blacklight 7.3.0 → 7.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/helpers/blacklight/blacklight_helper_behavior.rb +2 -1
  4. data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -3
  5. data/app/helpers/blacklight/configuration_helper_behavior.rb +3 -2
  6. data/app/helpers/blacklight/layout_helper_behavior.rb +7 -0
  7. data/app/helpers/blacklight/render_partials_helper_behavior.rb +1 -9
  8. data/app/helpers/blacklight/url_helper_behavior.rb +2 -2
  9. data/app/presenters/blacklight/document_presenter.rb +74 -4
  10. data/app/presenters/blacklight/field_presenter.rb +22 -11
  11. data/app/presenters/blacklight/index_presenter.rb +9 -50
  12. data/app/presenters/blacklight/show_presenter.rb +6 -53
  13. data/app/presenters/blacklight/thumbnail_presenter.rb +14 -4
  14. data/app/services/blacklight/field_retriever.rb +7 -1
  15. data/app/views/catalog/_document.atom.builder +1 -1
  16. data/app/views/catalog/_document.rss.builder +2 -2
  17. data/app/views/catalog/_facet_layout.html.erb +3 -3
  18. data/app/views/catalog/_opensearch_response_metadata.html.erb +3 -3
  19. data/app/views/catalog/_search_results.html.erb +1 -1
  20. data/app/views/catalog/index.json.jbuilder +2 -3
  21. data/app/views/catalog/show.json.jbuilder +3 -3
  22. data/app/views/layouts/blacklight/base.html.erb +2 -2
  23. data/config/i18n-tasks.yml +1 -1
  24. data/config/locales/blacklight.ar.yml +250 -0
  25. data/config/locales/blacklight.hu.yml +8 -0
  26. data/config/locales/blacklight.nl.yml +8 -0
  27. data/config/locales/blacklight.sq.yml +9 -0
  28. data/config/locales/blacklight.zh.yml +8 -0
  29. data/lib/blacklight/configuration.rb +16 -4
  30. data/spec/features/search_spec.rb +5 -0
  31. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +4 -0
  32. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +10 -0
  33. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +5 -5
  34. data/spec/helpers/catalog_helper_spec.rb +9 -0
  35. data/spec/models/blacklight/configuration_spec.rb +32 -10
  36. data/spec/presenters/blacklight/document_presenter_spec.rb +9 -14
  37. data/spec/presenters/blacklight/show_presenter_spec.rb +23 -6
  38. data/spec/presenters/thumbnail_presenter_spec.rb +1 -2
  39. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +3 -2
  40. data/spec/views/catalog/index.html.erb_spec.rb +1 -1
  41. metadata +3 -2
@@ -357,16 +357,28 @@ module Blacklight
357
357
  ##
358
358
  # Return a list of fields for the index display that should be used for the
359
359
  # provided document. This respects any configuration made using for_display_type
360
- def index_fields_for(document)
361
- display_type = document.first(index.display_type_field)
360
+ def index_fields_for(document_or_display_type)
361
+ display_type = if document_or_display_type.is_a? Blacklight::Document
362
+ Deprecation.warn self, "Calling index_fields_for with a #{document_or_display_type.class} is deprecated and will be removed in Blacklight 8. Pass the display type instead."
363
+ document_or_display_type.first(index.display_type_field)
364
+ else
365
+ document_or_display_type
366
+ end
367
+
362
368
  for_display_type(display_type).index_fields.merge(index_fields)
363
369
  end
364
370
 
365
371
  ##
366
372
  # Return a list of fields for the show page that should be used for the
367
373
  # provided document. This respects any configuration made using for_display_type
368
- def show_fields_for(document)
369
- display_type = document.first(show.display_type_field)
374
+ def show_fields_for(document_or_display_type)
375
+ display_type = if document_or_display_type.is_a? Blacklight::Document
376
+ Deprecation.warn self, "Calling show_fields_for with a #{document_or_display_type.class} is deprecated and will be removed in Blacklight 8. Pass the display type instead."
377
+ document_or_display_type.first(show.display_type_field)
378
+ else
379
+ document_or_display_type
380
+ end
381
+
370
382
  for_display_type(display_type).show_fields.merge(show_fields)
371
383
  end
