blacklight-spotlight 0.29.1 → 0.30.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8aa5b0b3b677f689a7ba441aac0ab64a27ceb251
4
- data.tar.gz: 40967db22fab3aeae71a4178a36855f4367a6baa
3
+ metadata.gz: 7dd88ac0b2f47a2f72fbbaa0d7395c31ab24a86d
4
+ data.tar.gz: d15195cc46560c6ac23745bf6a46afd5cde83870
5
5
  SHA512:
6
- metadata.gz: 0432f79d47f9758d3f43f4bdd63ea33b6dca2a0e7f4e9a7864086723cb8bfc60c1b6b6bb2261ff02e483f380b7627a71914643059b7445b887c6adfea479d873
7
- data.tar.gz: d13f7995cc6c25ecc0a87963495b815e3278daf696e02c4b32a10bc86d85fb18539f0b7b2eec52acd87c6ba11ecdb97f813c5cf1b50715992cddfb1a050c76b5
6
+ metadata.gz: b9966f72907df2f6d2e945047ae2d72c37bbba13adbd2cc2df56f39b9eee4fc4df238bc85ad561d5c82f32fc18ddded497033218d81f3daeb7946c089cf15ea8
7
+ data.tar.gz: 787eafb42229bb8d5504fa7b8a97b46876079bcb348f91e5cfef39f4ce3fb7697270d41fd2aa20c2cd89e0e54a7ba39e723ad5dd8aa5e0e5c7e77d633b07f8ef
@@ -6,8 +6,7 @@ module Spotlight
6
6
  before_action :load_site
7
7
  load_and_authorize_resource :site, class: 'Spotlight::Site'
8
8
 
9
- def index
10
- end
9
+ def index; end
11
10
 
12
11
  def create
13
12
  if update_roles
@@ -8,7 +8,7 @@ module Spotlight
8
8
  load_and_authorize_resource
9
9
 
10
10
  def index
11
- @published_exhibits = @exhibits.published.ordered_by_weight.page(params[:page])
11
+ @published_exhibits = @exhibits.includes(:thumbnail).published.ordered_by_weight.page(params[:page])
12
12
  @published_exhibits = @published_exhibits.tagged_with(params[:tag]) if params[:tag]
13
13
 
14
14
  if @exhibits.one?
@@ -38,8 +38,7 @@ module Spotlight
38
38
  end
39
39
 
40
40
  # GET /exhibits/1/pages/new
41
- def new
42
- end
41
+ def new; end
43
42
 
44
43
  # GET /pages/1/edit
45
44
  def edit
@@ -13,10 +13,9 @@ module Spotlight
13
13
  load_and_authorize_resource :exhibit, class: Spotlight::Exhibit
14
14
 
15
15
  def create
16
- file = csv_params[:url]
17
- csv = CSV.parse(file.read, headers: true, return_headers: false, encoding: 'utf-8').map(&:to_hash)
16
+ csv = CSV.parse(csv_io_param, headers: true, return_headers: false).map(&:to_hash)
18
17
  Spotlight::AddUploadsFromCSV.perform_later(csv, current_exhibit, current_user)
19
- flash[:notice] = t('spotlight.resources.upload.csv.success', file_name: file.original_filename)
18
+ flash[:notice] = t('spotlight.resources.upload.csv.success', file_name: csv_io_name)
20
19
  redirect_back(fallback_location: spotlight.exhibit_resources_path(current_exhibit))
21
20
  end
22
21
 
@@ -37,6 +36,29 @@ module Spotlight
37
36
  def data_param_keys
38
37
  Spotlight::Resources::Upload.fields(current_exhibit).map(&:field_name) + current_exhibit.custom_fields.map(&:field)
39
38
  end
39
+
40
+ # Gets an IO-like object for the CSV parser to use.
41
+ # @return IO
42
+ def csv_io_param
43
+ file_or_io = csv_params[:url]
44
+ io = if file_or_io.respond_to?(:to_io)
45
+ file_or_io.to_io
46
+ else
47
+ file_or_io
48
+ end
49
+
50
+ io.set_encoding('utf-8')
51
+ end
52
+
53
+ def csv_io_name
54
+ file_or_io = csv_params[:url]
55
+
56
+ if file_or_io.respond_to? :original_filename
57
+ file_or_io.original_filename
58
+ else
59
+ t('spotlight.resources.upload.csv.anonymous_file')
60
+ end
61
+ end
40
62
  end
