rsolr 2.0.0.pre1 → 2.0.0.pre2

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: 6615cc15df2d2db90f952215c74c2c1215622f6d
4
- data.tar.gz: 3b46e5c7953531a68c6dd596036f8b50d10c99d6
3
+ metadata.gz: c12bcd80599dbe9baf6b616dd23422a935587718
4
+ data.tar.gz: ea19f8226b2a7737099c38094899a46a649e3de0
5
5
  SHA512:
6
- metadata.gz: e4de23a7c03b4d3d81a765dd6be91abff61a6f8241bbe5a4e941df9d0c34855715fe077aa5d3b20d54c3e87781aa539a90cd6da8ba3e4cb9b87591c0523e59f7
7
- data.tar.gz: d2ad073f1b1814b834facbeaa8268d803076645eae603ed751813fe73684d10172e26cec7d54d232e42e1d5052d159ec519f8be5fee5ec74ea2e309cd5bb37a7
6
+ metadata.gz: dc3e492100005e174362232e5cf4b1e6d0d0e8a4288fd8810256980747288f9ff74fa61411d565610c9c234d2d638fe1c190a1c4bb35d57310b54005a1943440
7
+ data.tar.gz: 0ec2bcdf0bbcfdc8bc82d711f9c5df3158f56c948f8ae698ce07a7959aeb82534f2a202c90461003a3d99f1ce411d58b9d80e7e24ca433a1a463d6fd0b89363b
data/.travis.yml CHANGED
@@ -1,21 +1,13 @@
1
- addons:
2
- apt:
3
- packages:
4
- - libgmp-dev
5
1
  language: ruby
6
2
  sudo: false
7
3
  rvm:
8
4
  - 2.3.1
9
5
  - 2.2.5
10
- - jruby-9.0.5.0
11
-
12
- notifications:
13
- irc: "irc.freenode.org#blacklight"
14
- email:
15
- - blacklight-commits@googlegroups.com
6
+ - jruby-9.1.5.0
16
7
 
17
8
  env:
18
9
  global:
19
10
  - JRUBY_OPTS="-J-Xms512m -J-Xmx1024m"
20
11
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
12
+
21
13
  jdk: oraclejdk8
data/CHANGES.txt CHANGED
@@ -1,3 +1,14 @@
1
+ 2.0.0.pre1
2
+
3
+ In this release, we've added many new features, including:
4
+
5
+ - a new JSON request generator (enabled by default, replacing the XML-based requests) (@mootprinter)
6
+ - using Faraday for added flexibility for HTTP configuration
7
+ - native support for nested child documents and atomic updates in RSolr::Document and RSolr::Client.add
8
+ - better support for custom field value converters (@solenko)
9
+ - removing code deprecated in RSolr 1.x (@vipulnsward, and others)
10
+
11
+
1
12
  1.0.12
2
13
  - Fix bug where specifying the wt property as a string, would add the supplied value to the default ('ruby') rather than overriding it.
3
14
 
data/Gemfile CHANGED
@@ -3,7 +3,3 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  gem "builder", ">= 2.1.2"
6
-
7
- if defined? RUBY_VERSION and RUBY_VERSION < "1.9"
8
- gem 'nokogiri', "< 1.6"
9
- end
data/README.rdoc CHANGED
@@ -11,7 +11,6 @@ The code docs http://www.rubydoc.info/gems/rsolr
11
11
  gem install rsolr
12
12
 
13
13
  == Example:
14
- require 'rubygems'
15
14
  require 'rsolr'
16
15
 
17
16
  # Direct connection
@@ -19,7 +18,17 @@ The code docs http://www.rubydoc.info/gems/rsolr
19
18
 
20
19
  # Connecting over a proxy server
21
20
  solr = RSolr.connect :url => 'http://solrserver.com', :proxy=>'http://user:pass@proxy.example.com:8080'
21
+
22
+ # Using an alternate Faraday adapter
23
+ solr = RSolr.connect :url => 'http://solrserver.com', :adapter => :em_http
22
24
 
25
+ # Using a custom Faraday connection
26
+ conn = Faraday.new do |faraday|
27
+ faraday.response :logger # log requests to STDOUT
28
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
29
+ end
30
+ solr = RSolr.connect conn, :url => 'http://solrserver.com'
31
+
23
32
  # send a request to /select
24
33
  response = solr.get 'select', :params => {:q => '*:*'}
25
34
 
@@ -34,6 +43,14 @@ The +:request+ attribute contains the original request context. You can use this
34
43
 
35
44
  The +:response+ attribute contains the original response. This object contains the +:status+, +:body+ and +:headers+ keys.
36
45
 
