rmla 1.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.
- data/.document +6 -0
- data/.rspec +1 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +139 -0
- data/LICENSE.txt +20 -0
- data/README.md +255 -0
- data/Rakefile +44 -0
- data/TODO.md +23 -0
- data/VERSION +1 -0
- data/lib/generators/mebla/install/USAGE +7 -0
- data/lib/generators/mebla/install/install_generator.rb +35 -0
- data/lib/generators/mebla/install/templates/mebla.yml +15 -0
- data/lib/mebla.rb +117 -0
- data/lib/mebla/configuration.rb +71 -0
- data/lib/mebla/context.rb +298 -0
- data/lib/mebla/errors.rb +11 -0
- data/lib/mebla/errors/mebla_configuration_exception.rb +10 -0
- data/lib/mebla/errors/mebla_error.rb +14 -0
- data/lib/mebla/errors/mebla_fatal.rb +14 -0
- data/lib/mebla/errors/mebla_index_exception.rb +10 -0
- data/lib/mebla/errors/mebla_synchronization_exception.rb +9 -0
- data/lib/mebla/log_subscriber.rb +74 -0
- data/lib/mebla/mongoid/mebla.rb +341 -0
- data/lib/mebla/railtie.rb +39 -0
- data/lib/mebla/result_set.rb +91 -0
- data/lib/mebla/search.rb +240 -0
- data/lib/mebla/tasks.rb +49 -0
- data/mebla.gemspec +113 -0
- data/spec/fixtures/models.rb +99 -0
- data/spec/fixtures/mongoid.yml +3 -0
- data/spec/mebla/indexing_spec.rb +165 -0
- data/spec/mebla/searching_spec.rb +142 -0
- data/spec/mebla/synchronizing_spec.rb +126 -0
- data/spec/mebla_helper.rb +33 -0
- data/spec/mebla_spec.rb +28 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/support/mongoid.rb +3 -0
- data/spec/support/rails.rb +13 -0
- metadata +301 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'mebla'
|
|
2
|
+
require 'rails'
|
|
3
|
+
|
|
4
|
+
# A wrapper for slingshot elastic-search adapter for Mongoid
|
|
5
|
+
module Mebla
|
|
6
|
+
# @private
|
|
7
|
+
# Railtie for Mebla
|
|
8
|
+
class Railtie < Rails::Railtie
|
|
9
|
+
# Configuration
|
|
10
|
+
initializer "mebla.set_configs" do |app|
|
|
11
|
+
Mebla.configure do |config|
|
|
12
|
+
# Open logfile
|
|
13
|
+
config.logger = ActiveSupport::BufferedLogger.new(
|
|
14
|
+
open("#{Dir.pwd}/log/#{Rails.env}.mebla.log", "a")
|
|
15
|
+
)
|
|
16
|
+
# Setup the log level
|
|
17
|
+
config.logger.level = case app.config.log_level
|
|
18
|
+
when :info
|
|
19
|
+
ActiveSupport::BufferedLogger::Severity::INFO
|
|
20
|
+
when :warn
|
|
21
|
+
ActiveSupport::BufferedLogger::Severity::WARN
|
|
22
|
+
when :error
|
|
23
|
+
ActiveSupport::BufferedLogger::Severity::ERROR
|
|
24
|
+
when :fatal
|
|
25
|
+
ActiveSupport::BufferedLogger::Severity::FATAL
|
|
26
|
+
else
|
|
27
|
+
ActiveSupport::BufferedLogger::Severity::DEBUG
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
config.setup_logger
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Rake tasks
|
|
35
|
+
rake_tasks do
|
|
36
|
+
load File.expand_path('../tasks.rb', __FILE__)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# A wrapper for slingshot elastic-search adapter for Mongoid
|
|
2
|
+
module Mebla
|
|
3
|
+
# Represents a set of search results
|
|
4
|
+
class ResultSet
|
|
5
|
+
include Enumerable
|
|
6
|
+
attr_reader :entries, :facets, :time, :total
|
|
7
|
+
|
|
8
|
+
# --
|
|
9
|
+
# OPTIMIZE: needs major refractoring
|
|
10
|
+
# ++
|
|
11
|
+
|
|
12
|
+
# Creates a new result set from an elasticsearch response hash
|
|
13
|
+
# @param response
|
|
14
|
+
def initialize(response)
|
|
15
|
+
# Keep the query time
|
|
16
|
+
@time = response['took']
|
|
17
|
+
# Keep the facets
|
|
18
|
+
@facets = response['facets']
|
|
19
|
+
# Keep the query total to check against the count
|
|
20
|
+
@total = response['hits']['total']
|
|
21
|
+
|
|
22
|
+
# Be efficient only query the database once
|
|
23
|
+
model_ids = []
|
|
24
|
+
|
|
25
|
+
# Collect results' ids
|
|
26
|
+
response['hits']['hits'].each do |hit|
|
|
27
|
+
model_class = hit['_type'].camelize.constantize
|
|
28
|
+
model_ids << [model_class]
|
|
29
|
+
|
|
30
|
+
if model_class.embedded?
|
|
31
|
+
model_class_collection = model_ids.assoc(model_class)
|
|
32
|
+
# collect parent ids
|
|
33
|
+
# [class, [parent_id, ids]]
|
|
34
|
+
parent_id = hit['_source']['_parent']
|
|
35
|
+
|
|
36
|
+
model_class_collection << [parent_id]
|
|
37
|
+
|
|
38
|
+
model_class_collection.assoc(parent_id) << hit['_source']['id']
|
|
39
|
+
else
|
|
40
|
+
# collect ids
|
|
41
|
+
# [class, ids]
|
|
42
|
+
model_ids.assoc(model_class) << hit['_source']['id']
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Cast the results into their appropriate classes
|
|
47
|
+
@entries = []
|
|
48
|
+
|
|
49
|
+
model_ids.each do |model_class_collection|
|
|
50
|
+
model_class = model_class_collection.first
|
|
51
|
+
ids = model_class_collection.drop(1)
|
|
52
|
+
|
|
53
|
+
unless model_class.embedded?
|
|
54
|
+
# Retrieve the results from the database
|
|
55
|
+
ids.each do |id|
|
|
56
|
+
@entries << model_class.find(id)
|
|
57
|
+
end
|
|
58
|
+
else
|
|
59
|
+
# Get the parent
|
|
60
|
+
parent_class = model_class.embedded_parent
|
|
61
|
+
access_method = model_class.embedded_as
|
|
62
|
+
|
|
63
|
+
ids.each do |parent_id_collection|
|
|
64
|
+
parent_id = parent_id_collection.first
|
|
65
|
+
entries_ids = parent_id_collection.drop(1)
|
|
66
|
+
|
|
67
|
+
parent = parent_class.find parent_id
|
|
68
|
+
|
|
69
|
+
# Retrieve the results from the database
|
|
70
|
+
entries_ids.each do |entry_id|
|
|
71
|
+
@entries << parent.send(access_method.to_sym).find(entry_id)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
Mebla.log("WARNING: Index not synchronized with the database; index total hits: #{@total}, retrieved documents: #{self.count}", :warn) if @total != self.count
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Iterates over the collection
|
|
81
|
+
def each(&block)
|
|
82
|
+
@entries.each(&block)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Returns the item with the given index
|
|
86
|
+
# @param [Integer] index
|
|
87
|
+
def [](index)
|
|
88
|
+
@entries[index]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
data/lib/mebla/search.rb
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# A wrapper for slingshot elastic-search adapter for Mongoid
|
|
2
|
+
module Mebla
|
|
3
|
+
# Handles all searching functions and chains search to define filters, sorting or facets.
|
|
4
|
+
#
|
|
5
|
+
# This example searches posts by tags, sorts and filters the results::
|
|
6
|
+
#
|
|
7
|
+
# criteria = Post.search.terms(:tags, ['ruby', 'rails']).ascending(:publish_date).only(:author => ['cousine'])
|
|
8
|
+
#
|
|
9
|
+
# This will search the index for posts tagged 'ruby' or 'rails', arrange the results ascendingly according
|
|
10
|
+
# to their publish dates, and filter the results by the author named 'cousine'.
|
|
11
|
+
#
|
|
12
|
+
# The search won't be executed unless we try accessing the results collection::
|
|
13
|
+
#
|
|
14
|
+
# results = criteria.hits
|
|
15
|
+
#
|
|
16
|
+
# Or directly iterate the collection::
|
|
17
|
+
#
|
|
18
|
+
# criteria.each do |result|
|
|
19
|
+
# ...
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# Mebla supports multiple methods of searching
|
|
23
|
+
#
|
|
24
|
+
# You can either search by direct Lucene query::
|
|
25
|
+
#
|
|
26
|
+
# Mebla.search("query")
|
|
27
|
+
#
|
|
28
|
+
# Or by term::
|
|
29
|
+
#
|
|
30
|
+
# Mebla.search.term(:field, "term")
|
|
31
|
+
#
|
|
32
|
+
# Or by terms::
|
|
33
|
+
#
|
|
34
|
+
# Mebla.search.terms(:field, ["term 1", "term 2", ...])
|
|
35
|
+
class Search
|
|
36
|
+
include Enumerable
|
|
37
|
+
attr_reader :slingshot_search, :results
|
|
38
|
+
|
|
39
|
+
# Creates a new Search object
|
|
40
|
+
# @param [String] query_string optional search query
|
|
41
|
+
# @param [String, Symbol, Array] type_names a string, symbol or array representing the models to be searcheds
|
|
42
|
+
def initialize(query_string = "", type_names = [])
|
|
43
|
+
# Convert type names from string or symbol to array
|
|
44
|
+
type_names = case true
|
|
45
|
+
when type_names.is_a?(Symbol), type_names.is_a?(String)
|
|
46
|
+
[type_names]
|
|
47
|
+
when type_names.is_a?(Array) && !type_names.empty?
|
|
48
|
+
type_names.collect{|name| name.to_s}
|
|
49
|
+
else
|
|
50
|
+
[]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
@slingshot_search = Slingshot::Search::Search.new(Mebla.context.slingshot_index_name, {})
|
|
54
|
+
# Add a type filter to return only certain types
|
|
55
|
+
unless type_names.empty?
|
|
56
|
+
only(:_type => type_names)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
unless query_string.blank?
|
|
60
|
+
query(query_string)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Creates a terms search criteria
|
|
65
|
+
# @param [String, Symbol] field the field to search
|
|
66
|
+
# @param [Array] values the terms to match
|
|
67
|
+
# @param [Hash] options to refine the search
|
|
68
|
+
# @return [Mebla::Search]
|
|
69
|
+
#
|
|
70
|
+
# Match Posts tagged with either 'ruby' or 'rails'::
|
|
71
|
+
#
|
|
72
|
+
# Post.search.terms(:tags, ['ruby', 'rails'], :minimum_match => 1)
|
|
73
|
+
def terms(field, values, options = {})
|
|
74
|
+
@slingshot_search = @slingshot_search.query
|
|
75
|
+
@slingshot_search.instance_variable_get(:@query).terms(field, values, options)
|
|
76
|
+
self
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Creates a term search criteria
|
|
80
|
+
# @param [String, Symbol] field the field to search
|
|
81
|
+
# @param [String] value term to match
|
|
82
|
+
# @return [Mebla::Search]
|
|
83
|
+
def term(field, value)
|
|
84
|
+
@slingshot_search = @slingshot_search.query
|
|
85
|
+
@slingshot_search.instance_variable_get(:@query).term(field, value)
|
|
86
|
+
self
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Creates a Lucene query string search criteria
|
|
90
|
+
# @param [String] query_string search query
|
|
91
|
+
# @param [Hash] options to refine the search
|
|
92
|
+
#
|
|
93
|
+
# Match Posts with "Test Lucene query" as title::
|
|
94
|
+
#
|
|
95
|
+
# Post.search.query("Test Lucene query", :default_field => "title")
|
|
96
|
+
#
|
|
97
|
+
# You can also instead::
|
|
98
|
+
#
|
|
99
|
+
# Post.search.query("title: Test Lucene query")
|
|
100
|
+
#
|
|
101
|
+
# Or to search all fields::
|
|
102
|
+
#
|
|
103
|
+
# Post.search.query("Test Lucene query")
|
|
104
|
+
#
|
|
105
|
+
# @note For more information check {http://lucene.apache.org/java/2_4_0/queryparsersyntax.html Lucene's query syntax}
|
|
106
|
+
def query(query_string, options = {})
|
|
107
|
+
@slingshot_search = @slingshot_search.query
|
|
108
|
+
@slingshot_search.instance_variable_get(:@query).string(query_string, options)
|
|
109
|
+
self
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Sorts results ascendingly
|
|
113
|
+
# @param [String, Symbol] field to sort by
|
|
114
|
+
# @return [Mebla::Search]
|
|
115
|
+
def ascending(field)
|
|
116
|
+
@slingshot_search = @slingshot_search.sort
|
|
117
|
+
@slingshot_search.instance_variable_get(:@sort).send(field.to_sym, 'asc')
|
|
118
|
+
self
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Sorts results descendingly
|
|
122
|
+
# @param [String, Symbol] field to sort by
|
|
123
|
+
# @return [Mebla::Search]
|
|
124
|
+
def descending(field)
|
|
125
|
+
@slingshot_search = @slingshot_search.sort
|
|
126
|
+
@slingshot_search.instance_variable_get(:@sort).send(field.to_sym, 'desc')
|
|
127
|
+
self
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Creates a new facet for the search
|
|
131
|
+
# @param [String] name of the facet
|
|
132
|
+
# @param [String, Symbol] field to create a facet for
|
|
133
|
+
# @param [Hash] options
|
|
134
|
+
# @return [Mebla::Search]
|
|
135
|
+
#
|
|
136
|
+
# Defining a global facet named "tags"::
|
|
137
|
+
#
|
|
138
|
+
# Post.search("*").facet("tags", :tag, :global => true)
|
|
139
|
+
#
|
|
140
|
+
# @note check {http://www.elasticsearch.org/guide/reference/api/search/facets/ elasticsearch's facet reference} for more information
|
|
141
|
+
def facet(name, field, options={})
|
|
142
|
+
# Get the hash
|
|
143
|
+
facet_hash = @slingshot_search.instance_variable_get(:@facets)
|
|
144
|
+
# Create a new Facet
|
|
145
|
+
facet_obj = Slingshot::Search::Facet.new(name, options)
|
|
146
|
+
facet_obj.terms(field)
|
|
147
|
+
# Initialize the hash if its nil
|
|
148
|
+
if facet_hash.nil?
|
|
149
|
+
@slingshot_search.instance_variable_set(:@facets, {})
|
|
150
|
+
end
|
|
151
|
+
# Add the facet to the hash
|
|
152
|
+
@slingshot_search.instance_variable_get(:@facets).update facet_obj.to_hash
|
|
153
|
+
self
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Filters the results according to the criteria
|
|
157
|
+
# @param [*Hash] fields hash for each filter
|
|
158
|
+
# @return [Mebla::Search]
|
|
159
|
+
#
|
|
160
|
+
# Get all indexed Posts and filter them by tags and authors::
|
|
161
|
+
#
|
|
162
|
+
# Post.search("*").only(:tag => ["ruby", "rails"], :author => ["cousine"])
|
|
163
|
+
def only(*fields)
|
|
164
|
+
return if fields.empty?
|
|
165
|
+
fields.each do |field|
|
|
166
|
+
@slingshot_search = @slingshot_search.filter(:terms, field)
|
|
167
|
+
end
|
|
168
|
+
self
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Sets the maximum number of hits per query, defaults to 10
|
|
172
|
+
# @param [Integer] value
|
|
173
|
+
# @return [Mebla::Search]
|
|
174
|
+
def size(value)
|
|
175
|
+
@slingshot_search = @slingshot_search.size(value)
|
|
176
|
+
self
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Sets the starting offset for the query
|
|
180
|
+
# @param [Integer] value
|
|
181
|
+
# @return [Mebla::Search]
|
|
182
|
+
def from(value)
|
|
183
|
+
@slingshot_search = @slingshot_search.from(value)
|
|
184
|
+
self
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Performs the search and returns the results
|
|
188
|
+
# @return [Mebla::ResultSet]
|
|
189
|
+
def hits
|
|
190
|
+
return @results if @results
|
|
191
|
+
# Log search query
|
|
192
|
+
Mebla.log("Searching:\n#{@slingshot_search.to_json.to_s}", :debug)
|
|
193
|
+
response = @slingshot_search.perform.json
|
|
194
|
+
Mebla.log("Response:\n#{response.to_json.to_s}", :info)
|
|
195
|
+
@results = Mebla::ResultSet.new(response)
|
|
196
|
+
# Log results statistics
|
|
197
|
+
Mebla.log("Searched for:\n#{@slingshot_search.to_json.to_s}\ngot #{@results.total} documents in #{@results.time} ms", :debug)
|
|
198
|
+
@results
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Returns the internal results list
|
|
202
|
+
# @return [Array]
|
|
203
|
+
def entries
|
|
204
|
+
hits.entries
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Retrieves the total number of hits
|
|
208
|
+
# @return [Integer]
|
|
209
|
+
def total
|
|
210
|
+
hits.total
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Retrieves the time taken to perform the search in ms
|
|
214
|
+
# @return [Float]
|
|
215
|
+
def time
|
|
216
|
+
hits.time
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Retrieves the facets
|
|
220
|
+
# @return [Hash]
|
|
221
|
+
#
|
|
222
|
+
# Reading a facet named 'tags'::
|
|
223
|
+
#
|
|
224
|
+
# facets = Post.search("*").facet("tags", :tag)
|
|
225
|
+
# facets["terms"].each do |term|
|
|
226
|
+
# puts "#{term['term']} - #{term['count']}"
|
|
227
|
+
# end
|
|
228
|
+
def facets
|
|
229
|
+
hits.facets
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# Iterates over the results collection
|
|
233
|
+
def each(&block)
|
|
234
|
+
hits.each(&block)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
alias_method :asc, :ascending
|
|
238
|
+
alias_method :desc, :descending
|
|
239
|
+
end
|
|
240
|
+
end
|
data/lib/mebla/tasks.rb
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
namespace :mebla do
|
|
2
|
+
desc "Creates the indeces and indexes the data for all indexed models"
|
|
3
|
+
task :index => :environment do
|
|
4
|
+
setup
|
|
5
|
+
@context.index_data
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
desc "Drops then creates the indeces and indexes the data for all indexed models"
|
|
9
|
+
task :reindex => :environment do
|
|
10
|
+
setup
|
|
11
|
+
@context.reindex_data
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
desc "Creates the index without indexing the data"
|
|
15
|
+
task :create_index => :environment do
|
|
16
|
+
setup
|
|
17
|
+
@context.create_index
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
desc "Rebuilds the index without indexing the data"
|
|
21
|
+
task :rebuild_index => :environment do
|
|
22
|
+
setup
|
|
23
|
+
@context.rebuild_index
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc "Drops the index"
|
|
27
|
+
task :drop_index => :environment do
|
|
28
|
+
setup
|
|
29
|
+
@context.drop_index
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
desc "Refreshes the index"
|
|
33
|
+
task :refresh_index => :environment do
|
|
34
|
+
setup
|
|
35
|
+
@context.refresh_index
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @private
|
|
40
|
+
# Sets up the logger and loads all the models
|
|
41
|
+
def setup
|
|
42
|
+
Rails.application.eager_load!
|
|
43
|
+
Mebla.configure do |config|
|
|
44
|
+
config.logger = ActiveSupport::BufferedLogger.new(STDOUT)
|
|
45
|
+
config.logger.level = ActiveSupport::BufferedLogger::Severity::UNKNOWN
|
|
46
|
+
config.setup_logger
|
|
47
|
+
end
|
|
48
|
+
@context = Mebla.context
|
|
49
|
+
end
|
data/mebla.gemspec
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = "rmla"
|
|
8
|
+
s.version = "1.0"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("<= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Youssef Hanna"]
|
|
12
|
+
s.date = "2012-01-04"
|
|
13
|
+
s.description = "\n An elasticsearch wrapper for mongoid odm based on slingshot. Makes integration between ElasticSearch full-text \n search engine and Mongoid documents seemless and simple.\n "
|
|
14
|
+
s.email = "1@11.com"
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"LICENSE.txt",
|
|
17
|
+
"README.md"
|
|
18
|
+
]
|
|
19
|
+
s.files = [
|
|
20
|
+
".document",
|
|
21
|
+
".rspec",
|
|
22
|
+
"Gemfile",
|
|
23
|
+
"Gemfile.lock",
|
|
24
|
+
"LICENSE.txt",
|
|
25
|
+
"README.md",
|
|
26
|
+
"Rakefile",
|
|
27
|
+
"TODO.md",
|
|
28
|
+
"VERSION",
|
|
29
|
+
"lib/generators/mebla/install/USAGE",
|
|
30
|
+
"lib/generators/mebla/install/install_generator.rb",
|
|
31
|
+
"lib/generators/mebla/install/templates/mebla.yml",
|
|
32
|
+
"lib/mebla.rb",
|
|
33
|
+
"lib/mebla/configuration.rb",
|
|
34
|
+
"lib/mebla/context.rb",
|
|
35
|
+
"lib/mebla/errors.rb",
|
|
36
|
+
"lib/mebla/errors/mebla_configuration_exception.rb",
|
|
37
|
+
"lib/mebla/errors/mebla_error.rb",
|
|
38
|
+
"lib/mebla/errors/mebla_fatal.rb",
|
|
39
|
+
"lib/mebla/errors/mebla_index_exception.rb",
|
|
40
|
+
"lib/mebla/errors/mebla_synchronization_exception.rb",
|
|
41
|
+
"lib/mebla/log_subscriber.rb",
|
|
42
|
+
"lib/mebla/mongoid/mebla.rb",
|
|
43
|
+
"lib/mebla/railtie.rb",
|
|
44
|
+
"lib/mebla/result_set.rb",
|
|
45
|
+
"lib/mebla/search.rb",
|
|
46
|
+
"lib/mebla/tasks.rb",
|
|
47
|
+
"mebla.gemspec",
|
|
48
|
+
"spec/fixtures/models.rb",
|
|
49
|
+
"spec/fixtures/mongoid.yml",
|
|
50
|
+
"spec/mebla/indexing_spec.rb",
|
|
51
|
+
"spec/mebla/searching_spec.rb",
|
|
52
|
+
"spec/mebla/synchronizing_spec.rb",
|
|
53
|
+
"spec/mebla_helper.rb",
|
|
54
|
+
"spec/mebla_spec.rb",
|
|
55
|
+
"spec/spec_helper.rb",
|
|
56
|
+
"spec/support/mongoid.rb",
|
|
57
|
+
"spec/support/rails.rb"
|
|
58
|
+
]
|
|
59
|
+
s.homepage = "http://github.com/cousine/mebla"
|
|
60
|
+
s.licenses = ["MIT"]
|
|
61
|
+
s.require_paths = ["lib"]
|
|
62
|
+
s.rubygems_version = "1.8.11"
|
|
63
|
+
s.summary = "An elasticsearch wrapper for mongoid odm based on slingshot."
|
|
64
|
+
|
|
65
|
+
if s.respond_to? :specification_version then
|
|
66
|
+
s.specification_version = 3
|
|
67
|
+
|
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
69
|
+
s.add_runtime_dependency(%q<slingshot-rb>, ["= 0.0.8"])
|
|
70
|
+
s.add_runtime_dependency(%q<mongoid>, [">= 2.1.8"])
|
|
71
|
+
s.add_development_dependency(%q<bson_ext>, ["~> 1.3.1"])
|
|
72
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
|
73
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
|
74
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
|
75
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
|
76
|
+
s.add_development_dependency(%q<mongoid-rspec>, ["~> 1.4.4"])
|
|
77
|
+
s.add_development_dependency(%q<database_cleaner>, ["= 0.6.4"])
|
|
78
|
+
s.add_development_dependency(%q<bluecloth>, ["~> 2.1.0"])
|
|
79
|
+
s.add_development_dependency(%q<irbtools>, [">= 0"])
|
|
80
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
|
81
|
+
s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
|
|
82
|
+
else
|
|
83
|
+
s.add_dependency(%q<slingshot-rb>, ["= 0.0.8"])
|
|
84
|
+
s.add_dependency(%q<mongoid>, [">= 2.1.8"])
|
|
85
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.3.1"])
|
|
86
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
|
87
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
|
88
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
|
89
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
|
90
|
+
s.add_dependency(%q<mongoid-rspec>, ["~> 1.4.4"])
|
|
91
|
+
s.add_dependency(%q<database_cleaner>, ["= 0.6.4"])
|
|
92
|
+
s.add_dependency(%q<bluecloth>, ["~> 2.1.0"])
|
|
93
|
+
s.add_dependency(%q<irbtools>, [">= 0"])
|
|
94
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
|
95
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
s.add_dependency(%q<slingshot-rb>, ["= 0.0.8"])
|
|
99
|
+
s.add_dependency(%q<mongoid>, [">= 2.1.8"])
|
|
100
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.3.1"])
|
|
101
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
|
102
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
|
103
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
|
104
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
|
105
|
+
s.add_dependency(%q<mongoid-rspec>, ["~> 1.4.4"])
|
|
106
|
+
s.add_dependency(%q<database_cleaner>, ["= 0.6.4"])
|
|
107
|
+
s.add_dependency(%q<bluecloth>, ["~> 2.1.0"])
|
|
108
|
+
s.add_dependency(%q<irbtools>, [">= 0"])
|
|
109
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
|
110
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|