From 133abdd4ba8f6572246c13b686d427316827a150 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 15:13:10 -0400 Subject: [PATCH 01/13] make it rails 3.0.x compatible while keeping rails 2.3.x compatibility --- Rakefile | 10 ------- escargot.gemspec | 3 +- lib/escargot.rb | 15 +++++++--- lib/escargot/rails/init.rb | 15 ++++++++++ lib/escargot/rails/init_commun.rb | 11 +++++++ lib/escargot/rails/railtie.rb | 24 +++++++++++++++ lib/escargot/tasks/escargot.rake | 50 +++++++++++++++++++++++++++++++ rails/init.rb | 21 ------------- 8 files changed, 113 insertions(+), 36 deletions(-) create mode 100644 lib/escargot/rails/init.rb create mode 100644 lib/escargot/rails/init_commun.rb create mode 100644 lib/escargot/rails/railtie.rb create mode 100644 lib/escargot/tasks/escargot.rake delete mode 100644 rails/init.rb diff --git a/Rakefile b/Rakefile index 24684b2..79cad86 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,5 @@ require 'rake' require 'rake/testtask' -require 'rake/rdoctask' desc 'Default: run unit tests.' task :default => :test @@ -11,13 +10,4 @@ Rake::TestTask.new(:test) do |t| t.libs << 'test' t.pattern = 'test/**/*_test.rb' t.verbose = true -end - -desc 'Generate documentation for the elastic_rails plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'ElasticRails' - rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README') - rdoc.rdoc_files.include('lib/**/*.rb') end \ No newline at end of file diff --git a/escargot.gemspec b/escargot.gemspec index 24b44db..593055c 100644 --- a/escargot.gemspec +++ b/escargot.gemspec @@ -1,5 +1,6 @@ # -*- encoding: utf-8 -*- -require File.expand_path("../lib/escargot/version", __FILE__) +$:.push File.expand_path("../lib", __FILE__) +require "escargot/version" Gem::Specification.new do |s| s.name = "escargot" diff --git a/lib/escargot.rb b/lib/escargot.rb index 22b29f0..18695b3 100644 --- a/lib/escargot.rb +++ b/lib/escargot.rb @@ -1,4 +1,3 @@ -# Escargot require 'elasticsearch' require 'escargot/activerecord_ex' require 'escargot/elasticsearch_ex' @@ -7,7 +6,6 @@ require 'escargot/queue_backend/base' require 'escargot/queue_backend/resque' - module Escargot def self.register_model(model) return unless model.table_exists? @@ -80,8 +78,8 @@ def self.search_count(query = "*", options = {}, call_by_instance_method = false def self.register_all_models models = [] # Search all Models in the application Rails - Dir[File.join("#{RAILS_ROOT}/app/models".split(/\\/), "**", "*.rb")].each do |file| - model = file.gsub(/#{RAILS_ROOT}\/app\/models\/(.*?)\.rb/,'\1').classify.constantize + Dir[File.join(Rails.root.to_s + "/app/models".split(/\\/), "**", "*.rb")].each do |file| + model = file.gsub(/Rails.root.to_s\/app\/models\/(.*?)\.rb/,'\1').classify.constantize unless models.include?(model) require file end @@ -91,3 +89,12 @@ def self.register_all_models end + + +#------------------------------------------------------------------------------- +require 'escargot' +require 'escargot/rails/init_commun' + +# preserve rails 2.x compatibility +(Rails::VERSION::MAJOR == 3) ? (require 'escargot/rails/railtie') : (require 'escargot/rails/init') +#------------------------------------------------------------------------------- diff --git a/lib/escargot/rails/init.rb b/lib/escargot/rails/init.rb new file mode 100644 index 0000000..ebb7f52 --- /dev/null +++ b/lib/escargot/rails/init.rb @@ -0,0 +1,15 @@ +require 'escargot' + +ActiveRecord::Base.class_eval do + include Escargot::ActiveRecordExtensions +end + +ElasticSearch::Api::Hit.class_eval do + include Escargot::HitExtensions +end + +ElasticSearch::Client.class_eval do + include Escargot::AdminIndexVersions +end + +init_elastic_Search_client \ No newline at end of file diff --git a/lib/escargot/rails/init_commun.rb b/lib/escargot/rails/init_commun.rb new file mode 100644 index 0000000..08e8374 --- /dev/null +++ b/lib/escargot/rails/init_commun.rb @@ -0,0 +1,11 @@ +def init_elastic_Search_client + path_to_elasticsearch_config_file = Rails.root.to_s + "/config/elasticsearch.yml" + + unless File.exists?(path_to_elasticsearch_config_file) + Rails.logger.warn "No config/elastic_search.yaml file found, connecting to localhost:9200" + $elastic_search_client = ElasticSearch.new("localhost:9200") + else + config = YAML.load_file(path_to_elasticsearch_config_file) + $elastic_search_client = ElasticSearch.new(config["host"] + ":" + config["port"].to_s, :timeout => 20) + end +end diff --git a/lib/escargot/rails/railtie.rb b/lib/escargot/rails/railtie.rb new file mode 100644 index 0000000..5584fc6 --- /dev/null +++ b/lib/escargot/rails/railtie.rb @@ -0,0 +1,24 @@ +module Escargot + class Railtie < ::Rails::Railtie + initializer 'escargot.init' do + ActiveSupport.on_load(:active_record) do + ElasticSearch::Api::Hit.class_eval{include Escargot::HitExtensions} + ElasticSearch::Client.class_eval{include Escargot::AdminIndexVersions} + include(Escargot::ActiveRecordExtensions) + init_elastic_Search_client + end + #ActiveSupport.on_load(:action_controller) do + # include(ElasticSearch::RequestLifecycle) + #end + end + + rake_tasks do + load 'escargot/tasks/escargot.tasks' + end + + generators do + load "generators/escargot_install/escargot_install_generator.rb" + end + + end +end diff --git a/lib/escargot/tasks/escargot.rake b/lib/escargot/tasks/escargot.rake new file mode 100644 index 0000000..9db1263 --- /dev/null +++ b/lib/escargot/tasks/escargot.rake @@ -0,0 +1,50 @@ +# desc "Explaining what the task does" +# task :elastic_rails do +# # Task goes here +# end + +namespace :escargot do + desc "indexes the models" + task :index, :models, :needs => [:environment, :load_all_models] do |t, args| + each_indexed_model(args) do |model| + puts "Indexing #{model}" + Escargot::LocalIndexing.create_index_for_model(model) + end + end + + desc "indexes the models" + task :distributed_index, :models, :needs => [:environment, :load_all_models] do |t, args| + each_indexed_model(args) do |model| + puts "Indexing #{model}" + Escargot::DistributedIndexing.create_index_for_model(model) + end + end + + desc "prunes old index versions for this models" + task :prune_versions, :models, :needs => [:environment, :load_all_models] do |t, args| + each_indexed_model(args) do |model| + $elastic_search_client.prune_index_versions(model.index_name) + end + end + + task :load_all_models do + models = ActiveRecord::Base.send(:subclasses) + Dir["#{Rails.root}/app/models/*.rb", "#{Rails.root}/app/models/*/*.rb"].each do |file| + model = File.basename(file, ".*").classify + unless models.include?(model) + require file + end + models << model + end + end + + private + def each_indexed_model(args) + if args[:models] + models = args[:models].split(",").map{|m| m.classify.constantize} + else + models = Escargot.indexed_models + end + models.each{|m| yield m} + end +end diff --git a/rails/init.rb b/rails/init.rb deleted file mode 100644 index 7a3a5e7..0000000 --- a/rails/init.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'escargot' - -ActiveRecord::Base.class_eval do - include Escargot::ActiveRecordExtensions -end - -ElasticSearch::Api::Hit.class_eval do - include Escargot::HitExtensions -end - -ElasticSearch::Client.class_eval do - include Escargot::AdminIndexVersions -end - -unless File.exists?(Rails.root + "/config/elasticsearch.yml") - Rails.logger.warn "No config/elastic_search.yaml file found, connecting to localhost:9200" - $elastic_search_client = ElasticSearch.new("localhost:9200") -else - config = YAML.load_file(RAILS_ROOT + "/config/elasticsearch.yml") - $elastic_search_client = ElasticSearch.new(config["host"] + ":" + config["port"].to_s, :timeout => 20) -end \ No newline at end of file From af4e2ac1e7b640a1531fc89cf80901fe558daec5 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 15:14:57 -0400 Subject: [PATCH 02/13] add generator: escargot:install (generates config/elasticsearch.yml) .. it is intended to be both rails 2.3.x and rails 3.0.x compatible (need tests on rails 2.3.x) --- generators/escargot_install/USAGE | 8 +++++++ .../escargot_install_generator.rb | 13 ++++++++++ .../templates/config/elasticsearch.yml | 2 ++ lib/escargot/rails/railtie.rb.bak | 24 +++++++++++++++++++ lib/generators/escargot_install/USAGE | 8 +++++++ lib/generators/escargot_install/USAGE.bak | 8 +++++++ .../escargot_install_generator.rb | 15 ++++++++++++ .../templates/config/elasticsearch.yml | 2 ++ 8 files changed, 80 insertions(+) create mode 100644 generators/escargot_install/USAGE create mode 100644 generators/escargot_install/escargot_install_generator.rb create mode 100644 generators/escargot_install/templates/config/elasticsearch.yml create mode 100644 lib/escargot/rails/railtie.rb.bak create mode 100644 lib/generators/escargot_install/USAGE create mode 100644 lib/generators/escargot_install/USAGE.bak create mode 100644 lib/generators/escargot_install/escargot_install_generator.rb create mode 100644 lib/generators/escargot_install/templates/config/elasticsearch.yml diff --git a/generators/escargot_install/USAGE b/generators/escargot_install/USAGE new file mode 100644 index 0000000..5af4072 --- /dev/null +++ b/generators/escargot_install/USAGE @@ -0,0 +1,8 @@ +Description: + Explain the generator + +Example: + ruby script/generate escargot_install + + This will create: + what/will/it/create diff --git a/generators/escargot_install/escargot_install_generator.rb b/generators/escargot_install/escargot_install_generator.rb new file mode 100644 index 0000000..4e79b49 --- /dev/null +++ b/generators/escargot_install/escargot_install_generator.rb @@ -0,0 +1,13 @@ +# rails 2 generator +module Escargot + class InstallGenerator < Rails::Generators::NamedBase + + def manifest + record do |m| + m.template 'config/elasticsearch.yml', 'config/elasticsearch.yml' + end + end + + end +end + diff --git a/generators/escargot_install/templates/config/elasticsearch.yml b/generators/escargot_install/templates/config/elasticsearch.yml new file mode 100644 index 0000000..fa29b5c --- /dev/null +++ b/generators/escargot_install/templates/config/elasticsearch.yml @@ -0,0 +1,2 @@ +host: localhost +port: 9200 \ No newline at end of file diff --git a/lib/escargot/rails/railtie.rb.bak b/lib/escargot/rails/railtie.rb.bak new file mode 100644 index 0000000..a422ab3 --- /dev/null +++ b/lib/escargot/rails/railtie.rb.bak @@ -0,0 +1,24 @@ +module Escargot + class Railtie < ::Rails::Railtie + initializer 'escargot.init' do + ActiveSupport.on_load(:active_record) do + ElasticSearch::Api::Hit.class_eval{include Escargot::HitExtensions} + ElasticSearch::Client.class_eval{include Escargot::AdminIndexVersions} + include(Escargot::ActiveRecordExtensions) + init_elastic_Search_client + end + #ActiveSupport.on_load(:action_controller) do + # include(ElasticSearch::RequestLifecycle) + #end + end + + rake_tasks do + load 'escargot.tasks' + end + + generators do + load "generators/escargot_install/escargot_install_generator.rb" + end + + end +end diff --git a/lib/generators/escargot_install/USAGE b/lib/generators/escargot_install/USAGE new file mode 100644 index 0000000..ef6b608 --- /dev/null +++ b/lib/generators/escargot_install/USAGE @@ -0,0 +1,8 @@ +Description: + Explain the generator + +Example: + rails generate escargot:install + + This will create: + what/will/it/create diff --git a/lib/generators/escargot_install/USAGE.bak b/lib/generators/escargot_install/USAGE.bak new file mode 100644 index 0000000..14a55c4 --- /dev/null +++ b/lib/generators/escargot_install/USAGE.bak @@ -0,0 +1,8 @@ +Description: + Explain the generator + +Example: + rails generate escargot_install + + This will create: + what/will/it/create diff --git a/lib/generators/escargot_install/escargot_install_generator.rb b/lib/generators/escargot_install/escargot_install_generator.rb new file mode 100644 index 0000000..28e90e9 --- /dev/null +++ b/lib/generators/escargot_install/escargot_install_generator.rb @@ -0,0 +1,15 @@ +module Escargot + class InstallGenerator < Rails::Generators::NamedBase + + source_root File.expand_path('../templates', __FILE__) + + argument :name, :required => false, :type => :string, :default => "elasticsearch.yml" + + def copy_config_file + template 'config/elasticsearch.yml' + #copy_file 'config/elasticsearch.yml', "config/elasticsearch.yml" + end + + end +end + diff --git a/lib/generators/escargot_install/templates/config/elasticsearch.yml b/lib/generators/escargot_install/templates/config/elasticsearch.yml new file mode 100644 index 0000000..fa29b5c --- /dev/null +++ b/lib/generators/escargot_install/templates/config/elasticsearch.yml @@ -0,0 +1,2 @@ +host: localhost +port: 9200 \ No newline at end of file From ac95945ee6221f8f8c0f0a5310032deea6dca172 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 15:41:39 -0400 Subject: [PATCH 03/13] oups! .bak files removed --- lib/escargot/rails/railtie.rb.bak | 24 ----------------------- lib/generators/escargot_install/USAGE.bak | 8 -------- 2 files changed, 32 deletions(-) delete mode 100644 lib/escargot/rails/railtie.rb.bak delete mode 100644 lib/generators/escargot_install/USAGE.bak diff --git a/lib/escargot/rails/railtie.rb.bak b/lib/escargot/rails/railtie.rb.bak deleted file mode 100644 index a422ab3..0000000 --- a/lib/escargot/rails/railtie.rb.bak +++ /dev/null @@ -1,24 +0,0 @@ -module Escargot - class Railtie < ::Rails::Railtie - initializer 'escargot.init' do - ActiveSupport.on_load(:active_record) do - ElasticSearch::Api::Hit.class_eval{include Escargot::HitExtensions} - ElasticSearch::Client.class_eval{include Escargot::AdminIndexVersions} - include(Escargot::ActiveRecordExtensions) - init_elastic_Search_client - end - #ActiveSupport.on_load(:action_controller) do - # include(ElasticSearch::RequestLifecycle) - #end - end - - rake_tasks do - load 'escargot.tasks' - end - - generators do - load "generators/escargot_install/escargot_install_generator.rb" - end - - end -end diff --git a/lib/generators/escargot_install/USAGE.bak b/lib/generators/escargot_install/USAGE.bak deleted file mode 100644 index 14a55c4..0000000 --- a/lib/generators/escargot_install/USAGE.bak +++ /dev/null @@ -1,8 +0,0 @@ -Description: - Explain the generator - -Example: - rails generate escargot_install - - This will create: - what/will/it/create From 3a0e624e8a268238aceb34346340f02cedd5b674 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 21:26:22 -0400 Subject: [PATCH 04/13] ignore .bak files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ff04183..456987e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ # vim swap files *.swp *.swo + +# bak files +*.bak From 1c4b7eb467d03ca1156ef3e412f63b62dac8163d Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 21:27:55 -0400 Subject: [PATCH 05/13] @bugfix: escargot generator is now working with rails 2.3.x --- generators/escargot_install/escargot_install_generator.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/generators/escargot_install/escargot_install_generator.rb b/generators/escargot_install/escargot_install_generator.rb index 4e79b49..b023270 100644 --- a/generators/escargot_install/escargot_install_generator.rb +++ b/generators/escargot_install/escargot_install_generator.rb @@ -1,6 +1,5 @@ # rails 2 generator -module Escargot - class InstallGenerator < Rails::Generators::NamedBase + class EscargotInstallGenerator < Rails::Generator::Base def manifest record do |m| @@ -9,5 +8,4 @@ def manifest end end -end From 879e9368fb6b322a3cd4545d21d87ec987dce20c Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 21:28:15 -0400 Subject: [PATCH 06/13] generator usage updated --- generators/escargot_install/USAGE | 5 +++-- lib/generators/escargot_install/USAGE | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/generators/escargot_install/USAGE b/generators/escargot_install/USAGE index 5af4072..a78aba6 100644 --- a/generators/escargot_install/USAGE +++ b/generators/escargot_install/USAGE @@ -2,7 +2,8 @@ Description: Explain the generator Example: - ruby script/generate escargot_install + rails 2.3.x: ruby script/generate escargot_install + rails 3.0.x: rails generate escargot:install This will create: - what/will/it/create + config/elasticsearch.yml diff --git a/lib/generators/escargot_install/USAGE b/lib/generators/escargot_install/USAGE index ef6b608..a78aba6 100644 --- a/lib/generators/escargot_install/USAGE +++ b/lib/generators/escargot_install/USAGE @@ -2,7 +2,8 @@ Description: Explain the generator Example: - rails generate escargot:install + rails 2.3.x: ruby script/generate escargot_install + rails 3.0.x: rails generate escargot:install This will create: - what/will/it/create + config/elasticsearch.yml From 97cebc8c9e19c66bdc20424f51a4af0ecdd81e14 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 21:30:37 -0400 Subject: [PATCH 07/13] .specification file added to avoid warning when unpacked to rails 2.3.x projects --- .specification | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .specification diff --git a/.specification b/.specification new file mode 100644 index 0000000..1af32c3 --- /dev/null +++ b/.specification @@ -0,0 +1,74 @@ +--- !ruby/object:Gem::Specification +name: escargot +version: !ruby/object:Gem::Version + version: 0.0.3 + prerelease: + segments: + - 0 + - 0 + - 3 +platform: ruby +authors: +- Angel Faus +autorequire: +bindir: bin +cert_chain: [] +date: 2011-04-25 00:00:00.000000000Z +dependencies: +- !ruby/object:Gem::Dependency + name: bundler + requirement: &21062412 !ruby/object:Gem::Requirement + none: false + requirements: + - - ! '>=' + - !ruby/object:Gem::Version + version: 1.0.0 + type: :development + prerelease: false + version_requirements: *21062412 +- !ruby/object:Gem::Dependency + name: rubberband + requirement: &21062052 !ruby/object:Gem::Requirement + none: false + requirements: + - - ! '>=' + - !ruby/object:Gem::Version + version: 0.0.5 + type: :runtime + prerelease: false + version_requirements: *21062052 +description: Connects any Rails model with ElasticSearch, supports near real time + updates, distributed indexing and models that integrate data from many databases. +email: +- angel@vlex.com +executables: [] +extensions: [] +extra_rdoc_files: [] +files: [] +homepage: http://github.com/angelf/escargot +licenses: [] +post_install_message: +rdoc_options: [] +require_paths: +- lib +required_ruby_version: !ruby/object:Gem::Requirement + none: false + requirements: + - - ! '>=' + - !ruby/object:Gem::Version + version: '0' +required_rubygems_version: !ruby/object:Gem::Requirement + none: false + requirements: + - - ! '>=' + - !ruby/object:Gem::Version + version: 1.3.6 +requirements: [] +rubyforge_project: escargot +rubygems_version: 1.7.2 +signing_key: +specification_version: 3 +summary: ElasticSearch connector for Rails +test_files: [] +has_rdoc: true + From 31592141e6f3aff23d791dd3a6eca3f03e8f7915 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 21:41:19 -0400 Subject: [PATCH 08/13] @refactoring: to avoid confusion with elasticsearch own configuration file, escargot config file (config/elasticsearch.yml) is renamed to config/escargot.yml. --- generators/escargot_install/USAGE | 2 +- generators/escargot_install/escargot_install_generator.rb | 2 +- .../templates/config/{elasticsearch.yml => escargot.yml} | 0 lib/escargot/rails/init_commun.rb | 4 ++-- lib/generators/escargot_install/USAGE | 2 +- .../escargot_install/escargot_install_generator.rb | 5 ++--- .../templates/config/{elasticsearch.yml => escargot.yml} | 0 7 files changed, 7 insertions(+), 8 deletions(-) rename generators/escargot_install/templates/config/{elasticsearch.yml => escargot.yml} (100%) rename lib/generators/escargot_install/templates/config/{elasticsearch.yml => escargot.yml} (100%) diff --git a/generators/escargot_install/USAGE b/generators/escargot_install/USAGE index a78aba6..fc2a646 100644 --- a/generators/escargot_install/USAGE +++ b/generators/escargot_install/USAGE @@ -6,4 +6,4 @@ Example: rails 3.0.x: rails generate escargot:install This will create: - config/elasticsearch.yml + config/escargot.yml diff --git a/generators/escargot_install/escargot_install_generator.rb b/generators/escargot_install/escargot_install_generator.rb index b023270..ebaab64 100644 --- a/generators/escargot_install/escargot_install_generator.rb +++ b/generators/escargot_install/escargot_install_generator.rb @@ -3,7 +3,7 @@ class EscargotInstallGenerator < Rails::Generator::Base def manifest record do |m| - m.template 'config/elasticsearch.yml', 'config/elasticsearch.yml' + m.template 'config/escargot.yml', 'config/escargot.yml' end end diff --git a/generators/escargot_install/templates/config/elasticsearch.yml b/generators/escargot_install/templates/config/escargot.yml similarity index 100% rename from generators/escargot_install/templates/config/elasticsearch.yml rename to generators/escargot_install/templates/config/escargot.yml diff --git a/lib/escargot/rails/init_commun.rb b/lib/escargot/rails/init_commun.rb index 08e8374..77e3fdf 100644 --- a/lib/escargot/rails/init_commun.rb +++ b/lib/escargot/rails/init_commun.rb @@ -1,8 +1,8 @@ def init_elastic_Search_client - path_to_elasticsearch_config_file = Rails.root.to_s + "/config/elasticsearch.yml" + path_to_elasticsearch_config_file = Rails.root.to_s + "/config/escargot.yml" unless File.exists?(path_to_elasticsearch_config_file) - Rails.logger.warn "No config/elastic_search.yaml file found, connecting to localhost:9200" + Rails.logger.warn "No config/escargot.yaml file found, connecting to localhost:9200" $elastic_search_client = ElasticSearch.new("localhost:9200") else config = YAML.load_file(path_to_elasticsearch_config_file) diff --git a/lib/generators/escargot_install/USAGE b/lib/generators/escargot_install/USAGE index a78aba6..fc2a646 100644 --- a/lib/generators/escargot_install/USAGE +++ b/lib/generators/escargot_install/USAGE @@ -6,4 +6,4 @@ Example: rails 3.0.x: rails generate escargot:install This will create: - config/elasticsearch.yml + config/escargot.yml diff --git a/lib/generators/escargot_install/escargot_install_generator.rb b/lib/generators/escargot_install/escargot_install_generator.rb index 28e90e9..30a646d 100644 --- a/lib/generators/escargot_install/escargot_install_generator.rb +++ b/lib/generators/escargot_install/escargot_install_generator.rb @@ -3,11 +3,10 @@ class InstallGenerator < Rails::Generators::NamedBase source_root File.expand_path('../templates', __FILE__) - argument :name, :required => false, :type => :string, :default => "elasticsearch.yml" + argument :name, :required => false, :type => :string, :default => "escargot.yml" def copy_config_file - template 'config/elasticsearch.yml' - #copy_file 'config/elasticsearch.yml', "config/elasticsearch.yml" + template 'config/escargot.yml' end end diff --git a/lib/generators/escargot_install/templates/config/elasticsearch.yml b/lib/generators/escargot_install/templates/config/escargot.yml similarity index 100% rename from lib/generators/escargot_install/templates/config/elasticsearch.yml rename to lib/generators/escargot_install/templates/config/escargot.yml From 20148b8522bddae08aaba3d21ba5ce4799a3a120 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 22:02:45 -0400 Subject: [PATCH 09/13] @doc updated --- README.markdown | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index b872582..c8a91ba 100644 --- a/README.markdown +++ b/README.markdown @@ -7,9 +7,29 @@ distributed indexing and models that integrate data from many databases. Requirements ============ -Currently only rails 2.3 is supported. You will need ElasticSearch, the 'rubberband' gem +Escargot supports both rails 2.3.x and rails 3.0.x. You will need ElasticSearch, the 'rubberband' gem and (if you want to use the **optional** distributed indexing mode) Redis. +Configuration +============= +By default, Escargot will try to connect to elasticsearch at + - host: localhost + - port: 9200 + +To explicitly specify a server host and a port of elasticsearch to connect to, one need to create +config/escargot.yml and add the following lines: +host: +port: + +If you are lasy to create config/escargot.yml by hand, there is a solution for you named escargot install generator. +To invoque the generator, just trigger one of the following commands: +- rails 2.3.x: + ruby script/generate escargot_install + +- rails 3.0.x: + rails generate escargot:install + + Usage ======= From ebc6c76b0663a17b325a86542052ad0843372899 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 22:08:19 -0400 Subject: [PATCH 10/13] @doc: reformating --- README.markdown | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/README.markdown b/README.markdown index c8a91ba..605d9fb 100644 --- a/README.markdown +++ b/README.markdown @@ -13,21 +13,28 @@ and (if you want to use the **optional** distributed indexing mode) Redis. Configuration ============= By default, Escargot will try to connect to elasticsearch at - - host: localhost - - port: 9200 + + host: localhost + + port: 9200 To explicitly specify a server host and a port of elasticsearch to connect to, one need to create config/escargot.yml and add the following lines: -host: -port: + + host: + + port: If you are lasy to create config/escargot.yml by hand, there is a solution for you named escargot install generator. To invoque the generator, just trigger one of the following commands: + - rails 2.3.x: - ruby script/generate escargot_install + + ruby script/generate escargot_install - rails 3.0.x: - rails generate escargot:install + + rails generate escargot:install Usage From 3858d9c561a564de23f1d5d543932465b7a068aa Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 22:08:19 -0400 Subject: [PATCH 11/13] @doc: formating --- README.markdown | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/README.markdown b/README.markdown index c8a91ba..2358f93 100644 --- a/README.markdown +++ b/README.markdown @@ -13,21 +13,28 @@ and (if you want to use the **optional** distributed indexing mode) Redis. Configuration ============= By default, Escargot will try to connect to elasticsearch at - - host: localhost - - port: 9200 + + host: localhost + + port: 9200 To explicitly specify a server host and a port of elasticsearch to connect to, one need to create config/escargot.yml and add the following lines: -host: -port: + + host: + + port: If you are lasy to create config/escargot.yml by hand, there is a solution for you named escargot install generator. To invoque the generator, just trigger one of the following commands: + - rails 2.3.x: - ruby script/generate escargot_install + + ruby script/generate escargot_install - rails 3.0.x: - rails generate escargot:install + + rails generate escargot:install Usage From 728da1f0fc1fc1d4b7c9ea4b2eded7295657af41 Mon Sep 17 00:00:00 2001 From: mehdi Date: Mon, 25 Apr 2011 22:16:47 -0400 Subject: [PATCH 12/13] @bump version 0.0.4 --- lib/escargot/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/escargot/version.rb b/lib/escargot/version.rb index 2f21807..855de2d 100644 --- a/lib/escargot/version.rb +++ b/lib/escargot/version.rb @@ -1,3 +1,3 @@ module Escargot - VERSION = "0.0.3" + VERSION = "0.0.4" end From e3d11b7f5b4a9caee92ab575003f3ceb82f1ded3 Mon Sep 17 00:00:00 2001 From: mehdi Date: Tue, 26 Apr 2011 13:33:47 -0400 Subject: [PATCH 13/13] escargot gem added to download --- .gitignore | 2 +- README.markdown | 2 +- escargot-0.0.4.gem | Bin 0 -> 19968 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 escargot-0.0.4.gem diff --git a/.gitignore b/.gitignore index 456987e..cbe4ddb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ *.db # Generate gem file -*.gem +#*.gem # vim swap files *.swp diff --git a/README.markdown b/README.markdown index 2358f93..8987f10 100644 --- a/README.markdown +++ b/README.markdown @@ -25,7 +25,7 @@ config/escargot.yml and add the following lines: port: -If you are lasy to create config/escargot.yml by hand, there is a solution for you named escargot install generator. +If you are lazy to create config/escargot.yml by hand, there is a solution for you named escargot install generator. To invoque the generator, just trigger one of the following commands: - rails 2.3.x: diff --git a/escargot-0.0.4.gem b/escargot-0.0.4.gem new file mode 100644 index 0000000000000000000000000000000000000000..9247499c266a319ed221df4451854f919ff81624 GIT binary patch literal 19968 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