rails_apps_composer 1.0.0

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.
Files changed (64) hide show
  1. data/README.textile +313 -0
  2. data/bin/rails_apps_composer +7 -0
  3. data/lib/rails_wizard.rb +10 -0
  4. data/lib/rails_wizard/command.rb +79 -0
  5. data/lib/rails_wizard/config.rb +86 -0
  6. data/lib/rails_wizard/recipe.rb +106 -0
  7. data/lib/rails_wizard/recipes.rb +38 -0
  8. data/lib/rails_wizard/template.rb +58 -0
  9. data/recipes/action_mailer.rb +41 -0
  10. data/recipes/activerecord.rb +37 -0
  11. data/recipes/add_user.rb +87 -0
  12. data/recipes/add_user_name.rb +74 -0
  13. data/recipes/application_layout.rb +45 -0
  14. data/recipes/ban_spiders.rb +27 -0
  15. data/recipes/capybara.rb +34 -0
  16. data/recipes/cleanup.rb +36 -0
  17. data/recipes/css_setup.rb +42 -0
  18. data/recipes/cucumber.rb +62 -0
  19. data/recipes/devise.rb +76 -0
  20. data/recipes/devise_navigation.rb +93 -0
  21. data/recipes/env_yaml.rb +54 -0
  22. data/recipes/git.rb +38 -0
  23. data/recipes/haml.rb +23 -0
  24. data/recipes/heroku.rb +58 -0
  25. data/recipes/home_page.rb +45 -0
  26. data/recipes/home_page_users.rb +47 -0
  27. data/recipes/hoptoad.rb +34 -0
  28. data/recipes/jammit.rb +43 -0
  29. data/recipes/jquery.rb +70 -0
  30. data/recipes/less.rb +12 -0
  31. data/recipes/mongo_mapper.rb +18 -0
  32. data/recipes/mongohq.rb +59 -0
  33. data/recipes/mongoid.rb +39 -0
  34. data/recipes/mootools.rb +23 -0
  35. data/recipes/navigation.rb +68 -0
  36. data/recipes/omniauth.rb +152 -0
  37. data/recipes/omniauth_email.rb +82 -0
  38. data/recipes/pow.rb +12 -0
  39. data/recipes/prototype.rb +11 -0
  40. data/recipes/rails_admin.rb +21 -0
  41. data/recipes/redis.rb +17 -0
  42. data/recipes/redistogo.rb +40 -0
  43. data/recipes/rightjs.rb +17 -0
  44. data/recipes/rspec.rb +112 -0
  45. data/recipes/sass.rb +13 -0
  46. data/recipes/seed_database.rb +42 -0
  47. data/recipes/sequel.rb +13 -0
  48. data/recipes/settingslogic.rb +43 -0
  49. data/recipes/slim.rb +11 -0
  50. data/recipes/test_unit.rb +11 -0
  51. data/recipes/users_page.rb +103 -0
  52. data/spec/rails_wizard/config_spec.rb +99 -0
  53. data/spec/rails_wizard/recipe_spec.rb +103 -0
  54. data/spec/rails_wizard/recipes/sanity_spec.rb +30 -0
  55. data/spec/rails_wizard/recipes_spec.rb +24 -0
  56. data/spec/rails_wizard/template_spec.rb +48 -0
  57. data/spec/spec_helper.rb +11 -0
  58. data/spec/support/rails_directory.rb +17 -0
  59. data/spec/support/template_runner.rb +28 -0
  60. data/templates/helpers.erb +45 -0
  61. data/templates/layout.erb +69 -0
  62. data/templates/recipe.erb +10 -0
  63. data/version.rb +3 -0
  64. metadata +206 -0