372
384
 
@@ -1,6 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe "Search Page" do
4
+ it 'declares the page language in the html lang attribute' do
5
+ visit root_path
6
+ expect(page).to have_selector('html[lang=en]')
7
+ end
8
+
4
9
  it "shows welcome" do
5
10
  visit root_path
6
11
  expect(page).to have_selector("input#q")
@@ -103,6 +103,10 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
103
103
  describe "#document_show_link_field" do
104
104
  let(:document) { SolrDocument.new id: 123, a: 1, b: 2, c: 3 }
105
105
 
106
+ before do
107
+ allow(Deprecation).to receive(:warn)
108
+ end
109
+
106
110
  it "allows single values" do
107
111
  blacklight_config.index.title_field = :a
108
112
  f = helper.document_show_link_field document
@@ -35,4 +35,14 @@ RSpec.describe Blacklight::LayoutHelperBehavior do
35
35
  expect(helper.container_classes).to eq 'container'
36
36
  end
37
37
  end
38
+
39
+ describe '#html_tag_attributes' do
40
+ before do
41
+ allow(I18n).to receive(:locale).and_return('x')
42
+ end
43
+
44
+ it 'returns the current locale as the lang' do
45
+ expect(helper.html_tag_attributes).to include lang: 'x'
46
+ end
47
+ end
38
48
  end
@@ -206,7 +206,7 @@ RSpec.describe Blacklight::UrlHelperBehavior do
206
206
  end
207
207
 
208
208
  it "consists of the document title wrapped in a <a>" do
209
- expect(Deprecation).to receive(:warn)
209
+ allow(Deprecation).to receive(:warn)
210
210
  expect(helper.link_to_document(document, :title_tsim)).to have_selector("a", text: '654321', count: 1)
211
211
  end
212
212
 
@@ -215,7 +215,7 @@ RSpec.describe Blacklight::UrlHelperBehavior do
215
215
  end
216
216
 
217
217
  it "accepts and returns a Proc" do
218
- expect(Deprecation).to receive(:warn).twice
218
+ allow(Deprecation).to receive(:warn)
219
219
  expect(helper.link_to_document(document, proc { |doc, _opts| doc[:id] + ": " + doc.first(:title_tsim) })).to have_selector("a", text: '123456: 654321', count: 1)
220
220
  end
221
221
 
@@ -223,12 +223,12 @@ RSpec.describe Blacklight::UrlHelperBehavior do
223
223
  let(:data) { { 'id' => id } }
224
224
 
225
225
  it "returns id" do
226
- expect(Deprecation).to receive(:warn)
226
+ allow(Deprecation).to receive(:warn)
227
227
  expect(helper.link_to_document(document, :title_tsim)).to have_selector("a", text: '123456', count: 1)
228
228
  end
229
229
 
230
230
  it "is html safe" do
231
- expect(Deprecation).to receive(:warn)
231
+ allow(Deprecation).to receive(:warn)
232
232
  expect(helper.link_to_document(document, :title_tsim)).to be_html_safe
233
233
  end
234
234
 
@@ -250,7 +250,7 @@ RSpec.describe Blacklight::UrlHelperBehavior do
250
250
  end
251
251
 
252
252
  it "converts the counter parameter into a data- attribute" do
253
- expect(Deprecation).to receive(:warn)
253
+ allow(Deprecation).to receive(:warn)
254
254
  expect(helper.link_to_document(document, :title_tsim, counter: 5)).to include 'data-context-href="tracking url"'
255
255
  expect(helper.main_app).to have_received(:track_test_path).with(hash_including(id: have_attributes(id: '123456'), counter: 5))
256
256
  end
@@ -46,6 +46,15 @@ RSpec.describe CatalogHelper do
46
46
  expect(html).to be_blank
47
47
  end
48
48
 
49
+ context "when response.entry_name is nil" do
50
+ it "does not raise an error" do
51
+ collection = mock_response total: 10
52
+ allow(collection).to receive(:entry_name).and_return(nil)
53
+
54
+ expect { page_entries_info(collection) }.not_to raise_error
55
+ end
56
+ end
57
+
49
58
  describe "with a single result" do
50
59
  it "uses the provided entry name" do
