elasticsearch-documents 0.0.1 → 0.1.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: 09242c5b4dacbea5a8df8b92589cf7da49491d1c
4
- data.tar.gz: b26f6777634d3e6e37207eafb0ed96e1def983d7
3
+ metadata.gz: d5c254c644e1b8f9f4649a463816664305479ce7
4
+ data.tar.gz: d37eb314977344a51a554bd20799f924c954e4cc
5
5
  SHA512:
6
- metadata.gz: 5d7bb17681d33ef53bc909f4089be04971ca9f3b8f355a689f179cf5918ec7e36d1365de24c35aa05920f8ea50df01cef220e36364e17e433c4ac4e856339432
7
- data.tar.gz: c778f6377d6243a1999c4edb25daf9a0c3a768f1d8ccd42756c520021d0f6bc0b59e8fdbf37bc9e8f68a2ab7dab2ec6e0d2740f98ea1df9718d7eb516f2b0826
6
+ metadata.gz: 5101e3b59ff7ef130591279d0076c0480eeabe93cff21c19f69fffc5f3ba0bed89f87ba1f92c1ed90000c347d37725cb28098c1dbbd6b338e43318231eeccc9c
7
+ data.tar.gz: e6a6e3980de1d94f54a4976ef558371e468dd1b126c7260c01ed500a1a2389670ced05b63c96da99e50ce57e0e473710e3175706b57d53a6c365d04315a16cf3
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Elasticsearch::Extensions::Documents
2
2
 