41
63
  end
42
64
  end
@@ -6,11 +6,9 @@ module Spotlight
6
6
  before_action :load_site
7
7
  load_and_authorize_resource
8
8
 
9
- def edit
10
- end
9
+ def edit; end
11
10
 
12
- def edit_exhibits
13
- end
11
+ def edit_exhibits; end
14
12
 
15
13
  def update
16
14
  if @site.update(site_params)
@@ -15,11 +15,13 @@ module Spotlight
15
15
  url = row.delete('url')
16
16
  next unless url.present?
17
17
 
18
- Spotlight::Resources::Upload.create(
18
+ resource = Spotlight::Resources::Upload.new(
19
19
  remote_url_url: url,
20
20
  data: row,
21
21
  exhibit: exhibit
22
22
  )
23
+
24
+ resource.save_and_index
23
25
  end
24
26
  end
25
27
 
@@ -30,15 +30,13 @@ module Spotlight
30
30
  false
31
31
  end
32
32
 
33
- def before_destroy(*_args)
34
- end
33
+ def before_destroy(*_args); end
35
34
 
36
35
  def pluralize_table_names
37
36
  true
38
37
  end
39
38
 
40
- def add_autosave_association_callbacks(_arg)
41
- end
39
+ def add_autosave_association_callbacks(_arg); end
42
40
 
43
41
  # needed for Rails 4.1 + act_as_taggable
44
42
  def dangerous_attribute_method?(*_args)
@@ -515,6 +515,7 @@ en:
515
515
  upload:
516
516
  csv:
517
517
  success: "'%{file_name}' has been uploaded. An email will be sent to you once indexing is complete."
518
+ anonymous_file: '(blank)'
518
519
  new:
519
520
  single_item_form: "Single item"
520
521
  multi_item_form: "Multiple items using CSV file"
@@ -0,0 +1,6 @@
1
+ class AddDocumentIndexToSolrDocumentSidecar < ActiveRecord::Migration
2
+ def change
3
+ add_index :spotlight_solr_document_sidecars, [:exhibit_id, :document_type, :document_id], name: 'spotlight_solr_document_sidecars_exhibit_document'
4
+ add_index :spotlight_solr_document_sidecars, [:document_type, :document_id], name: 'spotlight_solr_document_sidecars_solr_document'
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Spotlight
2
- VERSION = '0.29.1'.freeze
2
+ VERSION = '0.30.0'.freeze
3
3
  end
@@ -33,6 +33,13 @@ describe Spotlight::Resources::CsvUploadController, type: :controller do
33
33
  'spotlight_upload_description_tesim' => 'A random 900 by 600 image from lorempixel',
34
34
  'spotlight_upload_attribution_tesim' => 'lorempixel.com',
35
35
  'spotlight_upload_date_tesim' => '2014'
36
+ },
37
+ {
38
+ 'url' => 'http://lorempixel.com/900/600/',
39
+ 'full_title_tesim' => 'Yet another random image to test UTF8 text',
40
+ 'spotlight_upload_description_tesim' => 'A random 900 by 600 image from lorempixel and some UTF8: Hüsker Dü',
41
+ 'spotlight_upload_attribution_tesim' => 'lorempixel.com',
42
+ 'spotlight_upload_date_tesim' => '2016'
36
43
  }
37
44
  ]
38
45
  end
