blacklight_advanced_search 5.3.1 → 6.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d25fc6826f0edccf6e69175e09bd622ab304e21a
4
- data.tar.gz: d64e54527b54fe2bae942c363f953771ad763112
3
+ metadata.gz: f2ca7a7c57ac86d4f3c0dc385ef79561af1c1737
4
+ data.tar.gz: ed73c2995b52f221b639d0840ee2caef4f90fbb7
5
5
  SHA512:
6
- metadata.gz: e8488838860c7746f5ab351ceed56ecb2fb0f5825f832a491342c1d563e137c98a01c78d12976c9358ff70653ff42dc7d85642bf6b82da6b88384f5b60c88238
7
- data.tar.gz: cdb92d6f7b7f77f811211498118f0df17060d97177727427948a1e4e1ec3253b14a7bd736a68090645a71ebe6f30e75d9b641f6a8277cf326d43a93a423865c6
6
+ metadata.gz: d8dd353a79541d70fe0d026fb69d12c6957921c2805955533b2b0e181bd426a5ec0ce65f3e1feb06b7a1b9756a10ea364d1481f821127d0e91427ac187aad914
7
+ data.tar.gz: 17af4c42eb38f9649659c9667150c9a50a7bca920ce077fdaed12d90d7357be0ad3ca1aa0fd560dbd8c2ea695c340cef25d4ae9e2f342088dbb56afa484e4d7e
data/.travis.yml CHANGED
@@ -6,6 +6,9 @@ rvm:
6
6
  - 2.1
7
7
  # - 1.9.3
8
8
  # - jruby-19mode
9
+ before_install:
10
+ - rvm @global do gem uninstall bundler -a -x
11
+ - rvm @global do gem install bundler -v 1.10.6
9
12
 
10
13
  notifications:
11
14
  irc: "irc.freenode.org#blacklight"
data/README.md CHANGED
@@ -64,11 +64,7 @@ If your application uses a single Solr qt request handler for all its search fie
64
64
 
65
65
  ### Expression parsing in ordinary search
66
66
 
67
- Turn this feature on by adding to your CatalogController definition:
68
-
69
- self.search_params_logic << :add_advanced_parse_q_to_solr
70
-
71
- And/or, if you've switched over to configuration in SearchBuilder, then to your ./app/models/search_builder.rb:
67
+ Turn this feature on by adding to your SearchBuilder definition:
72
68
 
73
69
  self.default_processor_chain << :add_advanced_parse_q_to_solr
74
70
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.3.1
1
+ 6.0.0
@@ -9,11 +9,17 @@ class BlacklightAdvancedSearch::AdvancedController < CatalogController
9
9
  end
10
10
 
11
11
  protected
12
+
13
+ # Override to use the engine routes
14
+ def search_action_url options = {}
15
+ blacklight_advanced_search_engine.url_for(options.merge(action: 'index'))
16
+ end
17
+
12
18
  def get_advanced_search_facets
13
19
  # We want to find the facets available for the current search, but:
14
20
  # * IGNORING current query (add in facets_for_advanced_search_form filter)
15
21
  # * IGNORING current advanced search facets (remove add_advanced_search_to_solr filter)
16
- response, _ = search_results(params, search_params_logic) do |search_builder|
22
+ response, _ = search_results(params) do |search_builder|
17
23
  search_builder.except(:add_advanced_search_to_solr).append(:facets_for_advanced_search_form)
18
24
  end
19
25
 
@@ -5,9 +5,9 @@
5
5
  </div>
6
6
  <% end %>
7
7
 
8
- <%= form_tag catalog_index_path, :class => 'advanced form-horizontal', :method => :get do %>
8
+ <%= form_tag search_catalog_path, :class => 'advanced form-horizontal', :method => :get do %>
9
9
 
10
- <%= render_hash_as_hidden_fields(params_for_search(advanced_search_context, {})) %>
10
+ <%= render_hash_as_hidden_fields(search_state.params_for_search(advanced_search_context)) %>
11
11
 
12
12
  <div class="input-criteria">
13
13
 
@@ -1,12 +1,12 @@
1
1
  <div class="sort-buttons pull-left">
2
2
  <%= label_tag(:sort, t('blacklight_advanced_search.form.sort_label'), :class => "control-label") %>
3
3
 