46
+ == Request formats
47
+
48
+ By default, RSolr uses the Solr JSON command format for all requests.
49
+
50
+ RSolr.connect :url => 'http://solrserver.com', update_format: :json # the default
51
+ # or
52
+ RSolr.connect :url => 'http://solrserver.com', update_format: :xml
53
+
37
54
  == Timeouts
38
55
  The read and connect timeout settings can be set when creating a new instance of RSolr:
39
56
  solr = RSolr.connect(:read_timeout => 120, :open_timeout => 120)
@@ -44,6 +61,7 @@ A 503 is usually a temporary error which RSolr may retry if requested. You may s
44
61
  Only requests which specify a Retry-After header will be retried, after waiting the indicated retry interval, otherwise RSolr will treat the request as a 500. You may specify a maximum Retry-After interval to wait with the +:retry_after_limit+ option (default: one second).
45
62
  solr = RSolr.connect(:retry_503 => 1, :retry_after_limit => 1)
46
63
 
64
+ For additional control, consider using a custom Faraday connection (see above) using its `retry` middleware.
47
65
 
48
66
  == Querying
49
67
  Use the #get / #post method to send search requests to the /select handler:
@@ -119,9 +137,9 @@ Multiple documents via #add
119
137
  The optional +:add_attributes+ hash can also be used to set Solr "add" document attributes:
120
138
  solr.add documents, :add_attributes => {:commitWithin => 10}
121
139
 
122
- Raw XML via #update
123
- solr.update :data => '<commit/>'
124
- solr.update :data => '<optimize/>'
140
+ Raw commands via #update
141
+ solr.update data: '<commit/>', headers: { 'Content-Type' => 'text/xml' }
142
+ solr.update data: { optimize: true }.to_json, headers: { 'Content-Type' => 'application/json' }
125
143
 
126
144
  When adding, you can also supply "add" xml element attributes and/or a block for manipulating other "add" related elements (docs and fields) by calling the +xml+ method directly:
127
145
 
data/lib/rsolr.rb CHANGED
@@ -21,5 +21,20 @@ module RSolr
21
21
  # so the result sent to Solr is ultimately a single backslash in front of the particular character
