blacklight 5.11.3 → 5.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +2 -2
- data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -4
- data/app/helpers/blacklight/facets_helper_behavior.rb +10 -6
- data/app/helpers/blacklight/url_helper_behavior.rb +1 -1
- data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +1 -0
- data/app/views/bookmarks/index.html.erb +0 -1
- data/blacklight.gemspec +1 -1
- data/config/locales/blacklight.en.yml +1 -0
- data/lib/blacklight.rb +2 -1
- data/lib/blacklight/bookmarks.rb +2 -0
- data/lib/blacklight/catalog.rb +1 -1
- data/lib/blacklight/configuration.rb +8 -1
- data/lib/blacklight/configuration/fields.rb +20 -10
- data/lib/blacklight/document.rb +43 -13
- data/lib/blacklight/document_presenter.rb +8 -4
- data/lib/blacklight/facet.rb +6 -54
- data/lib/blacklight/request_builders.rb +2 -2
- data/lib/blacklight/search_builder.rb +48 -18
- data/lib/blacklight/search_helper.rb +10 -10
- data/lib/blacklight/solr.rb +1 -1
- data/lib/blacklight/solr/search_builder.rb +2 -265
- data/lib/blacklight/solr/search_builder_behavior.rb +274 -0
- data/lib/blacklight/solr_repository.rb +1 -1
- data/lib/blacklight/solr_response.rb +8 -16
- data/lib/blacklight/solr_response/facets.rb +133 -25
- data/lib/blacklight/solr_response/group_response.rb +1 -1
- data/lib/blacklight/solr_response/pagination_methods.rb +0 -17
- data/lib/generators/blacklight/install_generator.rb +6 -1
- data/lib/generators/blacklight/search_builder_generator.rb +20 -0
- data/lib/generators/blacklight/templates/search_builder.rb +3 -0
- data/lib/railties/blacklight.rake +1 -1
- data/spec/controllers/catalog_controller_spec.rb +9 -9
- data/spec/helpers/blacklight_helper_spec.rb +29 -179
- data/spec/helpers/facets_helper_spec.rb +37 -75
- data/spec/helpers/url_helper_spec.rb +1 -1
- data/spec/lib/blacklight/configuration_spec.rb +18 -1
- data/spec/lib/blacklight/document_spec.rb +62 -0
- data/spec/lib/blacklight/search_builder_spec.rb +15 -13
- data/spec/lib/blacklight/search_helper_spec.rb +15 -16
- data/spec/lib/blacklight/solr/document_spec.rb +5 -3
- data/spec/lib/blacklight/solr/search_builder_spec.rb +0 -5
- data/spec/lib/blacklight/solr_response/facets_spec.rb +144 -10
- data/spec/lib/blacklight/solr_response_spec.rb +5 -13
- data/spec/lib/document_presenter_spec.rb +23 -27
- data/spec/views/catalog/_facets.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_index_default.erb_spec.rb +2 -13
- data/spec/views/catalog/_show_default.erb_spec.rb +1 -13
- metadata +10 -4
@@ -43,7 +43,7 @@ module Blacklight
|
|
43
43
|
key = blacklight_config.http_method == :post ? :data : :params
|
44
44
|
res = connection.send_and_receive(path, {key=>solr_params.to_hash, method:blacklight_config.http_method})
|
45
45
|
|
46
|
-
solr_response = blacklight_config.response_model.new(res, solr_params, document_model: blacklight_config.document_model)
|
46
|
+
solr_response = blacklight_config.response_model.new(res, solr_params, document_model: blacklight_config.document_model, blacklight_config: blacklight_config)
|
47
47
|
|
48
48
|
Blacklight.logger.debug("Solr query: #{solr_params.inspect}")
|
49
49
|
Blacklight.logger.debug("Solr response: #{solr_response.inspect}") if defined?(::BLACKLIGHT_VERBOSE_LOGGING) and ::BLACKLIGHT_VERBOSE_LOGGING
|
@@ -1,4 +1,5 @@
|
|
1
1
|
class Blacklight::SolrResponse < HashWithIndifferentAccess
|
2
|
+
extend Deprecation
|
2
3
|
|
3
4
|
require 'blacklight/solr_response/pagination_methods'
|
4
5
|
|
@@ -16,44 +17,35 @@ class Blacklight::SolrResponse < HashWithIndifferentAccess
|
|
16
17
|
include MoreLikeThis
|
17
18
|
|
18
19
|
attr_reader :request_params
|
19
|
-
attr_accessor :document_model
|
20
|
+
attr_accessor :document_model, :blacklight_config
|
20
21
|
|
21
22
|
def initialize(data, request_params, options = {})
|
22
23
|
super(force_to_utf8(data))
|
23
24
|
@request_params = request_params
|
24
25
|
self.document_model = options[:solr_document_model] || options[:document_model] || SolrDocument
|
26
|
+
self.blacklight_config = options[:blacklight_config]
|
25
27
|
end
|
26
28
|
|
27
29
|
def header
|
28
|
-
self['responseHeader']
|
30
|
+
self['responseHeader'] || {}
|
29
31
|
end
|
30
|
-
|
31
|
-
def update(other_hash)
|
32
|
-
other_hash.each_pair { |key, value| self[key] = value }
|
33
|
-
self
|
34
|
-
end
|
35
32
|
|
36
33
|
def params
|
37
|
-
|
34
|
+
header['params'] || request_params
|
38
35
|
end
|
39
36
|
|
40
37
|
def rows
|
41
|
-
|
38
|
+
params[:rows].to_i
|
42
39
|
end
|
43
40
|
|
44
41
|
def sort
|
45
42
|
params[:sort]
|
46
43
|
end
|
47
44
|
|
48
|
-
def docs
|
49
|
-
@docs ||= begin
|
50
|
-
response['docs'] || []
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
45
|
def documents
|
55
|
-
docs.collect{|doc| document_model.new(doc, self) }
|
46
|
+
@documents ||= (response['docs'] || []).collect{|doc| document_model.new(doc, self) }
|
56
47
|
end
|
48
|
+
alias_method :docs, :documents
|
57
49
|
|
58
50
|
def grouped
|
59
51
|
@groups ||= self["grouped"].map do |field, group|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
3
|
module Blacklight::SolrResponse::Facets
|
4
|
+
extend Deprecation
|
4
5
|
|
5
6
|
# represents a facet value; which is a field value and its hit count
|
6
7
|
class FacetItem < OpenStruct
|
@@ -67,40 +68,29 @@ module Blacklight::SolrResponse::Facets
|
|
67
68
|
end
|
68
69
|
|
69
70
|
end
|
70
|
-
|
71
|
+
|
72
|
+
##
|
73
|
+
# Get all the Solr facet data (fields, queries, pivots) as a hash keyed by
|
74
|
+
# both the Solr field name and/or by the blacklight field name
|
75
|
+
def aggregations
|
76
|
+
@aggregations ||= {}.merge(facet_field_aggregations).merge(facet_query_aggregations).merge(facet_pivot_aggregations)
|
77
|
+
end
|
78
|
+
|
71
79
|
# @response.facets.each do |facet|
|
72
80
|
# facet.name
|
73
81
|
# facet.items
|
74
82
|
# end
|
75
83
|
# "caches" the result in the @facets instance var
|
76
84
|
def facets
|
77
|
-
|
78
|
-
facet_fields.map do |(facet_field_name,values_and_hits)|
|
79
|
-
items = []
|
80
|
-
options = {}
|
81
|
-
values_and_hits.each_slice(2) do |k,v|
|
82
|
-
items << FacetItem.new(:value => k, :hits => v)
|
83
|
-
end
|
84
|
-
options[:sort] = (params[:"f.#{facet_field_name}.facet.sort"] || params[:'facet.sort'])
|
85
|
-
if params[:"f.#{facet_field_name}.facet.limit"] || params[:"facet.limit"]
|
86
|
-
options[:limit] = (params[:"f.#{facet_field_name}.facet.limit"] || params[:"facet.limit"]).to_i
|
87
|
-
end
|
88
|
-
|
89
|
-
if params[:"f.#{facet_field_name}.facet.offset"] || params[:'facet.offset']
|
90
|
-
options[:offset] = (params[:"f.#{facet_field_name}.facet.offset"] || params[:'facet.offset']).to_i
|
91
|
-
end
|
92
|
-
FacetField.new(facet_field_name, items, options)
|
93
|
-
end
|
94
|
-
end
|
85
|
+
aggregations.values
|
95
86
|
end
|
96
|
-
|
87
|
+
deprecation_deprecate facets: :aggregations
|
88
|
+
|
97
89
|
# pass in a facet field name and get back a Facet instance
|
98
90
|
def facet_by_field_name(name)
|
99
|
-
|
100
|
-
@facets_by_field_name[name] ||= (
|
101
|
-
facets.detect{|facet|facet.name.to_s == name.to_s}
|
102
|
-
)
|
91
|
+
aggregations[name]
|
103
92
|
end
|
93
|
+
deprecation_deprecate facet_by_field_name: :aggregations
|
104
94
|
|
105
95
|
def facet_counts
|
106
96
|
@facet_counts ||= self['facet_counts'] || {}
|
@@ -108,7 +98,16 @@ module Blacklight::SolrResponse::Facets
|
|
108
98
|
|
109
99
|
# Returns the hash of all the facet_fields (ie: {'instock_b' => ['true', 123, 'false', 20]}
|
110
100
|
def facet_fields
|
111
|
-
@facet_fields ||=
|
101
|
+
@facet_fields ||= begin
|
102
|
+
val = facet_counts['facet_fields'] || {}
|
103
|
+
|
104
|
+
# this is some old solr (1.4? earlier?) serialization of facet fields
|
105
|
+
if val.is_a? Array
|
106
|
+
Hash[val]
|
107
|
+
else
|
108
|
+
val
|
109
|
+
end
|
110
|
+
end
|
112
111
|
end
|
113
112
|
|
114
113
|
# Returns all of the facet queries
|
@@ -120,5 +119,114 @@ module Blacklight::SolrResponse::Facets
|
|
120
119
|
def facet_pivot
|
121
120
|
@facet_pivot ||= facet_counts['facet_pivot'] || {}
|
122
121
|
end
|
122
|
+
|
123
|
+
private
|
124
|
+
##
|
125
|
+
# Convert Solr responses of various json.nl flavors to
|
126
|
+
def list_as_hash solr_list
|
127
|
+
# map
|
128
|
+
if solr_list.values.first.is_a? Hash
|
129
|
+
solr_list
|
130
|
+
else
|
131
|
+
solr_list.each_with_object({}) do |(key, values), hash|
|
132
|
+
hash[key] = if values.first.is_a? Array
|
133
|
+
# arrarr
|
134
|
+
Hash[values]
|
135
|
+
else
|
136
|
+
# flat
|
137
|
+
Hash[values.each_slice(2).to_a]
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
##
|
144
|
+
# Convert Solr's facet_field response into
|
145
|
+
# a hash of Blacklight::SolrResponse::Facet::FacetField objects
|
146
|
+
def facet_field_aggregations
|
147
|
+
list_as_hash(facet_fields).each_with_object({}) do |(facet_field_name, values), hash|
|
148
|
+
items = []
|
149
|
+
options = {}
|
150
|
+
values.each do |value, hits|
|
151
|
+
i = FacetItem.new(value: value, hits: hits)
|
152
|
+
|
153
|
+
# solr facet.missing serialization
|
154
|
+
if value.nil?
|
155
|
+
i.label = I18n.t(:"blacklight.search.fields.facet.missing.#{facet_field_name}", default: [:"blacklight.search.facets.missing"])
|
156
|
+
i.fq = "-#{facet_field_name}:[* TO *]"
|
157
|
+
end
|
158
|
+
|
159
|
+
items << i
|
160
|
+
end
|
161
|
+
options[:sort] = (params[:"f.#{facet_field_name}.facet.sort"] || params[:'facet.sort'])
|
162
|
+
if params[:"f.#{facet_field_name}.facet.limit"] || params[:"facet.limit"]
|
163
|
+
options[:limit] = (params[:"f.#{facet_field_name}.facet.limit"] || params[:"facet.limit"]).to_i
|
164
|
+
end
|
165
|
+
|
166
|
+
if params[:"f.#{facet_field_name}.facet.offset"] || params[:'facet.offset']
|
167
|
+
options[:offset] = (params[:"f.#{facet_field_name}.facet.offset"] || params[:'facet.offset']).to_i
|
168
|
+
end
|
169
|
+
|
170
|
+
hash[facet_field_name] = FacetField.new(facet_field_name, items, options)
|
171
|
+
|
172
|
+
if blacklight_config and !blacklight_config.facet_fields[facet_field_name]
|
173
|
+
# alias all the possible blacklight config names..
|
174
|
+
blacklight_config.facet_fields.select { |k,v| v.field == facet_field_name }.each do |key,_|
|
175
|
+
hash[key] = hash[facet_field_name]
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# Aggregate Solr's facet_query response into the virtual facet fields defined
|
183
|
+
# in the blacklight configuration
|
184
|
+
def facet_query_aggregations
|
185
|
+
return {} unless blacklight_config
|
186
|
+
|
187
|
+
blacklight_config.facet_fields.select { |k,v| v.query }.each_with_object({}) do |(field_name, facet_field), hash|
|
188
|
+
salient_facet_queries = facet_field.query.map { |k, x| x[:fq] }
|
189
|
+
items = []
|
190
|
+
facet_queries.select { |k,v| salient_facet_queries.include?(k) }.reject { |value, hits| hits == 0 }.map do |value,hits|
|
191
|
+
salient_fields = facet_field.query.select { |key, val| val[:fq] == value }
|
192
|
+
key = ((salient_fields.keys if salient_fields.respond_to? :keys) || salient_fields.first).first
|
193
|
+
items << Blacklight::SolrResponse::Facets::FacetItem.new(value: key, hits: hits, label: facet_field.query[key][:label])
|
194
|
+
end
|
195
|
+
|
196
|
+
hash[field_name] = Blacklight::SolrResponse::Facets::FacetField.new field_name, items
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
##
|
201
|
+
# Convert Solr's facet_pivot response into
|
202
|
+
# a hash of Blacklight::SolrResponse::Facet::FacetField objects
|
203
|
+
def facet_pivot_aggregations
|
204
|
+
facet_pivot.each_with_object({}) do |(field_name, values), hash|
|
205
|
+
items = []
|
206
|
+
values.map do |lst|
|
207
|
+
items << construct_pivot_field(lst)
|
208
|
+
end
|
209
|
+
|
210
|
+
if blacklight_config and !blacklight_config.facet_fields[field_name]
|
211
|
+
# alias all the possible blacklight config names..
|
212
|
+
blacklight_config.facet_fields.select { |k,v| v.pivot and v.pivot.join(",") == field_name }.each do |key, _|
|
213
|
+
hash[key] = Blacklight::SolrResponse::Facets::FacetField.new key, items
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
##
|
220
|
+
# Recursively parse the pivot facet response to build up the full pivot tree
|
221
|
+
def construct_pivot_field lst, parent_fq = {}
|
222
|
+
items = []
|
223
|
+
|
224
|
+
lst[:pivot].each do |i|
|
225
|
+
items << construct_pivot_field(i, parent_fq.merge({ lst[:field] => lst[:value] }))
|
226
|
+
end if lst[:pivot]
|
227
|
+
|
228
|
+
Blacklight::SolrResponse::Facets::FacetItem.new(value: lst[:value], hits: lst[:count], field: lst[:field], items: items, fq: parent_fq)
|
229
|
+
end
|
230
|
+
|
123
231
|
|
124
232
|
end # end Facets
|
@@ -25,7 +25,7 @@ class Blacklight::SolrResponse::GroupResponse
|
|
25
25
|
def total
|
26
26
|
# ngroups is only available in Solr 4.1+
|
27
27
|
# fall back on the number of facet items for that field?
|
28
|
-
(group["ngroups"] || (response.
|
28
|
+
(group["ngroups"] || (response.aggregations[key] || []).length).to_s.to_i
|
29
29
|
end
|
30
30
|
|
31
31
|
def start
|
@@ -14,21 +14,4 @@ module Blacklight::SolrResponse::PaginationMethods
|
|
14
14
|
def total_count #:nodoc:
|
15
15
|
total
|
16
16
|
end
|
17
|
-
|
18
|
-
def model_name
|
19
|
-
if !docs.empty? and docs.first.respond_to? :model_name
|
20
|
-
docs.first.model_name
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
## Methods in kaminari master that we'd like to use today.
|
25
|
-
# Next page number in the collection
|
26
|
-
def next_page
|
27
|
-
current_page + 1 unless last_page?
|
28
|
-
end
|
29
|
-
|
30
|
-
# Previous page number in the collection
|
31
|
-
def prev_page
|
32
|
-
current_page - 1 unless first_page?
|
33
|
-
end
|
34
17
|
end
|
@@ -6,6 +6,7 @@ module Blacklight
|
|
6
6
|
argument :model_name , type: :string , default: "user"
|
7
7
|
argument :controller_name, type: :string , default: "catalog"
|
8
8
|
argument :document_name, type: :string , default: "solr_document"
|
9
|
+
argument :search_builder_name, type: :string , default: "search_builder"
|
9
10
|
|
10
11
|
class_option :devise , type: :boolean, default: false, aliases: "-d", desc: "Use Devise as authentication logic."
|
11
12
|
class_option :jettywrapper, type: :boolean, default: false, desc: "Use jettywrapper to download and control Jetty"
|
@@ -55,6 +56,10 @@ module Blacklight
|
|
55
56
|
generate 'blacklight:document', document_name
|
56
57
|
end
|
57
58
|
|
59
|
+
def generate_search_builder
|
60
|
+
generate 'blacklight:search_builder', search_builder_name
|
61
|
+
end
|
62
|
+
|
58
63
|
def generate_blacklight_models
|
59
64
|
generate 'blacklight:models'
|
60
65
|
end
|
@@ -103,7 +108,7 @@ EOF
|
|
103
108
|
run "bundle install"
|
104
109
|
end
|
105
110
|
|
106
|
-
generate '
|
111
|
+
generate 'blacklight:marc:install'
|
107
112
|
end
|
108
113
|
end
|
109
114
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Blacklight
|
4
|
+
class SearchBuilderGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
9
|
+
argument :model_name, :type => :string , :default => "search_builder"
|
10
|
+
|
11
|
+
desc """
|
12
|
+
This generator makes the following changes to your application:
|
13
|
+
1. Creates a blacklight search builder in your /app/models directory
|
14
|
+
"""
|
15
|
+
def create_search_builder
|
16
|
+
template "search_builder.rb", "app/models/#{model_name}.rb"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -103,7 +103,7 @@ namespace :blacklight do
|
|
103
103
|
print " - fetch: "
|
104
104
|
|
105
105
|
begin
|
106
|
-
doc_id = response.
|
106
|
+
doc_id = response.documents.first.id
|
107
107
|
response, doc = controller.fetch doc_id
|
108
108
|
|
109
109
|
if response.header['status'] == 0 and doc
|
@@ -39,18 +39,18 @@ describe CatalogController do
|
|
39
39
|
it "should have docs and facets for query with results", :integration => true do
|
40
40
|
get :index, q: user_query
|
41
41
|
expect(assigns_response.docs).to_not be_empty
|
42
|
-
assert_facets_have_values(assigns_response.
|
42
|
+
assert_facets_have_values(assigns_response.aggregations)
|
43
43
|
end
|
44
44
|
it "should have docs and facets for existing facet value", :integration => true do
|
45
45
|
get :index, f: {"format" => 'Book'}
|
46
46
|
expect(assigns_response.docs).to_not be_empty
|
47
|
-
assert_facets_have_values(assigns_response.
|
47
|
+
assert_facets_have_values(assigns_response.aggregations)
|
48
48
|
end
|
49
49
|
it "should have docs and facets for non-default results per page", :integration => true do
|
50
50
|
num_per_page = 7
|
51
51
|
get :index, :per_page => num_per_page
|
52
52
|
expect(assigns_response.docs).to have(num_per_page).items
|
53
|
-
assert_facets_have_values(assigns_response.
|
53
|
+
assert_facets_have_values(assigns_response.aggregations)
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should have docs and facets for second page", :integration => true do
|
@@ -58,14 +58,14 @@ describe CatalogController do
|
|
58
58
|
get :index, :page => page
|
59
59
|
expect(assigns_response.docs).to_not be_empty
|
60
60
|
expect(assigns_response.params[:start].to_i).to eq (page-1) * @controller.blacklight_config[:default_solr_params][:rows]
|
61
|
-
assert_facets_have_values(assigns_response.
|
61
|
+
assert_facets_have_values(assigns_response.aggregations)
|
62
62
|
end
|
63
63
|
|
64
64
|
it "should have no docs or facet values for query without results", :integration => true do
|
65
65
|
get :index, q: 'sadfdsafasdfsadfsadfsadf' # query for no results
|
66
66
|
|
67
67
|
expect(assigns_response.docs).to be_empty
|
68
|
-
assigns_response.
|
68
|
+
assigns_response.aggregations.each do |key, facet|
|
69
69
|
expect(facet.items).to be_empty
|
70
70
|
end
|
71
71
|
end
|
@@ -97,7 +97,7 @@ describe CatalogController do
|
|
97
97
|
end
|
98
98
|
it "should get facets when no query", :integration => true do
|
99
99
|
get :index
|
100
|
-
assert_facets_have_values(assigns_response.
|
100
|
+
assert_facets_have_values(assigns_response.aggregations)
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
@@ -737,10 +737,10 @@ end
|
|
737
737
|
|
738
738
|
|
739
739
|
# there must be at least one facet, and each facet must have at least one value
|
740
|
-
def assert_facets_have_values(
|
741
|
-
expect(
|
740
|
+
def assert_facets_have_values(aggregations)
|
741
|
+
expect(aggregations).to_not be_empty
|
742
742
|
# should have at least one value for each facet
|
743
|
-
|
743
|
+
aggregations.each do |key, facet|
|
744
744
|
expect(facet.items).to have_at_least(1).item
|
745
745
|
end
|
746
746
|
end
|
@@ -207,203 +207,53 @@ describe BlacklightHelper do
|
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
|
-
describe "render_index_field_value" do
|
210
|
+
describe "#render_index_field_value" do
|
211
|
+
let(:presenter) { double }
|
211
212
|
before do
|
212
|
-
|
213
|
-
config.add_index_field 'qwer'
|
214
|
-
config.add_index_field 'asdf', :helper_method => :render_asdf_index_field
|
215
|
-
config.add_index_field 'link_to_search_true', :link_to_search => true
|
216
|
-
config.add_index_field 'link_to_search_named', :link_to_search => :some_field
|
217
|
-
config.add_index_field 'highlight', :highlight => true
|
218
|
-
config.add_index_field 'solr_doc_accessor', :accessor => true
|
219
|
-
config.add_index_field 'explicit_accessor', :accessor => :solr_doc_accessor
|
220
|
-
config.add_index_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
|
221
|
-
end
|
222
|
-
allow(helper).to receive(:blacklight_config).and_return(@config)
|
223
|
-
end
|
224
|
-
|
225
|
-
it "should check for an explicit value" do
|
226
|
-
doc = double()
|
227
|
-
expect(doc).to_not receive(:get).with('asdf', :sep => nil)
|
228
|
-
value = helper.render_index_field_value :value => 'asdf', :document => doc, :field => 'asdf'
|
229
|
-
expect(value).to eq 'asdf'
|
213
|
+
allow(helper).to receive(:presenter).with(doc).and_return(presenter)
|
230
214
|
end
|
231
215
|
|
232
|
-
|
233
|
-
|
234
|
-
allow(doc).to receive(:get).with('asdf', :sep => nil)
|
235
|
-
allow(helper).to receive(:render_asdf_index_field).and_return('custom asdf value')
|
236
|
-
value = helper.render_index_field_value :document => doc, :field => 'asdf'
|
237
|
-
expect(value).to eq 'custom asdf value'
|
238
|
-
end
|
239
|
-
|
240
|
-
it "should check for a link_to_search" do
|
241
|
-
doc = double()
|
242
|
-
allow(doc).to receive(:get).with('link_to_search_true', :sep => nil).and_return('x')
|
243
|
-
value = helper.render_index_field_value :document => doc, :field => 'link_to_search_true'
|
244
|
-
expect(value).to eq helper.link_to("x", helper.search_action_path(:f => { :link_to_search_true => ['x'] }))
|
245
|
-
end
|
246
|
-
|
247
|
-
it "should check for a link_to_search with a field name" do
|
248
|
-
doc = double()
|
249
|
-
allow(doc).to receive(:get).with('link_to_search_named', :sep => nil).and_return('x')
|
250
|
-
value = helper.render_index_field_value :document => doc, :field => 'link_to_search_named'
|
251
|
-
expect(value).to eq helper.link_to("x", helper.search_action_path(:f => { :some_field => ['x'] }))
|
252
|
-
end
|
253
|
-
|
254
|
-
it "should gracefully handle when no highlight field is available" do
|
255
|
-
doc = double()
|
256
|
-
expect(doc).to_not receive(:get)
|
257
|
-
allow(doc).to receive(:has_highlight_field?).and_return(false)
|
258
|
-
value = helper.render_index_field_value :document => doc, :field => 'highlight'
|
259
|
-
expect(value).to be_blank
|
260
|
-
end
|
261
|
-
|
262
|
-
it "should check for a highlighted field" do
|
263
|
-
doc = double()
|
264
|
-
expect(doc).to_not receive(:get)
|
265
|
-
allow(doc).to receive(:has_highlight_field?).and_return(true)
|
266
|
-
allow(doc).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
|
267
|
-
value = helper.render_index_field_value :document => doc, :field => 'highlight'
|
268
|
-
expect(value).to eq '<em>highlight</em>'
|
269
|
-
end
|
270
|
-
|
271
|
-
it "should check the document field value" do
|
272
|
-
doc = double()
|
273
|
-
allow(doc).to receive(:get).with('qwer', :sep => nil).and_return('document qwer value')
|
274
|
-
value = helper.render_index_field_value :document => doc, :field => 'qwer'
|
275
|
-
expect(value).to eq 'document qwer value'
|
276
|
-
end
|
277
|
-
|
278
|
-
it "should work with index fields that aren't explicitly defined" do
|
279
|
-
doc = double()
|
280
|
-
allow(doc).to receive(:get).with('mnbv', :sep => nil).and_return('document mnbv value')
|
281
|
-
value = helper.render_index_field_value :document => doc, :field => 'mnbv'
|
282
|
-
expect(value).to eq 'document mnbv value'
|
283
|
-
end
|
216
|
+
let(:doc) { double }
|
217
|
+
let(:field) { "some_field" }
|
284
218
|
|
285
|
-
it "should
|
286
|
-
|
287
|
-
|
288
|
-
expect(value).to eq "123"
|
219
|
+
it "should pass the document and field through to the presenter" do
|
220
|
+
expect(presenter).to receive(:render_index_field_value).with(field, {})
|
221
|
+
helper.render_index_field_value(doc, field)
|
289
222
|
end
|
290
223
|
|
291
|
-
it "should
|
292
|
-
|
293
|
-
|
294
|
-
expect(value).to eq "123"
|
224
|
+
it "should allow the document and field to be passed as hash arguments" do
|
225
|
+
expect(presenter).to receive(:render_index_field_value).with(field, {})
|
226
|
+
helper.render_index_field_value(document: doc, field: field)
|
295
227
|
end
|
296
228
|
|
297
|
-
it "should
|
298
|
-
|
299
|
-
|
300
|
-
value = helper.render_index_field_value :document => doc, :field => 'explicit_accessor_with_arg'
|
301
|
-
expect(value).to eq "123"
|
229
|
+
it "should allow additional options to be passed to the presenter" do
|
230
|
+
expect(presenter).to receive(:render_index_field_value).with(field, x: 1)
|
231
|
+
helper.render_index_field_value(document: doc, field: field, x: 1)
|
302
232
|
end
|
303
233
|
end
|
304
|
-
|
305
|
-
describe "render_document_show_field_value" do
|
234
|
+
|
235
|
+
describe "#render_document_show_field_value" do
|
236
|
+
let(:presenter) { double }
|
306
237
|
before do
|
307
|
-
|
308
|
-
config.add_show_field 'qwer'
|
309
|
-
config.add_show_field 'asdf', :helper_method => :render_asdf_document_show_field
|
310
|
-
config.add_show_field 'link_to_search_true', :link_to_search => true
|
311
|
-
config.add_show_field 'link_to_search_named', :link_to_search => :some_field
|
312
|
-
config.add_show_field 'highlight', :highlight => true
|
313
|
-
config.add_show_field 'solr_doc_accessor', :accessor => true
|
314
|
-
config.add_show_field 'explicit_accessor', :accessor => :solr_doc_accessor
|
315
|
-
config.add_show_field 'explicit_array_accessor', :accessor => [:solr_doc_accessor, :some_method]
|
316
|
-
config.add_show_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
|
317
|
-
end
|
318
|
-
|
319
|
-
allow(helper).to receive(:blacklight_config).and_return(@config)
|
320
|
-
end
|
321
|
-
|
322
|
-
it "should check for an explicit value" do
|
323
|
-
doc = double()
|
324
|
-
expect(doc).to_not receive(:get).with('asdf', :sep => nil)
|
325
|
-
expect(helper).to_not receive(:render_asdf_document_show_field)
|
326
|
-
value = helper.render_document_show_field_value :value => 'asdf', :document => doc, :field => 'asdf'
|
327
|
-
expect(value).to eq 'asdf'
|
238
|
+
allow(helper).to receive(:presenter).with(doc).and_return(presenter)
|
328
239
|
end
|
329
240
|
|
330
|
-
|
331
|
-
|
332
|
-
allow(doc).to receive(:get).with('asdf', :sep => nil)
|
333
|
-
allow(helper).to receive(:render_asdf_document_show_field).and_return('custom asdf value')
|
334
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'asdf'
|
335
|
-
expect(value).to eq 'custom asdf value'
|
336
|
-
end
|
337
|
-
|
338
|
-
it "should check for a link_to_search" do
|
339
|
-
doc = double()
|
340
|
-
allow(doc).to receive(:get).with('link_to_search_true', :sep => nil).and_return('x')
|
341
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'link_to_search_true'
|
342
|
-
expect(value).to eq helper.link_to("x", helper.search_action_path(:f => { :link_to_search_true => ['x'] }))
|
343
|
-
end
|
344
|
-
|
345
|
-
it "should check for a link_to_search with a field name" do
|
346
|
-
doc = double()
|
347
|
-
allow(doc).to receive(:get).with('link_to_search_named', :sep => nil).and_return('x')
|
348
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'link_to_search_named'
|
349
|
-
expect(value).to eq helper.link_to("x", helper.search_action_path(:f => { :some_field => ['x'] }))
|
350
|
-
end
|
351
|
-
|
352
|
-
it "should gracefully handle when no highlight field is available" do
|
353
|
-
doc = double()
|
354
|
-
expect(doc).to_not receive(:get)
|
355
|
-
allow(doc).to receive(:has_highlight_field?).and_return(false)
|
356
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'highlight'
|
357
|
-
expect(value).to be_blank
|
358
|
-
end
|
359
|
-
|
360
|
-
it "should check for a highlighted field" do
|
361
|
-
doc = double()
|
362
|
-
expect(doc).to_not receive(:get)
|
363
|
-
allow(doc).to receive(:has_highlight_field?).and_return(true)
|
364
|
-
allow(doc).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
|
365
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'highlight'
|
366
|
-
expect(value).to eq '<em>highlight</em>'
|
367
|
-
end
|
368
|
-
|
369
|
-
|
370
|
-
it "should check the document field value" do
|
371
|
-
doc = double()
|
372
|
-
allow(doc).to receive(:get).with('qwer', :sep => nil).and_return('document qwer value')
|
373
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'qwer'
|
374
|
-
expect(value).to eq 'document qwer value'
|
375
|
-
end
|
376
|
-
|
377
|
-
it "should work with show fields that aren't explicitly defined" do
|
378
|
-
doc = double()
|
379
|
-
allow(doc).to receive(:get).with('mnbv', :sep => nil).and_return('document mnbv value')
|
380
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'mnbv'
|
381
|
-
expect(value).to eq 'document mnbv value'
|
382
|
-
end
|
383
|
-
|
384
|
-
it "should call an accessor on the solr document" do
|
385
|
-
doc = double(:solr_doc_accessor => "123")
|
386
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'solr_doc_accessor'
|
387
|
-
expect(value).to eq "123"
|
388
|
-
end
|
241
|
+
let(:doc) { double }
|
242
|
+
let(:field) { "some_field" }
|
389
243
|
|
390
|
-
it "should
|
391
|
-
|
392
|
-
|
393
|
-
expect(value).to eq "123"
|
244
|
+
it "should pass the document and field through to the presenter" do
|
245
|
+
expect(presenter).to receive(:render_document_show_field_value).with(field, {})
|
246
|
+
helper.render_document_show_field_value(doc, field)
|
394
247
|
end
|
395
248
|
|
396
|
-
it "should
|
397
|
-
|
398
|
-
|
399
|
-
expect(value).to eq "123"
|
249
|
+
it "should allow the document and field to be passed as hash arguments" do
|
250
|
+
expect(presenter).to receive(:render_document_show_field_value).with(field, {})
|
251
|
+
helper.render_document_show_field_value(document: doc, field: field)
|
400
252
|
end
|
401
253
|
|
402
|
-
it "should
|
403
|
-
|
404
|
-
|
405
|
-
value = helper.render_document_show_field_value :document => doc, :field => 'explicit_accessor_with_arg'
|
406
|
-
expect(value).to eq "123"
|
254
|
+
it "should allow additional options to be passed to the presenter" do
|
255
|
+
expect(presenter).to receive(:render_document_show_field_value).with(field, x: 1)
|
256
|
+
helper.render_document_show_field_value(document: doc, field: field, x: 1)
|
407
257
|
end
|
408
258
|
end
|
409
259
|
|