blacklight 6.8.0 → 6.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.jshintrc +0 -47
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/autocomplete.js +3 -0
- data/app/controllers/concerns/blacklight/controller.rb +11 -4
- data/app/helpers/blacklight/catalog_helper_behavior.rb +6 -0
- data/app/helpers/blacklight/render_constraints_helper_behavior.rb +7 -7
- data/app/views/catalog/_search_results.html.erb +1 -0
- data/app/views/catalog/opensearch.xml.builder +2 -2
- data/blacklight.gemspec +2 -2
- data/config/locales/blacklight.sq.yml +234 -0
- data/lib/blacklight/search_state.rb +9 -3
- data/lib/blacklight/solr/response/spelling.rb +30 -35
- data/lib/generators/blacklight/solr4_generator.rb +1 -1
- data/lib/generators/blacklight/solr5_generator.rb +1 -1
- data/spec/features/search_spec.rb +1 -0
- data/spec/helpers/catalog_helper_spec.rb +2 -2
- data/spec/helpers/hash_as_hidden_fields_spec.rb +16 -16
- data/spec/helpers/render_constraints_helper_spec.rb +1 -1
- data/spec/lib/blacklight/search_state_spec.rb +2 -1
- data/spec/models/blacklight/solr/response_spec.rb +19 -8
- data/spec/models/solr_document_spec.rb +19 -23
- data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +2 -1
- data/spec/presenters/index_presenter_spec.rb +2 -1
- data/spec/presenters/show_presenter_spec.rb +2 -1
- data/spec/support/controller_level_helpers.rb +1 -1
- metadata +10 -10
- data/app/views/catalog/opensearch.json.erb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2061ccbc1e4df9ec4a7c1b1f780ea5420a379483
|
4
|
+
data.tar.gz: f08c9eac999b9954471352a6d5c1d83f9885a932
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8708c94876e422d943c9fdada3c5faefa71342a7112e6e2a8ce32b7a82b56be6b18ed74f041773e75594928e69fd30067c74ba65bfd7df1be5190f484113a643
|
7
|
+
data.tar.gz: 7ae034c2608744da8b713df542509e87e27380794c2400ef3b90bb829e262fc21895fdb7650b133c89d87b8270987b6afd9804408753be1ad4695c886800703f
|
data/.jshintrc
CHANGED
@@ -1,66 +1,19 @@
|
|
1
1
|
{
|
2
|
-
/*
|
3
|
-
* ENVIRONMENTS
|
4
|
-
* =================
|
5
|
-
*/
|
6
|
-
|
7
|
-
// Define globals exposed by modern browsers.
|
8
2
|
"browser": true,
|
9
|
-
|
10
|
-
// Define globals exposed by jQuery.
|
11
3
|
"jquery": true,
|
12
|
-
|
13
|
-
// Define globals exposed by Node.js.
|
14
4
|
"node": true,
|
15
|
-
|
16
|
-
// Allow ES6.
|
17
5
|
"esnext": true,
|
18
|
-
|
19
|
-
/*
|
20
|
-
* ENFORCING OPTIONS
|
21
|
-
* =================
|
22
|
-
*/
|
23
|
-
|
24
|
-
// Force all variable names to use either camelCase style or UPPER_CASE
|
25
|
-
// with underscores.
|
26
6
|
"camelcase": true,
|
27
|
-
|
28
|
-
// Prohibit use of == and != in favor of === and !==.
|
29
7
|
"eqeqeq": true,
|
30
|
-
|
31
|
-
// Enforce tab width of 2 spaces.
|
32
8
|
"indent": 2,
|
33
|
-
|
34
|
-
// Prohibit use of a variable before it is defined.
|
35
9
|
"latedef": true,
|
36
|
-
|
37
|
-
// Enforce line length to 80 characters
|
38
10
|
"maxlen": 80,
|
39
|
-
|
40
|
-
// Require capitalized names for constructor functions.
|
41
11
|
"newcap": true,
|
42
|
-
|
43
|
-
// Enforce use of single quotation marks for strings.
|
44
12
|
"quotmark": "single",
|
45
|
-
|
46
|
-
// Enforce placing 'use strict' at the top function scope
|
47
13
|
"strict": true,
|
48
|
-
|
49
|
-
// Prohibit use of explicitly undeclared variables.
|
50
14
|
"undef": true,
|
51
|
-
|
52
|
-
// Warn when variables are defined but never used.
|
53
15
|
"unused": true,
|
54
|
-
|
55
|
-
/*
|
56
|
-
* RELAXING OPTIONS
|
57
|
-
* =================
|
58
|
-
*/
|
59
|
-
|
60
|
-
// Suppress warnings about == null comparisons.
|
61
16
|
"eqnull": true,
|
62
|
-
|
63
|
-
// Custom predefined javascript objects that should be defined
|
64
17
|
"predef": [
|
65
18
|
"Blacklight"
|
66
19
|
]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.
|
1
|
+
6.9.0
|
@@ -67,7 +67,15 @@ module Blacklight::Controller
|
|
67
67
|
|
68
68
|
# @return [Blacklight::SearchState] a memoized instance of the parameter state.
|
69
69
|
def search_state
|
70
|
-
@search_state ||=
|
70
|
+
@search_state ||= begin
|
71
|
+
if search_state_class.instance_method(:initialize).arity == -3
|
72
|
+
search_state_class.new(params, blacklight_config, self)
|
73
|
+
else
|
74
|
+
Deprecation.warn(search_state_class, "The constructor for #{search_state_class} now requires a third argument. " \
|
75
|
+
"Invoking it will 2 arguments is deprecated and will be removed in Blacklight 7.")
|
76
|
+
search_state_class.new(params, blacklight_config)
|
77
|
+
end
|
78
|
+
end
|
71
79
|
end
|
72
80
|
|
73
81
|
# Default route to the search action (used e.g. in global partials). Override this method
|
@@ -131,7 +139,7 @@ module Blacklight::Controller
|
|
131
139
|
#
|
132
140
|
def has_user_authentication_provider?
|
133
141
|
respond_to? :current_user
|
134
|
-
end
|
142
|
+
end
|
135
143
|
|
136
144
|
def require_user_authentication_provider
|
137
145
|
raise ActionController::RoutingError, 'Not Found' unless has_user_authentication_provider?
|
@@ -159,7 +167,7 @@ module Blacklight::Controller
|
|
159
167
|
end
|
160
168
|
|
161
169
|
##
|
162
|
-
# To handle failed authorization attempts, redirect the user to the
|
170
|
+
# To handle failed authorization attempts, redirect the user to the
|
163
171
|
# login form and persist the current request uri as a parameter
|
164
172
|
def access_denied
|
165
173
|
# send the user home if the access was previously denied by the same
|
@@ -171,5 +179,4 @@ module Blacklight::Controller
|
|
171
179
|
|
172
180
|
redirect_to new_user_session_url(:referer => request.fullpath)
|
173
181
|
end
|
174
|
-
|
175
182
|
end
|
@@ -12,6 +12,12 @@ module Blacklight::CatalogHelperBehavior
|
|
12
12
|
auto_discovery_link_tag(:atom, feed_link_url('atom', options), title: t('blacklight.search.atom_feed'))
|
13
13
|
end
|
14
14
|
|
15
|
+
# @param [Hash] options
|
16
|
+
# @option options :route_set the route scope to use when constructing the link
|
17
|
+
def json_api_link_tag(options = {})
|
18
|
+
auto_discovery_link_tag(:json, feed_link_url('json', options), type: 'application/json')
|
19
|
+
end
|
20
|
+
|
15
21
|
##
|
16
22
|
# Override the Kaminari page_entries_info helper with our own, blacklight-aware
|
17
23
|
# implementation.
|
@@ -64,14 +64,14 @@ module Blacklight::RenderConstraintsHelperBehavior
|
|
64
64
|
# @param [Hash] localized_params query parameters
|
65
65
|
# @return [String]
|
66
66
|
def render_constraints_filters(localized_params = params)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
67
|
+
return "".html_safe unless localized_params[:f]
|
68
|
+
path = controller.search_state_class.new(localized_params, blacklight_config, controller)
|
69
|
+
content = []
|
70
|
+
localized_params[:f].each_pair do |facet,values|
|
71
|
+
content << render_filter_element(facet, values, path)
|
72
|
+
end
|
73
73
|
|
74
|
-
|
74
|
+
safe_join(content.flatten, "\n")
|
75
75
|
end
|
76
76
|
|
77
77
|
##
|
@@ -4,7 +4,7 @@ xml.OpenSearchDescription(:xmlns=>'http://a9.com/-/spec/opensearch/1.1/') {
|
|
4
4
|
xml.Description "#{application_name} Search"
|
5
5
|
xml.Image "#{asset_url('favicon.ico')}", :height=>16, :width=>16, :type=>'image/x-icon'
|
6
6
|
xml.Contact
|
7
|
-
xml.Url :type=>'text/html', :method=>'get', :template=>"#{url_for :controller=>'catalog', :only_path => false}?q={searchTerms}"
|
8
|
-
xml.Url :type=>'application/rss+xml', :method=>'get', :template=>"#{url_for :controller=>'catalog', :only_path => false}.rss?q={searchTerms}"
|
7
|
+
xml.Url :type=>'text/html', :method=>'get', :template=>"#{url_for :controller=>'catalog', :only_path => false}?q={searchTerms}&page={startPage?}"
|
8
|
+
xml.Url :type=>'application/rss+xml', :method=>'get', :template=>"#{url_for :controller=>'catalog', :only_path => false}.rss?q={searchTerms}&page={startPage?}"
|
9
9
|
xml.Url :type=>'application/x-suggestions+json', :method=>'get', :template=>"#{url_for :controller=>'catalog',:action => 'opensearch', :format=> 'json', :only_path => false}?q={searchTerms}"
|
10
10
|
}
|
data/blacklight.gemspec
CHANGED
@@ -38,12 +38,12 @@ Gem::Specification.new do |s|
|
|
38
38
|
s.add_development_dependency "rspec-rails", "~> 3.5"
|
39
39
|
s.add_development_dependency "rspec-its"
|
40
40
|
s.add_development_dependency "rspec-collection_matchers", ">= 1.0"
|
41
|
-
s.add_development_dependency "capybara", '~> 2.6
|
41
|
+
s.add_development_dependency "capybara", '~> 2.6'
|
42
42
|
s.add_development_dependency "poltergeist"
|
43
43
|
s.add_development_dependency 'engine_cart', '~> 1.0'
|
44
44
|
s.add_development_dependency "equivalent-xml"
|
45
45
|
s.add_development_dependency "coveralls"
|
46
46
|
s.add_development_dependency "simplecov"
|
47
|
-
s.add_development_dependency "rubocop"
|
47
|
+
s.add_development_dependency "rubocop", '~> 0.47.0' # pending release of 0.48.1
|
48
48
|
s.add_development_dependency "rubocop-rspec", '~> 1.8.0'
|
49
49
|
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
sq:
|
2
|
+
views:
|
3
|
+
pagination:
|
4
|
+
first: '« E para'
|
5
|
+
last: 'E fundit »'
|
6
|
+
previous: '« Mbrapa'
|
7
|
+
next: 'Tjetra »'
|
8
|
+
truncate: '…'
|
9
|
+
|
10
|
+
pagination_compact:
|
11
|
+
previous: '« Mbrapa'
|
12
|
+
next: 'Tjetra »'
|
13
|
+
|
14
|
+
blacklight:
|
15
|
+
application_name: 'Blacklight'
|
16
|
+
|
17
|
+
header_links:
|
18
|
+
login: 'Hyr'
|
19
|
+
logout: 'Dil'
|
20
|
+
bookmarks: 'Memorizimet'
|
21
|
+
saved_searches: 'Kërkimet e ruajtura'
|
22
|
+
search_history: 'Historia'
|
23
|
+
|
24
|
+
welcome: 'Mirësevini!'
|
25
|
+
and: 'dhe'
|
26
|
+
or: 'ose'
|
27
|
+
|
28
|
+
modal:
|
29
|
+
close: "Mbylle"
|
30
|
+
|
31
|
+
bookmarks:
|
32
|
+
title: 'Memorizimet'
|
33
|
+
page_title: 'Memorizimet - %{application_name}'
|
34
|
+
no_bookmarks: 'Nuk keni memorizime të ruajtura'
|
35
|
+
add:
|
36
|
+
button: 'Memorizo'
|
37
|
+
success:
|
38
|
+
one: 'Memorizimi u shtua me sukses.'
|
39
|
+
other: 'Memorizimet u shtuan me sukses.'
|
40
|
+
failure: 'Na vjen keq, ka pasur një problem gjatë ruajtes së memorizimeve.'
|
41
|
+
remove:
|
42
|
+
button: 'Fshij memorizimin'
|
43
|
+
success: 'Fshrija e memorizimit u krye me sukses'
|
44
|
+
failure: 'Na vjen keq, ka pasur një problem gjatë fshirjes së memorizimeve.'
|
45
|
+
action_confirm: 'Dëshiron ta fshishë memorizimin?'
|
46
|
+
clear:
|
47
|
+
action_title: 'Fshij memorizimet'
|
48
|
+
action_confirm: "Dëshiron t'i fshishë memorizimet?"
|
49
|
+
success: 'Memorizimet u fshinë.'
|
50
|
+
failure: 'Na vjen keq, ka pasur një problem gjatë fshirjes së memorizimeve.'
|
51
|
+
need_login: 'Ju lutemi kyçuni për të menaxhuar dhe për të parë memorizimet tuaja.'
|
52
|
+
list_title: 'Memorizimet e juaja'
|
53
|
+
delete: 'Fshije'
|
54
|
+
|
55
|
+
saved_searches:
|
56
|
+
add:
|
57
|
+
success: 'Kërkimi u ruajt me sukses.'
|
58
|
+
failure: 'Ka pasur një problem gjatë ruajt së kërkimit.'
|
59
|
+
remove:
|
60
|
+
success: 'Kërkimi i ruajtur u fshi me sukses.'
|
61
|
+
failure: 'Ka pasur një problem gjatë fshirjes së kërkimit.'
|
62
|
+
clear:
|
63
|
+
action_title: 'Fshij Kërkimet E Ruajtura'
|
64
|
+
action_confirm: "Dëshiron t'i fshishë kërkimet e ruajtua?"
|
65
|
+
success: 'Kërkimet e ruajtua u fshinë'
|
66
|
+
failure: 'Ka pasur një problem gjatë fshirjes së kërkimeve.'
|
67
|
+
title: 'Kërkimet e ruajtura'
|
68
|
+
page_title: 'Kërkimet E Ruajtura - %{application_name}'
|
69
|
+
need_login: 'Ju lutemi kyçuni për të menaxhuar dhe për të parë kërkimet e ruajtura.'
|
70
|
+
no_searches: 'Nuk keni kerkime të ruajtura'
|
71
|
+
list_title: 'Kërkimet e ruajtura'
|
72
|
+
delete: 'fshije'
|
73
|
+
|
74
|
+
search_history:
|
75
|
+
clear:
|
76
|
+
action_title: 'Fshij Historinë E Kërkimit'
|
77
|
+
action_confirm: 'Dëshiron ta fshishë historinë e kërkimit?'
|
78
|
+
success: 'Historia e kërkimit u fshi'
|
79
|
+
failure: 'Ka pasur një problem gjatë fshirjes së historisë së kërkimit.'
|
80
|
+
title: 'Historia e kërkimit'
|
81
|
+
page_title: 'Historia e kërkimit - %{application_name}'
|
82
|
+
no_history: 'Nuk keni histori të kërkimit'
|
83
|
+
recent: 'Kërkimet e fundit'
|
84
|
+
forget: 'fshije'
|
85
|
+
save: 'ruaje'
|
86
|
+
|
87
|
+
tools:
|
88
|
+
title: 'Veglat'
|
89
|
+
citation: 'Citati'
|
90
|
+
email: 'Email'
|
91
|
+
sms: 'Dërgo SMS'
|
92
|
+
clear: 'Fshij'
|
93
|
+
|
94
|
+
citation:
|
95
|
+
mla: 'MLA'
|
96
|
+
apa: 'APA'
|
97
|
+
chicago: 'Chicago'
|
98
|
+
|
99
|
+
email:
|
100
|
+
form:
|
101
|
+
title: 'Dërgo Email'
|
102
|
+
to: 'Email:'
|
103
|
+
message: 'Mesazhi:'
|
104
|
+
submit: 'Dërgo'
|
105
|
+
text:
|
106
|
+
default_title: 'N/A'
|
107
|
+
title: 'Titulli: %{value}'
|
108
|
+
author: 'Autori: %{value}'
|
109
|
+
format: 'Formati: %{value}'
|
110
|
+
language: 'Gjuha: %{value}'
|
111
|
+
subject:
|
112
|
+
one: 'Item Record: %{title}'
|
113
|
+
other: 'Item records'
|
114
|
+
url: 'URL: %{url}'
|
115
|
+
message: 'Mesazhi: %{message}'
|
116
|
+
|
117
|
+
success: "Emaili u dëgua"
|
118
|
+
|
119
|
+
errors:
|
120
|
+
to:
|
121
|
+
invalid: 'Duhet të shkruash një email adresë valide'
|
122
|
+
blank: 'Duhet të shkruash një pranues për të dëguar mesazh'
|
123
|
+
sms:
|
124
|
+
form:
|
125
|
+
title: 'SMS'
|
126
|
+
to: 'Numri i telefonit:'
|
127
|
+
carrier: 'Operatori'
|
128
|
+
carrier_prompt: 'Ju lutemi zgjedheni operatorin'
|
129
|
+
submit: 'Dërgo'
|
130
|
+
text:
|
131
|
+
title: '%{value}'
|
132
|
+
author: ' nga %{value}'
|
133
|
+
url: 'Link: %{url}'
|
134
|
+
success: "SMS-i u dëgua"
|
135
|
+
errors:
|
136
|
+
to:
|
137
|
+
invalid: 'Duhet të shkruash një number telefoni me 10 shifra'
|
138
|
+
blank: "Duhet të shkruash një numer telefoni për të dëguar SMS"
|
139
|
+
carrier:
|
140
|
+
blank: 'Duhet të zgjedheni operatorin'
|
141
|
+
invalid: "Duhet të zgjedheni operatorë valid"
|
142
|
+
|
143
|
+
back_to_search: 'Kthehu te kërkimi'
|
144
|
+
back_to_bookmarks: 'Kthehu te memorizimet'
|
145
|
+
|
146
|
+
search:
|
147
|
+
# i18n key 'title' is deprecated and will be removed in Blacklight 6.0
|
148
|
+
title: '%{application_name} Rezultatet e kërkimit'
|
149
|
+
page_title:
|
150
|
+
title: '%{constraints} - %{application_name} Rezultatet e kërkimit'
|
151
|
+
constraint: '%{label}: %{value}'
|
152
|
+
many_constraint_values: '%{values} zgjedhura'
|
153
|
+
search_results_header: 'Kufizimet e kërkimit'
|
154
|
+
search_results: 'Rezultatet e kërkimit'
|
155
|
+
errors:
|
156
|
+
request_error: "Na vjen keq, unë nuk e kuptoj kërkimin tuaj."
|
157
|
+
invalid_solr_id: "Na vjen keq, ju keni kërkuar një të dhënë që nuk ekziston."
|
158
|
+
per_page:
|
159
|
+
label: '%{count}<span class="sr-only"> për faqe</span>'
|
160
|
+
button_label: '%{count} për faqe'
|
161
|
+
title: 'Numri i rezultateve që do të shfaqen për faqe'
|
162
|
+
submit: 'Përditëso'
|
163
|
+
sort:
|
164
|
+
label: 'Klasifikoj sipas %{field}'
|
165
|
+
submit: 'klasifiko rezultatet'
|
166
|
+
form:
|
167
|
+
search_field:
|
168
|
+
label: 'Kërko'
|
169
|
+
title: 'Targeted search options'
|
170
|
+
post_label: 'për'
|
171
|
+
search:
|
172
|
+
label: 'kërko për'
|
173
|
+
placeholder: 'Kërko...'
|
174
|
+
submit: 'Kërko'
|
175
|
+
pagination:
|
176
|
+
title: 'Navigimi i rezultateteve'
|
177
|
+
pagination_info:
|
178
|
+
no_items_found: '%{entry_name} nuk u gjet'
|
179
|
+
single_item_found: '<strong>1</strong> %{entry_name} u gjet'
|
180
|
+
pages:
|
181
|
+
one: '<strong>%{start_num}</strong> - <strong>%{end_num}</strong> prej <strong>%{total_num}</strong>'
|
182
|
+
other: '<strong>%{start_num}</strong> - <strong>%{end_num}</strong> prej <strong>%{total_num}</strong>'
|
183
|
+
entry_pagination_info:
|
184
|
+
one: '<strong>1 prej 1</strong>'
|
185
|
+
other: '<strong>%{current}</strong> prej <strong>%{total}</strong>'
|
186
|
+
documents:
|
187
|
+
counter: '%{counter}. '
|
188
|
+
facets:
|
189
|
+
title: 'Kufizo këkimin'
|
190
|
+
clear: 'Fshij filterin'
|
191
|
+
sort:
|
192
|
+
count: 'Renditja numerike'
|
193
|
+
index: 'A-Z Renditja'
|
194
|
+
count: '%{number}'
|
195
|
+
more_html: 'Më shumë <span class="sr-only">%{field_name}</span> »'
|
196
|
+
selected:
|
197
|
+
remove: '[fshije]'
|
198
|
+
missing: "[Mungon]"
|
199
|
+
group:
|
200
|
+
more: 'më shumë »'
|
201
|
+
filters:
|
202
|
+
title: 'Ju keni kërkuar për:'
|
203
|
+
label: '%{label}:'
|
204
|
+
remove:
|
205
|
+
value: 'Fshij kufizimin %{value}'
|
206
|
+
label_value: 'Fshij kufizimin %{label}: %{value}'
|
207
|
+
start_over: 'Fillo nga e para'
|
208
|
+
index:
|
209
|
+
label: '%{label}:'
|
210
|
+
show:
|
211
|
+
title: '%{document_title} - %{application_name}'
|
212
|
+
label: '%{label}:'
|
213
|
+
rss_feed: 'RSS për rezultatet'
|
214
|
+
atom_feed: 'Atom për rezultatet'
|
215
|
+
fields:
|
216
|
+
default: 'Fjala'
|
217
|
+
bookmarks:
|
218
|
+
present: "Në memorizime"
|
219
|
+
absent: "Memorizo"
|
220
|
+
inprogress: "Duke u ruajtur..."
|
221
|
+
zero_results:
|
222
|
+
title: "Nuk u gjet asnjë rezultat"
|
223
|
+
modify_search: "Provo të ndryshosh kërkimin"
|
224
|
+
use_fewer_keywords: "Përdorni më pak fjalë kyçe, pastaj filtroni kërkimin tuaj me opcionet në të majtë"
|
225
|
+
search_fields: "u kërkuat për %{search_fields}"
|
226
|
+
search_everything: "provo të kërkosh çdo gjë"
|
227
|
+
view_title: "Shiko rezultatin si: "
|
228
|
+
view:
|
229
|
+
list: "List"
|
230
|
+
|
231
|
+
entry_name:
|
232
|
+
default: 'entry'
|
233
|
+
|
234
|
+
did_you_mean: 'A keni menduar: %{options}?'
|
@@ -6,11 +6,16 @@ module Blacklight
|
|
6
6
|
attr_reader :blacklight_config # Must be called blacklight_config, because Blacklight::Facet calls blacklight_config.
|
7
7
|
attr_reader :params
|
8
8
|
|
9
|
+
# This method is never accessed in this class, but may be used by subclasses that need
|
10
|
+
# to access the url_helpers
|
11
|
+
attr_reader :controller
|
12
|
+
|
9
13
|
delegate :facet_configuration_for_field, to: :blacklight_config
|
10
14
|
|
11
15
|
# @param [ActionController::Parameters] params
|
12
16
|
# @param [Blacklight::Config] blacklight_config
|
13
|
-
|
17
|
+
# @param [ApplicationController] controller used for the routing helpers
|
18
|
+
def initialize(params, blacklight_config, controller = nil)
|
14
19
|
if params.respond_to?(:to_unsafe_h)
|
15
20
|
# This is the typical (not-ActionView::TestCase) code path.
|
16
21
|
@params = params.to_unsafe_h
|
@@ -24,6 +29,7 @@ module Blacklight
|
|
24
29
|
end
|
25
30
|
|
26
31
|
@blacklight_config = blacklight_config
|
32
|
+
@controller = controller
|
27
33
|
end
|
28
34
|
|
29
35
|
def to_hash
|
@@ -32,7 +38,7 @@ module Blacklight
|
|
32
38
|
alias to_h to_hash
|
33
39
|
|
34
40
|
def reset
|
35
|
-
self.class.new(ActionController::Parameters.new, blacklight_config)
|
41
|
+
self.class.new(ActionController::Parameters.new, blacklight_config, controller)
|
36
42
|
end
|
37
43
|
|
38
44
|
##
|
@@ -120,7 +126,7 @@ module Blacklight
|
|
120
126
|
# @yield [params] The merged parameters hash before being sanitized
|
121
127
|
def params_for_search(params_to_merge={}, &block)
|
122
128
|
# params hash we'll return
|
123
|
-
my_params = params.dup.merge(self.class.new(params_to_merge, blacklight_config))
|
129
|
+
my_params = params.dup.merge(self.class.new(params_to_merge, blacklight_config, controller))
|
124
130
|
|
125
131
|
if block_given?
|
126
132
|
yield my_params
|
@@ -28,44 +28,39 @@ module Blacklight::Solr::Response::Spelling
|
|
28
28
|
if spellcheck && spellcheck[:suggestions]
|
29
29
|
suggestions = spellcheck[:suggestions]
|
30
30
|
unless suggestions.nil?
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
i_stop = suggestions.index("collation")
|
45
|
-
else
|
46
|
-
i_stop = suggestions.length
|
31
|
+
if suggestions.is_a?(Array)
|
32
|
+
# Before solr 6.5 suggestions is an array with the following format:
|
33
|
+
# (query term)
|
34
|
+
# (hash of term info and term suggestion)
|
35
|
+
# ...
|
36
|
+
# (query term)
|
37
|
+
# (hash of term info and term suggestion)
|
38
|
+
# 'correctlySpelled'
|
39
|
+
# true/false
|
40
|
+
# collation
|
41
|
+
# (suggestion for collation)
|
42
|
+
# We turn it into a hash here so that it is the same format as in solr 6.5 and later
|
43
|
+
suggestions = Hash[*suggestions].except('correctlySpelled', 'collation')
|
47
44
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
word_suggestions << term_info['suggestion'].map do |suggestion|
|
62
|
-
suggestion['word'] if suggestion['freq'] > orig_freq
|
63
|
-
end
|
64
|
-
else
|
65
|
-
# only extended suggestions have frequency so we just return all suggestions
|
66
|
-
word_suggestions << term_info['suggestion']
|
45
|
+
|
46
|
+
suggestions.each do |_, term_info|
|
47
|
+
# term_info is a hash:
|
48
|
+
# numFound =>
|
49
|
+
# startOffset =>
|
50
|
+
# endOffset =>
|
51
|
+
# origFreq =>
|
52
|
+
# suggestion => [{ frequency =>, word => }] # for extended results
|
53
|
+
# suggestion => ['word'] # for non-extended results
|
54
|
+
orig_freq = term_info['origFreq']
|
55
|
+
if term_info['suggestion'].first.is_a?(Hash)
|
56
|
+
word_suggestions << term_info['suggestion'].map do |suggestion|
|
57
|
+
suggestion['word'] if suggestion['freq'] > orig_freq
|
67
58
|
end
|
59
|
+
else
|
60
|
+
# only extended suggestions have frequency so we just return all suggestions
|
61
|
+
word_suggestions << term_info['suggestion']
|
68
62
|
end
|
63
|
+
end
|
69
64
|
end
|
70
65
|
end
|
71
66
|
word_suggestions.flatten.compact.uniq
|
@@ -30,6 +30,7 @@ describe "Search Page" do
|
|
30
30
|
Capybara.ignore_hidden_elements = false
|
31
31
|
expect(page).to have_selector("link[rel=alternate][type='application/rss+xml']")
|
32
32
|
expect(page).to have_selector("link[rel=alternate][type='application/atom+xml']")
|
33
|
+
expect(page).to have_selector("link[rel=alternate][type='application/json']")
|
33
34
|
|
34
35
|
# opensearch
|
35
36
|
expect(page).to have_selector("meta[name=totalResults]")
|
@@ -134,7 +134,7 @@ describe CatalogHelper do
|
|
134
134
|
let(:my_engine) { double("Engine") }
|
135
135
|
let(:query_params) { { controller: 'catalog', action: 'index' } }
|
136
136
|
let(:config) { Blacklight::Configuration.new }
|
137
|
-
let(:search_state) { Blacklight::SearchState.new(query_params, config) }
|
137
|
+
let(:search_state) { Blacklight::SearchState.new(query_params, config, controller) }
|
138
138
|
|
139
139
|
it "calls url_for on the engine scope" do
|
140
140
|
allow(helper).to receive(:search_state).and_return search_state
|
@@ -152,7 +152,7 @@ describe CatalogHelper do
|
|
152
152
|
let(:my_engine) { double("Engine") }
|
153
153
|
let(:query_params) { { controller: 'catalog', action: 'index' } }
|
154
154
|
let(:config) { Blacklight::Configuration.new }
|
155
|
-
let(:search_state) { Blacklight::SearchState.new(query_params, config) }
|
155
|
+
let(:search_state) { Blacklight::SearchState.new(query_params, config, controller) }
|
156
156
|
|
157
157
|
it "calls url_for on the engine scope" do
|
158
158
|
allow(helper).to receive(:search_state).and_return search_state
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
describe Blacklight::HashAsHiddenFieldsHelperBehavior do
|
4
|
+
let(:params) do
|
5
|
+
{ q: "query",
|
6
|
+
search_field: "search_field",
|
7
|
+
per_page: 10,
|
8
|
+
page: 5,
|
9
|
+
extra_arbitrary_key: "arbitrary_value",
|
10
|
+
f: { field1: %w(a b), field2: ["z"] } }
|
7
11
|
end
|
12
|
+
let(:generated) { helper.render_hash_as_hidden_fields(params) }
|
8
13
|
|
9
14
|
it "converts a hash with nested complex data to Rails-style hidden form fields" do
|
10
|
-
|
11
|
-
generated =
|
12
|
-
|
13
|
-
expect(generated).to have_selector("input[type='hidden'][name='
|
14
|
-
expect(generated).to have_selector("input[type='hidden'][name='
|
15
|
-
expect(generated).to have_selector("input[type='hidden'][name='
|
16
|
-
expect(generated).to have_selector("input[type='hidden'][name='
|
17
|
-
expect(generated).to have_selector("input[type='hidden'][name='f[field2][]'][value='z']")
|
18
|
-
expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='a']")
|
19
|
-
expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='b']")
|
20
|
-
|
15
|
+
expect(generated).to have_selector("input[type='hidden'][name='q'][value='query']", visible: false)
|
16
|
+
expect(generated).to have_selector("input[type='hidden'][name='per_page'][value='10']", visible: false)
|
17
|
+
expect(generated).to have_selector("input[type='hidden'][name='page'][value='5']", visible: false)
|
18
|
+
expect(generated).to have_selector("input[type='hidden'][name='extra_arbitrary_key'][value='arbitrary_value']", visible: false)
|
19
|
+
expect(generated).to have_selector("input[type='hidden'][name='f[field2][]'][value='z']", visible: false)
|
20
|
+
expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='a']", visible: false)
|
21
|
+
expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='b']", visible: false)
|
21
22
|
end
|
22
|
-
|
23
23
|
end
|
@@ -50,7 +50,7 @@ describe RenderConstraintsHelper do
|
|
50
50
|
subject { helper.render_filter_element('type', ['journal'], path) }
|
51
51
|
|
52
52
|
let(:params) { ActionController::Parameters.new q: 'biz' }
|
53
|
-
let(:path) { Blacklight::SearchState.new(params, config) }
|
53
|
+
let(:path) { Blacklight::SearchState.new(params, config, controller) }
|
54
54
|
|
55
55
|
it "has a link relative to the current url" do
|
56
56
|
expect(subject).to have_link "Remove constraint Item Type: journal", href: "/catalog?q=biz"
|
@@ -9,7 +9,8 @@ describe Blacklight::SearchState do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
let(:parameter_class) { ActionController::Parameters }
|
12
|
-
let(:
|
12
|
+
let(:controller) { double }
|
13
|
+
let(:search_state) { described_class.new(params, blacklight_config, controller) }
|
13
14
|
let(:params) { parameter_class.new }
|
14
15
|
|
15
16
|
describe '#to_h' do
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe Blacklight::Solr::Response do
|
3
|
+
RSpec.describe Blacklight::Solr::Response do
|
4
|
+
let(:raw_response) { eval(mock_query_response) }
|
4
5
|
|
5
|
-
|
6
|
-
raw_response
|
7
|
-
|
6
|
+
let(:r) do
|
7
|
+
Blacklight::Solr::Response.new(raw_response,
|
8
|
+
raw_response['params'])
|
8
9
|
end
|
9
10
|
|
10
|
-
let(:r) { create_response }
|
11
|
-
|
12
11
|
it 'should create a valid response' do
|
13
12
|
expect(r).to respond_to(:header)
|
14
13
|
end
|
@@ -106,7 +105,6 @@ describe Blacklight::Solr::Response do
|
|
106
105
|
end
|
107
106
|
|
108
107
|
it 'should return the correct value when calling facet_by_field_name' do
|
109
|
-
r = create_response
|
110
108
|
facet = r.aggregations['cat']
|
111
109
|
expect(facet.name).to eq 'cat'
|
112
110
|
end
|
@@ -183,6 +181,15 @@ describe Blacklight::Solr::Response do
|
|
183
181
|
end
|
184
182
|
end
|
185
183
|
|
184
|
+
context 'solr 6.5 spellcheck collation syntax' do
|
185
|
+
it 'should provide spelling suggestions for a regular spellcheck results with a collation' do
|
186
|
+
raw_response = eval(mock_response_with_spellcheck_collation_solr65)
|
187
|
+
r = Blacklight::Solr::Response.new(raw_response, {})
|
188
|
+
expect(r.spelling.words).to include("dell")
|
189
|
+
expect(r.spelling.words).to include("ultrasharp")
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
186
193
|
it "should provide MoreLikeThis suggestions" do
|
187
194
|
raw_response = eval(mock_response_with_more_like_this)
|
188
195
|
r = Blacklight::Solr::Response.new(raw_response, {})
|
@@ -228,7 +235,11 @@ describe Blacklight::Solr::Response do
|
|
228
235
|
def mock_response_with_spellcheck_collation_solr5
|
229
236
|
%|{'responseHeader'=>{'status'=>0,'QTime'=>3,'params'=>{'spellspellcheck.build'=>'true','spellcheck'=>'true','q'=>'hell','spellcheck.q'=>'hell ultrashar','wt'=>'ruby','spellcheck.collate'=>'true'}},'response'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'spellcheck'=>{'suggestions'=>['hell',{'numFound'=>1,'startOffset'=>0,'endOffset'=>4,'suggestion'=>['dell']},'ultrashar',{'numFound'=>1,'startOffset'=>5,'endOffset'=>14,'suggestion'=>['ultrasharp']}],'collations'=>['collation','dell ultrasharp']}}|
|
230
237
|
end
|
231
|
-
|
238
|
+
|
239
|
+
def mock_response_with_spellcheck_collation_solr65
|
240
|
+
%|{'responseHeader'=>{'status'=>0,'QTime'=>3,'params'=>{'spellspellcheck.build'=>'true','spellcheck'=>'true','q'=>'hell','spellcheck.q'=>'hell ultrashar','wt'=>'ruby','spellcheck.collate'=>'true'}},'response'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'spellcheck'=>{'suggestions'=>{'hell'=>{'numFound'=>1,'startOffset'=>0,'endOffset'=>4,'suggestion'=>['dell']},'ultrashar'=>{'numFound'=>1,'startOffset'=>5,'endOffset'=>14,'suggestion'=>['ultrasharp']}},'collations'=>['collation','dell ultrasharp']}}|
|
241
|
+
end
|
242
|
+
|
232
243
|
def mock_response_with_more_like_this
|
233
244
|
%({'responseHeader'=>{'status'=>0,'QTime'=>8,'params'=>{'facet'=>'false','mlt.mindf'=>'1','mlt.fl'=>'subject_t','fl'=>'id','mlt.count'=>'3','mlt.mintf'=>'0','mlt'=>'true','q.alt'=>'*:*','qt'=>'search','wt'=>'ruby'}},'response'=>{'numFound'=>30,'start'=>0,'docs'=>[{'id'=>'00282214'},{'id'=>'00282371'},{'id'=>'00313831'},{'id'=>'00314247'},{'id'=>'43037890'},{'id'=>'53029833'},{'id'=>'77826928'},{'id'=>'78908283'},{'id'=>'79930185'},{'id'=>'85910001'}]},'moreLikeThis'=>{'00282214'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'00282371'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'00313831'=>{'numFound'=>1,'start'=>0,'docs'=>[{'id'=>'96933325'}]},'00314247'=>{'numFound'=>3,'start'=>0,'docs'=>[{'id'=>'2008543486'},{'id'=>'96933325'},{'id'=>'2009373513'}]},'43037890'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'53029833'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'77826928'=>{'numFound'=>1,'start'=>0,'docs'=>[{'id'=>'94120425'}]},'78908283'=>{'numFound'=>0,'start'=>0,'docs'=>[]},'79930185'=>{'numFound'=>2,'start'=>0,'docs'=>[{'id'=>'94120425'},{'id'=>'2007020969'}]},'85910001'=>{'numFound'=>0,'start'=>0,'docs'=>[]}}})
|
234
245
|
end
|
@@ -1,31 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe SolrDocument do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
|
7
|
-
@solrdoc = SolrDocument.new :id => '00282214', :format => ['Book'], :title_display => 'some-title'
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "new" do
|
12
|
-
it "takes a Hash as the argument" do
|
13
|
-
expect { SolrDocument.new(:id => 1) }.not_to raise_error
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
3
|
+
RSpec.describe SolrDocument do
|
17
4
|
describe "access methods" do
|
18
|
-
|
19
|
-
|
20
|
-
expect(@solrdoc[:title_display]).not_to be_nil
|
5
|
+
let(:solrdoc) do
|
6
|
+
SolrDocument.new(id: '00282214', format: ['Book'], title_display: 'some-title')
|
21
7
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
8
|
+
|
9
|
+
describe "#[]" do
|
10
|
+
subject { solrdoc[field] }
|
11
|
+
|
12
|
+
context "with title_display" do
|
13
|
+
let(:field) { :title_display }
|
14
|
+
it { is_expected.to eq 'some-title' }
|
15
|
+
end
|
16
|
+
context "with format" do
|
17
|
+
let(:field) { :format }
|
18
|
+
it { is_expected.to eq ['Book'] }
|
19
|
+
end
|
25
20
|
end
|
26
21
|
|
27
|
-
|
28
|
-
|
22
|
+
describe "#id" do
|
23
|
+
subject { solrdoc.id }
|
24
|
+
it { is_expected.to eq '00282214' }
|
29
25
|
end
|
30
26
|
end
|
31
|
-
end
|
27
|
+
end
|
@@ -8,7 +8,8 @@ RSpec.describe Blacklight::LinkAlternatePresenter do
|
|
8
8
|
let(:config) { Blacklight::Configuration.new }
|
9
9
|
let(:parameter_class) { ActionController::Parameters }
|
10
10
|
let(:params) { parameter_class.new }
|
11
|
-
let(:
|
11
|
+
let(:controller) { double }
|
12
|
+
let(:search_state) { Blacklight::SearchState.new(params, config, controller) }
|
12
13
|
|
13
14
|
let(:presenter) { described_class.new(view_context, document, options) }
|
14
15
|
before do
|
@@ -9,7 +9,8 @@ describe Blacklight::IndexPresenter do
|
|
9
9
|
let(:presenter) { described_class.new(document, request_context, config) }
|
10
10
|
let(:parameter_class) { ActionController::Parameters }
|
11
11
|
let(:params) { parameter_class.new }
|
12
|
-
let(:
|
12
|
+
let(:controller) { double }
|
13
|
+
let(:search_state) { Blacklight::SearchState.new(params, config, controller) }
|
13
14
|
|
14
15
|
let(:document) do
|
15
16
|
SolrDocument.new(id: 1,
|
@@ -9,7 +9,8 @@ describe Blacklight::ShowPresenter do
|
|
9
9
|
let(:presenter) { described_class.new(document, request_context, config) }
|
10
10
|
let(:parameter_class) { ActionController::Parameters }
|
11
11
|
let(:params) { parameter_class.new }
|
12
|
-
let(:
|
12
|
+
let(:controller) { double }
|
13
|
+
let(:search_state) { Blacklight::SearchState.new(params, config, controller) }
|
13
14
|
|
14
15
|
let(:document) do
|
15
16
|
SolrDocument.new(id: 1,
|
@@ -4,7 +4,7 @@ module ControllerLevelHelpers
|
|
4
4
|
include Blacklight::Facet
|
5
5
|
|
6
6
|
def search_state
|
7
|
-
@search_state ||= Blacklight::SearchState.new(params, blacklight_config)
|
7
|
+
@search_state ||= Blacklight::SearchState.new(params, blacklight_config, controller)
|
8
8
|
end
|
9
9
|
|
10
10
|
def blacklight_configuration_context
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
@@ -17,7 +17,7 @@ authors:
|
|
17
17
|
autorequire:
|
18
18
|
bindir: exe
|
19
19
|
cert_chain: []
|
20
|
-
date: 2017-
|
20
|
+
date: 2017-05-02 00:00:00.000000000 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: rails
|
@@ -205,14 +205,14 @@ dependencies:
|
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 2.6
|
208
|
+
version: '2.6'
|
209
209
|
type: :development
|
210
210
|
prerelease: false
|
211
211
|
version_requirements: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 2.6
|
215
|
+
version: '2.6'
|
216
216
|
- !ruby/object:Gem::Dependency
|
217
217
|
name: poltergeist
|
218
218
|
requirement: !ruby/object:Gem::Requirement
|
@@ -287,16 +287,16 @@ dependencies:
|
|
287
287
|
name: rubocop
|
288
288
|
requirement: !ruby/object:Gem::Requirement
|
289
289
|
requirements:
|
290
|
-
- - "
|
290
|
+
- - "~>"
|
291
291
|
- !ruby/object:Gem::Version
|
292
|
-
version:
|
292
|
+
version: 0.47.0
|
293
293
|
type: :development
|
294
294
|
prerelease: false
|
295
295
|
version_requirements: !ruby/object:Gem::Requirement
|
296
296
|
requirements:
|
297
|
-
- - "
|
297
|
+
- - "~>"
|
298
298
|
- !ruby/object:Gem::Version
|
299
|
-
version:
|
299
|
+
version: 0.47.0
|
300
300
|
- !ruby/object:Gem::Dependency
|
301
301
|
name: rubocop-rspec
|
302
302
|
requirement: !ruby/object:Gem::Requirement
|
@@ -505,7 +505,6 @@ files:
|
|
505
505
|
- app/views/catalog/index.html.erb
|
506
506
|
- app/views/catalog/index.json.jbuilder
|
507
507
|
- app/views/catalog/index.rss.builder
|
508
|
-
- app/views/catalog/opensearch.json.erb
|
509
508
|
- app/views/catalog/opensearch.xml.builder
|
510
509
|
- app/views/catalog/send_email_record.erb
|
511
510
|
- app/views/catalog/show.html.erb
|
@@ -538,6 +537,7 @@ files:
|
|
538
537
|
- config/locales/blacklight.fr.yml
|
539
538
|
- config/locales/blacklight.it.yml
|
540
539
|
- config/locales/blacklight.pt-BR.yml
|
540
|
+
- config/locales/blacklight.sq.yml
|
541
541
|
- config/routes.rb
|
542
542
|
- db/migrate/20140202020201_create_searches.rb
|
543
543
|
- db/migrate/20140202020202_create_bookmarks.rb
|
@@ -748,7 +748,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
748
748
|
version: '0'
|
749
749
|
requirements: []
|
750
750
|
rubyforge_project:
|
751
|
-
rubygems_version: 2.6.
|
751
|
+
rubygems_version: 2.6.11
|
752
752
|
signing_key:
|
753
753
|
specification_version: 4
|
754
754
|
summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
|
File without changes
|