rsolr 1.0.9 → 1.0.10.pre1
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 +7 -0
- data/.travis.yml +15 -0
- data/lib/rsolr.rb +1 -1
- data/lib/rsolr/xml.rb +36 -6
- data/rsolr.gemspec +1 -0
- data/spec/api/xml_spec.rb +135 -99
- metadata +50 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f864085d45dbff290a9820ec8f12bb8388ac445a
|
4
|
+
data.tar.gz: 7a117de8e81fb1c59368d4c33bc342ea379f2239
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 00410c0dd950cf7ff57a56dc55ae2d771a7de08f4b139558cd39029f763071709970400c6e99d3a5985135b54e205c576c10d8ac765010cb77e5acf71caeb87d
|
7
|
+
data.tar.gz: 3d274051c0b81c3267bdf9330ff7888c9ad65b7d6d8edb034e840d06f41c5bc49e55f7c8b72a0531518be03350e66b775b26bed9ffb65799b837753cfddcab49
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
rvm:
|
2
|
+
- 2.1.0
|
3
|
+
- 2.0.0
|
4
|
+
- 1.9.3
|
5
|
+
- jruby-19mode
|
6
|
+
|
7
|
+
notifications:
|
8
|
+
irc: "irc.freenode.org#blacklight"
|
9
|
+
email:
|
10
|
+
- blacklight-commits@googlegroups.com
|
11
|
+
|
12
|
+
env:
|
13
|
+
global:
|
14
|
+
- JRUBY_OPTS="-J-Xms512m -J-Xmx1024m"
|
15
|
+
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
data/lib/rsolr.rb
CHANGED
data/lib/rsolr/xml.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
begin; require 'nokogiri'; rescue LoadError; end
|
2
2
|
|
3
3
|
module RSolr::Xml
|
4
4
|
|
@@ -71,13 +71,40 @@ module RSolr::Xml
|
|
71
71
|
end
|
72
72
|
|
73
73
|
class Generator
|
74
|
+
class << self
|
75
|
+
attr_accessor :use_nokogiri
|
76
|
+
|
77
|
+
def builder_proc
|
78
|
+
if use_nokogiri
|
79
|
+
require 'nokogiri' unless defined?(::Nokogiri::XML::Builder)
|
80
|
+
:nokogiri_build
|
81
|
+
else
|
82
|
+
require 'builder' unless defined?(::Builder::XmlMarkup)
|
83
|
+
:builder_build
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
self.use_nokogiri = (defined?(::Nokogiri::XML::Builder) and not defined?(JRuby)) ? true : false
|
88
|
+
|
89
|
+
def nokogiri_build &block
|
90
|
+
b = ::Nokogiri::XML::Builder.new do |xml|
|
91
|
+
block_given? ? yield(xml) : xml
|
92
|
+
end
|
93
|
+
'<?xml version="1.0" encoding="UTF-8"?>'+b.to_xml(:indent => 0, :encoding => 'UTF-8', :save_with => ::Nokogiri::XML::Node::SaveOptions::AS_XML | ::Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
|
94
|
+
end
|
95
|
+
protected :nokogiri_build
|
74
96
|
|
75
|
-
def
|
97
|
+
def builder_build &block
|
76
98
|
b = ::Builder::XmlMarkup.new(:indent => 0, :margin => 0, :encoding => 'UTF-8')
|
77
99
|
b.instruct!
|
78
100
|
block_given? ? yield(b) : b
|
79
101
|
end
|
80
|
-
|
102
|
+
protected :builder_build
|
103
|
+
|
104
|
+
def build &block
|
105
|
+
self.send(self.class.builder_proc,&block)
|
106
|
+
end
|
107
|
+
|
81
108
|
# generates "add" xml for updating solr
|
82
109
|
# "data" can be a hash or an array of hashes.
|
83
110
|
# - each hash should be a simple key=>value pair representing a solr doc.
|
@@ -111,11 +138,12 @@ module RSolr::Xml
|
|
111
138
|
data.each do |doc|
|
112
139
|
doc = RSolr::Xml::Document.new(doc) if doc.respond_to?(:each_pair)
|
113
140
|
yield doc if block_given?
|
114
|
-
|
141
|
+
doc_node_builder = lambda do |doc_node|
|
115
142
|
doc.fields.each do |field_obj|
|
116
143
|
doc_node.field field_obj.value, field_obj.attrs
|
117
144
|
end
|
118
145
|
end
|
146
|
+
self.class.use_nokogiri ? add_node.doc_(doc.attrs,&doc_node_builder) : add_node.doc(doc.attrs,&doc_node_builder)
|
119
147
|
end
|
120
148
|
end
|
121
149
|
end
|
@@ -144,7 +172,9 @@ module RSolr::Xml
|
|
144
172
|
ids = [ids] unless ids.is_a?(Array)
|
145
173
|
build do |xml|
|
146
174
|
xml.delete do |delete_node|
|
147
|
-
ids.each
|
175
|
+
ids.each do |id|
|
176
|
+
self.class.use_nokogiri ? delete_node.id_(id) : delete_node.id(id)
|
177
|
+
end
|
148
178
|
end
|
149
179
|
end
|
150
180
|
end
|
@@ -162,4 +192,4 @@ module RSolr::Xml
|
|
162
192
|
|
163
193
|
end
|
164
194
|
|
165
|
-
end
|
195
|
+
end
|
data/rsolr.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.require_paths = ["lib"]
|
29
29
|
|
30
30
|
s.add_dependency 'builder', '>= 2.1.2'
|
31
|
+
s.add_development_dependency 'nokogiri', '>= 1.4.0'
|
31
32
|
s.add_development_dependency 'rake', '~> 0.9.2'
|
32
33
|
s.add_development_dependency 'rdoc', '~> 3.9.4'
|
33
34
|
s.add_development_dependency 'rspec', '~> 2.6.0'
|
data/spec/api/xml_spec.rb
CHANGED
@@ -1,121 +1,157 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'builder'
|
3
|
+
require 'nokogiri'
|
2
4
|
describe "RSolr::Xml" do
|
3
5
|
|
4
6
|
let(:generator){ RSolr::Xml::Generator.new }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
it "#{meth} should generator xml" do
|
11
|
-
result = generator.send(meth)
|
12
|
-
result.should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><#{meth}/>"
|
13
|
-
end
|
7
|
+
let(:builder_engines) do
|
8
|
+
{
|
9
|
+
:builder => { :val => false, :class => Builder::XmlMarkup, :engine => Builder::XmlMarkup.new(:indent => 0, :margin => 0, :encoding => 'UTF-8') },
|
10
|
+
:nokogiri => { :val => true, :class => Nokogiri::XML::Builder, :engine => Nokogiri::XML::Builder.new }
|
11
|
+
}
|
14
12
|
end
|
13
|
+
|
14
|
+
[:builder,:nokogiri].each do |engine_name|
|
15
|
+
describe engine_name do
|
16
|
+
before :all do
|
17
|
+
@engine = builder_engines[engine_name]
|
18
|
+
@old_ng_setting = RSolr::Xml::Generator.use_nokogiri
|
19
|
+
RSolr::Xml::Generator.use_nokogiri = @engine[:val]
|
20
|
+
end
|
21
|
+
|
22
|
+
after :all do
|
23
|
+
RSolr::Xml::Generator.use_nokogiri = @old_ng_setting
|
24
|
+
end
|
15
25
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
add_attrs = {:boost=>200.00}
|
21
|
-
result = generator.add(documents, add_attrs) do |doc|
|
22
|
-
doc.field_by_name(:name).attrs[:boost] = 10
|
23
|
-
doc.fields.size.should == 4
|
24
|
-
doc.fields_by_name(:cat).size.should == 2
|
26
|
+
before :each do
|
27
|
+
builder_engines.each_pair do |name,spec|
|
28
|
+
spec[:class].should_not_receive(:new) unless name == engine_name
|
29
|
+
end
|
25
30
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
|
32
|
+
context :xml_engine do
|
33
|
+
it "should use #{engine_name}" do
|
34
|
+
@engine[:class].should_receive(:new).and_return(@engine[:engine])
|
35
|
+
generator.send(:commit)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# call all of the simple methods...
|
40
|
+
# make sure the xml string is valid
|
41
|
+
# ensure the class is actually Solr::XML
|
42
|
+
[:optimize, :rollback, :commit].each do |meth|
|
43
|
+
it "#{meth} should generator xml" do
|
44
|
+
result = generator.send(meth)
|
45
|
+
result.should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><#{meth}/>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context :add do
|
32
50
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
51
|
+
it 'should yield a Message::Document object when #add is called with a block' do
|
52
|
+
documents = [{:id=>1, :name=>'sam', :cat=>['cat 1', 'cat 2']}]
|
53
|
+
add_attrs = {:boost=>200.00}
|
54
|
+
result = generator.add(documents, add_attrs) do |doc|
|
55
|
+
doc.field_by_name(:name).attrs[:boost] = 10
|
56
|
+
doc.fields.size.should == 4
|
57
|
+
doc.fields_by_name(:cat).size.should == 2
|
58
|
+
end
|
59
|
+
result.should match(%r(name="cat">cat 1</field>))
|
60
|
+
result.should match(%r(name="cat">cat 2</field>))
|
61
|
+
result.should match(%r(<add boost="200.0">))
|
62
|
+
result.should match(%r(boost="10"))
|
63
|
+
result.should match(%r(<field name="id">1</field>))
|
64
|
+
end
|
65
|
+
|
66
|
+
# add a single hash ("doc")
|
67
|
+
it 'should create an add from a hash' do
|
68
|
+
data = {
|
69
|
+
:id=>1,
|
70
|
+
:name=>'matt'
|
71
|
+
}
|
72
|
+
result = generator.add(data)
|
73
|
+
result.should match(/<field name="name">matt<\/field>/)
|
74
|
+
result.should match(/<field name="id">1<\/field>/)
|
75
|
+
end
|
43
76
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
77
|
+
# add an array of hashes
|
78
|
+
it 'should create many adds from an array of hashes' do
|
79
|
+
data = [
|
80
|
+
{
|
81
|
+
:id=>1,
|
82
|
+
:name=>'matt'
|
83
|
+
},
|
84
|
+
{
|
85
|
+
:id=>2,
|
86
|
+
:name=>'sam'
|
87
|
+
}
|
88
|
+
]
|
89
|
+
message = generator.add(data)
|
90
|
+
expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><add><doc><field name=\"id\">1</field><field name=\"name\">matt</field></doc><doc><field name=\"id\">2</field><field name=\"name\">sam</field></doc></add>"
|
91
|
+
message.should match(/<field name="name">matt<\/field>/)
|
92
|
+
message.should match(/<field name="name">sam<\/field>/)
|
93
|
+
end
|
61
94
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
95
|
+
# multiValue field support test, thanks to Fouad Mardini!
|
96
|
+
it 'should create multiple fields from array values' do
|
97
|
+
data = {
|
98
|
+
:id => 1,
|
99
|
+
:name => ['matt1', 'matt2']
|
100
|
+
}
|
101
|
+
result = generator.add(data)
|
102
|
+
result.should match(/<field name="name">matt1<\/field>/)
|
103
|
+
result.should match(/<field name="name">matt2<\/field>/)
|
104
|
+
end
|
72
105
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
106
|
+
it 'should create an add from a single Message::Document' do
|
107
|
+
document = RSolr::Xml::Document.new
|
108
|
+
document.add_field('id', 1)
|
109
|
+
document.add_field('name', 'matt', :boost => 2.0)
|
110
|
+
result = generator.add(document)
|
111
|
+
result.should match(Regexp.escape('<?xml version="1.0" encoding="UTF-8"?>'))
|
112
|
+
result.should match(/<field name="id">1<\/field>/)
|
113
|
+
result.should match Regexp.escape('boost="2.0"')
|
114
|
+
result.should match Regexp.escape('name="name"')
|
115
|
+
result.should match Regexp.escape('matt</field>')
|
116
|
+
end
|
84
117
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
118
|
+
it 'should create adds from multiple Message::Documents' do
|
119
|
+
documents = (1..2).map do |i|
|
120
|
+
doc = RSolr::Xml::Document.new
|
121
|
+
doc.add_field('id', i)
|
122
|
+
doc.add_field('name', "matt#{i}")
|
123
|
+
doc
|
124
|
+
end
|
125
|
+
result = generator.add(documents)
|
126
|
+
result.should match(/<field name="name">matt1<\/field>/)
|
127
|
+
result.should match(/<field name="name">matt2<\/field>/)
|
128
|
+
end
|
96
129
|
|
97
|
-
|
130
|
+
end
|
98
131
|
|
99
|
-
|
132
|
+
context :delete_by_id do
|
100
133
|
|
101
|
-
|
102
|
-
|
103
|
-
|
134
|
+
it 'should create a doc id delete' do
|
135
|
+
generator.delete_by_id(10).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>10</id></delete>"
|
136
|
+
end
|
104
137
|
|
105
|
-
|
106
|
-
|
107
|
-
|
138
|
+
it 'should create many doc id deletes' do
|
139
|
+
generator.delete_by_id([1, 2, 3]).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>1</id><id>2</id><id>3</id></delete>"
|
140
|
+
end
|
108
141
|
|
109
|
-
|
142
|
+
end
|
110
143
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
144
|
+
context :delete_by_query do
|
145
|
+
it 'should create a query delete' do
|
146
|
+
generator.delete_by_query('status:"LOST"').should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query></delete>"
|
147
|
+
end
|
115
148
|
|
116
|
-
|
117
|
-
|
149
|
+
it 'should create many query deletes' do
|
150
|
+
generator.delete_by_query(['status:"LOST"', 'quantity:0']).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query><query>quantity:0</query></delete>"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
118
154
|
end
|
119
155
|
end
|
120
|
-
|
156
|
+
|
121
157
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsolr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.10.pre1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Antoine Latter
|
@@ -25,56 +24,82 @@ authors:
|
|
25
24
|
- Fouad Mardini
|
26
25
|
- Jeremy Hinegardner
|
27
26
|
- Nathan Witmer
|
28
|
-
-
|
27
|
+
- '"shima"'
|
29
28
|
autorequire:
|
30
29
|
bindir: bin
|
31
30
|
cert_chain: []
|
32
|
-
date:
|
31
|
+
date: 2014-01-16 00:00:00.000000000 Z
|
33
32
|
dependencies:
|
34
33
|
- !ruby/object:Gem::Dependency
|
35
34
|
name: builder
|
36
|
-
requirement:
|
37
|
-
none: false
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
38
36
|
requirements:
|
39
|
-
- -
|
37
|
+
- - '>='
|
40
38
|
- !ruby/object:Gem::Version
|
41
39
|
version: 2.1.2
|
42
40
|
type: :runtime
|
43
41
|
prerelease: false
|
44
|
-
version_requirements:
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.1.2
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: nokogiri
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.4.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.4.0
|
45
61
|
- !ruby/object:Gem::Dependency
|
46
62
|
name: rake
|
47
|
-
requirement:
|
48
|
-
none: false
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
49
64
|
requirements:
|
50
65
|
- - ~>
|
51
66
|
- !ruby/object:Gem::Version
|
52
67
|
version: 0.9.2
|
53
68
|
type: :development
|
54
69
|
prerelease: false
|
55
|
-
version_requirements:
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ~>
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.9.2
|
56
75
|
- !ruby/object:Gem::Dependency
|
57
76
|
name: rdoc
|
58
|
-
requirement:
|
59
|
-
none: false
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
60
78
|
requirements:
|
61
79
|
- - ~>
|
62
80
|
- !ruby/object:Gem::Version
|
63
81
|
version: 3.9.4
|
64
82
|
type: :development
|
65
83
|
prerelease: false
|
66
|
-
version_requirements:
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.9.4
|
67
89
|
- !ruby/object:Gem::Dependency
|
68
90
|
name: rspec
|
69
|
-
requirement:
|
70
|
-
none: false
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
71
92
|
requirements:
|
72
93
|
- - ~>
|
73
94
|
- !ruby/object:Gem::Version
|
74
95
|
version: 2.6.0
|
75
96
|
type: :development
|
76
97
|
prerelease: false
|
77
|
-
version_requirements:
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.6.0
|
78
103
|
description: RSolr aims to provide a simple and extensible library for working with
|
79
104
|
Solr
|
80
105
|
email:
|
@@ -84,6 +109,7 @@ extensions: []
|
|
84
109
|
extra_rdoc_files: []
|
85
110
|
files:
|
86
111
|
- .gitignore
|
112
|
+
- .travis.yml
|
87
113
|
- CHANGES.txt
|
88
114
|
- Gemfile
|
89
115
|
- LICENSE
|
@@ -113,26 +139,26 @@ files:
|
|
113
139
|
- tasks/spec.rake
|
114
140
|
homepage: https://github.com/mwmitchell/rsolr
|
115
141
|
licenses: []
|
142
|
+
metadata: {}
|
116
143
|
post_install_message:
|
117
144
|
rdoc_options: []
|
118
145
|
require_paths:
|
119
146
|
- lib
|
120
147
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
148
|
requirements:
|
123
|
-
- -
|
149
|
+
- - '>='
|
124
150
|
- !ruby/object:Gem::Version
|
125
151
|
version: '0'
|
126
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
-
none: false
|
128
153
|
requirements:
|
129
|
-
- -
|
154
|
+
- - '>'
|
130
155
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
156
|
+
version: 1.3.1
|
132
157
|
requirements: []
|
133
158
|
rubyforge_project: rsolr
|
134
|
-
rubygems_version: 1.
|
159
|
+
rubygems_version: 2.1.11
|
135
160
|
signing_key:
|
136
|
-
specification_version:
|
161
|
+
specification_version: 4
|
137
162
|
summary: A Ruby client for Apache Solr
|
138
163
|
test_files: []
|
164
|
+
has_rdoc:
|