4
- <%= select_tag(:sort, options_for_select(sort_fields, h(params[:sort])), :class => "form-control sort-select") %>
4
+ <%= select_tag(:sort, options_for_select(sort_fields, h(current_sort_field && current_sort_field.key)), :class => "form-control sort-select") %>
5
5
  <%= hidden_field_tag(:search_field, blacklight_config.advanced_search[:url_key]) %>
6
6
  </div>
7
7
 
8
8
  <div class="submit-buttons pull-right">
9
- <%= link_to t('blacklight_advanced_search.form.start_over'), advanced_search_path, :class =>"btn btn-default advanced-search-start-over" %>
9
+ <%= link_to t('blacklight_advanced_search.form.start_over'), blacklight_advanced_search_engine.advanced_search_path, :class =>"btn btn-default advanced-search-start-over" %>
10
10
 
11
11
  <%= submit_tag t('blacklight_advanced_search.form.search_btn'), :class=>'btn btn-primary advanced-search-submit', :id => "advanced-search-submit" %>
12
- </div>
12
+ </div>
@@ -4,7 +4,7 @@
4
4
 
5
5
  <h1 class="advanced page-header">
6
6
  <%= t('blacklight_advanced_search.form.title') %>
7
- <%= link_to t('blacklight_advanced_search.form.start_over'), advanced_search_path, :class =>"btn btn-default pull-right advanced-search-start-over" %>
7
+ <%= link_to t('blacklight_advanced_search.form.start_over'), blacklight_advanced_search_engine.advanced_search_path, :class =>"btn btn-default pull-right advanced-search-start-over" %>
8
8
  </h1>
9
9
 
10
10
  <div class="row">
@@ -18,4 +18,4 @@
18
18
 
19
19
  </div>
20
20
 
21
- </div>
21
+ </div>
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
18
  s.require_paths = ["lib"]
19
19
 
20
- s.add_dependency "blacklight", "~> 5.15"
20
+ s.add_dependency 'blacklight', '> 6.0.0.pre', '< 7'
21
21
  s.add_dependency "parslet"
22
22
 
23
23
  s.add_development_dependency "rails"
data/config/routes.rb CHANGED
@@ -1,3 +1,3 @@
1
- Rails.application.routes.draw do
2
- get 'advanced' => 'advanced#index', :as => 'advanced_search'
1
+ BlacklightAdvancedSearch::Engine.routes.draw do
2
+ get 'advanced' => 'advanced#index', as: 'advanced_search'
3
3
  end
@@ -6,40 +6,44 @@ module BlacklightAdvancedSearch
6
6
  autoload :QueryParser, 'blacklight_advanced_search/advanced_query_parser'
7
7
  autoload :ParsingNestingParser, 'blacklight_advanced_search/parsing_nesting_parser'
8
8
  autoload :FilterParser, 'blacklight_advanced_search/filter_parser'
9
- autoload :ParseBasicQ, 'blacklight_advanced_search/parse_basic_q'
10
9
  autoload :RedirectLegacyParamsFilter, 'blacklight_advanced_search/redirect_legacy_params_filter'
11
10
 
12
11
  require 'blacklight_advanced_search/version'
13
12
  require 'blacklight_advanced_search/engine'
14
-
15
- # Utility method used in our solr search logic.
16
- # Like Rails Hash#deep_merge, merges 2 hashes recursively, including nested Arrays and Hashes.
17
- # Unlike Rails Hash#deep_merge:
18
- # - will NOT merge nil values over existing ones
19
- # - will NOT merge (non-FalseClass) blank values
20
- # - WILL deduplicate values from arrays after merging them
21
- #
22
- # @param [Hash|HashWithIndifferentAccess] source_hash
23
- # @param [Hash|HashWithIndifferentAccess] new_hash
24
- # @return [Hash] the deeply merged hash
25
- # @see Rails #deep_merge http://apidock.com/rails/v4.2.1/Hash/deep_merge
26
- # @example new_hash = BlacklightAdvancedSearch.deep_merge(h1, h2)
27
- def self.deep_merge(source_hash, new_hash)
28
- source_hash.deep_merge(new_hash, &method(:merge_conflict_resolution))
29
- end
30
-
31
- # this one side-effects the first param
32
- # @see #deep_merge
33
- # @deprecated use `new_hash = BlacklightAdvancedSearch.deep_merge(h1, h2)` instead
13
+
14
+ # Utility method used in our solr search logic.
15
+ # Merges new_hash into source_hash, but will recursively
16
+ # merge nested arrays and hashes too; also will NOT merge nil
17
+ # or blank values from new_hash into source_hash, nil or blank values
18
+ # in new_hash will not overwrite values in source_hash.
34
19
  def self.deep_merge!(source_hash, new_hash)
