Научиться писать DSL, создать gem.
- http://nashbridges.me/introducing-ruby-oop
- http://nashbridges.me/procs-and-lambdas
- http://nashbridges.me/blocks-in-ruby
- Предметно-ориентированный язык
- внешние DSL (SQL, Regexp, configs)
- внутренние DSL (mothod chain, ...)
- согдать каркас gem
- написать библиотеку
# :development показывает, что стоим конфиг для development окружения
Configus.build :development do
env :production do
email '[email protected]'
house 'White House'
some_proc -> { 1 + 1 }
end
env :development do
email '[email protected]'
email '[email protected]' # переопределяем ключ
end
end
Configus.config.email #=> '[email protected]'
- команда
bundle gem configus --test=rspec
- http://bundler.io/v1.9/bundle_gem.html
- http://www.smashingmagazine.com/2014/04/08/how-to-build-a-ruby-gem-with-bundler-test-driven-development-travis-ci-and-coveralls-oh-my/
- http://stackoverflow.com/questions/4398262/setup-rspec-to-test-a-gem-not-rails
- http://railscasts.com/episodes/245-new-gem-with-bundler
- http://ruby-doc.org/core-2.1.0/BasicObject.html
- http://ruby-doc.org/core-2.1.0/BasicObject.html#method-i-method_missing
- http://ruby-doc.org/core-2.1.0/BasicObject.html#method-i-instance_exec
- http://ruby-doc.org/core-2.1.0/Object.html#method-i-define_singleton_method
- Configus.build
- Configus.config
#lib/configus.rb
module Configus
class << self
def build(env, &block)
@config = Builder.build env, &block
end
def config
@config
end
end
end
#lib/configus/proxy.rb
module Configus
class Proxy < BasicObject
# some code
def method_missing(key, value)
# код ниже только для примера
# в BasicObject нет метода p, по этому так=)
Kernel.p key
Kernel.p value
end
end
end
Configus::Proxy.new.instance_exec do
some_method "some value" # напечатает на экран :some_method "some value"
end
- контекст исполнения для method_missing:
Configus::Proxy < BasicObject
Configus.config
возвращает экземплярConfigus::Config
- использовать rspec
- использовать TDD
Мокевнину Кириллу за написание оригинального configus и объяснение как он устроен. Ссылку осознанно не привожу, что бы не подсматривали ;)