Archive for the ‘Ruby’ tag
Gemcutter & Jeweler
More about gemcutter & jeweler can be found here.
Here are the steps how to publish patched gem cloned from github:
1. Append username to gem name in .gemspec or if you use jeweler open Rakefile and edit Jeweler::Tasks section save it and run:
rake gemspec
2. Build gem with:
gem build
3. Push new gem to gemcutter
gem push
Cron in Ruby
daemon_controller + Thinking Sphinx
I’ve created simple rails initiator in order to start Sphinx through daemon_controller based on the Thinking Sphinx configuration. I hope it will help somebody.
require 'daemon_controller' def before_start if not ThinkingSphinx.define_indexes? config = ThinkingSphinx::Configuration.instance cmd = "#{config.bin_path}#{config.indexer_binary_name} --config \"#{config.config_file}\" --all" cmd << " --rotate" if ThinkingSphinx.sphinx_running? system cmd end end if defined?(ThinkingSphinx) if not ThinkingSphinx.sphinx_running? conf_instance = ThinkingSphinx::Configuration.instance @controller = DaemonController.new( :identifier => 'Sphinx search server', :start_command => "#{conf_instance.bin_path}#{conf_instance.searchd_binary_name} --pidfile --config \"#{conf_instance.config_file}\"", :before_start => method(:before_start), :ping_command => lambda { TCPSocket.new(conf_instance.configuration.searchd.address, conf_instance.configuration.searchd.port) }, :pid_file => conf_instance.configuration.searchd.pid_file, :log_file => conf_instance.configuration.searchd.log) @controller.start end end
ruby maxins in rails plugins
Very often when looking at the code in rails plugins you can run into this:
module Taggable def self.included(base) base.extend(ClassMethods) end module module ClassMethods #methods here end end
This is a part of a bigger pattern which is shown below:
module ModuleA def self.included(base) # add class methods from ModuleB base.extend(ModuleB) end end module ModuleB def act_as_hello p "hello from module B" end end class ClassC #class body here end # include moduleA in classC ClassC.send(:include, ModuleA) class ClassD < ClassC act_as_hello end classD = ClassD.new
The pattern is used often when developing plugins with ActiveRecord. What we gain by inheriting from ClassC (class ClassD < ClassC) are instance methods from ModuleA. This is done by:
ClassC.send(:include, ModuleA)
Moreover since ModuleA is included in ClassC, ModuleA’s initializer def self.included(base) will be invoked at the time ModuleA is mixed with ClassC. The invocation will call base.extend(ModuleB). In this case base represents ClassC which will be extended by adding class methods from ModuleB. The ModuleA’s init method is shown again below:
def self.included(base) # add class methods from ModuleB to ClassC base.extend(ModuleB) end
At the end our ClassD has now access to all class methods defined in ModuleB. act_as_hello will be called during ClassD initialization:
class ClassD < ClassC act_as_hello end
capistrano recipes for ubuntu
Few nice capistrano recipes which may help you automate Ubuntu Server setup:
Decoration in Ruby
Interesting discussion about object decoration in ruby.
few more ruby links
going back to ruby again…
Here are few links which helped me understand few ruby concepts:
stage deployment with capistrano and passenger
I’m still looking around for a stage deployment setup with Capistrano.
Here are few ideas/links I found useful.
- multi_staging_environment_for_rails_using_capistrano_and_mod_rails
- deploying-to-staging-and-production-with-capistrano
- using-capistrano-with-passenger-mod_rails/
Update:
It turned out this is pretty simple with the capistrano-ext gem:
http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage
set :default_stage, "development" set :stages, %w(production testing development) require 'capistrano/ext/multistage'