35
- source_hash.deep_merge!(new_hash, &method(:merge_conflict_resolution))
36
- end
20
+ # We used to use built-in source_hash.merge() with a block arg
21
+ # to customize merge behavior, but that was breaking in some
22
+ # versions of BL/Rails where source_hash was a kind of HashWithIndifferentAccess,
23
+ # and hwia is unreliable in some versions of Rails. Oh well.
24
+ # https://github.com/projectblacklight/blacklight/issues/827
25
+
26
+ new_hash.each_pair do |key, new_value|
27
+ old = source_hash.fetch(key, nil)
37
28
 
38
- # the arguments are set by what the Rails Hash.deep_merge supplies the block
39
- def self.merge_conflict_resolution(_key, old, new_value)
40
- return old if new_value.nil?
41
- return old if new_value.respond_to?(:blank?) && new_value.blank? && !new_value.is_a?(FalseClass)
42
- return old | new_value if old.is_a?(Array) && new_value.is_a?(Array)
43
- new_value
44
- end
29
+ source_hash[key] =
30
+ if new_value.respond_to?(:blank) && new.blank?
31
+ old
32
+ elsif (old.kind_of?(Hash) and new_value.kind_of?(Hash))
33
+ deep_merge!(old, new_value)
34
+ old
35
+ elsif (old.kind_of?(Array) and new_value.kind_of?(Array))
36
+ old.concat(new_value).uniq
37
+ elsif new_value.nil?
38
+ # Allowing nil values to over-write on merge messes things up.
39
+ # don't set a nil value if you really want to force blank, set
40
+ # empty string.
41
+ old
42
+ else
43
+ new_value
44
+ end
45
+ end
46
+ source_hash
47
+ end
48
+
45
49
  end
@@ -9,8 +9,8 @@ module BlacklightAdvancedSearch
9
9
  (blacklight_params[:search_field] == self.blacklight_config.advanced_search[:url_key]) || blacklight_params[:f_inclusive]
10
10
  end
11
11
 
12
- # this method should get added into the search_params_logic
13
- # list, in a position AFTER normal query handling (:add_query_to_solr),
12
+ # this method should get added into the processor chain
13
+ # in a position AFTER normal query handling (:add_query_to_solr),
14
14
  # so it'll overwrite that if and only if it's an advanced search.
15
15
  # adds a 'q' and 'fq's based on advanced search form input.
16
16
  def add_advanced_search_to_solr(solr_parameters)
@@ -35,14 +35,14 @@ module BlacklightAdvancedSearch
35
35
 
36
36
  # Different versions of Parslet raise different exception classes,
37
37
  # need to figure out which one exists to rescue
38
- PARSLET_FAILED_EXCEPTIONS = if defined? Parslet::UnconsumedInput
38
+ @@parslet_failed_exceptions = if defined? Parslet::UnconsumedInput
39
39
  [Parslet::UnconsumedInput]
40
40
  else
41
41
  [Parslet::ParseFailed]
42
42
  end
43
43
 
44
44
 
45
- # This method can be included in search_params_logic to have us
45
+ # This method can be included in the SearchBuilder to have us
46
46
  # parse an ordinary entered :q for AND/OR/NOT and produce appropriate
47
47
  # Solr query.
48
48
  #
@@ -50,31 +50,30 @@ module BlacklightAdvancedSearch
50
50
  # parse and send it straight to solr same as if advanced_parse_q
51
51
  # were not being used.
52
52
  def add_advanced_parse_q_to_solr(solr_parameters)
