lib/playmo/recipe.rb in playmo-0.1.1 vs lib/playmo/recipe.rb in playmo-0.1.2

- old
+ new

@@ -2,132 +2,14 @@ module Playmo autoload :Action autoload :Question autoload :Silent + autoload :Recipe, 'playmo/recipe/recipe' + autoload :Dsl, 'playmo/recipe/dsl' module Recipe def recipe(name, options = {}, &block) Dsl.new(name, options, &block) - end - - # Переименовать этот класс в DSL, и сделать отдельный класс Recipe, - # который будет предком DSL и от которого можно наследоваться для создания complex recipes - # У класса DSL будут еще свои методы типма build (?) - class Recipe < Rails::Generators::Base - attr_accessor :actions, :application_name - - def initialize - super - - @actions = [] - end - - def store(*args) - Options.instance.set(*args) - end - - def retrieve(*args) - Options.instance.get(*args) - end - - # TODO: Move it into module - def after_install(&block) - Event.events.listen(:after_install) do - # TODO: DRY this - recipe_name = name - - self.class.class_eval do - source_root File.expand_path("../recipes/templates/#{recipe_name}_recipe", __FILE__) - end - - self.instance_eval &block - end - end - - def before_exit(&block) - Event.events.listen(:before_exit) do - # TODO: DRY this - recipe_name = name - - self.class.class_eval do - source_root File.expand_path("../recipes/templates/#{recipe_name}_recipe", __FILE__) - end - - self.instance_eval &block - end - end - - def generate(*args) - after_install { super(*args) } - end - - #def template(*args) - # after_install { super(*args) } - #end - - def cook!(application_name) - self.destination_root = application_name - self.application_name = application_name - - actions.each do |action| - action.call - end - end - - def to_s - name - end - end - - - class Dsl < Playmo::Recipe::Recipe - attr_accessor :description, :name, :options, :after - - def initialize(name, options, &block) - super() - - raise 'Recipe name not specified!' unless name - - @name = name - @options = options - #@actions = [] - - instance_eval &block - end - - def description(description = nil) - @description = description if description.present? - @description - end - - # Если блок с агрументами - то поддерживается ввод данных пользователем - def question(question, &block) - actions << lambda { Playmo::Question.new(self, question, :type => :question, &block).to_s } - end - - def ask(question, &block) - actions << lambda { Playmo::Question.new(self, question, :type => :ask, &block).to_s } - end - - def silently(&block) - actions << lambda { Playmo::Silent.new(self, &block) } - end - - # TODO: Сделать автолоадинг для зависимых рецептов - def after(after) - @after = after - after_recipe = Playmo::Cookbook.instance.find_recipe(@after) - - if after_recipe.nil? && @after.present? - require "#{File.dirname(__FILE__)}/recipes/#{@after}_recipe.rb" - end - - if after_recipe.nil? - Playmo::Cookbook.instance.use(self) - else - Playmo::Cookbook.instance.insert_after(after_recipe, self) - end - end end end end \ No newline at end of file