@@ -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)
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])
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,58 @@
1
+ module RailsWizard
2
+ class Template
3
+ attr_reader :recipes
4
+
5
+ def initialize(recipes)
6
+ @recipes = recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
7
+ end
8
+
9
+ def self.template_root
10
+ File.dirname(__FILE__) + '/../../templates'
11
+ end
12
+
13
+ def self.render(template_name, binding = nil)
14
+ erb = ERB.new(File.open(template_root + '/' + template_name + '.erb').read)
15
+ erb.result(binding)
16
+ end
17
+ def render(template_name, binding = nil); self.class.render(template_name, binding) end
18
+
19
+
20
+ def resolve_recipes
21
+ # @resolve_recipes ||= recipes_with_dependencies.sort
22
+ @resolve_recipes ||= recipes_with_dependencies
23
+ end
24
+
25
+ def recipe_classes
26
+ @recipe_classes ||= recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
27
+ end
28
+
29
+ def recipes_with_dependencies
30
+ @recipes_with_dependencies ||= recipe_classes
31
+
32
+ added_more = false
33
+ for recipe in recipe_classes
34
+ recipe.requires.each do |requirement|
35
+ requirement = RailsWizard::Recipe.from_mongo(requirement)
36
+ count = @recipes_with_dependencies.size
37
+ (@recipes_with_dependencies << requirement).uniq!
38
+ unless @recipes_with_dependencies.size == count
39
+ added_more = true
40
+ end
41
+ end
42
+ end
43
+
44
+ added_more ? recipes_with_dependencies : @recipes_with_dependencies
45
+ end
46
+
47
+ def compile
48
+ render 'layout', binding
49
+ end
50
+
51
+ def args
52
+ recipes.map(&:args).uniq
53
+ end
54
+
55
+ def custom_code?; false end
56
+ def custom_code; nil end
57
+ end
58
+ end
@@ -0,0 +1,41 @@
1
+ # Application template recipe for the rails_apps_composer. Check for a newer version here:
2
+ # https://github.com/fortuity/rails_apps_composer/blob/master/recipes/action_mailer.rb
3
+
4
+ after_bundler do
5
+ say_wizard "ActionMailer recipe running 'after bundler'"
6
+ # modifying environment configuration files for ActionMailer
7
+ gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '# ActionMailer Config'
8
+ gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
9
+ <<-RUBY
10
+ config.action_mailer.default_url_options = { :host => 'localhost:3000' }
11
+ # A dummy setup for development - no deliveries, but logged
12
+ config.action_mailer.delivery_method = :smtp
13
+ config.action_mailer.perform_deliveries = false
14
+ config.action_mailer.raise_delivery_errors = true
15
+ config.action_mailer.default :charset => "utf-8"
16
+ RUBY
17
+ end
18
+ gsub_file 'config/environments/production.rb', /config.active_support.deprecation = :notify/ do
19
+ <<-RUBY
20
+ config.active_support.deprecation = :notify
21
+
22
+ config.action_mailer.default_url_options = { :host => 'yourhost.com' }
23
+ # ActionMailer Config
24
+ # Setup for production - deliveries, no errors raised
25
+ config.action_mailer.delivery_method = :smtp
26
+ config.action_mailer.perform_deliveries = true
27
+ config.action_mailer.raise_delivery_errors = false
28
+ config.action_mailer.default :charset => "utf-8"
29
+ RUBY
30
+ end
31
+
32
+ end
33
+
34
+ __END__
35
+
36
+ name: ActionMailer
37
+ description: "Configure ActionMailer to show errors during development and suppress failures when the app is deployed to production."
38
+ author: fortuity
39
+
40
+ category: other
41
+ tags: [utilities, configuration]
@@ -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?"
@@ -0,0 +1,87 @@
1
+ # Application template recipe for the rails_apps_composer. Check for a newer version here:
2
+ # https://github.com/fortuity/rails_apps_composer/blob/master/recipes/add_user.rb
3
+
4
+ after_bundler do
5
+
6
+ say_wizard "AddUser recipe running 'after bundler'"
7
+
8
+ if recipes.include? 'omniauth'
9
+ generate(:model, "user provider:string uid:string name:string email:string")
10
+ gsub_file 'app/models/user.rb', /end/ do
11
+ <<-RUBY
12
+ attr_accessible :provider, :uid, :name, :email
13
+ end
14
+ RUBY
15
+ end
16
+ end
17
+
18
+ if recipes.include? 'devise'
19
+
20
+ # Generate models and routes for a User
21
+ generate 'devise user'
22
+
23
+ # Add a 'name' attribute to the User model
24
+ if recipes.include? 'mongoid'
25
+ gsub_file 'app/models/user.rb', /end/ do
26
+ <<-RUBY
27
+ field :name
28
+ validates_presence_of :name
29
+ validates_uniqueness_of :name, :email, :case_sensitive => false
30
+ attr_accessible :name, :email, :password, :password_confirmation, :remember_me
31
+ end
32
+ RUBY
33
+ end
34
+ else
35
+ # for ActiveRecord
36
+ # Devise created a Users database, we'll modify it
37
+ generate 'migration AddNameToUsers name:string'
38
+ # Devise created a Users model, we'll modify it
39
+ gsub_file 'app/models/user.rb', /attr_accessible :email/, 'attr_accessible :name, :email'
40
+ inject_into_file 'app/models/user.rb', :before => 'validates_uniqueness_of' do
41
+ "validates_presence_of :name\n"
42
+ end
43
+ gsub_file 'app/models/user.rb', /validates_uniqueness_of :email/, 'validates_uniqueness_of :name, :email'
44
+ end
45
+
46
+ unless recipes.include? 'haml'
47
+
48
+ # Generate Devise views (unless you are using Haml)
49
+ run 'rails generate devise:views'
50
+
51
+ # Modify Devise views to add 'name'
52
+ inject_into_file "app/views/devise/registrations/edit.html.erb", :after => "<%= devise_error_messages! %>\n" do
53
+ <<-ERB
54
+ <p><%= f.label :name %><br />
55
+ <%= f.text_field :name %></p>
56
+ ERB
57
+ end
58
+
59
+ inject_into_file "app/views/devise/registrations/new.html.erb", :after => "<%= devise_error_messages! %>\n" do
60
+ <<-ERB
61
+ <p><%= f.label :name %><br />
62
+ <%= f.text_field :name %></p>
63
+ ERB
64
+ end
65
+
66
+ else
67
+
68
+ # copy Haml versions of modified Devise views
69
+ inside 'app/views/devise/registrations' do
70
+ get 'https://github.com/fortuity/rails3-application-templates/raw/master/files/rails3-mongoid-devise/app/views/devise/registrations/edit.html.haml', 'edit.html.haml'
71
+ get 'https://github.com/fortuity/rails3-application-templates/raw/master/files/rails3-mongoid-devise/app/views/devise/registrations/new.html.haml', 'new.html.haml'
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ __END__
81
+
82
+ name: AddUser
83
+ description: "Add a User model including 'name' and 'email' attributes."
84
+ author: fortuity
85
+
86
+ category: other
87
+ tags: [utilities, configuration]
@@ -0,0 +1,74 @@
1
+ # Application template recipe for the rails_apps_composer. Check for a newer version here:
2
+ # https://github.com/fortuity/rails_apps_composer/blob/master/recipes/add_user_name.rb
3
+
4
+ after_bundler do
5
+
6
+ say_wizard "AddUserName recipe running 'after bundler'"
7
+
8
+ # Add a 'name' attribute to the User model
9
+ if recipes.include? 'mongoid'
10
+ gsub_file 'app/models/user.rb', /end/ do
11
+ <<-RUBY
12
+ field :name
13
+ validates_presence_of :name
14
+ validates_uniqueness_of :name, :email, :case_sensitive => false
15
+ attr_accessible :name, :email, :password, :password_confirmation, :remember_me
16
+ end
17
+ RUBY
18
+ end
19
+ else
20
+ # for ActiveRecord
21
+ # Devise created a Users database, we'll modify it
22
+ generate 'migration AddNameToUsers name:string'
23
+ # Devise created a Users model, we'll modify it
24
+ gsub_file 'app/models/user.rb', /attr_accessible :email/, 'attr_accessible :name, :email'
25
+ inject_into_file 'app/models/user.rb', :before => 'validates_uniqueness_of' do
26
+ "validates_presence_of :name\n"
27
+ end
28
+ gsub_file 'app/models/user.rb', /validates_uniqueness_of :email/, 'validates_uniqueness_of :name, :email'
29
+ end
30
+
31
+ if recipes.include? 'devise'
32
+ unless recipes.include? 'haml'
33
+
34
+ # Generate Devise views (unless you are using Haml)
35
+ run 'rails generate devise:views'
36
+
37
+ # Modify Devise views to add 'name'
38
+ inject_into_file "app/views/devise/registrations/edit.html.erb", :after => "<%= devise_error_messages! %>\n" do
39
+ <<-ERB
40
+ <p><%= f.label :name %><br />
41
+ <%= f.text_field :name %></p>
42
+ ERB
43
+ end
44
+
45
+ inject_into_file "app/views/devise/registrations/new.html.erb", :after => "<%= devise_error_messages! %>\n" do
46
+ <<-ERB
47
+ <p><%= f.label :name %><br />
48
+ <%= f.text_field :name %></p>
49
+ ERB
50
+ end
51
+
52
+ else
53
+
54
+ # copy Haml versions of modified Devise views
55
+ inside 'app/views/devise/registrations' do
56
+ get 'https://github.com/fortuity/rails3-application-templates/raw/master/files/rails3-mongoid-devise/app/views/devise/registrations/edit.html.haml', 'edit.html.haml'
57
+ get 'https://github.com/fortuity/rails3-application-templates/raw/master/files/rails3-mongoid-devise/app/views/devise/registrations/new.html.haml', 'new.html.haml'
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ __END__
67
+
68
+ name: AddUserName
69
+ description: "Modify the default Devise configuration to add a 'name' attribute for all users."
70
+ author: fortuity
71
+
72
+ requires: [devise]
73
+ category: other
74
+ tags: [utilities, configuration]