53
- blacklight_params = scope.params
54
-
55
- return if blacklight_params[:q].blank? || !blacklight_params[:q].respond_to?(:to_str)
56
-
57
- field_def = search_field_def_for_key(blacklight_params[:search_field]) ||
58
- default_search_field
59
-
60
- # If the individual field has advanced_parse_q suppressed, punt
61
- return if field_def[:advanced_parse] == false
62
-
63
- solr_direct_params = field_def[:solr_parameters] || {}
64
- solr_local_params = field_def[:solr_local_parameters] || {}
65
-
66
- # See if we can parse it, if we can't, we're going to give up
67
- # and just allow basic search, perhaps with a warning.
68
- begin
69
- adv_search_params = ParsingNesting::Tree.parse(blacklight_params[:q], blacklight_config.advanced_search[:query_parser]).to_single_query_params(solr_local_params)
53
+ unless scope.params[:q].blank?
54
+ field_def = search_field_def_for_key( scope.params[:search_field]) ||
55
+ default_search_field
56
+
57
+
58
+ # If the individual field has advanced_parse_q suppressed, punt
59
+ return if field_def[:advanced_parse] == false
60
+
61
+ solr_direct_params = field_def[:solr_parameters] || {}
62
+ solr_local_params = field_def[:solr_local_parameters] || {}
63
+
64
+ # See if we can parse it, if we can't, we're going to give up
65
+ # and just allow basic search, perhaps with a warning.
66
+ begin
67
+ adv_search_params = ParsingNesting::Tree.parse(scope.params[:q], blacklight_config.advanced_search[:query_parser]).to_single_query_params( solr_local_params )
70
68
 
71
- BlacklightAdvancedSearch.deep_merge!(solr_parameters, solr_direct_params)
72
- BlacklightAdvancedSearch.deep_merge!(solr_parameters, adv_search_params)
73
- rescue *PARSLET_FAILED_EXCEPTIONS => e
74
- # do nothing, don't merge our input in, keep basic search
75
- # optional TODO, display error message in flash here, but hard to
76
- # display a good one.
77
- return
69
+ BlacklightAdvancedSearch.deep_merge!(solr_parameters, solr_direct_params)
70
+ BlacklightAdvancedSearch.deep_merge!(solr_parameters, adv_search_params)
71
+ rescue *@@parslet_failed_exceptions => e
72
+ # do nothing, don't merge our input in, keep basic search
73
+ # optional TODO, display error message in flash here, but hard to
74
+ # display a good one.
75
+ return
76
+ end
78
77
  end
79
78
  end
80
79
 
@@ -1,7 +1,7 @@
1
1
  require 'blacklight_advanced_search/parsing_nesting_parser'
2
2
 
3
3
  # This module gets included into CatalogController, or another SearchHelper
4
- # includer, to add behavior into search_params_logic.
4
+ # includer, to add advanced search behavior
5
5
  module BlacklightAdvancedSearch::Controller
6
6
  extend ActiveSupport::Concern
7
7
 
@@ -13,21 +13,6 @@ module BlacklightAdvancedSearch::Controller
13
13
  blacklight_config.advanced_search[:query_parser] ||= 'dismax'
14
14
  blacklight_config.advanced_search[:form_solr_parameters] ||= {}
15
15
 
16
- if respond_to? :search_params_logic
17
- # Parse app URL params used for adv searches
18
- self.search_params_logic += [:add_advanced_search_to_solr]
19
- end
20
-
21
- # Silence deprecations that occur when this code is executed before blacklight
22
- # has generated a SearchBuilder.
23
- Deprecation.silence Blacklight::Configuration do
24
- unless blacklight_config.search_builder_class.include? BlacklightAdvancedSearch::AdvancedSearchBuilder
25
- blacklight_config.search_builder_class.send(:include,
26
- BlacklightAdvancedSearch::AdvancedSearchBuilder
27
- )
28
- end
29
- end
30
-
31
16
  # Display advanced search constraints properly
32
17
  helper BlacklightAdvancedSearch::RenderConstraintsOverride
33
18
  helper BlacklightAdvancedSearch::CatalogHelperOverride
@@ -7,15 +7,27 @@ module BlacklightAdvancedSearch
7
7
  def inject_asset_requires
8
8
  generate "blacklight_advanced_search:assets"
9
9
  end
10
-
11
-
10
+
11
+ def inject_search_builder
12
+ inject_into_file 'app/models/search_builder.rb', after: /include Blacklight::Solr::SearchBuilderBehavior.*$/ do
13
+ "\n include BlacklightAdvancedSearch::AdvancedSearchBuilder" \
14
+ "\n self.default_processor_chain += [:add_advanced_parse_q_to_solr, :add_advanced_search_to_solr]"
15
+ end
16
+ end
17
+
18
+ def inject_routes
19
+ inject_into_file 'config/routes.rb', after: /mount Blacklight::Engine.*$/ do
20
+ "\n mount BlacklightAdvancedSearch::Engine => '/'\n"
21
+ end
22
+ end
23
+
12
24
  def install_localized_search_form