51
60
  response = mock_response total: 1
@@ -87,16 +87,38 @@ RSpec.describe "Blacklight::Configuration", api: true do
87
87
  let(:image) { SolrDocument.new(format: 'Image') }
88
88
  let(:sound) { SolrDocument.new(format: 'Sound') }
89
89
 
90
+ context 'with deprecated behavior' do
91
+ before do
92
+ allow(Deprecation).to receive(:warn)
93
+ end
94
+
95
+ it 'accepts documents as an argument to index_fields_for' do
96
+ config.for_display_type "Image" do |c|
97
+ c.add_index_field :dimensions
98
+ end
99
+ config.add_index_field :title
100
+ expect(config.index_fields_for(image)).to have_key 'dimensions'
101
+ end
102
+
103
+ it 'accepts documents as an argument to show_fields_for' do
104
+ config.for_display_type "Image" do |c|
105
+ c.add_show_field :dimensions
106
+ end
107
+ config.add_show_field :title
108
+ expect(config.show_fields_for(image)).to have_key 'dimensions'
109
+ end
110
+ end
111
+
90
112
  it "adds index fields just for a certain type" do
91
113
  config.for_display_type "Image" do |c|
92
114
  c.add_index_field :dimensions
93
115
  end
94
116
  config.add_index_field :title
95
117
 
96
- expect(config.index_fields_for(image)).to have_key 'dimensions'
97
- expect(config.index_fields_for(image)).to have_key 'title'
98
- expect(config.index_fields_for(sound)).not_to have_key 'dimensions'
99
- expect(config.index_fields_for(image)).to have_key 'title'
118
+ expect(config.index_fields_for('Image')).to have_key 'dimensions'
119
+ expect(config.index_fields_for('Image')).to have_key 'title'
120
+ expect(config.index_fields_for('Sound')).not_to have_key 'dimensions'
121
+ expect(config.index_fields_for('Image')).to have_key 'title'
100
122
  expect(config.index_fields).not_to have_key 'dimensions'
101
123
  end
102
124
 
@@ -106,10 +128,10 @@ RSpec.describe "Blacklight::Configuration", api: true do
106
128
  end
107
129
  config.add_show_field :title
108
130
 
109
- expect(config.show_fields_for(image)).to have_key 'dimensions'
110
- expect(config.show_fields_for(image)).to have_key 'title'
111
- expect(config.show_fields_for(sound)).not_to have_key 'dimensions'
112
- expect(config.show_fields_for(image)).to have_key 'title'
131
+ expect(config.show_fields_for('Image')).to have_key 'dimensions'
132
+ expect(config.show_fields_for('Image')).to have_key 'title'
133
+ expect(config.show_fields_for('Sound')).not_to have_key 'dimensions'
134
+ expect(config.show_fields_for('Image')).to have_key 'title'
113
135
  expect(config.show_fields).not_to have_key 'dimensions'
114
136
  end
115
137
 
@@ -121,8 +143,8 @@ RSpec.describe "Blacklight::Configuration", api: true do
121
143
  c.add_show_field :photographer
122
144
  end
123
145
 
124
- expect(config.show_fields_for(image)).to have_key 'dimensions'
125
- expect(config.show_fields_for(image)).to have_key 'photographer'
146
+ expect(config.show_fields_for('Image')).to have_key 'dimensions'
147
+ expect(config.show_fields_for('Image')).to have_key 'photographer'
126
148
  end
127
149
  end
128
150
 
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe Blacklight::DocumentPresenter do
4
- let(:presenter) { described_class.new }
4
+ let(:presenter) { described_class.new(doc, view_context) }
5
5
  let(:doc) { instance_double(SolrDocument) }
6
- let(:view_context) { double('View context', should_render_field?: true) }
7
-
8
- before do
9
- allow(presenter).to receive(:document).and_return(doc)
10
- allow(presenter).to receive(:view_context).and_return(view_context)
11
- end
6
+ let(:blacklight_config) { instance_double(Blacklight::Configuration) }
7
+ let(:view_context) { double('View context', should_render_field?: true, blacklight_config: blacklight_config) }
12
8
 
13
9
  describe '#fields_to_render' do
14
10
  subject { presenter.fields_to_render }