22
22
  str.gsub(/([+\-&|!\(\)\{\}\[\]\^"~\*\?:\\\/])/, '\\\\\1')
23
23
  end
24
-
24
+
25
+ module Array
26
+ def self.wrap(object)
27
+ if object.nil?
28
+ []
29
+ elsif object.respond_to?(:to_ary)
30
+ object.to_ary || [object]
31
+ elsif object.is_a? Hash
32
+ [object]
33
+ elsif object.is_a? Enumerable
34
+ object
35
+ else
36
+ [object]
37
+ end
38
+ end
39
+ end
25
40
  end
data/lib/rsolr/client.rb CHANGED
@@ -1,8 +1,4 @@
1
- begin
2
- require 'json'
3
- rescue LoadError
4
- end
5
-
1
+ require 'json'
6
2
  require 'faraday'
7
3
 
8
4
  class RSolr::Client
@@ -17,7 +13,7 @@ class RSolr::Client
17
13
  end
18
14
  end
19
15
 
20
- attr_reader :uri, :proxy, :options, :update_path
16
+ attr_reader :uri, :proxy, :update_format, :options, :update_path
21
17
 
22
18
  def initialize connection, options = {}
23
19
  @proxy = @uri = nil
@@ -34,7 +30,7 @@ class RSolr::Client
34
30
  @proxy = false # used to avoid setting the proxy from the environment.
35
31
  end
36
32
  end
37
- @update_format = options.delete(:update_format) || :json
33
+ @update_format = options.delete(:update_format) || RSolr::JSON::Generator
38
34
  @update_path = options.fetch(:update_path, 'update')
39
35
  @options = options
40
36
  end
@@ -83,11 +79,7 @@ class RSolr::Client
83
79
  #
84
80
  def update opts = {}
85
81
  opts[:headers] ||= {}
86
- if @update_format == :json
87
- opts[:headers]['Content-Type'] ||= 'application/json'
88
- else
89
- opts[:headers]['Content-Type'] ||= 'text/xml'
90
- end
82
+ opts[:headers]['Content-Type'] ||= builder.content_type
91
83
  post opts.fetch(:path, update_path), opts
92
84
  end
93
85
 
@@ -155,19 +147,15 @@ class RSolr::Client
155
147
  end
156
148
 
157
149
  def builder
158
- if @update_format == :json
159
- json
160
- else
161
- xml
162
- end
163
- end
164
- # shortcut to RSolr::Xml::Generator
165
- def xml
166
- @xml ||= RSolr::Xml::Generator.new
167
- end
168
-
169
- def json
170
- @json ||= RSolr::JSON::Generator.new
150
+ @builder ||= if update_format.is_a? Class
151
+ update_format.new
152
+ elsif update_format == :json
153
+ RSolr::JSON::Generator.new
154
+ elsif update_format == :xml
155
+ RSolr::Xml::Generator.new
156
+ else
157
+ update_format
158
+ end
171
159
  end
172
160
 
173
161
  # +send_and_receive+ is the main request method responsible for sending requests to the +connection+ object.
@@ -37,7 +37,7 @@ module RSolr
37
37
  # document.add_field('title', 'A Title', :boost => 2.0)
38
38
  #
39
39
  def add_field(name, values, options = {})
40
- wrap(values).each do |v|
40
+ RSolr::Array.wrap(values).each do |v|
41
41
  next if v.nil?
42
42
 
43
43
  field_attrs = { name: name }
@@ -50,26 +50,10 @@ module RSolr
50
50
  def as_json
51
51
  @fields.group_by(&:name).each_with_object({}) do |(field, values), result|
52
52
  v = values.map(&:as_json)
53
- v = v.first if v.length == 1
53
+ v = v.first if v.length == 1 && field.to_s != CHILD_DOCUMENT_KEY
54
54
  result[field] = v
55
55
  end
56
56
  end
57
-
58
- private
59
-
60
- def wrap(object)
61
- if object.nil?
62
- []
63
- elsif object.respond_to?(:to_ary)
64
- object.to_ary || [object]
65
- elsif object.is_a? Hash
66
- [object]
67
- elsif object.is_a? Enumerable
68
- object
69
- else
70
- [object]
71
- end
72
- end
73
57
  end
74
58
 
75
59
  class Field
@@ -0,0 +1,5 @@
1
+ module RSolr
2
+ class Generator
3
+
4
+ end
5
+ end
data/lib/rsolr/json.rb CHANGED
@@ -1,8 +1,16 @@
1
+ require 'json'
2
+
1
3
  module RSolr::JSON
2
- class Generator
4
+ class Generator < RSolr::Generator
5
+ CONTENT_TYPE = 'application/json'.freeze
6
+
7
+ def content_type
8
+ CONTENT_TYPE
9
+ end
10
+
3
11
  def add data, add_attrs = {}
4
12
  add_attrs ||= {}
5
- data = [data] unless data.is_a?(Array)
13
+ data = RSolr::Array.wrap(data)
6
14
 
7
15
  if add_attrs.empty? && data.none? { |doc| doc.is_a?(RSolr::Document) && !doc.attrs.empty? }
8
16
  data.map do |doc|
@@ -11,7 +11,7 @@ module RSolr::Response
11
11
  @request = request
12
12
  @response = response
13
13
  self.merge!(result)
14
- if self["response"] && self["response"]["docs"].is_a?(Array)
14
+ if self["response"] && self["response"]["docs"].is_a?(::Array)
15
15
  docs = PaginatedDocSet.new(self["response"]["docs"])
16
16
  docs.per_page = request[:params]["rows"]
17
17
  docs.page_start = request[:params]["start"]
@@ -41,7 +41,7 @@ module RSolr::Response
41
41
  end
42
42
 
43
43
  # A response module which gets mixed into the solr ["response"]["docs"] array.
44
- class PaginatedDocSet < Array
44
+ class PaginatedDocSet < ::Array
45
45
 
46
46
  attr_accessor :page_start, :per_page, :page_total
47
47
  if not (Object.const_defined?("RUBY_ENGINE") and Object::RUBY_ENGINE=='rbx')
data/lib/rsolr/uri.rb CHANGED
@@ -14,7 +14,7 @@ module RSolr::Uri
14
14
  # escape = false if we are here
15
15
  mapped = params.map do |k, v|
16
16
  next if v.to_s.empty?
17
- if v.class == Array
17
+ if v.class == ::Array
18
18
  params_to_solr(v.map { |x| [k, x] }, false)
19
19
  else
20
20
  "#{k}=#{v}"
data/lib/rsolr/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module RSolr
2
- VERSION = "2.0.0.pre1"
2
+ VERSION = "2.0.0.pre2"
3
3
 
4
4
  def self.version
5
5
  VERSION
data/lib/rsolr/xml.rb CHANGED
@@ -1,13 +1,10 @@
1
- begin; require 'nokogiri'; rescue LoadError; end
2
- require 'time'
3
-
4
1
  module RSolr::Xml
5
2
  require 'rsolr/document'
6
3
 
7
4
  Document = RSolr::Document
8
5
  Field = RSolr::Field
9
6
 
10
- class Generator
7
+ class Generator < RSolr::Generator
11
8
  class << self
12
9
  attr_accessor :use_nokogiri
13
10
 
@@ -21,7 +18,14 @@ module RSolr::Xml
21
18
  end
22
19
  end
23
20
  end
24
- self.use_nokogiri = (defined?(::Nokogiri::XML::Builder) and not defined?(JRuby)) ? true : false
21
+ self.use_nokogiri = defined?(::Nokogiri::XML::Builder) ? true : false
22
+
23
+ CONTENT_TYPE = 'text/xml'.freeze
24
+
25
+ def content_type
26
+ CONTENT_TYPE
27
+ end
28
+
25
29
 
26
30
  def nokogiri_build &block
27
31
  b = ::Nokogiri::XML::Builder.new do |xml|
data/rsolr.gemspec CHANGED
@@ -30,6 +30,8 @@ Gem::Specification.new do |s|
30
30
  s.require_paths = ["lib"]
31
31
 
32
32
  s.required_ruby_version = '>= 1.9.3'
33
+
34
+ s.requirements << 'Apache Solr'
33
35
 
34
36
  s.add_dependency 'builder', '>= 2.1.2'
35
37
  s.add_dependency 'faraday'
@@ -67,18 +67,6 @@ RSpec.describe RSolr::Client do
67
67
  end
68
68
  end
69
69
 
70
- context "xml" do
71
- it "should return an instance of RSolr::Xml::Generator" do
72
- expect(client.xml).to be_a RSolr::Xml::Generator
73
- end
74
- end
75
-
76
- context "json" do
77
- it "should return an instance of RSolr::JSON::Generator" do
78
- expect(client.json).to be_a RSolr::JSON::Generator
79
- end
80
- end
81
-
82
70
  context "add" do
83
71
  it "should send xml to the connection's #post method" do
84
72
  expect(client).to receive(:execute).
@@ -95,7 +83,7 @@ RSpec.describe RSolr::Client do
95
83
  :status => 200,
96
84
  :headers => {"Content-Type"=>"text/xml"}
97
85
  )
98
- expect(client.xml).to receive(:add).
86
+ expect(client.builder).to receive(:add).
99
87
  with({:id=>1}, {:commitWith=>10}).
100
88
  and_return("<xml/>")
101
89
  client.add({:id=>1}, :add_attributes => {:commitWith=>10})
@@ -119,7 +107,7 @@ RSpec.describe RSolr::Client do
119
107
  :status => 200,
120
108
  :headers => {"Content-Type"=>"text/xml"}
121
109
  )
122
- expect(client.json).to receive(:add).
110
+ expect(client.builder).to receive(:add).
123
111
  with({:id => 1}, {:commitWith=>10}).
124
112
  and_return('{"hello":"this is json"}')
125
113
  client.add({:id=>1}, :add_attributes => {:commitWith=>10})
@@ -123,6 +123,20 @@ RSpec.describe RSolr::JSON do
123
123
  expect(message.length).to eq 1
124
124
  expect(message.first).to eq data
125
125
  end
126
+
127
+ it 'supports nested child documents with only a single document' do
128
+ data = {
129
+ _childDocuments_: [
130
+ {
131
+ id: 1
132
+ }
133
+ ]
134
+ }
135
+
136
+ message = JSON.parse(generator.add(data), symbolize_names: true)
137
+ expect(message.length).to eq 1
138
+ expect(message.first).to eq data
139
+ end
126
140
  end
127
141
 
128
142
  it 'should create multiple fields from array values' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsolr
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre1
4
+ version: 2.0.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Antoine Latter
@@ -29,7 +29,7 @@ authors:
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2016-09-30 00:00:00.000000000 Z
32
+ date: 2017-02-05 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: builder
@@ -164,6 +164,7 @@ files:
164
164
  - lib/rsolr/client.rb
165
165
  - lib/rsolr/document.rb
166
166
  - lib/rsolr/error.rb
167
+ - lib/rsolr/generator.rb
167
168
  - lib/rsolr/json.rb
168
169
  - lib/rsolr/response.rb
169
170
  - lib/rsolr/uri.rb
@@ -206,9 +207,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
207
  - - ">"
207
208
  - !ruby/object:Gem::Version
208
209
  version: 1.3.1
209
- requirements: []
210
+ requirements:
211
+ - Apache Solr
210
212
  rubyforge_project: rsolr
211
- rubygems_version: 2.5.1
213
+ rubygems_version: 2.5.2
212
214
  signing_key:
213
215
  specification_version: 4
214
216
  summary: A Ruby client for Apache Solr