redmint_composer 2.3

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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/README.textile +10 -0
  3. data/bin/redmint_composer +7 -0
  4. data/lib/rails_wizard.rb +7 -0
  5. data/lib/rails_wizard/command.rb +204 -0
  6. data/lib/rails_wizard/config.rb +88 -0
  7. data/lib/rails_wizard/diagnostics.rb +58 -0
  8. data/lib/rails_wizard/recipe.rb +114 -0
  9. data/lib/rails_wizard/recipes.rb +56 -0
  10. data/lib/rails_wizard/template.rb +111 -0
  11. data/recipes/admin.rb +42 -0
  12. data/recipes/analytics.rb +41 -0
  13. data/recipes/core.rb +32 -0
  14. data/recipes/deployment.rb +178 -0
  15. data/recipes/devise.rb +34 -0
  16. data/recipes/email.rb +65 -0
  17. data/recipes/email_dev.rb +92 -0
  18. data/recipes/example.rb +63 -0
  19. data/recipes/extras.rb +283 -0
  20. data/recipes/frontend.rb +33 -0
  21. data/recipes/gems.rb +274 -0
  22. data/recipes/git.rb +27 -0
  23. data/recipes/init.rb +179 -0
  24. data/recipes/learn_rails.rb +89 -0
  25. data/recipes/locale.rb +31 -0
  26. data/recipes/omniauth.rb +38 -0
  27. data/recipes/pages.rb +91 -0
  28. data/recipes/rails_bootstrap.rb +29 -0
  29. data/recipes/rails_devise.rb +26 -0
  30. data/recipes/rails_devise_pundit.rb +25 -0
  31. data/recipes/rails_devise_roles.rb +25 -0
  32. data/recipes/rails_foundation.rb +29 -0
  33. data/recipes/rails_mailinglist_activejob.rb +76 -0
  34. data/recipes/rails_omniauth.rb +27 -0
  35. data/recipes/rails_signup_download.rb +69 -0
  36. data/recipes/rails_stripe_checkout.rb +84 -0
  37. data/recipes/rails_stripe_coupons.rb +125 -0
  38. data/recipes/rails_stripe_membership_saas.rb +112 -0
  39. data/recipes/railsapps.rb +77 -0
  40. data/recipes/readme.rb +161 -0
  41. data/recipes/roles.rb +40 -0
  42. data/recipes/setup.rb +162 -0
  43. data/recipes/tests.rb +59 -0
  44. data/spec/rails_wizard/config_spec.rb +108 -0
  45. data/spec/rails_wizard/recipe_spec.rb +115 -0
  46. data/spec/rails_wizard/recipes/sanity_spec.rb +30 -0
  47. data/spec/rails_wizard/recipes_spec.rb +41 -0
  48. data/spec/rails_wizard/template_spec.rb +92 -0
  49. data/spec/spec_helper.rb +11 -0
  50. data/spec/support/rails_directory.rb +17 -0
  51. data/spec/support/template_runner.rb +28 -0
  52. data/spec/test_recipes/test_recipe_in_file.rb +9 -0
  53. data/templates/helpers.erb +138 -0
  54. data/templates/layout.erb +231 -0
  55. data/templates/recipe.erb +13 -0
  56. data/version.rb +3 -0
  57. metadata +201 -0