13
25
  if options[:force] or yes?("Install local search form with advanced link? (y/N)", :green)
14
26
  # We're going to copy the search from from actual currently loaded
15
27
  # Blacklight into local app as custom local override -- but add our link at the end too.
16
28
  source_file = File.read(File.join(Blacklight.root, "app/views/catalog/_search_form.html.erb"))
17
29
 
18
- new_file_contents = source_file + "\n\n<%= link_to 'More options', advanced_search_path(params.except(:controller, :action)), :class=>'advanced_search'%>"
30
+ new_file_contents = source_file + "\n\n<%= link_to 'More options', blacklight_advanced_search_engine.advanced_search_path(params.except(:controller, :action)), class: 'advanced_search'%>"
19
31
 
20
32
  create_file("app/views/catalog/_search_form.html.erb", new_file_contents)
21
33
  end
@@ -49,23 +49,6 @@ describe BlacklightAdvancedSearch::AdvancedSearchBuilder do
49
49
  obj.add_advanced_parse_q_to_solr(solr_params)
50
50
  expect(solr_params[:q]).to eq(unparseable_q)
51
51
  end
52
-
53
- describe 'when parslet fails' do
54
- let(:failing_q) { ")(" }
55
- let(:params) { double("params", params: { :q => failing_q }) }
56
- it 'does not return the query that could not be parsed' do
57
- obj.add_advanced_parse_q_to_solr(solr_params)
58
- expect(solr_params[:q]).to be_nil
59
- end
60
- end
61
-
62
- describe 'when `q` is a hash' do
63
- let(:params) { double("params", params: { q: { id: ['a'] } }) }
64
- it 'does not return the query that could not be parsed' do
65
- obj.add_advanced_parse_q_to_solr(solr_params)
66
- expect(solr_params[:q]).to be_nil
67
- end
68
- end
69
52
  end
70
53
 
71
54
  context "when advanced_parse is false" do