@@ -38,7 +34,7 @@ RSpec.describe Blacklight::DocumentPresenter do
38
34
  it { is_expected.to be true }
39
35
 
40
36
  context 'when the view context says not to render the field' do
41
- let(:view_context) { double('View context', should_render_field?: false) }
37
+ let(:view_context) { double('View context', should_render_field?: false, blacklight_config: blacklight_config) }
42
38
 
43
39
  before do
44
40
  allow(field_config).to receive_messages(if: false)
@@ -52,10 +48,10 @@ RSpec.describe Blacklight::DocumentPresenter do
52
48
  subject { presenter.send(:has_value?, field_config) }
53
49
 
54
50
  context 'when the document has the field value' do
55
- let(:field_config) { double(field: 'asdf') }
51
+ let(:field_config) { double(field: 'asdf', highlight: false, accessor: nil, default: nil, values: nil) }
56
52
 
57
53
  before do
58
- allow(doc).to receive(:has?).with('asdf').and_return(true)
54
+ allow(doc).to receive(:fetch).with('asdf', nil).and_return(['value'])
59
55
  end
60
56
 
61
57
  it { is_expected.to be true }
@@ -66,18 +62,17 @@ RSpec.describe Blacklight::DocumentPresenter do
66
62
 
67
63
  before do
68
64
  allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(true)
69
- allow(doc).to receive(:has?).with('asdf').and_return(true)
65
+ allow(doc).to receive(:highlight_field).with('asdf').and_return(['value'])
70
66
  end
71
67
 
72
68
  it { is_expected.to be true }
73
69
  end
74
70
 
75
71
  context 'when the field is a model accessor' do
76
- let(:field_config) { double(field: 'asdf', highlight: true, accessor: true) }
72
+ let(:field_config) { double(field: 'asdf', highlight: false, accessor: true) }
77
73
 
78
74
  before do
79
- allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(true)
80
- allow(doc).to receive(:has?).with('asdf').and_return(true)
75
+ allow(doc).to receive(:send).with('asdf').and_return(['value'])
81
76
  end
82
77
 
83
78
  it { is_expected.to be true }
@@ -122,6 +122,7 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
122
122
  config.add_show_field 'solr_doc_accessor', accessor: true
123
123
  config.add_show_field 'explicit_accessor', accessor: :solr_doc_accessor
124
124
  config.add_show_field 'explicit_array_accessor', accessor: [:solr_doc_accessor, :some_method]
125
+ config.add_show_field 'explicit_values', values: ->(_config, _doc) { ['some-value'] }
125
126
  end
126
127
  end
127
128
 
@@ -248,6 +249,14 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
248
249
  expect(subject).to eq '123'
249
250
  end
250
251
  end
252
+
253
+ context 'when the values lambda is provided' do
254
+ let(:field_name) { 'explicit_values' }
255
+
256
+ it 'calls the accessors on the return of the preceeding' do
257
+ expect(subject).to eq 'some-value'
258
+ end
259
+ end
251
260
  end
252
261
 
253
262
  describe '#fields' do
@@ -271,17 +280,21 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
271
280
  it "returns the value of the field" do
272
281
  config.show.title_field = :x
273
282
  allow(document).to receive(:has?).with(:x).and_return(true)
274
- allow(document).to receive(:[]).with(:x).and_return("value")
283
+ allow(document).to receive(:fetch).with(:x, nil).and_return("value")
275
284
  expect(subject.heading).to eq "value"
276
285
  end
277
286
 
278
287
  it "returns the first present value" do
279
288
  config.show.title_field = [:x, :y]
280
- allow(document).to receive(:has?).with(:x).and_return(false)
281
- allow(document).to receive(:has?).with(:y).and_return(true)
282
- allow(document).to receive(:[]).with(:y).and_return("value")
289
+ allow(document).to receive(:fetch).with(:x, nil).and_return(nil)
290
+ allow(document).to receive(:fetch).with(:y, nil).and_return("value")
283
291
  expect(subject.heading).to eq "value"
284
292
  end
293
+
294
+ it "can use explicit field configuration" do
295
+ config.show.title_field = Blacklight::Configuration::Field.new(field: 'x', values: ->(*_) { 'hardcoded' })
296
+ expect(subject.heading).to eq 'hardcoded'
297
+ end
285
298
  end
