rails_apps_composer 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,17 @@
1
+ gem 'right-rails'
2
+
3
+ after_bundler do
4
+ generate 'right_rails'
5
+ end
6
+
7
+ __END__
8
+
9
+ name: RightJS
10
+ description: "Use RightJS in place of Prototype for this application."
11
+ author: mbleigh
12
+
13
+ exclusive: javascript_framework
14
+ category: assets
15
+ tags: [javascript, framework]
16
+
17
+ args: ["-J"]
data/recipes/rspec.rb ADDED
@@ -0,0 +1,112 @@
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/rspec.rb
3
+
4
+ if config['rspec']
5
+ say_wizard "REMINDER: When creating a Rails app using RSpec..."
6
+ say_wizard "you should add the '-T' flag to 'rails new'"
7
+ gem 'rspec-rails', '>= 2.5.0', :group => [:development, :test]
8
+ if recipes.include? 'mongoid'
9
+ # use the database_cleaner gem to reset the test database
10
+ gem 'database_cleaner', '>= 0.6.7', :group => :test
11
+ # include RSpec matchers from the mongoid-rspec gem
12
+ gem 'mongoid-rspec', ">= 1.4.2", :group => :test
13
+ end
14
+ if config['factory_girl']
15
+ # use the factory_girl gem for test fixtures
16
+ gem 'factory_girl_rails', ">= 1.1.beta1", :group => :test
17
+ end
18
+ else
19
+ recipes.delete('rspec')
20
+ end
21
+
22
+ # note: there is no need to specify the RSpec generator in the config/application.rb file
23
+
24
+ if config['rspec']
25
+ after_bundler do
26
+ say_wizard "RSpec recipe running 'after bundler'"
27
+ generate 'rspec:install'
28
+
29
+ say_wizard "Removing test folder (not needed for RSpec)"
30
+ run 'rm -rf test/'
31
+
32
+ inject_into_file 'config/application.rb', :after => "Rails::Application\n" do <<-RUBY
33
+
34
+ # don't generate RSpec tests for views and helpers
35
+ config.generators do |g|
36
+ g.view_specs false
37
+ g.helper_specs false
38
+ end
39
+
40
+ RUBY
41
+ end
42
+
43
+
44
+ if recipes.include? 'mongoid'
45
+
46
+ # remove ActiveRecord artifacts
47
+ gsub_file 'spec/spec_helper.rb', /config.fixture_path/, '# config.fixture_path'
48
+ gsub_file 'spec/spec_helper.rb', /config.use_transactional_fixtures/, '# config.use_transactional_fixtures'
49
+
50
+ # reset your application database to a pristine state during testing
51
+ inject_into_file 'spec/spec_helper.rb', :before => "\nend" do
52
+ <<-RUBY
53
+ \n
54
+ # Clean up the database
55
+ require 'database_cleaner'
56
+ config.before(:suite) do
57
+ DatabaseCleaner.strategy = :truncation
58
+ DatabaseCleaner.orm = "mongoid"
59
+ end
60
+
61
+ config.before(:each) do
62
+ DatabaseCleaner.clean
63
+ end
64
+ RUBY
65
+ end
66
+
67
+ # remove either possible occurrence of "require rails/test_unit/railtie"
68
+ gsub_file 'config/application.rb', /require 'rails\/test_unit\/railtie'/, '# require "rails/test_unit/railtie"'
69
+ gsub_file 'config/application.rb', /require "rails\/test_unit\/railtie"/, '# require "rails/test_unit/railtie"'
70
+
71
+ # configure RSpec to use matchers from the mongoid-rspec gem
72
+ create_file 'spec/support/mongoid.rb' do
73
+ <<-RUBY
74
+ RSpec.configure do |config|
75
+ config.include Mongoid::Matchers
76
+ end
77
+ RUBY
78
+ end
79
+ end
80
+
81
+ if recipes.include? 'devise'
82
+ # add Devise test helpers
83
+ create_file 'spec/support/devise.rb' do
84
+ <<-RUBY
85
+ RSpec.configure do |config|
86
+ config.include Devise::TestHelpers, :type => :controller
87
+ end
88
+ RUBY
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+
95
+ __END__
96
+
97
+ name: RSpec
98
+ description: "Use RSpec instead of TestUnit."
99
+ author: fortuity
100
+
101
+ exclusive: unit_testing
102
+ category: testing
103
+
104
+ args: ["-T"]
105
+
106
+ config:
107
+ - rspec:
108
+ type: boolean
109
+ prompt: Would you like to use RSpec instead of TestUnit?
110
+ - factory_girl:
111
+ type: boolean
112
+ prompt: Would you like to use factory_girl for test fixtures with RSpec?
data/recipes/sass.rb ADDED
@@ -0,0 +1,13 @@
1
+ unless recipes.include? 'haml'
2
+ gem 'haml', '>= 3.0.0'
3
+ end
4
+
5
+ __END__
6
+
7
+ name: SASS
8
+ description: "Utilize SASS (through the HAML gem) for really awesome stylesheets!"
9
+ author: mbleigh
10
+
11
+ exclusive: css_replacement
12
+ category: assets
13
+ tags: [css]
@@ -0,0 +1,42 @@
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/seed_database.rb
3
+
4
+
5
+ after_bundler do
6
+
7
+ say_wizard "SeedDatabase recipe running 'after bundler'"
8
+
9
+ unless recipes.include? 'mongoid'
10
+ run 'rake db:migrate'
11
+ end
12
+
13
+ if recipes.include? 'mongoid'
14
+ append_file 'db/seeds.rb' do <<-FILE
15
+ puts 'EMPTY THE MONGODB DATABASE'
16
+ Mongoid.master.collections.reject { |c| c.name =~ /^system/}.each(&:drop)
17
+ FILE
18
+ end
19
+ end
20
+
21
+ if recipes.include? 'devise'
22
+ # create a default user
23
+ append_file 'db/seeds.rb' do <<-FILE
24
+ puts 'SETTING UP DEFAULT USER LOGIN'
25
+ user = User.create! :name => 'First User', :email => 'user@test.com', :password => 'please', :password_confirmation => 'please'
26
+ puts 'New user created: ' << user.name
27
+ FILE
28
+ end
29
+ end
30
+
31
+ run 'rake db:seed'
32
+
33
+ end
34
+
35
+ __END__
36
+
37
+ name: SeedDatabase
38
+ description: "Create a database seed file with a default user."
39
+ author: fortuity
40
+
41
+ category: other
42
+ tags: [utilities, configuration]
data/recipes/sequel.rb ADDED
@@ -0,0 +1,13 @@
1
+ gem 'sequel-rails'
2
+
3
+ application "require 'sequel-rails/railtie'"
4
+
5
+ __END__
6
+
7
+ name: Sequel
8
+ description: "Utilize Sequel as the primary ORM for your application."
9
+ author: mbleigh
10
+
11
+ exclusive: orm
12
+ category: persistence
13
+ tags: [orm, sql]
@@ -0,0 +1,43 @@
1
+ gem 'settingslogic'
2
+
3
+ say_wizard "Generating config/application.yml..."
4
+
5
+ append_file "config/application.rb", <<-RUBY
6
+
7
+ require 'settings'
8
+ RUBY
9
+
10
+ create_file "lib/settings.rb", <<-RUBY
11
+ class Settings < Settingslogic
12
+ source "#\{Rails.root\}/config/application.yml"
13
+ namespace Rails.env
14
+ end
15
+
16
+ RUBY
17
+
18
+ create_file "config/application.yml", <<-YAML
19
+ defaults: &defaults
20
+ cool:
21
+ saweet: nested settings
22
+ neat_setting: 24
23
+ awesome_setting: <%= "Did you know 5 + 5 = #{5 + 5}?" %>
24
+
25
+ development:
26
+ <<: *defaults
27
+ neat_setting: 800
28
+
29
+ test:
30
+ <<: *defaults
31
+
32
+ production:
33
+ <<: *defaults
34
+ YAML
35
+
36
+ __END__
37
+
38
+ name: Settingslogic
39
+ description: "A simple and straightforward settings solution that uses an ERB enabled YAML file and a singleton design pattern."
40
+ author: elandesign
41
+
42
+ category: other
43
+ tags: [utilities, configuration]
data/recipes/slim.rb ADDED
@@ -0,0 +1,11 @@
1
+ gem 'slim'
2
+ gem 'slim-rails'
3
+
4
+ __END__
5
+
6
+ name: Slim
7
+ description: "Use Slim as the default templating engine."
8
+ author: mbleigh
9
+
10
+ category: templating
11
+ exclusive: templating
@@ -0,0 +1,11 @@
1
+ # No additional code required.
2
+
3
+ __END__
4
+
5
+ name: Test::Unit
6
+ description: "Utilize the default Rails test facilities."
7
+ author: mbleigh
8
+
9
+ exclusive: unit_testing
10
+ category: testing
11
+ tags: [defaults]
@@ -0,0 +1,103 @@
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/users_page.rb
3
+
4
+ after_bundler do
5
+
6
+ say_wizard "UsersPage recipe running 'after bundler'"
7
+
8
+ #----------------------------------------------------------------------------
9
+ # Create a users controller
10
+ #----------------------------------------------------------------------------
11
+ generate(:controller, "users show")
12
+ gsub_file 'app/controllers/users_controller.rb', /def show/ do
13
+ <<-RUBY
14
+ before_filter :authenticate_user!
15
+
16
+ def show
17
+ @user = User.find(params[:id])
18
+ RUBY
19
+ end
20
+
21
+ #----------------------------------------------------------------------------
22
+ # Modify the routes
23
+ #----------------------------------------------------------------------------
24
+ # @devise_for :users@ route must be placed above @resources :users, :only => :show@.
25
+ gsub_file 'config/routes.rb', /get \"users\/show\"/, '#get \"users\/show\"'
26
+ gsub_file 'config/routes.rb', /devise_for :users/ do
27
+ <<-RUBY
28
+ devise_for :users
29
+ resources :users, :only => :show
30
+ RUBY
31
+ end
32
+
33
+ #----------------------------------------------------------------------------
34
+ # Create a users show page
35
+ #----------------------------------------------------------------------------
36
+ if recipes.include? 'haml'
37
+ remove_file 'app/views/users/show.html.haml'
38
+ # There is Haml code in this script. Changing the indentation is perilous between HAMLs.
39
+ # We have to use single-quote-style-heredoc to avoid interpolation.
40
+ create_file 'app/views/users/show.html.haml' do <<-'HAML'
41
+ %p
42
+ User: #{@user.name}
43
+ %p
44
+ Email: #{@user.email if @user.email}
45
+ HAML
46
+ end
47
+ else
48
+ append_file 'app/views/users/show.html.erb' do <<-ERB
49
+ <p>User: <%= @user.name %></p>
50
+ <p>Email: <%= @user.email if @user.email %></p>
51
+ ERB
52
+ end
53
+ end
54
+
55
+ #----------------------------------------------------------------------------
56
+ # Create a home page containing links to user show pages
57
+ # (clobbers code from the home_page_users recipe)
58
+ #----------------------------------------------------------------------------
59
+ # set up the controller
60
+ remove_file 'app/controllers/home_controller.rb'
61
+ create_file 'app/controllers/home_controller.rb' do
62
+ <<-RUBY
63
+ class HomeController < ApplicationController
64
+ def index
65
+ @users = User.all
66
+ end
67
+ end
68
+ RUBY
69
+ end
70
+
71
+ # modify the home page
72
+ if recipes.include? 'haml'
73
+ remove_file 'app/views/home/index.html.haml'
74
+ # There is Haml code in this script. Changing the indentation is perilous between HAMLs.
75
+ # We have to use single-quote-style-heredoc to avoid interpolation.
76
+ create_file 'app/views/home/index.html.haml' do
77
+ <<-'HAML'
78
+ %h3 Home
79
+ - @users.each do |user|
80
+ %p User: #{link_to user.name, user}
81
+ HAML
82
+ end
83
+ else
84
+ remove_file 'app/views/home/index.html.erb'
85
+ create_file 'app/views/home/index.html.erb' do <<-ERB
86
+ <h3>Home</h3>
87
+ <% @users.each do |user| %>
88
+ <p>User: <%=link_to user.name, user %></p>
89
+ <% end %>
90
+ ERB
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ __END__
97
+
98
+ name: UsersPage
99
+ description: "Add a users controller and user show page with links from the home page."
100
+ author: fortuity
101
+
102
+ category: other
103
+ tags: [utilities, configuration]
@@ -0,0 +1,99 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsWizard::Config do
4
+ describe '#initialize' do
5
+ subject{ RailsWizard::Config.new(YAML.load(@schema)) }
6
+ it 'should add a question key for each key of the schema' do
7
+ @schema = <<-YAML
8
+ - test:
9
+ type: string
10
+ YAML
11
+ subject.questions.should be_key('test')
12
+ end
13
+
14
+ it 'should instantiate the correct question type for each question' do
15
+ @schema = <<-YAML
16
+ - string:
17
+ type: string
18
+ - boolean:
19
+ type: boolean
20
+ - multiple_choice:
21
+ type: multiple_choice
22
+ YAML
23
+ subject.questions['string'].should be_kind_of(RailsWizard::Config::Prompt)
24
+ subject.questions['boolean'].should be_kind_of(RailsWizard::Config::TrueFalse)
25
+ subject.questions['multiple_choice'].should be_kind_of(RailsWizard::Config::MultipleChoice)
26
+ end
27
+
28
+ it 'should error on invalid question type' do
29
+ @schema = <<-YAML
30
+ - invalid
31
+ type: invalid
32
+ YAML
33
+ lambda{ subject }.should raise_error(ArgumentError)
34
+ end
35
+
36
+ describe '#compile' do
37
+ let(:lines) { subject.compile.split("\n") }
38
+ before do
39
+ @schema = <<-YAML
40
+ - string:
41
+ type: string
42
+ prompt: Give me a string?
43
+ if: is_true
44
+ - boolean:
45
+ type: boolean
46
+ prompt: Yes or no?
47
+ unless: is_false
48
+ if_recipe: awesome
49
+ - multiple_choice:
50
+ type: multiple_choice
51
+ choices: [[ABC, abc], [DEF, def]]
52
+ unless_recipe: awesome
53
+ YAML
54
+ end
55
+
56
+ it 'should include all questions' do
57
+ lines.size.should == 4
58
+ end
59
+
60
+ it 'should handle "if"' do
61
+ lines[1].should be_include("config['is_true']")
62
+ end
63
+
64
+ it 'should handle "unless"' do
65
+ lines[2].should be_include("!config['is_false']")
66
+ end
67
+
68
+ it 'should handle "if_recipe"' do
69
+ lines[2].should be_include("recipe?('awesome')")
70
+ end
71
+
72
+ it 'should handle "unelss_recipe"' do
73
+ lines[3].should be_include("!recipe?('awesome')")
74
+ end
75
+ end
76
+
77
+ describe RailsWizard::Config::Prompt do
78
+ subject{ RailsWizard::Config::Prompt }
79
+ it 'should compile to a prompt' do
80
+ subject.new({'prompt' => "What's your favorite color?"}).question.should == 'ask_wizard("What\'s your favorite color?")'
81
+ end
82
+ end
83
+
84
+ describe RailsWizard::Config::TrueFalse do
85
+ subject{ RailsWizard::Config::TrueFalse }
86
+ it 'should compile to a yes? question' do
87
+ subject.new({'prompt' => 'Yes yes?'}).question.should == 'yes_wizard?("Yes yes?")'
88
+ end
89
+ end
90
+
91
+ describe RailsWizard::Config::MultipleChoice do
92
+ subject{ RailsWizard::Config::MultipleChoice }
93
+ it 'should compile into a multiple_choice' do
94
+ subject.new({'prompt' => 'What kind of fruit?', 'choices' => [['Apples', 'apples'], ['Bananas', 'bananas']]}).question.should ==
95
+ 'multiple_choice("What kind of fruit?", [["Apples", "apples"], ["Bananas", "bananas"]])'
96
+ end
97
+ end
98
+ end
99
+ end