blacklight 5.11.3 → 5.12.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/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
|
|