@@ -1,123 +1,45 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'BlacklightAdvancedSearch#deep_merge' do
4
- let(:hash_X) do
5
- {
6
- 'a' => 'a',
7
- 'b' => 'b',
8
- 'array1' => [1, 2],
9
- 'array2' => [3, 4],
10
- 'hash1' => { 'a' => 'a', 'array' => [1], 'b' => 'b' },
11
- 'hash2' => { 'a2' => 'a2', 'array2' => [12], 'b2' => 'b2' }
3
+ describe "BlacklightAdvancedSearch#deep_merge!" do
4
+ before do
5
+ @ahash = {"a" => "a", "b" => "b",
6
+ "array1" => [1,2], "array2" => [3,4],
7
+ "hash1" => {"a" => "a", "array" => [1], "b" => "b"},
8
+ "hash2" => {"a2" => "a2", "array2" => [12], "b2" => "b2"}
12
9
  }
13
- end
14
- let(:hash_Y) do
15
- {
16
- 'a' => 'NEW A',
17
- 'c' => 'NEW C',
18
- 'array1' => [3, 4],
19
- 'hash1' => { 'array' => [2], 'b' => 'NEW B' }
20
- }
21
- end
22
- let(:ahash) do
23
- BlacklightAdvancedSearch.deep_merge(hash_x, hash_y)
24
- end
25
-
26
- RSpec.shared_examples 'Mergable Parameters' do # this name referenced below
27
- it 'does not modify the param hashes' do
28
- dup_x = hash_x.dup
29
- dup_y = hash_y.dup
30
- expect(ahash).not_to eq hash_x # this was the old behavior
31
- expect(dup_x).to eq hash_x
32
- expect(dup_y).to eq hash_y
33
- end
34
-
35
- it 'leaves un-collided content alone' do
36
- expect(ahash['b']).to eq('b')
37
- expect(ahash['array2']).to eq([3, 4])
38
- expect(ahash['hash2']).to eq('a2' => 'a2', 'array2' => [12], 'b2' => 'b2')
39
- end
40
-
41
- it 'adds new content' do
42
- expect(ahash['c']).to eq('NEW C')
43
- end
44
-
45
- it 'merges a hash, recursive like' do
46
- expect(ahash['hash1']).to eq('a' => 'a', 'array' => [1, 2], 'b' => 'NEW B')
47
- end
48
-
49
- it 'merges boolean values (false)' do
50
- expect(BlacklightAdvancedSearch.deep_merge({ a: false }, a: true)).to eq(a: true)
51
- expect(BlacklightAdvancedSearch.deep_merge({ a: true }, a: false)).to eq(a: false)
52
- end
53
10
 
54
- it 'does not merge nil values over existing keys' do
55
- expect(BlacklightAdvancedSearch.deep_merge({ a: 1 }, a: nil)).to eq(a: 1)
56
- end
57
-
58
- it 'does merge nil values when the key is not yet present' do
59
- expect(BlacklightAdvancedSearch.deep_merge({}, a: nil)).to eq(a: nil)
60
- end
61
-
62
- it 'does not merge empty strings over existing keys' do
63
- expect(BlacklightAdvancedSearch.deep_merge({ a: 1 }, a: '')).to eq(a: 1)
64
- expect(BlacklightAdvancedSearch.deep_merge({ a: nil }, a: '')).to eq(a: nil)
65
- end
66
-
67
- it 'does not merge empty strings when the key is not yet present' do
68
- expect(BlacklightAdvancedSearch.deep_merge({}, a: '')).to eq(a: '')
69
- end
70
-
71
- context 'Arrays' do
72
- it 'merges an array' do
73
- expect(ahash['array1']).to eq([1, 2, 3, 4])
74
- end
75
-
76
- it 'collapse to uniq values when merging' do
77
- expect(BlacklightAdvancedSearch.deep_merge({ a: [1, 1, 2, 1] }, a: [3, 2])).to eq(a: [1, 2, 3])
78
- end
79
-
80
- it 'does not collapse to uniq values if not merging' do
81
- expect(BlacklightAdvancedSearch.deep_merge({ a: [1, 1, 2, 1] }, a: [])).to eq(a: [1, 1, 2, 1])
82
- end
83
- end
11
+ BlacklightAdvancedSearch.deep_merge!(@ahash, {
12
+ "a" => "NEW A",
13
+ "array1" => [3, 4],
14
+ "hash1" => {
15
+ "array" => [2],
16
+ "b" => "NEW B"
17
+ },
18
+ "c" => "NEW C"
19
+ })
84
20
  end
85
21
 
86
- describe Hash do
87
- it_behaves_like 'Mergable Parameters' do
88
- let(:hash_x) { hash_X }
89
- let(:hash_y) { hash_Y }
90
- end
91
- end
92
22
 
93
- describe HashWithIndifferentAccess do
94
- it_behaves_like 'Mergable Parameters' do
95
- let(:hash_x) { hash_X.with_indifferent_access }
96
- let(:hash_y) { hash_Y.with_indifferent_access }
97
- end
23
+ it "leaves un-collided content alone" do
24
+ expect(@ahash["b"]).to eq("b")
25
+ expect(@ahash["array2"]).to eq([3,4])
26
+ expect(@ahash["hash2"]).to eq({"a2" => "a2", "array2" => [12], "b2" => "b2"})
98
27
  end
99
28
 
100
- describe 'Mixed Hash and HWIA' do
101
- it_behaves_like 'Mergable Parameters' do
102
- let(:hash_x) { hash_X }
103
- let(:hash_y) { hash_Y.with_indifferent_access }
104
- end
29
+ it "adds new content" do
30
+ expect(@ahash["c"]).to eq("NEW C")
31
+ end
105
32
 
106
- it_behaves_like 'Mergable Parameters' do
107
- let(:hash_x) { hash_X.with_indifferent_access }
108
- let(:hash_y) { hash_Y }
109
- end
33
+ it "merges an array" do
34
+ expect(@ahash["array1"]).to eq([1,2,3,4])
110
35
  end
111
36
 
112
- # from http://apidock.com/rails/v4.2.1/Hash/deep_merge
113
- describe 'reference example' do
114
- it 'gives the same result as Rails Hash .deep_merge' do
115
- h1 = { a: true, b: { c: [1, 2, 3] } }
116
- h2 = { a: false, b: { x: [3, 4, 5] } }
117
- merged = { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
118
- expect(h1.deep_merge(h2)).to eq(merged)
119
- expect(BlacklightAdvancedSearch.deep_merge(h1, h2)).to eq(merged)
120
- end
37
+ it "merges a hash, recursive like" do
38
+ expect(@ahash["hash1"]).to eq({
39
+ "a" => "a",
40
+ "array" => [1,2],
41
+ "b" => "NEW B"
42
+ })
121
43
  end
122
44
 
123
- end
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blacklight_advanced_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.1
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
@@ -9,22 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-08 00:00:00.000000000 Z
12
+ date: 2016-01-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: blacklight
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">"
19
+ - !ruby/object:Gem::Version
20
+ version: 6.0.0.pre
21
+ - - "<"
19
22
  - !ruby/object:Gem::Version
20
- version: '5.15'
23
+ version: '7'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - "~>"
28
+ - - ">"
29
+ - !ruby/object:Gem::Version
30
+ version: 6.0.0.pre
31
+ - - "<"
26
32
  - !ruby/object:Gem::Version
27
- version: '5.15'
33
+ version: '7'
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: parslet
30
36
  requirement: !ruby/object:Gem::Requirement
@@ -150,7 +156,6 @@ files:
150
156
  - lib/blacklight_advanced_search/controller.rb
151
157
  - lib/blacklight_advanced_search/engine.rb
152
158
  - lib/blacklight_advanced_search/filter_parser.rb
153
- - lib/blacklight_advanced_search/parse_basic_q.rb
154
159
  - lib/blacklight_advanced_search/parsing_nesting_parser.rb
155
160
  - lib/blacklight_advanced_search/redirect_legacy_params_filter.rb
156
161
  - lib/blacklight_advanced_search/render_constraints_override.rb
@@ -170,7 +175,6 @@ files:
170
175
  - spec/lib/filter_parser_spec.rb
171
176
  - spec/parsing_nesting/build_tree_spec.rb
172
177
  - spec/parsing_nesting/consuming_spec.rb
173
- - spec/parsing_nesting/parse_basic_q_spec.rb
174
178
  - spec/parsing_nesting/to_solr_spec.rb
175
179
  - spec/rcov.opts
176
180
  - spec/spec.opts
@@ -196,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
200
  version: '0'
197
201
  requirements: []
198
202
  rubyforge_project: blacklight
199
- rubygems_version: 2.6.11
203
+ rubygems_version: 2.4.5.1
200
204
  signing_key:
201
205
  specification_version: 4
202
206
  summary: Blacklight Advanced Search plugin
@@ -209,7 +213,6 @@ test_files:
209
213
  - spec/lib/filter_parser_spec.rb
210
214
  - spec/parsing_nesting/build_tree_spec.rb
211
215
  - spec/parsing_nesting/consuming_spec.rb
212
- - spec/parsing_nesting/parse_basic_q_spec.rb
213
216
  - spec/parsing_nesting/to_solr_spec.rb
214
217
  - spec/rcov.opts
215
218
  - spec/spec.opts
@@ -1,73 +0,0 @@
1
- require 'parslet'
2
- require 'parsing_nesting/tree'
3
-
4
- # A solr search logic mix-in to CatalogController.
5
- # If mixed-in, adds Advanced Search parsing behavior
6
- # to queries entered on basic/standard/simple search
7
- # form too, for boolean expressions.
8
- #
9
- # simply:
10
- # include BlacklightAdvancedSearch::ParseBasicQ
11
- # in your CatalogController
12
- module BlacklightAdvancedSearch::ParseBasicQ
13
- extend ActiveSupport::Concern
14
- extend Deprecation
15
-
16
- self.deprecation_horizon = 'blacklight_advanced_search 6.0'
17
-
18
- include Blacklight::SearchFields
19
-
20
- included do
21
- self.search_params_logic += [:add_advanced_parse_q_to_solr]
22
- end
23
-
24
- # Different versions of Parslet raise different exception classes,
25
- # need to figure out which one exists to rescue
26
- PARSLET_FAILED_EXCEPTIONS = if defined? Parslet::UnconsumedInput
27
- [Parslet::UnconsumedInput]
28
- else
29
- [Parslet::ParseFailed]
30
- end
31
-
32
-
33
- # This method can be included in search_params_logic to have us
34
- # parse an ordinary entered :q for AND/OR/NOT and produce appropriate
35
- # Solr query. Note that it is NOT included in search_params_logic
36
- # by default when this module is included, because it is optional behavior.
37
- # BlacklightAdvancedSearch init code will add it to CatalogController
38
- # if it's configured to do so. You can of course add it yourself
39
- # manually too.
40
- #
41
- # Note: For syntactically invalid input, we'll just skip the adv
42
- # parse and send it straight to solr same as if advanced_parse_q
43
- # were not being used.
44
- def add_advanced_parse_q_to_solr(solr_parameters, req_params = params)
45
- unless req_params[:q].blank?
46
- field_def = search_field_def_for_key( req_params[:search_field]) ||
47
- default_search_field
48
-
49
-
50
- # If the individual field has advanced_parse_q suppressed, punt
51
- return if field_def[:advanced_parse] == false
52
-
53
- solr_direct_params = field_def[:solr_parameters] || {}
54
- solr_local_params = field_def[:solr_local_parameters] || {}
55
-
56
- # See if we can parse it, if we can't, we're going to give up
57
- # and just allow basic search, perhaps with a warning.
58
- begin
59
- adv_search_params = ParsingNesting::Tree.parse(req_params[:q], blacklight_config.advanced_search[:query_parser]).to_single_query_params( solr_local_params )
60
-
61
- BlacklightAdvancedSearch.deep_merge!(solr_parameters, solr_direct_params)
62
- BlacklightAdvancedSearch.deep_merge!(solr_parameters, adv_search_params)
63
- rescue *PARSLET_FAILED_EXCEPTIONS => e
64
- # do nothing, don't merge our input in, keep basic search
65
- # optional TODO, display error message in flash here, but hard to
66
- # display a good one.
67
- return
68
- end
69
- end
70
- end
71
- deprecation_deprecate add_advanced_parse_q_to_solr: "use AdvancedSearchBuilder.add_advanced_parse_q_to_solr"
72
-
73
- end
@@ -1,86 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe "NestingParser" do
4
-
5
- # Our ParseBasicQ mixin assumes a SolrHelper context.
6
- # SolrHelper is a controller layer mixin, which depends
7
- # on being mixed into a class which has #params (from Rails)
8
- # and #blacklight_config
9
- #
10
- # This technique of testing is copied from Blacklight solr_helper_spec.rb
11
- #
12
- # It gets kind of a mess of dependencies, sorry.
13
- class ParseBasicQTestClass
14
- cattr_accessor :blacklight_config
15
-
16
- include Blacklight::SearchHelper
17
-
18
- include BlacklightAdvancedSearch::ParseBasicQ
19
-
20
-
21
- def initialize blacklight_config
22
- self.blacklight_config = blacklight_config
23
- end
24
-
25
- def params
26
- {}
27
- end
28
-
29
- def logger
30
- Rails.logger
31
- end
32
- end
33
-
34
- describe "basic functionality" do
35
- before do
36
- @blacklight_config = Blacklight::Configuration.new do |config|
37
- config.advanced_search = {
38
-
39
- }
40
-
41
- config.add_search_field "all_fields" do |field|
42
-
43
- end
44
-
45
- config.add_search_field "special_field" do |field|
46
- field.advanced_parse = false
47
- end
48
- end
49
- @obj = ParseBasicQTestClass.new @blacklight_config
50
- end
51
-
52
- it "catches a simple example" do
53
- expect(Deprecation).to receive(:warn)
54
- solr_params = {}
55
- @obj.add_advanced_parse_q_to_solr(solr_params, :q => "one two AND three OR four")
56
-
57
- expect(solr_params[:defType]).to eq("lucene")
58
- # We're not testing succesful parsing here, just that it's doing
59
- # something that looks like we expect with subqueries.
60
- expect(solr_params[:q]).to start_with("_query_:")
61
- end
62
-
63
- it "passes through an unparseable example" do
64
- expect(Deprecation).to receive(:warn)
65
- solr_params = {}
66
- unparseable_q = "foo bar\'s AND"
67
- @obj.add_advanced_parse_q_to_solr(solr_params, :q => unparseable_q)
68
-
69
- expect(solr_params[:q]).to eq(unparseable_q)
70
- end
71
-
72
- it "ignores field with advanced_parse=false" do
73
- expect(Deprecation).to receive(:warn)
74
- solr_params = {}
75
- original_q = "one two AND three OR four"
76
- @obj.add_advanced_parse_q_to_solr(solr_params,
77
- :search_field => "special_field",
78
- :q => original_q
79
- )
80
-
81
- expect(solr_params).not_to have_key(:q)
82
- end
83
-
84
- end
85
-
86
- end