blacklight 6.8.0 → 6.9.0
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.
- 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
|