require 'rubygems' require 'templater' module Rhoconnect extend Templater::Manifold extend Rhoconnect desc <<-DESC Rhoconnect generator DESC class BaseGenerator < Templater::Generator def class_name name.gsub('-', '_').camel_case end def underscore_name Rhoconnect.under_score(name) end def gem_version VERSION end alias_method :module_name, :class_name end class AppGenerator < BaseGenerator def self.source_root File.join(File.dirname(__FILE__), 'templates', 'application') end desc <<-DESC Generates a new rhoconnect application. Required: name - application name DESC first_argument :name, :required => true, :desc => "application name" template :configru do |template| require 'securerandom' rescue nil @secret = SecureRandom.hex(64) rescue '' template.source = 'config.ru' template.destination = "#{name}/config.ru" end template :gitignore do |template| template.source = 'gitignore' template.destination = "#{name}/.gitignore" end template :settings do |template| template.source = 'settings/settings.yml' template.destination = "#{name}/settings/settings.yml" end template :license do |template| template.source = 'settings/license.key' template.destination = "#{name}/settings/license.key" end template :application do |template| template.source = 'application.rb' template.destination = "#{name}/application.rb" end template :rakefile do |template| template.source = 'Rakefile' template.destination = "#{name}/Rakefile" end template :gemfile do |template| template.source = 'Gemfile' template.destination = "#{name}/Gemfile" end template :gemfile_app do |template| template.source = 'rcgemfile' template.destination = "#{name}/.rcgemfile" end template :spec_helper do |template| template.source = 'spec/spec_helper.rb' template.destination = "#{name}/spec/spec_helper.rb" end empty_directory :public do |dir| dir.destination = File.join("#{name}", 'public') end def after_run install_gems_note = <<_BUNDLE_INSTALL_ In the future, to ensure that all the dependencies in your rhoconnect application are available execute these commands: cd #{name} && bundle install If you're setting up the application in a production environment run the following: cd #{name} && bundle install --without=test development _BUNDLE_INSTALL_ running_bundler_first_time = <<_RUN_BUNDLER Executing 'bundle install' for the first time in your freshly baked application! bundle install --gemfile=#{destination_root}/#{name}/Gemfile _RUN_BUNDLER puts running_bundler_first_time system("bundle install --gemfile=#{destination_root}/#{name}/Gemfile") puts install_gems_note end end class SourceGenerator < BaseGenerator def self.source_root File.join(File.dirname(__FILE__), 'templates', 'source') end desc <<-DESC Generates a new source adapter. Required: name - source name(i.e. product) DESC first_argument :name, :required => true, :desc => "source name" template :source do |template| template.source = 'source_adapter.rb' template.destination = "sources/#{underscore_name}.rb" settings_file = File.join(@destination_root,'settings','settings.yml') settings = YAML.load_file(settings_file) settings[:sources] ||= {} settings[:sources][class_name] = {:poll_interval => 300} File.open(settings_file, 'w' ) do |file| file.write "#Sources" + {:sources => settings[:sources]}.to_yaml[3..-1] envs = {} [:development,:test,:production].each do |env| envs[env] = settings[env] end file.write envs.to_yaml[3..-1] # write all other settings [:development, :test, :production, :sources].each do |key| settings.delete(key) end file.write settings.to_yaml[3..-1] unless settings.empty? end end template :source_spec do |template| template.source = 'source_spec.rb' template.destination = "spec/sources/#{underscore_name}_spec.rb" end end add :app, AppGenerator add :source, SourceGenerator end