http://drnicwilliams.com/2006/10/11/generating-new-gems/
newgem を使った作法を学びます.
##必要パッケージのインストール
% sudo gem install rubigen
% sudo gem install newgem
##テンプレートの作成
% newgem map_by_method
##モジュールの作成 これから作るのは MapByMethod モジュールなので,lib/map_by_method.rb が最初に呼び出されます.
- lib/map_by_method.rb
module MapByMethod
VERSION = "0.0.1"
def self.included(base)
super
base.module_eval <<-EOS
def method_missing(method, *arg, &block)
super
rescue NoMethodError
error = $!
begin
re = /(map|collect|select|each|reject)_([\\w\\_]+\\??)/
if (match = method.to_s.match(re))
iterator, callmethod = match[1..2]
return self.send(iterator){|item| item.send callmethod}
end
return self.map{|item| item.send method.to_s.singularize.to_sym}
rescue NoMethodError
nil
end
end
EOS
end
end
unless String.instance_methods.include? "singularize"
class String
def singularize
self.gsub(/e?s\Z/, '')
end
end
end
Array.send :include, MapByMethod
##動作確認 一応動くことを確認してみる.
% irb
>> require 'lib/map_by_method'
=> true
>> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> a.map_to_s
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
##パッケージ作成 rake package コマンドで作成します.
% rake package
パッケージファイルは pkg 配下に作成されます.
% ls pkg/
map_by_method-0.0.1 map_by_method-0.0.1.gem map_by_method-0.0.1.tgz
##インストール・実行・アンインストール
% sudo gem install pkg/map_by_method-0.0.1.gem
% irb
>> require 'map_by_method'
=> true
>> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> a.map_to_s
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
% ls /usr/lib/ruby/gems/1.8/gems/map_by_method-0.0.1
History.txt Manifest.txt PostInstall.txt README.rdoc Rakefile lib script test
% sudo gem uninstall map_by_method
Successfully uninstalled map_by_method-0.0.1
% ls /usr/lib/ruby/gems/1.8/gems/map_by_method-0.0.1
ls: cannot access /usr/lib/ruby/gems/1.8/gems/map_by_method-0.0.1: No such file or directory
comments powered by Disqus