3
- A service wrapper to manage Elasticsearch index documents
3
+ A service wrapper to manage Elasticsearch index documents. Built on the
4
+ [`elasticsearch-ruby`][es-ruby-gem] Gem.
5
+
6
+ [![Build Status](https://travis-ci.org/ryanhouston/elasticsearch-documents.png?branch=master)](https://travis-ci.org/ryanhouston/elasticsearch-documents)
4
7
 
5
8
  ## Installation
6
9
 
@@ -19,7 +22,8 @@ Or install it yourself as:
19
22
  ## Configuration
20
23
 
21
24
  Before making any calls to Elasticsearch you need to configure the `Documents`
22
- extension.
25
+ extension. Configuration options namespaced under 'client' are passed through to
26
+ [`Elasticsearch::Client`](https://github.com/elasticsearch/elasticsearch-ruby/blob/a7bbdbf2a96168c1b33dca46ee160d2d4d75ada0/elasticsearch-transport/lib/elasticsearch/transport/client.rb).
23
27
 
24
28
  ```ruby
25
29
  ES_MAPPINGS = {
@@ -42,12 +46,11 @@ ES_SETTINGS = {
42
46
  }
43
47
 
44
48
  Elasticsearch::Extensions::Documents.configure do |config|
45
- config.url = 'http://example.com:9200' # your elasticsearch endpoint
46
49
  config.index_name = 'test_index' # the name of your index
47
50
  config.mappings = ES_MAPPINGS # a hash containing your index mappings
48
51
  config.settings = ES_SETTINGS # a hash containing your index settings
49
- config.logger = Logger.new(STDOUT) # the logger to use. (defaults to Logger.new(STDOUT)
50
- config.log = true # if the elasticsearch-ruby should provide logging
52
+ config.client.url = 'http://example.com:9200' # your elasticsearch endpoint
53
+ config.client.logger = Rails.logger # the logger to use. (defaults to Logger.new(STDERR))
51
54
  end
52
55
  ```
53
56
 
@@ -56,16 +59,16 @@ could live in an initializer like `config/initializers/elasticsearch.rb`.
56
59
 
57
60
  ## Usage
58
61
 
59
- The `Documents` extension builds on the
60
- `elasticsearch-ruby` Gem adding conventions and helper classes to aide in the
61
- serialization and flow of data between your application code and the
62
- elasticsearch-ruby interface. To accomplish this the application data models
63
- will be serialized into `Document`s that can be indexed and searched with the
64
- `elasticsearch-ruby` Gem.
62
+ The `Documents` extension builds on the [`elasticsearch-ruby`][es-ruby-gem] Gem
63
+ adding conventions and helper classes to aide in the serialization and flow of
64
+ data between your application code and the elasticsearch-ruby client. To
65
+ accomplish this the application data models will be serialized into instances
66
+ of `Document` classes. These `Document` instances are then indexed and searched
67
+ with wrappers around the `elasticsearch-ruby` client.
65
68
 
66
69
  ### Saving a Document
67
- If your application has a model called `User` that you wanted to index you would
68
- create a `Document` that defined how the `User` is stored in the index.
70
+ Assume your application has a `User` model. To index the `User` records you
71
+ define a `Document` that maps `User` records to a search index mapping.
69
72
 
70
73
  ```ruby
71
74
  class UserDocument < Elasticsearch::Extensions::Documents::Document
@@ -124,7 +127,8 @@ end
124
127
  ```
125
128
 
126
129
  You could elaborate on this class with a constructor that takes the search
127
- term and other options specific to your use case as arguments.
130
+ term and other options specific to your use case as arguments. The impoortant
131
+ part is to define the `#as_hash` method.
128
132
 
129
133
  You can then call the `#execute` method to run the query. The Elasticsearch JSON
130
134
  response will be returned in whole wrapped in a
@@ -203,6 +207,23 @@ indexer.reindex do |indexer|
203
207
  indexer.bulk_index(documents)
204
208
  end
205
209
  ```
210
+
211
+ By default the call to `#reindex` will create the index if it does not yet
212
+ exist. If the index already exists it will be left in place and the documents
213
+ provided to be indexed will be added or updated as needed. You can force the
214
+ index to be dropped and recreated during the reindex process by passing the
215
+ `force_create: true` option:
216
+
217
+ ```ruby
218
+ indexer.reindex(force_create: true) do |indexer|
219
+ # bulk index those documents into a fresh index
220
+ end
221
+ ```
222
+
223
+ Different reindexing strategies may be added in the future to allow "zero
224
+ downtime reindexing". This could be accomplished using index names with a
225
+ timestamp appended and index aliases.
226
+
206
227
  ## Contributing
207
228
 
208
229
  1. Fork it
@@ -213,5 +234,6 @@ end
213
234
 
214
235
 
215
236
  [es-query-dsl]: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
237
+ [es-ruby-gem]: https://github.com/elasticsearch/elasticsearch-ruby
216
238
  [es-ruby-search-src]: https://github.com/elasticsearch/elasticsearch-ruby/blob/master/elasticsearch-api/lib/elasticsearch/api/actions/search.rb
217
239
 
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec", "~> 2.14"
25
25
 
26
26
  spec.add_runtime_dependency "elasticsearch"
27
27
  spec.add_runtime_dependency "hashie"
@@ -1,5 +1,6 @@
1
1
  require "elasticsearch"
2
2
  require "logger"
3
+ require "ostruct"
3
4
  require "elasticsearch/extensions/documents/version"
4
5
  require "elasticsearch/extensions/documents/document"
5
6
  require "elasticsearch/extensions/documents/index"
@@ -15,14 +16,11 @@ module Elasticsearch
15
16
  attr_accessor :client, :configuration
16
17
 
17
18
  def client
18
- @client ||= Elasticsearch::Client.new({
19
- host: self.configuration.url,
20
- log: self.configuration.log,
21
- })
19
+ Elasticsearch::Client.new(configuration.client.marshal_dump)
22
20
  end
23
21
 
24
22
  def configure
25
- self.configuration ||= Configuration.new
23
+ self.configuration ||= OpenStruct.new(client: OpenStruct.new)
26
24
  yield configuration
27
25
  end
28
26
 
@@ -31,16 +29,7 @@ module Elasticsearch
31
29
  end
32
30
 
33
31
  def logger
34
- self.configuration.logger
35
- end
36
- end
37
-
38
- class Configuration
39
- attr_accessor :url, :index_name, :mappings, :settings, :log, :logger
40
-
41
- def initialize
42
- @logger = Logger.new(STDOUT)
43
- @log = true
32
+ self.configuration.client.logger ||= Logger.new(STDERR)
44
33
  end
45
34
  end
46
35
 
@@ -28,9 +28,12 @@ module Elasticsearch
28
28
  end
29
29
  end
30
30
 
31
- def reindex(&block)
32
- drop_index
31
+ def reindex(options = {}, &block)
32
+ force_create = options.fetch(:force_create) { false }
33
+
34
+ drop_index if force_create
33
35
  create_index
36
+
34
37
  block.call(self) if block_given?
35
38
  end
36
39
 
@@ -1,7 +1,7 @@
1
1
  module Elasticsearch
2
2
  module Extensions
3
3
  module Documents
4
- VERSION = "0.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -83,10 +83,20 @@ module Elasticsearch
83
83
 
84
84
  describe '#reindex' do
85
85
 
86
- it 'drops the index if exists' do
87
- indices.stub(:exists).and_return(true)
88
- expect(indexer).to receive(:drop_index)
89
- indexer.reindex
86
+ context 'with the :force_create option' do
87
+ it 'drops the index if exists' do
88
+ indices.stub(:exists).and_return(true)
89
+ expect(indexer).to receive(:drop_index)
90
+ indexer.reindex(force_create: true)
91
+ end
92
+ end
93
+
94
+ context 'without the :force_create option' do
95
+ it 'does not drop the index if exists' do
96
+ indices.stub(:exists).and_return(true)
97
+ expect(indexer).not_to receive(:drop_index)
98
+ indexer.reindex
99
+ end
90
100
  end
91
101
 
92
102
  it 'creates a new index' do
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+
4
+ module Elasticsearch::Extensions
5
+ describe Documents do
6
+
7
+ before(:each) { reset_configuration }
8
+
9
+ describe '.configuration' do
10
+ subject(:config) { Documents.configuration }
11
+
12
+ its(:index_name) { should eql 'test_index' }
13
+ its(:mappings) { should eql :fake_mappings }
14
+ its(:settings) { should eql :fake_settings }
15
+ end
16
+
17
+ describe '.client' do
18
+ subject(:client) { Documents.client }
19
+
20
+ it 'creates an instance of Elasticsearch::Transport::Client' do
21
+ expect(client).to be_instance_of Elasticsearch::Transport::Client
22
+ end
23
+
24
+ it 'provides a new client instance for each call' do
25
+ c1 = Documents.client
26
+ c2 = Documents.client
27
+ expect(c1).not_to equal c2
28
+ end
29
+
30
+ it 'instantiates the client with the config.client settings' do
31
+ Documents.configure do |config|
32
+ config.client.url = 'http://example.com:9200/es'
33
+ config.client.logger = :app_logger
34
+ config.client.tracer = :app_tracer
35
+ end
36
+
37
+ expect(Elasticsearch::Client).to receive(:new) do |options|
38
+ expect(options[:url]).to eq 'http://example.com:9200/es'
39
+ expect(options[:logger]).to eq :app_logger
40
+ expect(options[:tracer]).to eq :app_tracer
41
+ end
42
+ Documents.client
43
+ end
44
+ end
45
+
46
+ describe '.index_name' do
47
+ specify { expect(Documents.index_name).to eq 'test_index' }
48
+ end
49
+
50
+ describe '.logger' do
51
+ it 'provides a default logger if none is given' do
52
+ expect(Documents.logger).to be_kind_of Logger
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+
data/spec/spec_helper.rb CHANGED
@@ -1,18 +1,29 @@
1
1
  require 'elasticsearch-documents'
2
2
 
3
+ def reset_configuration
4
+ Elasticsearch::Extensions::Documents.configuration = nil
5
+ configure_documents
6
+ end
7
+
8
+ def configure_documents
9
+ Elasticsearch::Extensions::Documents.configure do |config|
10
+ config.index_name = 'test_index'
11
+ config.settings = :fake_settings
12
+ config.mappings = :fake_mappings
13
+ config.client.url = 'http://example.com:9200'
14
+ end
15
+ end
16
+
3
17
  RSpec.configure do |config|
4
18
  config.treat_symbols_as_metadata_keys_with_true_values = true
5
19
  config.run_all_when_everything_filtered = true
6
20
  config.filter_run :focus
7
21
 
8
22
  config.order = 'random'
9
- end
10
23
 
11
- Elasticsearch::Extensions::Documents.configure do |config|
12
- config.url = 'http://example.com:9200'
13
- config.index_name = 'test_index'
14
- config.settings = :fake_settings
15
- config.mappings = :fake_mappings
24
+ config.before(:suite) do
25
+ configure_documents
26
+ end
16
27
  end
17
28
 
18
29
  class TestDocumentsDocument < Elasticsearch::Extensions::Documents::Document
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elasticsearch-documents
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Houston
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-16 00:00:00.000000000 Z
11
+ date: 2014-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '2.14'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '2.14'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: elasticsearch
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +89,7 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - .gitignore
91
91
  - .rspec
92
+ - .travis.yml
92
93
  - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md
@@ -102,12 +103,12 @@ files:
102
103
  - lib/elasticsearch/extensions/documents/queryable.rb
103
104
  - lib/elasticsearch/extensions/documents/utils.rb
104
105
  - lib/elasticsearch/extensions/documents/version.rb
105
- - spec/elasticsearch/extensions/documentor_spec.rb
106
106
  - spec/elasticsearch/extensions/documents/document_spec.rb
107
107
  - spec/elasticsearch/extensions/documents/index_spec.rb
108
108
  - spec/elasticsearch/extensions/documents/indexer_spec.rb
109
109
  - spec/elasticsearch/extensions/documents/queryable_spec.rb
110
110
  - spec/elasticsearch/extensions/documents/utils_spec.rb
111
+ - spec/elasticsearch/extensions/documents_spec.rb
111
112
  - spec/spec_helper.rb
112
113
  homepage: http://github.com/RyanHouston/elasticsearch-documents
113
114
  licenses:
@@ -129,15 +130,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
130
  version: '0'
130
131
  requirements: []
131
132
  rubyforge_project:
132
- rubygems_version: 2.2.0
133
+ rubygems_version: 2.2.2
133
134
  signing_key:
134
135
  specification_version: 4
135
136
  summary: A service wrapper to manage elasticsearch index documents
136
137
  test_files:
137
- - spec/elasticsearch/extensions/documentor_spec.rb
138
138
  - spec/elasticsearch/extensions/documents/document_spec.rb
139
139
  - spec/elasticsearch/extensions/documents/index_spec.rb
140
140
  - spec/elasticsearch/extensions/documents/indexer_spec.rb
141
141
  - spec/elasticsearch/extensions/documents/queryable_spec.rb
142
142
  - spec/elasticsearch/extensions/documents/utils_spec.rb
143
+ - spec/elasticsearch/extensions/documents_spec.rb
143
144
  - spec/spec_helper.rb
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
- require 'logger'
3
-
4
- module Elasticsearch::Extensions
5
- describe Documents do
6
-
7
- let(:logger) { Logger.new(STDOUT) }
8
- before do
9
- Documents.configure do |config|
10
- config.logger = logger
11
- config.log = true
12
- end
13
- end
14
-
15
- describe '.configuration' do
16
- subject(:config) { Documents.configuration }
17
-
18
- specify { expect(config.url).to eql 'http://example.com:9200' }
19
- specify { expect(config.index_name).to eql 'test_index' }
20
- specify { expect(config.mappings).to eql( :fake_mappings ) }
21
- specify { expect(config.settings).to eql( :fake_settings ) }
22
- specify { expect(config.logger).to equal logger }
23
- specify { expect(config.logger).to be_true }
24
- end
25
-
26
- describe '.client' do
27
- subject(:client) { Documents.client }
28
-
29
- it 'creates an instance of Elasticsearch::Transport::Client' do
30
- expect(client).to be_instance_of Elasticsearch::Transport::Client
31
- end
32
-
33
- it 'caches the client instance' do
34
- c1 = Documents.client
35
- c2 = Documents.client
36
- expect(c1).to equal c2
37
- end
38
- end
39
-
40
- describe '.index_name' do
41
- specify { expect(Documents.index_name).to eq 'test_index' }
42
- end
43
-
44
- describe '.logger' do
45
- specify { expect(Documents.logger).to equal logger }
46
- end
47
-
48
- end
49
- end
50
-