@@ -0,0 +1,8 @@
1
+ example_id | status | run_time |
2
+ ----------------------------------------------------------------------------- | ------ | --------------- |
3
+ ./spec/controllers/spotlight/resources/csv_upload_controller_spec.rb[1:1:1:1] | passed | 0.50985 seconds |
4
+ ./spec/controllers/spotlight/resources/csv_upload_controller_spec.rb[1:2:1:1] | passed | 0.12143 seconds |
5
+ ./spec/controllers/spotlight/resources/csv_upload_controller_spec.rb[1:2:1:2] | passed | 0.10647 seconds |
6
+ ./spec/controllers/spotlight/resources/csv_upload_controller_spec.rb[1:2:1:3] | passed | 0.11359 seconds |
7
+ ./spec/jobs/spotlight/add_uploads_from_csv_spec.rb[1:1:1] | passed | 0.09125 seconds |
8
+ ./spec/jobs/spotlight/add_uploads_from_csv_spec.rb[1:2] | passed | 0.48251 seconds |
@@ -1 +1,4 @@
1
- url,full_title_tesim,spotlight_upload_description_tesim,spotlight_upload_attribution_tesim,spotlight_upload_date_tesim
1
+ url,full_title_tesim,spotlight_upload_description_tesim,spotlight_upload_attribution_tesim,spotlight_upload_date_tesim
2
+ http://lorempixel.com/800/500/,A random image,A random 800 by 500 image from lorempixel,lorempixel.com,2015
3
+ http://lorempixel.com/900/600/,Another random image,A random 900 by 600 image from lorempixel,lorempixel.com,2014
4
+ http://lorempixel.com/900/600/,Yet another random image to test UTF8 text,A random 900 by 600 image from lorempixel and some UTF8: Hüsker Dü,lorempixel.com,2016
@@ -0,0 +1,37 @@
1
+ describe Spotlight::AddUploadsFromCSV do
2
+ subject(:job) { described_class.new(data, exhibit, user) }
3
+ let(:exhibit) { FactoryGirl.create(:exhibit) }
4
+ let(:user) { FactoryGirl.create(:exhibit_curator, exhibit: exhibit) }
5
+ let(:data) do
6
+ [
7
+ { 'url' => 'x' },
8
+ { 'url' => 'y' }
9
+ ]
10
+ end
11
+
12
+ let(:resource_x) { instance_double(Spotlight::Resource) }
13
+ let(:resource_y) { instance_double(Spotlight::Resource) }
14
+
15
+ before do
16
+ allow(Spotlight::IndexingCompleteMailer).to receive(:documents_indexed).and_return(double(deliver_now: true))
17
+ end
18
+
19
+ context 'with empty data' do
20
+ let(:data) { [] }
21
+
22
+ it 'sends the user an email after the indexing job is complete' do
23
+ expect(Spotlight::IndexingCompleteMailer).to receive(:documents_indexed).and_return(double(deliver_now: true))
24
+ job.perform_now
25
+ end
26
+ end
27
+
28
+ it 'creates uploaded resources for each row of data' do
29
+ expect(Spotlight::Resources::Upload).to receive(:new).with(hash_including(remote_url_url: 'x')).and_return(resource_x)
30
+ expect(Spotlight::Resources::Upload).to receive(:new).with(hash_including(remote_url_url: 'y')).and_return(resource_y)
31
+
32
+ expect(resource_x).to receive(:save_and_index)
33
+ expect(resource_y).to receive(:save_and_index)
34
+
35
+ job.perform_now
36
+ end
37
+ end
@@ -98,6 +98,49 @@ RSpec.configure do |config|
98
98
  config.include BackportTestHelpers, type: :controller
99
99
  end
100
100
  config.include Spotlight::TestFeaturesHelpers, type: :feature
101
+
102
+ config.expect_with :rspec do |expectations|
103
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
104
+ end
105
+
106
+ config.default_formatter = 'doc' if config.files_to_run.one?
107
+
108
+ config.shared_context_metadata_behavior = :apply_to_host_groups
109
+
110
+ # This allows you to limit a spec run to individual examples or groups
111
+ # you care about by tagging them with `:focus` metadata. When nothing
112
+ # is tagged with `:focus`, all examples get run. RSpec also provides
113
+ # aliases for `it`, `describe`, and `context` that include `:focus`
114
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
115
+ config.filter_run_when_matching :focus
116
+
117
+ config.example_status_persistence_file_path = 'spec/examples.txt'
118
+ # Many RSpec users commonly either run the entire suite or an individual
119
+ # file, and it's useful to allow more verbose output when running an
120
+ # individual spec file.
121
+ if config.files_to_run.one?
122
+ # Use the documentation formatter for detailed output,
123
+ # unless a formatter has already been configured
124
+ # (e.g. via a command-line flag).
125
+ config.default_formatter = 'doc'
126
+ end
127
+
128
+ # Print the 10 slowest examples and example groups at the
129
+ # end of the spec run, to help surface which specs are running
130
+ # particularly slow.
131
+ config.profile_examples = 10
132
+
133
+ # Run specs in random order to surface order dependencies. If you find an
134
+ # order dependency and want to debug it, you can fix the order by providing
135
+ # the seed, which is printed after each run.
136
+ # --seed 1234
137
+ # config.order = :random
138
+
139
+ # Seed global randomization in this process using the `--seed` CLI option.
140
+ # Setting this allows you to use `--seed` to deterministically reproduce
141
+ # test failures related to randomization by passing the same `--seed` value
142
+ # as the one that triggered the failure.
143
+ Kernel.srand config.seed
101
144
  end