286
299
 
287
300
  describe "#html_title" do
@@ -299,11 +312,15 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
299
312
 
300
313
  it "returns the first present value" do
301
314
  config.show.html_title_field = [:x, :y]
302
- allow(document).to receive(:has?).with(:x).and_return(false)
303
- allow(document).to receive(:has?).with(:y).and_return(true)
315
+ allow(document).to receive(:fetch).with(:x, nil).and_return(nil)
304
316
  allow(document).to receive(:fetch).with(:y, nil).and_return("value")
305
317
  expect(subject.html_title).to eq "value"
306
318
  end
319
+
320
+ it "can use explicit field configuration" do
321
+ config.show.html_title_field = Blacklight::Configuration::Field.new(field: 'x', values: ->(*_) { 'hardcoded' })
322
+ expect(subject.html_title).to eq 'hardcoded'
323
+ end
307
324
  end
308
325
 
309
326
  describe '#field_values' do
@@ -105,14 +105,13 @@ RSpec.describe Blacklight::ThumbnailPresenter do
105
105
  end
106
106
 
107
107
  it "creates an image tag from the given field" do
108
- allow(document).to receive(:first).with(:xyz).and_return("http://example.com/some.jpg")
108
+ allow(document).to receive(:fetch).with(:xyz, nil).and_return("http://example.com/some.jpg")
109
109
  allow(view_context).to receive(:image_tag).with("http://example.com/some.jpg", {}).and_return('<img src="image.jpg">')
110
110
  expect(view_context).to receive(:link_to_document).with(document, '<img src="image.jpg">', {})
111
111
  subject
112
112
  end
113
113
 
114
114
  it "returns nil if no thumbnail is in the document" do
115
- allow(document).to receive(:first).with(:xyz).and_return(nil)
116
115
  expect(subject).to be_nil
117
116
  end
118
117
  end
@@ -27,14 +27,15 @@ RSpec.describe "catalog/facet_layout" do
27
27
 
28
28
  it "is collapsable" do
29
29
  render partial: 'catalog/facet_layout', locals: { facet_field: facet_field }
30
- expect(rendered).to have_selector 'button.collapsed'
30
+ expect(rendered).to have_selector 'button[data-toggle="collapse"][aria-expanded="false"]'
31
31
  expect(rendered).to have_selector '.collapse .card-body'
32
32
  end
33
33
 
34
34
  it "is configured to be open by default" do
35
35
  allow(facet_field).to receive_messages(collapse: false)
36
36
  render partial: 'catalog/facet_layout', locals: { facet_field: facet_field }
37
+ expect(rendered).to have_selector 'button[data-toggle="collapse"][aria-expanded="true"]'
37
38
  expect(rendered).not_to have_selector '.card-header.collapsed'
38
- expect(rendered).to have_selector '.show .card-body'
39
+ expect(rendered).to have_selector '.collapse.show .card-body'
39
40
  end
40
41
  end
@@ -23,7 +23,7 @@ RSpec.describe "catalog/index.html.erb" do
23
23
  stub_template "catalog/_search_header.html.erb" => "header_content"
24
24
  allow(view).to receive(:blacklight_config).and_return(Blacklight::Configuration.new)
25
25
  allow(view).to receive(:render_opensearch_response_metadata).and_return("")
26
- assign(:response, instance_double(Blacklight::Solr::Response, empty?: true))
26
+ @response = instance_double(Blacklight::Solr::Response, empty?: true, total: 11, start: 1, limit_value: 10)
27
27
  end
28
28
 
29
29
  it "renders the search_header partial" do
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: 7.3.0
4
+ version: 7.4.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: 2019-10-30 00:00:00.000000000 Z
20
+ date: 2019-11-08 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rails
@@ -503,6 +503,7 @@ files:
503
503
  - app/views/shared/_user_util_links.html.erb
504
504
  - blacklight.gemspec
505
505
  - config/i18n-tasks.yml
506
+ - config/locales/blacklight.ar.yml
506
507
  - config/locales/blacklight.de.yml
507
508
  - config/locales/blacklight.en.yml
508
509
  - config/locales/blacklight.es.yml