thyone_creator 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/thyone +7 -0
- data/lib/rails_wizard/command.rb +116 -0
- data/lib/rails_wizard/config.rb +88 -0
- data/lib/rails_wizard/recipe.rb +106 -0
- data/lib/rails_wizard/recipes.rb +38 -0
- data/lib/rails_wizard/template.rb +73 -0
- data/lib/rails_wizard.rb +10 -0
- data/recipes/action_mailer.rb +123 -0
- data/recipes/active_admin.rb +44 -0
- data/recipes/activerecord.rb +37 -0
- data/recipes/add_user.rb +129 -0
- data/recipes/airbrake.rb +34 -0
- data/recipes/backbone.rb +23 -0
- data/recipes/capybara.rb +34 -0
- data/recipes/cleanup.rb +40 -0
- data/recipes/cloudfiles.rb +36 -0
- data/recipes/compass.rb +46 -0
- data/recipes/compass_960.rb +48 -0
- data/recipes/cucumber.rb +75 -0
- data/recipes/datamapper.rb +111 -0
- data/recipes/devise.rb +114 -0
- data/recipes/extras.rb +80 -0
- data/recipes/git.rb +40 -0
- data/recipes/guard.rb +99 -0
- data/recipes/haml.rb +23 -0
- data/recipes/heroku.rb +62 -0
- data/recipes/home_page.rb +58 -0
- data/recipes/home_page_users.rb +47 -0
- data/recipes/html5.rb +153 -0
- data/recipes/inherited_resources.rb +23 -0
- data/recipes/less.rb +12 -0
- data/recipes/mongohq.rb +59 -0
- data/recipes/mongoid.rb +39 -0
- data/recipes/mongolab.rb +59 -0
- data/recipes/omniauth.rb +192 -0
- data/recipes/omniauth_email.rb +82 -0
- data/recipes/paperclip.rb +79 -0
- data/recipes/rails_admin.rb +21 -0
- data/recipes/redis.rb +23 -0
- data/recipes/responders.rb +10 -0
- data/recipes/resque.rb +25 -0
- data/recipes/rspec.rb +133 -0
- data/recipes/sass.rb +25 -0
- data/recipes/seed_database.rb +76 -0
- data/recipes/settingslogic.rb +43 -0
- data/recipes/simple_form.rb +54 -0
- data/recipes/slim.rb +46 -0
- data/recipes/static_page.rb +43 -0
- data/recipes/subdomains.rb +121 -0
- data/recipes/users_page.rb +165 -0
- data/spec/rails_wizard/config_spec.rb +108 -0
- data/spec/rails_wizard/recipe_spec.rb +81 -0
- data/spec/rails_wizard/recipes/sanity_spec.rb +30 -0
- data/spec/rails_wizard/recipes_spec.rb +24 -0
- data/spec/rails_wizard/template_spec.rb +78 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/rails_directory.rb +17 -0
- data/spec/support/template_runner.rb +28 -0
- data/templates/helpers.erb +45 -0
- data/templates/layout.erb +83 -0
- data/templates/recipe.erb +10 -0
- data/version.rb +3 -0
- metadata +251 -0
data/bin/thyone
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'rails_wizard'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
module RailsWizard
|
5
|
+
class Command < Thor
|
6
|
+
include Thor::Actions
|
7
|
+
desc "new APP_NAME", "create a new Rails app"
|
8
|
+
method_option :recipes, :type => :array, :aliases => "-r"
|
9
|
+
method_option :defaults, :type => :string, :aliases => "-d"
|
10
|
+
def new(name)
|
11
|
+
recipes, defaults = load_defaults
|
12
|
+
recipes = ask_for_recipes(recipes)
|
13
|
+
run_template(name, recipes, defaults, nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "template TEMPLATE_FILE", "create a new Rails template"
|
17
|
+
method_option :recipes, :type => :array, :aliases => "-r"
|
18
|
+
method_option :defaults, :type => :string, :aliases => "-d"
|
19
|
+
def template(template_name)
|
20
|
+
recipes, defaults = load_defaults
|
21
|
+
recipes = ask_for_recipes(recipes)
|
22
|
+
run_template(nil, recipes, defaults, template_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "list [CATEGORY]", "list available recipes (optionally by category)"
|
26
|
+
def list(category = nil)
|
27
|
+
if category
|
28
|
+
recipes = RailsWizard::Recipes.for(category).map{|r| RailsWizard::Recipe.from_mongo(r) }
|
29
|
+
else
|
30
|
+
recipes = RailsWizard::Recipes.list_classes
|
31
|
+
end
|
32
|
+
|
33
|
+
recipes.each do |recipe|
|
34
|
+
puts recipe.key.ljust(15) + "# #{recipe.description}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
no_tasks do
|
39
|
+
def cyan; "\033[36m" end
|
40
|
+
def clear; "\033[0m" end
|
41
|
+
def bold; "\033[1m" end
|
42
|
+
def red; "\033[31m" end
|
43
|
+
def green; "\033[32m" end
|
44
|
+
def yellow; "\033[33m" end
|
45
|
+
|
46
|
+
def load_defaults
|
47
|
+
# Load defaults from a file; if a file specifies recipes, they'll be run *before*
|
48
|
+
# any on the command line (or prompted for)..
|
49
|
+
defaults = if options[:defaults]
|
50
|
+
File.open(options[:defaults]) {|f| YAML.load(f) }
|
51
|
+
else
|
52
|
+
{}
|
53
|
+
end
|
54
|
+
recipes = defaults.delete('recipes') { [] }
|
55
|
+
[recipes, defaults]
|
56
|
+
end
|
57
|
+
|
58
|
+
def print_recipes(recipes)
|
59
|
+
puts
|
60
|
+
puts "#{bold}#{cyan}Available Recipes#{clear}:"
|
61
|
+
RailsWizard::Recipes.categories.each do |category|
|
62
|
+
puts "#{bold}#{cyan}#{category}#{clear}: " +RailsWizard::Recipes.for(category).collect {|recipe|
|
63
|
+
recipes.include?(recipe) ? "#{green}#{bold}#{recipe}#{clear}" : recipe
|
64
|
+
}.join(', ')
|
65
|
+
end
|
66
|
+
puts
|
67
|
+
end
|
68
|
+
|
69
|
+
def ask_for_recipes(recipes)
|
70
|
+
if options[:recipes]
|
71
|
+
return recipes + options[:recipes]
|
72
|
+
end
|
73
|
+
while recipe = ask("#{print_recipes(recipes)}#{bold}Which recipe would you like to add? #{clear}#{yellow}(blank to finish)#{clear}")
|
74
|
+
if recipe == ''
|
75
|
+
break
|
76
|
+
elsif recipes.include?(recipe)
|
77
|
+
recipes -= [recipe]
|
78
|
+
elsif RailsWizard::Recipes.list.include?(recipe)
|
79
|
+
recipes << recipe
|
80
|
+
else
|
81
|
+
puts
|
82
|
+
puts "> #{red}Invalid recipe, please try again.#{clear}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
recipes
|
86
|
+
end
|
87
|
+
|
88
|
+
#pass in name if you want to create a rails app
|
89
|
+
#pass in file_name if you want to create a template
|
90
|
+
def run_template(name, recipes, defaults, file_name=nil)
|
91
|
+
puts
|
92
|
+
puts
|
93
|
+
puts "#{bold}Generating#{name ? " and Running" : ''} Template..."
|
94
|
+
puts
|
95
|
+
|
96
|
+
if file_name
|
97
|
+
file = File.new(file_name,'w')
|
98
|
+
else
|
99
|
+
file = Tempfile.new('template')
|
100
|
+
end
|
101
|
+
template = RailsWizard::Template.new(recipes, defaults)
|
102
|
+
file.write template.compile
|
103
|
+
file.close
|
104
|
+
if name
|
105
|
+
system "rails new #{name} -m #{file.path} #{template.args.join(' ')}"
|
106
|
+
else
|
107
|
+
puts "install with the command:"
|
108
|
+
puts
|
109
|
+
puts "rails new <APP_NAME> -m #{file.path} #{template.args.join(' ')}"
|
110
|
+
end
|
111
|
+
ensure
|
112
|
+
file.unlink unless file_name
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'active_support/ordered_hash'
|
2
|
+
|
3
|
+
module RailsWizard
|
4
|
+
class Config
|
5
|
+
attr_reader :questions, :defaults
|
6
|
+
|
7
|
+
def initialize(schema, defaults=nil)
|
8
|
+
@questions = ActiveSupport::OrderedHash.new
|
9
|
+
@defaults = defaults
|
10
|
+
schema.each do |hash|
|
11
|
+
key = hash.keys.first
|
12
|
+
details = hash.values.first
|
13
|
+
|
14
|
+
kind = details['type']
|
15
|
+
raise ArgumentError, "Unrecognized question type, must be one of #{QUESTION_TYPES.keys.join(', ')}" unless QUESTION_TYPES.keys.include?(kind)
|
16
|
+
@questions[key] = QUESTION_TYPES[kind].new(details)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def compile(values = {})
|
21
|
+
result = []
|
22
|
+
values.merge!(defaults) if defaults
|
23
|
+
result << "config = #{values.inspect}"
|
24
|
+
@questions.each_pair do |key, question|
|
25
|
+
result << "config['#{key}'] = #{question.compile} unless config.key?('#{key}')"
|
26
|
+
end
|
27
|
+
result.join("\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
class Prompt
|
31
|
+
attr_reader :prompt, :details
|
32
|
+
def initialize(details)
|
33
|
+
@details = details
|
34
|
+
@prompt = details['prompt']
|
35
|
+
end
|
36
|
+
|
37
|
+
def compile
|
38
|
+
"#{question} if #{conditions}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def question
|
42
|
+
"ask_wizard(#{prompt.inspect})"
|
43
|
+
end
|
44
|
+
|
45
|
+
def conditions
|
46
|
+
[config_conditions, recipe_conditions].join(' && ')
|
47
|
+
end
|
48
|
+
|
49
|
+
def config_conditions
|
50
|
+
if details['if']
|
51
|
+
"config['#{details['if']}']"
|
52
|
+
elsif details['unless']
|
53
|
+
"!config['#{details['unless']}']"
|
54
|
+
else
|
55
|
+
'true'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def recipe_conditions
|
60
|
+
if details['if_recipe']
|
61
|
+
"recipe?('#{details['if_recipe']}')"
|
62
|
+
elsif details['unless_recipe']
|
63
|
+
"!recipe?('#{details['unless_recipe']}')"
|
64
|
+
else
|
65
|
+
'true'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class TrueFalse < Prompt
|
71
|
+
def question
|
72
|
+
"yes_wizard?(#{prompt.inspect})"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class MultipleChoice < Prompt
|
77
|
+
def question
|
78
|
+
"multiple_choice(#{prompt.inspect}, #{@details['choices'].inspect})"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
QUESTION_TYPES = {
|
83
|
+
'boolean' => TrueFalse,
|
84
|
+
'string' => Prompt,
|
85
|
+
'multiple_choice' => MultipleChoice
|
86
|
+
}
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'rails_wizard/config'
|
2
|
+
|
3
|
+
require 'active_support/inflector'
|
4
|
+
require 'yaml'
|
5
|
+
require 'erb'
|
6
|
+
|
7
|
+
module RailsWizard
|
8
|
+
class Recipe
|
9
|
+
extend Comparable
|
10
|
+
|
11
|
+
def self.<=>(another)
|
12
|
+
return -1 if another.run_after.include?(self.key) || self.run_before.include?(another.key)
|
13
|
+
return 1 if another.run_before.include?(self.key) || self.run_after.include?(another.key)
|
14
|
+
self.key <=> another.key
|
15
|
+
end
|
16
|
+
|
17
|
+
ATTRIBUTES = %w(key args category name description template config exclusive tags run_before run_after requires defaults)
|
18
|
+
DEFAULT_ATTRIBUTES = {
|
19
|
+
:category => 'other',
|
20
|
+
:args => [],
|
21
|
+
:tags => [],
|
22
|
+
:run_after => [],
|
23
|
+
:run_before => [],
|
24
|
+
:requires => []
|
25
|
+
}
|
26
|
+
|
27
|
+
def self.generate(key, template_or_file, attributes = {})
|
28
|
+
if template_or_file.respond_to?(:read)
|
29
|
+
file = template_or_file.read
|
30
|
+
parts = file.split(/^__END__$/)
|
31
|
+
raise ArgumentError, "The recipe file must have YAML matter after an __END__" unless parts.size == 2
|
32
|
+
template = parts.first.strip
|
33
|
+
attributes = YAML.load(parts.last).inject({}) do |h,(k,v)|
|
34
|
+
h[k.to_sym] = v
|
35
|
+
h
|
36
|
+
end.merge!(attributes)
|
37
|
+
else
|
38
|
+
template = template_or_file
|
39
|
+
end
|
40
|
+
|
41
|
+
recipe_class = Class.new(RailsWizard::Recipe)
|
42
|
+
recipe_class.attributes = attributes
|
43
|
+
recipe_class.template = template
|
44
|
+
recipe_class.key = key
|
45
|
+
|
46
|
+
recipe_class
|
47
|
+
end
|
48
|
+
|
49
|
+
ATTRIBUTES.each do |setter|
|
50
|
+
class_eval <<-RUBY
|
51
|
+
def self.#{setter}
|
52
|
+
attributes[:#{setter}]
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.#{setter}=(val)
|
56
|
+
attributes[:#{setter}] = val
|
57
|
+
end
|
58
|
+
|
59
|
+
def #{setter}
|
60
|
+
self.class.#{setter}
|
61
|
+
end
|
62
|
+
RUBY
|
63
|
+
end
|
64
|
+
|
65
|
+
# The attributes hash containing any set values for
|
66
|
+
def self.attributes
|
67
|
+
@attributes ||= DEFAULT_ATTRIBUTES.dup
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.attributes=(hash)
|
71
|
+
attributes.merge! hash
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.config
|
75
|
+
return nil unless attributes[:config]
|
76
|
+
RailsWizard::Config.new(attributes[:config], attributes[:defaults])
|
77
|
+
end
|
78
|
+
|
79
|
+
def attributes
|
80
|
+
self.class.attributes
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.compile
|
84
|
+
"# >#{"[ #{name} ]".center(75,'-')}<\n\n# #{description}\nsay_recipe '#{name}'\n\n#{template}\n"
|
85
|
+
end
|
86
|
+
def compile; self.class.compile end
|
87
|
+
|
88
|
+
def self.to_mongo(value)
|
89
|
+
case value
|
90
|
+
when Class
|
91
|
+
value.key
|
92
|
+
when String
|
93
|
+
value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.from_mongo(key)
|
98
|
+
return key if key.respond_to?(:superclass) && key.superclass == RailsWizard::Recipe
|
99
|
+
RailsWizard::Recipes[key]
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.get_binding
|
103
|
+
binding
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RailsWizard
|
2
|
+
module Recipes
|
3
|
+
@@categories = {}
|
4
|
+
@@list = {}
|
5
|
+
|
6
|
+
def self.add(recipe)
|
7
|
+
RailsWizard::Recipes.const_set ActiveSupport::Inflector.camelize(recipe.key), recipe
|
8
|
+
@@list[recipe.key] = recipe
|
9
|
+
(@@categories[recipe.category.to_s] ||= []) << recipe.key
|
10
|
+
@@categories[recipe.category.to_s].uniq!
|
11
|
+
recipe
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.[](key)
|
15
|
+
@@list[key.to_s]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.list
|
19
|
+
@@list.keys.sort
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.list_classes
|
23
|
+
@@list.values.sort_by{|c| c.key}
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.categories
|
27
|
+
@@categories.keys.sort
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.for(category)
|
31
|
+
(@@categories[category.to_s] || []).sort
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.remove_from_category(category, recipe)
|
35
|
+
(@@categories[category.to_s] ||= []).delete(recipe.key)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module RailsWizard
|
2
|
+
class Template
|
3
|
+
attr_reader :recipes, :defaults
|
4
|
+
|
5
|
+
def initialize(recipes, defaults={})
|
6
|
+
@recipes = recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
|
7
|
+
@defaults = defaults
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.template_root
|
11
|
+
File.dirname(__FILE__) + '/../../templates'
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.render(template_name, binding = nil)
|
15
|
+
erb = ERB.new(File.open(template_root + '/' + template_name + '.erb').read)
|
16
|
+
erb.result(binding)
|
17
|
+
end
|
18
|
+
def render(template_name, binding = nil); self.class.render(template_name, binding) end
|
19
|
+
|
20
|
+
|
21
|
+
# Sort the recipes list taking 'run_after' directives into account.
|
22
|
+
def resolve_recipes
|
23
|
+
@resolve_recipes ||= begin
|
24
|
+
list = recipes_with_dependencies
|
25
|
+
|
26
|
+
for i in 0...list.size
|
27
|
+
after_keys = list[i+1..-1].map { |r| r.key }
|
28
|
+
|
29
|
+
if (list[i].run_after & after_keys).any?
|
30
|
+
list.push list.slice!(i)
|
31
|
+
redo
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
list.each {|recipe| recipe.defaults = defaults[recipe.key] }
|
36
|
+
list
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def recipe_classes
|
41
|
+
@recipe_classes ||= recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
|
42
|
+
end
|
43
|
+
|
44
|
+
def recipes_with_dependencies
|
45
|
+
@recipes_with_dependencies ||= recipe_classes
|
46
|
+
|
47
|
+
added_more = false
|
48
|
+
for recipe in recipe_classes
|
49
|
+
recipe.requires.each do |requirement|
|
50
|
+
requirement = RailsWizard::Recipe.from_mongo(requirement)
|
51
|
+
count = @recipes_with_dependencies.size
|
52
|
+
(@recipes_with_dependencies << requirement).uniq!
|
53
|
+
unless @recipes_with_dependencies.size == count
|
54
|
+
added_more = true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
added_more ? recipes_with_dependencies : @recipes_with_dependencies
|
60
|
+
end
|
61
|
+
|
62
|
+
def compile
|
63
|
+
render 'layout', binding
|
64
|
+
end
|
65
|
+
|
66
|
+
def args
|
67
|
+
recipes.map(&:args).uniq
|
68
|
+
end
|
69
|
+
|
70
|
+
def custom_code?; false end
|
71
|
+
def custom_code; nil end
|
72
|
+
end
|
73
|
+
end
|
data/lib/rails_wizard.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rails_wizard/recipes'
|
2
|
+
require 'rails_wizard/recipe'
|
3
|
+
require 'rails_wizard/config'
|
4
|
+
require 'rails_wizard/template'
|
5
|
+
|
6
|
+
Dir[File.dirname(__FILE__) + '/../recipes/*.rb'].each do |path|
|
7
|
+
key = File.basename(path, '.rb')
|
8
|
+
recipe = RailsWizard::Recipe.generate(key, File.open(path))
|
9
|
+
RailsWizard::Recipes.add(recipe)
|
10
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Check for a newer version here:
|
2
|
+
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/action_mailer.rb
|
3
|
+
|
4
|
+
case config['mailer']
|
5
|
+
when 'smtp'
|
6
|
+
recipes << 'smtp'
|
7
|
+
when 'gmail'
|
8
|
+
recipes << 'gmail'
|
9
|
+
when 'sendgrid'
|
10
|
+
gem 'sendgrid'
|
11
|
+
recipes << 'sendgrid'
|
12
|
+
when 'mandrill'
|
13
|
+
gem 'hominid'
|
14
|
+
recipes << 'mandrill'
|
15
|
+
end
|
16
|
+
|
17
|
+
after_bundler do
|
18
|
+
### modifying environment configuration files for ActionMailer
|
19
|
+
say_wizard "ActionMailer recipe running 'after bundler'"
|
20
|
+
### development environment
|
21
|
+
gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '# ActionMailer Config'
|
22
|
+
gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
|
23
|
+
<<-RUBY
|
24
|
+
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
|
25
|
+
config.action_mailer.delivery_method = :smtp
|
26
|
+
# change to true to allow email to be sent during development
|
27
|
+
config.action_mailer.perform_deliveries = false
|
28
|
+
config.action_mailer.raise_delivery_errors = true
|
29
|
+
config.action_mailer.default :charset => "utf-8"
|
30
|
+
RUBY
|
31
|
+
end
|
32
|
+
### test environment
|
33
|
+
inject_into_file 'config/environments/test.rb', :before => "\nend" do
|
34
|
+
<<-RUBY
|
35
|
+
\n
|
36
|
+
# ActionMailer Config
|
37
|
+
config.action_mailer.default_url_options = { :host => 'example.com' }
|
38
|
+
RUBY
|
39
|
+
end
|
40
|
+
### production environment
|
41
|
+
gsub_file 'config/environments/production.rb', /config.active_support.deprecation = :notify/ do
|
42
|
+
<<-RUBY
|
43
|
+
config.active_support.deprecation = :notify
|
44
|
+
|
45
|
+
config.action_mailer.default_url_options = { :host => 'example.com' }
|
46
|
+
# ActionMailer Config
|
47
|
+
# Setup for production - deliveries, no errors raised
|
48
|
+
config.action_mailer.delivery_method = :smtp
|
49
|
+
config.action_mailer.perform_deliveries = true
|
50
|
+
config.action_mailer.raise_delivery_errors = false
|
51
|
+
config.action_mailer.default :charset => "utf-8"
|
52
|
+
RUBY
|
53
|
+
end
|
54
|
+
|
55
|
+
### modifying environment configuration files to send email using a GMail account
|
56
|
+
if recipes.include? 'gmail'
|
57
|
+
gmail_configuration_text = <<-TEXT
|
58
|
+
\n
|
59
|
+
config.action_mailer.smtp_settings = {
|
60
|
+
address: "smtp.gmail.com",
|
61
|
+
port: 587,
|
62
|
+
domain: "example.com",
|
63
|
+
authentication: "plain",
|
64
|
+
enable_starttls_auto: true,
|
65
|
+
user_name: ENV["GMAIL_USERNAME"],
|
66
|
+
password: ENV["GMAIL_PASSWORD"]
|
67
|
+
}
|
68
|
+
TEXT
|
69
|
+
say_wizard gmail_configuration_text
|
70
|
+
inject_into_file 'config/environments/development.rb', gmail_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
71
|
+
inject_into_file 'config/environments/production.rb', gmail_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
72
|
+
end
|
73
|
+
|
74
|
+
### modifying environment configuration files to send email using a SendGrid account
|
75
|
+
if recipes.include? 'sendgrid'
|
76
|
+
sendgrid_configuration_text = <<-TEXT
|
77
|
+
\n
|
78
|
+
config.action_mailer.smtp_settings = {
|
79
|
+
address: "smtp.sendgrid.net",
|
80
|
+
port: 25,
|
81
|
+
domain: "example.com",
|
82
|
+
authentication: "plain",
|
83
|
+
user_name: ENV["SENDGRID_USERNAME"],
|
84
|
+
password: ENV["SENDGRID_PASSWORD"]
|
85
|
+
}
|
86
|
+
TEXT
|
87
|
+
say_wizard gmail_configuration_text
|
88
|
+
inject_into_file 'config/environments/development.rb', sendgrid_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
89
|
+
inject_into_file 'config/environments/production.rb', sendgrid_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
90
|
+
end
|
91
|
+
|
92
|
+
### modifying environment configuration files to send email using a Mandrill account
|
93
|
+
if recipes.include? 'mandrill'
|
94
|
+
mandrill_configuration_text = <<-TEXT
|
95
|
+
\n
|
96
|
+
config.action_mailer.smtp_settings = {
|
97
|
+
:address => "smtp.mandrillapp.com",
|
98
|
+
:port => 25,
|
99
|
+
:user_name => ENV["MANDRILL_USERNAME"],
|
100
|
+
:password => ENV["MANDRILL_API_KEY"]
|
101
|
+
}
|
102
|
+
TEXT
|
103
|
+
say_wizard gmail_configuration_text
|
104
|
+
inject_into_file 'config/environments/development.rb', mandrill_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
105
|
+
inject_into_file 'config/environments/production.rb', mandrill_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"'
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
__END__
|
111
|
+
|
112
|
+
name: ActionMailer
|
113
|
+
description: "Configure ActionMailer for email."
|
114
|
+
author: RailsApps
|
115
|
+
|
116
|
+
category: other
|
117
|
+
tags: [utilities, configuration]
|
118
|
+
|
119
|
+
config:
|
120
|
+
- mailer:
|
121
|
+
type: multiple_choice
|
122
|
+
prompt: "How will you send email?"
|
123
|
+
choices: [["SMTP account", smtp], ["Gmail account", gmail], ["SendGrid account", sendgrid], ["Mandrill by MailChimp account", mandrill]]
|
@@ -0,0 +1,44 @@
|
|
1
|
+
if recipes.include? 'mongoid'
|
2
|
+
gem 'formtastic', "~> 2.1.1"
|
3
|
+
gem 'activeadmin-mongoid'
|
4
|
+
else
|
5
|
+
gem 'activeadmin'
|
6
|
+
end
|
7
|
+
gem "meta_search", '>= 1.1.0.pre'
|
8
|
+
# sass-rails is also required but is by default in rails
|
9
|
+
|
10
|
+
|
11
|
+
after_bundler do
|
12
|
+
case config['user_model']
|
13
|
+
when 'default'
|
14
|
+
generate 'active_admin:install'
|
15
|
+
when ''
|
16
|
+
generate 'active_admin:install'
|
17
|
+
when 'skip'
|
18
|
+
generate 'active_admin:install --skip-users'
|
19
|
+
else
|
20
|
+
generate "active_admin:install #{config['user_model']}"
|
21
|
+
end
|
22
|
+
|
23
|
+
if config['i18n']
|
24
|
+
get "https://raw.github.com/gregbell/active_admin/master/lib/active_admin/locales/zh_cn.yml", "config/locales/active_admin.zh-CN.yml"
|
25
|
+
gsub_file "config/locales/active_admin.zh-CN.yml", /zh_cn/, "zh-CN"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
__END__
|
30
|
+
|
31
|
+
name: ActiveAdmin
|
32
|
+
description: "Install Active Admin to build an administration zone data in your application"
|
33
|
+
author: systho
|
34
|
+
|
35
|
+
category: other
|
36
|
+
|
37
|
+
config:
|
38
|
+
- user_model:
|
39
|
+
type: string
|
40
|
+
prompt: "What model will you use for admin users ? type 'skip' to skip this step (default is AdminUser)"
|
41
|
+
- i18n:
|
42
|
+
type: boolean
|
43
|
+
prompt: "Would you want to set active admin to zh-CN locale?"
|
44
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
if config['database']
|
2
|
+
say_wizard "Configuring '#{config['database']}' database settings..."
|
3
|
+
old_gem = gem_for_database
|
4
|
+
@options = @options.dup.merge(:database => config['database'])
|
5
|
+
gsub_file 'Gemfile', "gem '#{old_gem}'", "gem '#{gem_for_database}'"
|
6
|
+
template "config/databases/#{@options[:database]}.yml", "config/database.yml.new"
|
7
|
+
run 'mv config/database.yml.new config/database.yml'
|
8
|
+
end
|
9
|
+
|
10
|
+
after_bundler do
|
11
|
+
rake "db:create:all" if config['auto_create']
|
12
|
+
end
|
13
|
+
|
14
|
+
__END__
|
15
|
+
|
16
|
+
name: ActiveRecord
|
17
|
+
description: "Use the default ActiveRecord database store."
|
18
|
+
author: mbleigh
|
19
|
+
|
20
|
+
exclusive: orm
|
21
|
+
category: persistence
|
22
|
+
tags: [sql, defaults, orm]
|
23
|
+
|
24
|
+
config:
|
25
|
+
- database:
|
26
|
+
type: multiple_choice
|
27
|
+
prompt: "Which database are you using?"
|
28
|
+
choices:
|
29
|
+
- ["MySQL", mysql]
|
30
|
+
- ["Oracle", oracle]
|
31
|
+
- ["PostgreSQL", postgresql]
|
32
|
+
- ["SQLite", sqlite3]
|
33
|
+
- ["Frontbase", frontbase]
|
34
|
+
- ["IBM DB", ibm_db]
|
35
|
+
- auto_create:
|
36
|
+
type: boolean
|
37
|
+
prompt: "Automatically create database with default configuration?"
|