102
145
 
103
146
  def add_new_page_via_button(title = 'New Page')
@@ -1877,16 +1877,16 @@ return /******/ (function(modules) { // webpackBootstrap
1877
1877
  /* 26 */
1878
1878
  /***/ function(module, exports) {
1879
1879
 
1880
- module.exports = function(module) {
1881
- if(!module.webpackPolyfill) {
1882
- module.deprecate = function() {};
1883
- module.paths = [];
1884
- // module.parent = undefined by default
1885
- module.children = [];
1886
- module.webpackPolyfill = 1;
1887
- }
1888
- return module;
1889
- }
1880
+ module.exports = function(module) {
1881
+ if(!module.webpackPolyfill) {
1882
+ module.deprecate = function() {};
1883
+ module.paths = [];
1884
+ // module.parent = undefined by default
1885
+ module.children = [];
1886
+ module.webpackPolyfill = 1;
1887
+ }
1888
+ return module;
1889
+ }
1890
1890
 
1891
1891
 
1892
1892
  /***/ },
@@ -1899,7 +1899,7 @@ return /******/ (function(modules) { // webpackBootstrap
1899
1899
  /* 28 */
1900
1900
  /***/ function(module, exports) {
1901
1901
 
1902
- module.exports = function() { throw new Error("define cannot be used indirect"); };
1902
+ module.exports = function() { throw new Error("define cannot be used indirect"); };
1903
1903
 
1904
1904
 
1905
1905
  /***/ },
@@ -17054,7 +17054,12 @@ return /******/ (function(modules) { // webpackBootstrap
17054
17054
  if (this._scribe.getTextContent() !== '') {
17055
17055
  var fakeContent = document.createElement('div');
17056
17056
  fakeContent.innerHTML = this.getTextBlockHTML();
17057
- content = fakeContent.firstChild.innerHTML || fakeContent.innerHTML;
17057
+
17058
+ // We concatenate the content of each paragraph and take into account the new lines
17059
+ content = fakeContent.children && Array.prototype.slice.call(fakeContent.children).reduce(function (res, child) {
17060
+ return res + child.innerHTML;
17061
+ }, '') || fakeContent.innerHTML;
17062
+
17058
17063
  return content.replace(/^[\s\uFEFF\xA0]+|$/g, '');
17059
17064
  }
17060
17065
  return content;
@@ -18790,7 +18795,7 @@ return /******/ (function(modules) { // webpackBootstrap
18790
18795
  _this3.deleteEl.classList.remove("active");
18791
18796
  };
18792
18797
 
18793
- this.ui.insertAdjacentHTML("beforeend", DELETE_TEMPLATE);
18798
+ this.ui.insertAdjacentHTML("beforeend", DELETE_TEMPLATE());
18794
18799
  Events.delegate(this.el, ".js-st-block-confirm-delete", "click", this.onDeleteConfirm);
18795
18800
  Events.delegate(this.el, ".js-st-block-deny-delete", "click", onDeleteDeny);
18796
18801
  },
@@ -18882,19 +18887,8 @@ return /******/ (function(modules) { // webpackBootstrap
18882
18887
  return;
18883
18888
  }
18884
18889
 
18885
- var ctrlDown = false;
18886
-
18887
- Events.delegate(block.el, '.st-text-block', 'keyup', function (ev) {
18888
- if (ev.which === 17 || ev.which === 224 || ev.which === 91) {
18889
- ctrlDown = false;
18890
- }
18891
- });
18892
18890
  Events.delegate(block.el, '.st-text-block', 'keydown', function (ev) {
18893
- if (ev.which === 17 || ev.which === 224 || ev.which === 91) {
18894
- ctrlDown = true;
18895
- }
18896
-
18897
- if (ev.which === cmd.keyCode && ctrlDown) {
18891
+ if ((ev.metaKey || ev.ctrlKey) && ev.keyCode === cmd.keyCode) {
18898
18892
  ev.preventDefault();
18899
18893
  block.execTextBlockCommand(cmd.cmd);
18900
18894
  }
@@ -19625,9 +19619,11 @@ return /******/ (function(modules) { // webpackBootstrap
19625
19619
  /* 252 */
19626
19620
  /***/ function(module, exports) {
19627
19621
 
19628
- 'use strict';
19622
+ "use strict";
19629
19623
 
19630
- module.exports = '\n <div class="st-block__ui-delete-controls">\n <label class="st-block__delete-label">\n ' + i18n.t('general:delete') + '\n </label>\n <button class=\'st-block-ui__confirm js-st-block-confirm-delete\' type="button">\n ' + i18n.t('general:yes') + '\n </button>\n <button class=\'st-block-ui__confirm js-st-block-deny-delete\' type="button">\n ' + i18n.t('general:no') + '\n </button>\n </div>\n';
19624
+ module.exports = function () {
19625
+ return '\n <div class="st-block__ui-delete-controls">\n <label class="st-block__delete-label">\n ' + i18n.t('general:delete') + '\n </label>\n <button class=\'st-block-ui__confirm js-st-block-confirm-delete\' type="button">\n ' + i18n.t('general:yes') + '\n </button>\n <button class=\'st-block-ui__confirm js-st-block-deny-delete\' type="button">\n ' + i18n.t('general:no') + '\n </button>\n </div>\n ';
19626
+ };
19631
19627
 
19632
19628
  /***/ },
19633
19629
  /* 253 */
@@ -19764,6 +19760,14 @@ return /******/ (function(modules) { // webpackBootstrap
19764
19760
 
19765
19761
  range.setStartBefore(scribe.el.firstChild, 0);
19766
19762
 
19763
+ var node = range.endContainer.nodeType === 3 ? range.endContainer.parentNode : range.endContainer;
19764
+
19765
+ // We make sure that the caret must be inside the first element to consider
19766
+ // it at the beginning of the block
19767
+ if (scribe.el.firstChild !== node) {
19768
+ return false;
19769
+ }
19770
+
19767
19771
  return rangeToHTML(range, false) === '';
19768
19772
  };
19769
19773
 
@@ -20499,8 +20503,8 @@ return /******/ (function(modules) { // webpackBootstrap
20499
20503
  if (_.isUndefined(data.status_url)) {
20500
20504
  data.status_url = '';
20501
20505
  }
20502
- var iframe = this.inner.querySelector('iframe');
20503
- Dom.remove(iframe);
20506
+ var twitterwidget = this.inner.querySelector('twitterwidget');
20507
+ Dom.remove(twitterwidget);
20504
20508
 
20505
20509
  this.inner.insertAdjacentHTML("afterbegin", tweet_template(data));
20506
20510
 
@@ -21632,4 +21636,4 @@ return /******/ (function(modules) { // webpackBootstrap
21632
21636
  17
21633
21637
  /******/ ])))
21634
21638
  });
21635
- ;
21639
+ ;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blacklight-spotlight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.1
4
+ version: 0.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Beer
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-09-26 00:00:00.000000000 Z
14
+ date: 2016-12-08 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -541,34 +541,28 @@ dependencies:
541
541
  requirements:
542
542
  - - "~>"
543
543
  - !ruby/object:Gem::Version
544
- version: '0.41'
545
- - - ">="
546
- - !ruby/object:Gem::Version
547
- version: 0.41.2
544
+ version: '0.45'
548
545
  type: :development
549
546
  prerelease: false
550
547
  version_requirements: !ruby/object:Gem::Requirement
551
548
  requirements:
552
549
  - - "~>"
553
550
  - !ruby/object:Gem::Version
554
- version: '0.41'
555
- - - ">="
556
- - !ruby/object:Gem::Version
557
- version: 0.41.2
551
+ version: '0.45'
558
552
  - !ruby/object:Gem::Dependency
559
553
  name: rubocop-rspec
560
554
  requirement: !ruby/object:Gem::Requirement
561
555
  requirements:
562
- - - ">="
556
+ - - "~>"
563
557
  - !ruby/object:Gem::Version
564
- version: '0'
558
+ version: '1.8'
565
559
  type: :development
566
560
  prerelease: false
567
561
  version_requirements: !ruby/object:Gem::Requirement
568
562
  requirements:
569
- - - ">="
563
+ - - "~>"
570
564
  - !ruby/object:Gem::Version
571
- version: '0'
565
+ version: '1.8'
572
566
  - !ruby/object:Gem::Dependency
573
567
  name: poltergeist
574
568
  requirement: !ruby/object:Gem::Requirement
@@ -1128,6 +1122,7 @@ files:
1128
1122
  - db/migrate/20160711121314_add_default_view_to_spotlight_searches.rb
1129
1123
  - db/migrate/20160815165432_add_resource_to_solr_document_sidecar.rb
1130
1124
  - db/migrate/20160816165432_add_index_status_to_solr_document_sidecar.rb
1125
+ - db/migrate/20160929180534_add_document_index_to_solr_document_sidecar.rb
1131
1126
  - lib/blacklight/spotlight.rb
1132
1127
  - lib/generators/spotlight/install_generator.rb
1133
1128
  - lib/generators/spotlight/scaffold_resource_generator.rb
@@ -1173,6 +1168,7 @@ files:
1173
1168
  - spec/controllers/spotlight/tags_controller_spec.rb
1174
1169
  - spec/controllers/spotlight/versions_controller_spec.rb
1175
1170
  - spec/controllers/spotlight/view_configurations_controller_spec.rb
1171
+ - spec/examples.txt
1176
1172
  - spec/factories/contacts.rb
1177
1173
  - spec/factories/custom_fields.rb
1178
1174
  - spec/factories/exhibits.rb
@@ -1248,6 +1244,7 @@ files:
1248
1244
  - spec/helpers/spotlight/roles_helper_spec.rb
1249
1245
  - spec/helpers/spotlight/search_configurations_helper_spec.rb
1250
1246
  - spec/helpers/spotlight/title_helper_spec.rb
1247
+ - spec/jobs/spotlight/add_uploads_from_csv_spec.rb
1251
1248
  - spec/jobs/spotlight/default_thumbnail_job_spec.rb
1252
1249
  - spec/jobs/spotlight/reindex_job_spec.rb
1253
1250
  - spec/jobs/spotlight/rename_sidecar_field_job_spec.rb
@@ -1409,7 +1406,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1409
1406
  version: '0'
1410
1407
  requirements: []
1411
1408
  rubyforge_project:
1412
- rubygems_version: 2.5.1
1409
+ rubygems_version: 2.5.2
1413
1410
  signing_key:
1414
1411
  specification_version: 4
1415
1412
  summary: Enable librarians, curators, and others who are responsible for digital collections
@@ -1444,6 +1441,7 @@ test_files:
1444
1441
  - spec/controllers/spotlight/tags_controller_spec.rb
1445
1442
  - spec/controllers/spotlight/versions_controller_spec.rb
1446
1443
  - spec/controllers/spotlight/view_configurations_controller_spec.rb
1444
+ - spec/examples.txt
1447
1445
  - spec/factories/contacts.rb
1448
1446
  - spec/factories/custom_fields.rb
1449
1447
  - spec/factories/exhibits.rb
@@ -1519,6 +1517,7 @@ test_files:
1519
1517
  - spec/helpers/spotlight/roles_helper_spec.rb
1520
1518
  - spec/helpers/spotlight/search_configurations_helper_spec.rb
1521
1519
  - spec/helpers/spotlight/title_helper_spec.rb
1520
+ - spec/jobs/spotlight/add_uploads_from_csv_spec.rb
1522
1521
  - spec/jobs/spotlight/default_thumbnail_job_spec.rb
1523
1522
  - spec/jobs/spotlight/reindex_job_spec.rb
1524
1523
  - spec/jobs/spotlight/rename_sidecar_field_job_spec.rb