@@ -0,0 +1,161 @@
1
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/readme.rb
3
+
4
+ stage_three do
5
+ say_wizard "recipe stage three"
6
+
7
+ # remove default READMEs
8
+ %w{
9
+ README
10
+ README.rdoc
11
+ doc/README_FOR_APP
12
+ }.each { |file| remove_file file }
13
+
14
+ # add diagnostics to README
15
+ create_file 'README', "#{app_name.humanize.titleize}\n================\n\n"
16
+ append_to_file 'README' do <<-TEXT
17
+ Rails Composer, open source, supported by subscribers.
18
+ Please join RailsApps to support development of Rails Composer.
19
+ Need help? Ask on Stack Overflow with the tag 'railsapps.'
20
+ Problems? Submit an issue: https://github.com/RailsApps/rails_apps_composer/issues
21
+ Your application contains diagnostics in this README file.
22
+ Please provide a copy of this README file when reporting any issues.
23
+ \n
24
+ TEXT
25
+ end
26
+ append_to_file 'README' do <<-TEXT
27
+ option Build a starter application?
28
+ choose Enter your selection: [#{prefs[:apps4]}]
29
+ option Get on the mailing list for Rails Composer news?
30
+ choose Enter your selection: [#{prefs[:announcements]}]
31
+ option Web server for development?
32
+ choose Enter your selection: [#{prefs[:dev_webserver]}]
33
+ option Web server for production?
34
+ choose Enter your selection: [#{prefs[:prod_webserver]}]
35
+ option Database used in development?
36
+ choose Enter your selection: [#{prefs[:database]}]
37
+ option Template engine?
38
+ choose Enter your selection: [#{prefs[:templates]}]
39
+ option Test framework?
40
+ choose Enter your selection: [#{prefs[:tests]}]
41
+ option Continuous testing?
42
+ choose Enter your selection: [#{prefs[:continuous_testing]}]
43
+ option Front-end framework?
44
+ choose Enter your selection: [#{prefs[:frontend]}]
45
+ option Add support for sending email?
46
+ choose Enter your selection: [#{prefs[:email]}]
47
+ option Authentication?
48
+ choose Enter your selection: [#{prefs[:authentication]}]
49
+ option Devise modules?
50
+ choose Enter your selection: [#{prefs[:devise_modules]}]
51
+ option OmniAuth provider?
52
+ choose Enter your selection: [#{prefs[:omniauth_provider]}]
53
+ option Authorization?
54
+ choose Enter your selection: [#{prefs[:authorization]}]
55
+ option Use a form builder gem?
56
+ choose Enter your selection: [#{prefs[:form_builder]}]
57
+ option Add pages?
58
+ choose Enter your selection: [#{prefs[:pages]}]
59
+ option Set a locale?
60
+ choose Enter your selection: [#{prefs[:locale]}]
61
+ option Install page-view analytics?
62
+ choose Enter your selection: [#{prefs[:analytics]}]
63
+ option Add a deployment mechanism?
64
+ choose Enter your selection: [#{prefs[:deployment]}]
65
+ option Set a robots.txt file to ban spiders?
66
+ choose Enter your selection: [#{prefs[:ban_spiders]}]
67
+ option Create a GitHub repository? (y/n)
68
+ choose Enter your selection: [#{prefs[:github]}]
69
+ option Add gem and file for environment variables?
70
+ choose Enter your selection: [#{prefs[:local_env_file]}]
71
+ option Reduce assets logger noise during development?
72
+ choose Enter your selection: [#{prefs[:quiet_assets]}]
73
+ option Improve error reporting with 'better_errors' during development?
74
+ choose Enter your selection: [#{prefs[:better_errors]}]
75
+ option Use 'pry' as console replacement during development and test?
76
+ choose Enter your selection: [#{prefs[:pry]}]
77
+ option Use or create a project-specific rvm gemset?
78
+ choose Enter your selection: [#{prefs[:rvmrc]}]
79
+ TEXT
80
+ end
81
+
82
+ create_file 'public/humans.txt' do <<-TEXT
83
+ /* the humans responsible & colophon */
84
+ /* humanstxt.org */
85
+
86
+
87
+ /* TEAM */
88
+ <your title>: <your name>
89
+ Site:
90
+ Twitter:
91
+ Location:
92
+
93
+ /* SITE */
94
+ Standards: HTML5, CSS3
95
+ Components: jQuery
96
+ Software: Ruby on Rails
97
+ TEXT
98
+ end
99
+
100
+ create_file 'README.md', "#{app_name.humanize.titleize}\n================\n\n"
101
+
102
+ if prefer :deployment, 'heroku'
103
+ append_to_file 'README.md' do <<-TEXT
104
+ [![Deploy to Heroku](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
105
+
106
+ TEXT
107
+ end
108
+ end
109
+
110
+ append_to_file 'README.md' do <<-TEXT
111
+ This application was generated with the [redmint_composer](https://github.com/adrianescat/redmint_composer) gem
112
+ based on rails_apps_composer gem provided by [RailsApps Project](http://railsapps.github.io/).
113
+
114
+ Rails Composer is open source and supported by subscribers. Please join RailsApps to support development of Rails Composer.
115
+
116
+ Ruby on Rails
117
+ -------------
118
+
119
+ This application requires:
120
+
121
+ - Ruby #{RUBY_VERSION}
122
+ - Rails #{Rails::VERSION::STRING}
123
+
124
+
125
+ Getting Started
126
+ ---------------
127
+
128
+ Documentation and Support
129
+ -------------------------
130
+
131
+ Issues
132
+ -------------
133
+
134
+ Similar Projects
135
+ ----------------
136
+
137
+ Contributing
138
+ ------------
139
+
140
+ Credits
141
+ -------
142
+
143
+ License
144
+ -------
145
+ TEXT
146
+ end
147
+
148
+ git :add => '-A' if prefer :git, true
149
+ git :commit => '-qm "rails_apps_composer: add README files"' if prefer :git, true
150
+
151
+ end
152
+
153
+ __END__
154
+
155
+ name: readme
156
+ description: "Build a README file for your application."
157
+ author: RailsApps
158
+
159
+ requires: [setup]
160
+ run_after: [setup]
161
+ category: configuration
@@ -0,0 +1,40 @@
1
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/roles.rb
3
+
4
+ stage_two do
5
+ say_wizard "recipe stage two"
6
+ if (prefer :authorization, 'roles') || (prefer :authorization, 'pundit')
7
+ if prefer :authentication, 'none'
8
+ generate 'model User email:string'
9
+ run 'bundle exec rake db:migrate'
10
+ end
11
+ generate 'migration AddRoleToUsers role:integer'
12
+ role_boilerplate = " enum role: [:user, :admin]\n after_initialize :set_default_role, :if => :new_record?\n\n"
13
+ role_boilerplate << " def set_default_role\n self.role ||= :user\n end\n\n" if prefer :authentication, 'devise'
14
+ if prefer :authentication, 'omniauth'
15
+ role_boilerplate << <<-RUBY
16
+ def set_default_role
17
+ if User.count == 0
18
+ self.role ||= :admin
19
+ else
20
+ self.role ||= :user
21
+ end
22
+ end
23
+ RUBY
24
+ end
25
+ inject_into_class 'app/models/user.rb', 'User', role_boilerplate
26
+ end
27
+ ### GIT ###
28
+ git :add => '-A' if prefer :git, true
29
+ git :commit => '-qm "redmint_composer: add roles to a User model"' if prefer :git, true
30
+ end
31
+
32
+ __END__
33
+
34
+ name: roles
35
+ description: "Add roles to a User model"
36
+ author: RailsApps
37
+
38
+ requires: [setup, gems, devise, omniauth]
39
+ run_after: [setup, gems, devise, omniauth]
40
+ category: mvc
@@ -0,0 +1,162 @@
1
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/setup.rb
3
+
4
+ ## Ruby on Rails
5
+ HOST_OS = RbConfig::CONFIG['host_os']
6
+ say_wizard "Your operating system is #{HOST_OS}."
7
+ say_wizard "You are using Ruby version #{RUBY_VERSION}."
8
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING}."
9
+
10
+ ## Is sqlite3 in the Gemfile?
11
+ gemfile = File.read(destination_root() + '/Gemfile')
12
+ sqlite_detected = gemfile.include? 'sqlite3'
13
+
14
+ ## Web Server
15
+ prefs[:dev_webserver] = multiple_choice "Web server for development?", [["WEBrick (default)", "webrick"],
16
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"], ["Phusion Passenger (Apache/Nginx)", "passenger"],
17
+ ["Phusion Passenger (Standalone)", "passenger_standalone"]] unless prefs.has_key? :dev_webserver
18
+ prefs[:prod_webserver] = multiple_choice "Web server for production?", [["Same as development", "same"],
19
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"], ["Phusion Passenger (Apache/Nginx)", "passenger"],
20
+ ["Phusion Passenger (Standalone)", "passenger_standalone"]] unless prefs.has_key? :prod_webserver
21
+ prefs[:prod_webserver] = prefs[:dev_webserver] if prefs[:prod_webserver] == 'same'
22
+
23
+ ## Database Adapter
24
+ prefs[:database] = "sqlite" if prefer :database, 'default'
25
+ prefs[:database] = multiple_choice "Database used in development?", [["SQLite", "sqlite"], ["PostgreSQL", "postgresql"],
26
+ ["MySQL", "mysql"]] unless prefs.has_key? :database
27
+
28
+ ## Template Engine
29
+ prefs[:templates] = multiple_choice "Template engine?", [["ERB", "erb"], ["Haml", "haml"], ["Slim", "slim"]] unless prefs.has_key? :templates
30
+
31
+ ## Testing Framework
32
+ if recipes.include? 'tests'
33
+ prefs[:tests] = multiple_choice "Test framework?", [["None", "none"],
34
+ ["RSpec with Capybara", "rspec"]] unless prefs.has_key? :tests
35
+ case prefs[:tests]
36
+ when 'rspec'
37
+ say_wizard "Adding DatabaseCleaner, FactoryGirl, Faker, Launchy, Selenium"
38
+ prefs[:continuous_testing] = multiple_choice "Continuous testing?", [["None", "none"], ["Guard", "guard"]] unless prefs.has_key? :continuous_testing
39
+ end
40
+ end
41
+
42
+ ## Front-end Framework
43
+ if recipes.include? 'frontend'
44
+ prefs[:frontend] = multiple_choice "Front-end framework?", [["None", "none"],
45
+ ["Bootstrap 3.3", "bootstrap3"], ["Bootstrap 2.3", "bootstrap2"],
46
+ ["Zurb Foundation 5.5", "foundation5"], ["Zurb Foundation 4.0", "foundation4"],
47
+ ["Simple CSS", "simple"]] unless prefs.has_key? :frontend
48
+ end
49
+
50
+ ## Email
51
+ if recipes.include? 'email'
52
+ unless prefs.has_key? :email
53
+ say_wizard "The Devise 'forgot password' feature requires email." if prefer :authentication, 'devise'
54
+ prefs[:email] = multiple_choice "Add support for sending email?", [["None", "none"], ["Gmail","gmail"], ["SMTP","smtp"],
55
+ ["SendGrid","sendgrid"], ["Mandrill","mandrill"]]
56
+ end
57
+ else
58
+ prefs[:email] = 'none'
59
+ end
60
+
61
+ ## Authentication and Authorization
62
+ if (recipes.include? 'devise') || (recipes.include? 'omniauth')
63
+ prefs[:authentication] = multiple_choice "Authentication?", [["None", "none"], ["Devise", "devise"], ["OmniAuth", "omniauth"]] unless prefs.has_key? :authentication
64
+ case prefs[:authentication]
65
+ when 'devise'
66
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"],
67
+ ["Devise with Confirmable module","confirmable"],
68
+ ["Devise with Confirmable and Invitable modules","invitable"]] unless prefs.has_key? :devise_modules
69
+ when 'omniauth'
70
+ prefs[:omniauth_provider] = multiple_choice "OmniAuth provider?", [["Facebook", "facebook"], ["Twitter", "twitter"], ["GitHub", "github"],
71
+ ["LinkedIn", "linkedin"], ["Google-Oauth-2", "google_oauth2"], ["Tumblr", "tumblr"]] unless prefs.has_key? :omniauth_provider
72
+ end
73
+ prefs[:authorization] = multiple_choice "Authorization?", [["None", "none"], ["Simple role-based", "roles"], ["Pundit", "pundit"]] unless prefs.has_key? :authorization
74
+ if prefer :authentication, 'devise'
75
+ if (prefer :authorization, 'roles') || (prefer :authorization, 'pundit')
76
+ prefs[:dashboard] = multiple_choice "Admin interface for database?", [["None", "none"], ["Upmin", "upmin"]] unless prefs.has_key? :dashboard
77
+ end
78
+ end
79
+ end
80
+
81
+ ## Form Builder
82
+ prefs[:form_builder] = multiple_choice "Use a form builder gem?", [["None", "none"], ["SimpleForm", "simple_form"]] unless prefs.has_key? :form_builder
83
+
84
+ ## Pages
85
+ if recipes.include? 'pages'
86
+ prefs[:pages] = multiple_choice "Add pages?", [["None", "none"],
87
+ ["Home", "home"], ["Home and About", "about"],
88
+ ["Home and Users", "users"],
89
+ ["Home, About, and Users", "about+users"]] unless prefs.has_key? :pages
90
+ end
91
+
92
+ ## Bootstrap Page Templates
93
+ if recipes.include? 'pages'
94
+ if prefs[:frontend] == 'bootstrap3'
95
+ prefs[:layouts] = multiple_choice "Add Bootstrap page templates?", [["None", "none"],
96
+ ["1 Col Portfolio", "one_col_portfolio"],
97
+ ["2 Col Portfolio", "two_col_portfolio"],
98
+ ["3 Col Portfolio", "three_col_portfolio"],
99
+ ["4 Col Portfolio", "four_col_portfolio"],
100
+ ["Bare", "bare"],
101
+ ["Blog Home", "blog_home"],
102
+ ["Business Casual", "business_casual"],
103
+ ["Business Frontpage", "business_frontpage"],
104
+ ["Clean Blog", "clean_blog"],
105
+ ["Full Width Pics", "full_width_pics"],
106
+ ["Heroic Features", "heroic_features"],
107
+ ["Landing Page", "landing_page"],
108
+ ["Modern Business", "modern_business"],
109
+ ["One Page Wonder", "one_page_wonder"],
110
+ ["Portfolio Item", "portfolio_item"],
111
+ ["Round About", "round_about"],
112
+ ["Shop Homepage", "shop_homepage"],
113
+ ["Shop Item", "shop_item"],
114
+ ["Simple Sidebar", "simple_sidebar"],
115
+ ["Small Business", "small_business"],
116
+ ["Stylish Portfolio", "stylish_portfolio"],
117
+ ["The Big Picture", "the_big_picture"],
118
+ ["Thumbnail Gallery", "thumbnail_gallery"]] unless prefs.has_key? :layouts
119
+ end
120
+ end
121
+
122
+ # save configuration before anything can fail
123
+ create_file 'config/railscomposer.yml', "# This application was generated with Rails Composer\n\n"
124
+ append_to_file 'config/railscomposer.yml' do <<-TEXT
125
+ apps4: [#{prefs[:apps4]}]
126
+ announcements: [#{prefs[:announcements]}]
127
+ dev_webserver: [#{prefs[:dev_webserver]}]
128
+ prod_webserver: [#{prefs[:prod_webserver]}]
129
+ database: [#{prefs[:database]}]
130
+ templates: [#{prefs[:templates]}]
131
+ tests: [#{prefs[:tests]}]
132
+ continuous_testing: [#{prefs[:continuous_testing]}]
133
+ frontend: [#{prefs[:frontend]}]
134
+ email: [#{prefs[:email]}]
135
+ authentication: [#{prefs[:authentication]}]
136
+ devise_modules: [#{prefs[:devise_modules]}]
137
+ omniauth_provider: [#{prefs[:omniauth_provider]}]
138
+ authorization: [#{prefs[:authorization]}]
139
+ form_builder: [#{prefs[:form_builder]}]
140
+ pages: [#{prefs[:pages]}]
141
+ layouts: [#{prefs[:layouts]}]
142
+ locale: [#{prefs[:locale]}]
143
+ analytics: [#{prefs[:analytics]}]
144
+ deployment: [#{prefs[:deployment]}]
145
+ ban_spiders: [#{prefs[:ban_spiders]}]
146
+ github: [#{prefs[:github]}]
147
+ local_env_file: [#{prefs[:local_env_file]}]
148
+ quiet_assets: [#{prefs[:quiet_assets]}]
149
+ better_errors: [#{prefs[:better_errors]}]
150
+ pry: [#{prefs[:pry]}]
151
+ rvmrc: [#{prefs[:rvmrc]}]
152
+ TEXT
153
+ end
154
+
155
+ __END__
156
+
157
+ name: setup
158
+ description: "Make choices for your application."
159
+ author: RailsApps
160
+
161
+ run_after: [git, railsapps]
162
+ category: configuration
@@ -0,0 +1,59 @@
1
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/tests.rb
3
+
4
+ stage_two do
5
+ say_wizard "recipe stage two"
6
+ if prefer :tests, 'rspec'
7
+ say_wizard "recipe installing RSpec"
8
+ generate 'testing:configure rspec -f'
9
+ end
10
+ if prefer :continuous_testing, 'guard'
11
+ say_wizard "recipe initializing Guard"
12
+ run 'bundle exec guard init'
13
+ end
14
+ git :add => '-A' if prefer :git, true
15
+ git :commit => '-qm "redmint_composer: testing framework"' if prefer :git, true
16
+ end
17
+
18
+ stage_three do
19
+ say_wizard "recipe stage three"
20
+ if prefer :tests, 'rspec'
21
+ if prefer :authentication, 'devise'
22
+ generate 'testing:configure devise -f'
23
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
24
+ inject_into_file 'spec/factories/users.rb', " confirmed_at Time.now\n", :after => "factory :user do\n"
25
+ default_url = ' config.action_mailer.default_url_options = { :host => Rails.application.secrets.domain_name }'
26
+ inject_into_file 'config/environments/test.rb', default_url, :after => "delivery_method = :test\n"
27
+ gsub_file 'spec/features/users/user_edit_spec.rb', /successfully./, 'successfully,'
28
+ gsub_file 'spec/features/visitors/sign_up_spec.rb', /Welcome! You have signed up successfully./, 'A message with a confirmation'
29
+ end
30
+ end
31
+ if prefer :authentication, 'omniauth'
32
+ generate 'testing:configure omniauth -f'
33
+ end
34
+ if (prefer :authorization, 'roles') || (prefer :authorization, 'pundit')
35
+ generate 'testing:configure pundit -f'
36
+ remove_file 'spec/policies/user_policy_spec.rb' unless %w(users about+users).include?(prefs[:pages])
37
+ remove_file 'spec/policies/user_policy_spec.rb' if prefer :authorization, 'roles'
38
+ remove_file 'spec/support/pundit.rb' if prefer :authorization, 'roles'
39
+ if (prefer :authentication, 'devise') &&\
40
+ ((prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable'))
41
+ inject_into_file 'spec/factories/users.rb', " confirmed_at Time.now\n", :after => "factory :user do\n"
42
+ end
43
+ end
44
+ unless %w(users about+users).include?(prefs[:pages])
45
+ remove_file 'spec/features/users/user_index_spec.rb'
46
+ remove_file 'spec/features/users/user_show_spec.rb'
47
+ end
48
+ end
49
+ end
50
+
51
+ __END__
52
+
53
+ name: tests
54
+ description: "Add testing framework."
55
+ author: RailsApps
56
+
57
+ requires: [setup, gems]
58
+ run_after: [setup, gems]
59
+ category: testing
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsWizard::Config do
4
+ describe '#initialize' do
5
+ let(:defaults) { nil }
6
+ subject{ RailsWizard::Config.new(YAML.load(@schema), defaults) }
7
+ it 'should add a question key for each key of the schema' do
8
+ @schema = <<-YAML
9
+ - test:
10
+ type: string
11
+ YAML
12
+ subject.questions.should be_key('test')
13
+ end
14
+
15
+ it 'should instantiate the correct question type for each question' do
16
+ @schema = <<-YAML
17
+ - string:
18
+ type: string
19
+ - boolean:
20
+ type: boolean
21
+ - multiple_choice:
22
+ type: multiple_choice
23
+ YAML
24
+ subject.questions['string'].should be_kind_of(RailsWizard::Config::Prompt)
25
+ subject.questions['boolean'].should be_kind_of(RailsWizard::Config::TrueFalse)
26
+ subject.questions['multiple_choice'].should be_kind_of(RailsWizard::Config::MultipleChoice)
27
+ end
28
+
29
+ # it 'should error on invalid question type' do
30
+ # @schema = <<-YAML
31
+ # - invalid
32
+ # type: invalid
33
+ # YAML
34
+ # lambda{ subject }.should raise_error(ArgumentError)
35
+ # end
36
+
37
+ describe '#compile' do
38
+ let(:lines) { subject.compile.split("\n") }
39
+ before do
40
+ @schema = <<-YAML
41
+ - string:
42
+ type: string
43
+ prompt: Give me a string?
44
+ if: is_true
45
+ - boolean:
46
+ type: boolean
47
+ prompt: Yes or no?
48
+ unless: is_false
49
+ if_recipe: awesome
50
+ - multiple_choice:
51
+ type: multiple_choice
52
+ choices: [[ABC, abc], [DEF, def]]
53
+ unless_recipe: awesome
54
+ YAML
55
+ end
56
+
57
+ it 'should include all questions' do
58
+ lines.size.should == 4
59
+ end
60
+
61
+ it 'should handle "if"' do
62
+ lines[1].should be_include("config['is_true']")
63
+ end
64
+
65
+ it 'should handle "unless"' do
66
+ lines[2].should be_include("!config['is_false']")
67
+ end
68
+
69
+ it 'should handle "if_recipe"' do
70
+ lines[2].should be_include("recipe?('awesome')")
71
+ end
72
+
73
+ it 'should handle "unelss_recipe"' do
74
+ lines[3].should be_include("!recipe?('awesome')")
75
+ end
76
+
77
+ describe 'with defaults' do
78
+ let(:defaults) { { 'multiple_choice' => 'def' }}
79
+
80
+ it 'should process defaults' do
81
+ lines[0].should == 'config = {"multiple_choice"=>"def"}'
82
+ end
83
+ end
84
+ end
85
+
86
+ describe RailsWizard::Config::Prompt do
87
+ subject{ RailsWizard::Config::Prompt }
88
+ it 'should compile to a prompt' do
89
+ subject.new({'prompt' => "What's your favorite color?"}).question.should == 'ask_wizard("What\'s your favorite color?")'
90
+ end
91
+ end
92
+
93
+ describe RailsWizard::Config::TrueFalse do
94
+ subject{ RailsWizard::Config::TrueFalse }
95
+ it 'should compile to a yes? question' do
96
+ subject.new({'prompt' => 'Yes yes?'}).question.should == 'yes_wizard?("Yes yes?")'
97
+ end
98
+ end
99
+
100
+ describe RailsWizard::Config::MultipleChoice do
101
+ subject{ RailsWizard::Config::MultipleChoice }
102
+ it 'should compile into a multiple_choice' do
103
+ subject.new({'prompt' => 'What kind of fruit?', 'choices' => [['Apples', 'apples'], ['Bananas', 'bananas']]}).question.should ==
104
+ 'multiple_choice("What kind of fruit?", [["Apples", "apples"], ["Bananas", "bananas"]])'
105
+ end
106
+ end
107
+ end
108
+ end