katapult 0.4.1 → 0.5.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.
- checksums.yaml +4 -4
 - data/.gitignore +1 -0
 - data/CHANGELOG.md +34 -12
 - data/README.md +154 -114
 - data/Rakefile +3 -3
 - data/bin/katapult +34 -8
 - data/features/application_model.feature +8 -44
 - data/features/authenticate.feature +21 -4
 - data/features/basics.feature +16 -89
 - data/features/binary.feature +37 -4
 - data/features/model.feature +40 -24
 - data/features/navigation.feature +2 -0
 - data/features/step_definitions/katapult_steps.rb +48 -16
 - data/features/step_definitions/test_steps.rb +2 -0
 - data/features/templates.feature +74 -0
 - data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +2 -2
 - data/lib/generators/katapult/basics/basics_generator.rb +12 -1
 - data/lib/generators/katapult/basics/templates/Capfile +5 -0
 - data/lib/generators/katapult/basics/templates/Gemfile +3 -1
 - data/lib/generators/katapult/basics/templates/Gemfile.lock +376 -0
 - data/lib/generators/katapult/basics/templates/app/models/application_record.rb +28 -0
 - data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/bootstrap.js +2 -2
 - data/lib/generators/katapult/basics/templates/config/deploy.rb +2 -3
 - data/lib/generators/katapult/basics/templates/config/deploy/production.rb +2 -2
 - data/lib/generators/katapult/basics/templates/config/deploy/staging.rb +1 -1
 - data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/deploy.rake +1 -4
 - data/lib/generators/katapult/clearance/clearance_generator.rb +13 -4
 - data/lib/generators/katapult/clearance/templates/features/authentication.feature +3 -3
 - data/lib/generators/katapult/model/model_generator.rb +14 -4
 - data/lib/generators/katapult/templates/templates_generator.rb +35 -0
 - data/lib/generators/katapult/transform/transform_generator.rb +3 -3
 - data/lib/generators/katapult/views/views_generator.rb +1 -1
 - data/lib/generators/katapult/web_ui/web_ui_generator.rb +1 -1
 - data/lib/katapult/application_model.rb +7 -7
 - data/lib/katapult/elements/attribute.rb +16 -0
 - data/lib/katapult/elements/authentication.rb +9 -6
 - data/lib/katapult/elements/model.rb +8 -4
 - data/lib/katapult/elements/navigation.rb +2 -2
 - data/lib/katapult/elements/web_ui.rb +2 -2
 - data/lib/katapult/generator.rb +12 -2
 - data/lib/katapult/support/generator_goodies.rb +14 -0
 - data/lib/katapult/version.rb +1 -1
 - data/script/update +5 -1
 - metadata +8 -8
 - data/features/configuration.feature +0 -24
 - data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/passenger.rake +0 -8
 - data/lib/generators/katapult/basics/templates/lib/ext/active_record/find_by_anything.rb +0 -20
 - data/lib/generators/katapult/basics/templates/lib/ext/active_record/these.rb +0 -7
 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -16,11 +16,11 @@ RSpec::Core::RakeTask.new(:spec) 
     | 
|
| 
       16 
16 
     | 
    
         
             
            task :update_readme do
         
     | 
| 
       17 
17 
     | 
    
         
             
              require_relative 'lib/katapult/version'
         
     | 
| 
       18 
18 
     | 
    
         
             
              readme_path = 'README.md'
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
       19 
20 
     | 
    
         
             
              readme = File.read readme_path
         
     | 
| 
      
 21 
     | 
    
         
            +
              readme.sub! /\A# Katapult.*\nGenerating.*\n/, '# ' + `bin/katapult version`
         
     | 
| 
      
 22 
     | 
    
         
            +
              readme.sub! /(required .Ruby. version is )[\d\.]+\d/, "\\1#{Katapult::RUBY_VERSION}"
         
     | 
| 
       20 
23 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
              # Using \s+ to support line breaks
         
     | 
| 
       22 
     | 
    
         
            -
              readme.sub! /(currently\s+it's\s+Rails\s+)[\d\.]+/, "\\1#{Katapult::RAILS_VERSION}"
         
     | 
| 
       23 
     | 
    
         
            -
              readme.sub! /(and\s+Ruby\s+)[\d\.]+\d/, "\\1#{Katapult::RUBY_VERSION}"
         
     | 
| 
       24 
24 
     | 
    
         
             
              File.open readme_path, 'w' do |f|
         
     | 
| 
       25 
25 
     | 
    
         
             
                f.write readme
         
     | 
| 
       26 
26 
     | 
    
         
             
              end
         
     | 
    
        data/bin/katapult
    CHANGED
    
    | 
         @@ -3,8 +3,6 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            # This script simplifies the usage of `katapult` by grouping relevant actions
         
     | 
| 
       4 
4 
     | 
    
         
             
            # that the user else had to perform manually.
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            usage = 'Usage: katapult new APP_NAME | fire [path/to/model] | version'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
6 
     | 
    
         
             
            require_relative '../lib/katapult/version'
         
     | 
| 
       9 
7 
     | 
    
         
             
            require_relative '../lib/katapult/support/binary_util'
         
     | 
| 
       10 
8 
     | 
    
         
             
            util = Katapult::BinaryUtil
         
     | 
| 
         @@ -35,6 +33,25 @@ is not supported by this version of katapult. 
     | 
|
| 
       35 
33 
     | 
    
         
             
            Please switch to Ruby #{supported_ruby} and run again.
         
     | 
| 
       36 
34 
     | 
    
         
             
            MSG
         
     | 
| 
       37 
35 
     | 
    
         | 
| 
      
 36 
     | 
    
         
            +
            # Prepare output ###############################################################
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            # This is also used as README heading
         
     | 
| 
      
 39 
     | 
    
         
            +
            version = <<-VERSION
         
     | 
| 
      
 40 
     | 
    
         
            +
            Katapult #{Katapult::VERSION}
         
     | 
| 
      
 41 
     | 
    
         
            +
            Generating a Rails #{Katapult::RAILS_VERSION} app on Ruby #{Katapult::RUBY_VERSION}.
         
     | 
| 
      
 42 
     | 
    
         
            +
            VERSION
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            usage = <<-USAGE
         
     | 
| 
      
 45 
     | 
    
         
            +
            Usage: katapult <command>
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            Commands:
         
     | 
| 
      
 48 
     | 
    
         
            +
            new APP_NAME    Generate a configured Rails application
         
     | 
| 
      
 49 
     | 
    
         
            +
            fire [PATH]     Transform application model into code
         
     | 
| 
      
 50 
     | 
    
         
            +
                            Default path: lib/katapult/application_model.rb
         
     | 
| 
      
 51 
     | 
    
         
            +
            templates       Copy templates to lib/templates/katapult
         
     | 
| 
      
 52 
     | 
    
         
            +
            version         Print version
         
     | 
| 
      
 53 
     | 
    
         
            +
            USAGE
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
       38 
55 
     | 
    
         | 
| 
       39 
56 
     | 
    
         
             
            case ARGV.shift
         
     | 
| 
       40 
57 
     | 
    
         
             
            when 'new'
         
     | 
| 
         @@ -78,13 +95,16 @@ when 'new' 
     | 
|
| 
       78 
95 
     | 
    
         
             
            Application initialization done.
         
     | 
| 
       79 
96 
     | 
    
         | 
| 
       80 
97 
     | 
    
         
             
            Next steps:
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
      
 98 
     | 
    
         
            +
            - \`cd #{app_name}\`
         
     | 
| 
      
 99 
     | 
    
         
            +
            - Customize Katapult's template files in lib/templates/katapult
         
     | 
| 
       82 
100 
     | 
    
         
             
            - Model your application in lib/katapult/application_model.rb and transform it
         
     | 
| 
       83 
     | 
    
         
            -
              into code by running  
     | 
| 
      
 101 
     | 
    
         
            +
              into code by running \`katapult fire\`
         
     | 
| 
      
 102 
     | 
    
         
            +
            - Run \`bundle update\` if you want to use the latest versions of all gems
         
     | 
| 
       84 
103 
     | 
    
         
             
            - Configure public/robots.txt
         
     | 
| 
       85 
104 
     | 
    
         
             
            - Write a README
         
     | 
| 
       86 
105 
     | 
    
         
             
              INSTRUCTIONS
         
     | 
| 
       87 
106 
     | 
    
         | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
       88 
108 
     | 
    
         
             
            when 'fire'
         
     | 
| 
       89 
109 
     | 
    
         
             
              app_model_path = ARGV.shift || 'lib/katapult/application_model.rb'
         
     | 
| 
       90 
110 
     | 
    
         
             
              transform_command = 'bin/rails generate katapult:transform ' + app_model_path
         
     | 
| 
         @@ -102,12 +122,18 @@ Now boot up your development server (e.g. with `rails server`) and try your 
     | 
|
| 
       102 
122 
     | 
    
         
             
            kickstarted application in the browser!
         
     | 
| 
       103 
123 
     | 
    
         
             
              INSTRUCTIONS
         
     | 
| 
       104 
124 
     | 
    
         | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            when 'templates'
         
     | 
| 
      
 127 
     | 
    
         
            +
              util.run 'bundle exec rails generate katapult:templates'
         
     | 
| 
      
 128 
     | 
    
         
            +
              util.pink 'Templates copied to lib/templates/katapult.'
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
       105 
131 
     | 
    
         
             
            when 'version'
         
     | 
| 
       106 
     | 
    
         
            -
              puts  
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
            Generating a Rails #{Katapult::RAILS_VERSION} app on Ruby #{Katapult::RUBY_VERSION}.
         
     | 
| 
       109 
     | 
    
         
            -
              VERSION
         
     | 
| 
      
 132 
     | 
    
         
            +
              puts version
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
       110 
134 
     | 
    
         | 
| 
       111 
135 
     | 
    
         
             
            else
         
     | 
| 
      
 136 
     | 
    
         
            +
              puts version
         
     | 
| 
      
 137 
     | 
    
         
            +
              puts
         
     | 
| 
       112 
138 
     | 
    
         
             
              puts usage
         
     | 
| 
       113 
139 
     | 
    
         
             
            end
         
     | 
| 
         @@ -5,50 +5,14 @@ Feature: The default application model prepared by Katapult 
     | 
|
| 
       5 
5 
     | 
    
         
             
                Given a new Rails application with Katapult basics installed
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                When I generate the application model
         
     | 
| 
       8 
     | 
    
         
            -
                Then the file "lib/katapult/application_model.rb" should contain 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
       15 
     | 
    
         
            -
                   
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  # The order of attributes is respected when generating the form for that model
         
     | 
| 
       18 
     | 
    
         
            -
                  product.attr :price, type: :money
         
     | 
| 
       19 
     | 
    
         
            -
                  product.attr :mode, assignable_values: %w[public private]
         
     | 
| 
       20 
     | 
    
         
            -
                  product.attr :provider, type: :url
         
     | 
| 
       21 
     | 
    
         
            -
                  product.attr :import_data, type: :json
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                  # Reference other models just like you called them
         
     | 
| 
       24 
     | 
    
         
            -
                  product.belongs_to 'user'
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                # Define a model
         
     | 
| 
       28 
     | 
    
         
            -
                model 'user' do |user|
         
     | 
| 
       29 
     | 
    
         
            -
                  user.attr :email # Type "email" derived from attribute name
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                  user.attr :name
         
     | 
| 
       32 
     | 
    
         
            -
                  user.attr :last_visit, type: :datetime
         
     | 
| 
       33 
     | 
    
         
            -
                  user.attr :locked, type: :flag, default: false
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                # Add a web user interface for the 'user' model
         
     | 
| 
       37 
     | 
    
         
            -
                web_ui 'user' do |web_ui|
         
     | 
| 
       38 
     | 
    
         
            -
                  # All CRUD actions: index, show, new, create, edit, update, destroy
         
     | 
| 
       39 
     | 
    
         
            -
                  web_ui.crud
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                  # Custom action
         
     | 
| 
       42 
     | 
    
         
            -
                  web_ui.action :lock, scope: :member, method: :post
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                # Have a main menu
         
     | 
| 
       46 
     | 
    
         
            -
                navigation
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                # Add authentication
         
     | 
| 
       49 
     | 
    
         
            -
                authenticate 'user', system_email: 'system@example.com'
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                """
         
     | 
| 
      
 8 
     | 
    
         
            +
                Then the file "lib/katapult/application_model.rb" should contain "crud 'product'"
         
     | 
| 
      
 9 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "product.attr :price, type: :money"
         
     | 
| 
      
 10 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "product.belongs_to 'user'"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "model 'user'"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "web_ui 'user'"
         
     | 
| 
      
 14 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "navigation"
         
     | 
| 
      
 15 
     | 
    
         
            +
                  And the file "lib/katapult/application_model.rb" should contain "authenticate 'user'"
         
     | 
| 
       52 
16 
     | 
    
         | 
| 
       53 
17 
     | 
    
         
             
                When I successfully transform the application model including migrations
         
     | 
| 
       54 
18 
     | 
    
         
             
                  And I run cucumber
         
     | 
| 
         @@ -7,10 +7,12 @@ Feature: Add authentication to an application 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
              Scenario: Authenticate with the user model
         
     | 
| 
      
 10 
     | 
    
         
            +
                # Have a custom "label attr" (:name)
         
     | 
| 
       10 
11 
     | 
    
         
             
                When I write to "lib/katapult/application_model.rb" with:
         
     | 
| 
       11 
12 
     | 
    
         
             
                  """
         
     | 
| 
       12 
     | 
    
         
            -
                   
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                  crud 'user' do |user|
         
     | 
| 
      
 14 
     | 
    
         
            +
                    user.attr :name
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
       14 
16 
     | 
    
         
             
                  authenticate 'user', system_email: 'system@example.com'
         
     | 
| 
       15 
17 
     | 
    
         
             
                  """
         
     | 
| 
       16 
18 
     | 
    
         
             
                And I successfully transform the application model including migrations
         
     | 
| 
         @@ -267,11 +269,11 @@ Feature: Add authentication to an application 
     | 
|
| 
       267 
269 
     | 
    
         | 
| 
       268 
270 
     | 
    
         | 
| 
       269 
271 
     | 
    
         
             
                    Scenario: Reset password as a signed-in user
         
     | 
| 
       270 
     | 
    
         
            -
                      Given there is a user with the email "henry@example.com"
         
     | 
| 
      
 272 
     | 
    
         
            +
                      Given there is a user with the email "henry@example.com" and the name "name-string"
         
     | 
| 
       271 
273 
     | 
    
         
             
                        And I sign in as the user above
         
     | 
| 
       272 
274 
     | 
    
         | 
| 
       273 
275 
     | 
    
         
             
                      When I go to the homepage
         
     | 
| 
       274 
     | 
    
         
            -
                        And I follow " 
     | 
| 
      
 276 
     | 
    
         
            +
                        And I follow "name-string" within the navbar
         
     | 
| 
       275 
277 
     | 
    
         
             
                      Then I should be on the form for the user above
         
     | 
| 
       276 
278 
     | 
    
         | 
| 
       277 
279 
     | 
    
         
             
                      When I fill in "Password" with "new-password"
         
     | 
| 
         @@ -351,3 +353,18 @@ Feature: Add authentication to an application 
     | 
|
| 
       351 
353 
     | 
    
         | 
| 
       352 
354 
     | 
    
         
             
                When I run cucumber
         
     | 
| 
       353 
355 
     | 
    
         
             
                Then the features should pass
         
     | 
| 
      
 356 
     | 
    
         
            +
             
     | 
| 
      
 357 
     | 
    
         
            +
             
     | 
| 
      
 358 
     | 
    
         
            +
              Scenario: Generate a model with authentication twice
         
     | 
| 
      
 359 
     | 
    
         
            +
                Given I write to "lib/katapult/application_model.rb" with:
         
     | 
| 
      
 360 
     | 
    
         
            +
                  """
         
     | 
| 
      
 361 
     | 
    
         
            +
                  crud 'user'
         
     | 
| 
      
 362 
     | 
    
         
            +
                  authenticate 'user', system_email: 'system@example.com'
         
     | 
| 
      
 363 
     | 
    
         
            +
                  """
         
     | 
| 
      
 364 
     | 
    
         
            +
             
     | 
| 
      
 365 
     | 
    
         
            +
                When I successfully transform the application model
         
     | 
| 
      
 366 
     | 
    
         
            +
                  And I successfully transform the application model, ignoring conflicts
         
     | 
| 
      
 367 
     | 
    
         
            +
                Then the file named "spec/factories/factories.rb" should contain "factory :user" exactly once
         
     | 
| 
      
 368 
     | 
    
         
            +
             
     | 
| 
      
 369 
     | 
    
         
            +
                When I run cucumber
         
     | 
| 
      
 370 
     | 
    
         
            +
                Then the features should pass
         
     | 
    
        data/features/basics.feature
    CHANGED
    
    | 
         @@ -25,6 +25,7 @@ Feature: Preparation of a new Rails app (basics generator) 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                And the configured Rails version should be listed in the Gemfile.lock
         
     | 
| 
       27 
27 
     | 
    
         
             
                And the file "Gemfile" should contain "gem 'katapult', path: '../../..'"
         
     | 
| 
      
 28 
     | 
    
         
            +
                And a file named "Gemfile.lock" should exist
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         
             
                And the file "app/controllers/application_controller.rb" should contain:
         
     | 
| 
       30 
31 
     | 
    
         
             
                """
         
     | 
| 
         @@ -63,6 +64,9 @@ Feature: Preparation of a new Rails app (basics generator) 
     | 
|
| 
       63 
64 
     | 
    
         
             
                And binstubs should be set up
         
     | 
| 
       64 
65 
     | 
    
         | 
| 
       65 
66 
     | 
    
         | 
| 
      
 67 
     | 
    
         
            +
                And the file "app/models/application_record.rb" should contain "def these"
         
     | 
| 
      
 68 
     | 
    
         
            +
                And the file "app/models/application_record.rb" should contain "def find_by_anything"
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
       66 
70 
     | 
    
         
             
                # Config
         
     | 
| 
       67 
71 
     | 
    
         
             
                And the file "config/application.rb" should contain "config.time_zone = 'Berlin'"
         
     | 
| 
       68 
72 
     | 
    
         
             
                And the file "config/application.rb" should contain "config.system_email = 'system@katapult_test_app.com'"
         
     | 
| 
         @@ -132,6 +136,7 @@ Feature: Preparation of a new Rails app (basics generator) 
     | 
|
| 
       132 
136 
     | 
    
         
             
                  require filename
         
     | 
| 
       133 
137 
     | 
    
         
             
                end
         
     | 
| 
       134 
138 
     | 
    
         
             
                """
         
     | 
| 
      
 139 
     | 
    
         
            +
                And a file "config/schedule.rb" should exist
         
     | 
| 
       135 
140 
     | 
    
         
             
                And the file "config/secrets.yml" should contain:
         
     | 
| 
       136 
141 
     | 
    
         
             
                """
         
     | 
| 
       137 
142 
     | 
    
         
             
                staging:
         
     | 
| 
         @@ -141,95 +146,17 @@ Feature: Preparation of a new Rails app (basics generator) 
     | 
|
| 
       141 
146 
     | 
    
         | 
| 
       142 
147 
     | 
    
         | 
| 
       143 
148 
     | 
    
         
             
                # Lib
         
     | 
| 
       144 
     | 
    
         
            -
                And  
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
                 
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
       149 
     | 
    
         
            -
                "" 
     | 
| 
       150 
     | 
    
         
            -
                And  
     | 
| 
       151 
     | 
    
         
            -
                """
         
     | 
| 
       152 
     | 
    
         
            -
                 
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
                """
         
     | 
| 
       156 
     | 
    
         
            -
                And the file "lib/ext/action_view/form_for_with_development_errors.rb" should contain:
         
     | 
| 
       157 
     | 
    
         
            -
                """
         
     | 
| 
       158 
     | 
    
         
            -
                if Rails.env.development?
         
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
                  ActionView::Helpers::FormHelper.module_eval do
         
     | 
| 
       161 
     | 
    
         
            -
                    def form_for_with_development_errors
         
     | 
| 
       162 
     | 
    
         
            -
                """
         
     | 
| 
       163 
     | 
    
         
            -
                And the file "lib/ext/active_record/these.rb" should contain:
         
     | 
| 
       164 
     | 
    
         
            -
                """
         
     | 
| 
       165 
     | 
    
         
            -
                ActiveRecord::Base.class_eval do
         
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
       167 
     | 
    
         
            -
                  def self.these(arg)
         
     | 
| 
       168 
     | 
    
         
            -
                    where(id: arg.collect_ids)
         
     | 
| 
       169 
     | 
    
         
            -
                  end
         
     | 
| 
       170 
     | 
    
         
            -
                """
         
     | 
| 
       171 
     | 
    
         
            -
                And the file "lib/ext/array/xss_aware_join.rb" should contain:
         
     | 
| 
       172 
     | 
    
         
            -
                """
         
     | 
| 
       173 
     | 
    
         
            -
                Array.class_eval do
         
     | 
| 
       174 
     | 
    
         
            -
                  def xss_aware_join(delimiter = '')
         
     | 
| 
       175 
     | 
    
         
            -
                    ''.html_safe.tap do |str|
         
     | 
| 
       176 
     | 
    
         
            -
                      each_with_index do |element, i|
         
     | 
| 
       177 
     | 
    
         
            -
                        str << delimiter if i > 0
         
     | 
| 
       178 
     | 
    
         
            -
                        str << element
         
     | 
| 
       179 
     | 
    
         
            -
                      end
         
     | 
| 
       180 
     | 
    
         
            -
                    end
         
     | 
| 
       181 
     | 
    
         
            -
                  end
         
     | 
| 
       182 
     | 
    
         
            -
                end
         
     | 
| 
       183 
     | 
    
         
            -
                """
         
     | 
| 
       184 
     | 
    
         
            -
                And the file "lib/ext/enumerable/natural_sort.rb" should contain:
         
     | 
| 
       185 
     | 
    
         
            -
                """
         
     | 
| 
       186 
     | 
    
         
            -
                module Enumerable
         
     | 
| 
       187 
     | 
    
         
            -
             
     | 
| 
       188 
     | 
    
         
            -
                  def natural_sort
         
     | 
| 
       189 
     | 
    
         
            -
                """
         
     | 
| 
       190 
     | 
    
         
            -
                And the file "lib/ext/hash/infinite.rb" should contain:
         
     | 
| 
       191 
     | 
    
         
            -
                """
         
     | 
| 
       192 
     | 
    
         
            -
                class Hash
         
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
       194 
     | 
    
         
            -
                  def self.infinite
         
     | 
| 
       195 
     | 
    
         
            -
                    new { |h, k| h[k] = new(&h.default_proc) }
         
     | 
| 
       196 
     | 
    
         
            -
                  end
         
     | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
       198 
     | 
    
         
            -
                end
         
     | 
| 
       199 
     | 
    
         
            -
                """
         
     | 
| 
       200 
     | 
    
         
            -
                And the file "lib/ext/string/html_entities.rb" should contain:
         
     | 
| 
       201 
     | 
    
         
            -
                """
         
     | 
| 
       202 
     | 
    
         
            -
                class String
         
     | 
| 
       203 
     | 
    
         
            -
             
     | 
| 
       204 
     | 
    
         
            -
                  def self.nbsp
         
     | 
| 
       205 
     | 
    
         
            -
                    ' '
         
     | 
| 
       206 
     | 
    
         
            -
                  end
         
     | 
| 
       207 
     | 
    
         
            -
             
     | 
| 
       208 
     | 
    
         
            -
                  def self.ndash
         
     | 
| 
       209 
     | 
    
         
            -
                    '–'
         
     | 
| 
       210 
     | 
    
         
            -
                  end
         
     | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
       212 
     | 
    
         
            -
                end
         
     | 
| 
       213 
     | 
    
         
            -
                """
         
     | 
| 
       214 
     | 
    
         
            -
                And the file "lib/ext/string/to_sort_atoms.rb" should contain:
         
     | 
| 
       215 
     | 
    
         
            -
                """
         
     | 
| 
       216 
     | 
    
         
            -
                String.class_eval do
         
     | 
| 
       217 
     | 
    
         
            -
             
     | 
| 
       218 
     | 
    
         
            -
                  def to_sort_atoms
         
     | 
| 
       219 
     | 
    
         
            -
                    SmartSortAtom.parse(self)
         
     | 
| 
       220 
     | 
    
         
            -
                  end
         
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
       222 
     | 
    
         
            -
                end
         
     | 
| 
       223 
     | 
    
         
            -
                """
         
     | 
| 
       224 
     | 
    
         
            -
                And the file "lib/tasks/pending_migrations.rake" should contain:
         
     | 
| 
       225 
     | 
    
         
            -
                """
         
     | 
| 
       226 
     | 
    
         
            -
                      pending_migrations = ActiveRecord::Migrator.new(:up, all_migrations).pending_migrations
         
     | 
| 
       227 
     | 
    
         
            -
             
     | 
| 
       228 
     | 
    
         
            -
                      if pending_migrations.any?
         
     | 
| 
       229 
     | 
    
         
            -
                        puts ''
         
     | 
| 
       230 
     | 
    
         
            -
                        puts '======================================================='
         
     | 
| 
       231 
     | 
    
         
            -
                        puts "You have #{ pending_migrations.size } pending migrations:"
         
     | 
| 
       232 
     | 
    
         
            -
                """
         
     | 
| 
      
 149 
     | 
    
         
            +
                And Katapult templates should have been copied to the application
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
                And a file "lib/ext/action_view/spec_label.rb" should exist
         
     | 
| 
      
 152 
     | 
    
         
            +
                And a file "lib/ext/action_view/form_for_with_development_errors.rb" should exist
         
     | 
| 
      
 153 
     | 
    
         
            +
                And a file "lib/ext/array/xss_aware_join.rb" should exist
         
     | 
| 
      
 154 
     | 
    
         
            +
                And a file "lib/ext/enumerable/natural_sort.rb" should exist
         
     | 
| 
      
 155 
     | 
    
         
            +
                And a file "lib/ext/hash/infinite.rb" should exist
         
     | 
| 
      
 156 
     | 
    
         
            +
                And the file "lib/ext/string/html_entities.rb" should contain "def self.nbsp"
         
     | 
| 
      
 157 
     | 
    
         
            +
                And the file "lib/ext/string/html_entities.rb" should contain "def self.ndash"
         
     | 
| 
      
 158 
     | 
    
         
            +
                And a file "lib/ext/string/to_sort_atoms.rb" should exist
         
     | 
| 
      
 159 
     | 
    
         
            +
                And a file "lib/tasks/pending_migrations.rake" should exist
         
     | 
| 
       233 
160 
     | 
    
         | 
| 
       234 
161 
     | 
    
         | 
| 
       235 
162 
     | 
    
         
             
                # Tests
         
     | 
    
        data/features/binary.feature
    CHANGED
    
    | 
         @@ -4,7 +4,17 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              Scenario: Run without arguments
         
     | 
| 
       6 
6 
     | 
    
         
             
                When I run `katapult`
         
     | 
| 
       7 
     | 
    
         
            -
                Then the output should contain 
     | 
| 
      
 7 
     | 
    
         
            +
                Then the output should contain:
         
     | 
| 
      
 8 
     | 
    
         
            +
                """
         
     | 
| 
      
 9 
     | 
    
         
            +
                Usage: katapult <command>
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                Commands:
         
     | 
| 
      
 12 
     | 
    
         
            +
                new APP_NAME    Generate a configured Rails application
         
     | 
| 
      
 13 
     | 
    
         
            +
                fire [PATH]     Transform application model into code
         
     | 
| 
      
 14 
     | 
    
         
            +
                                Default path: lib/katapult/application_model.rb
         
     | 
| 
      
 15 
     | 
    
         
            +
                templates       Copy templates to lib/templates/katapult
         
     | 
| 
      
 16 
     | 
    
         
            +
                version         Print version
         
     | 
| 
      
 17 
     | 
    
         
            +
                """
         
     | 
| 
       8 
18 
     | 
    
         | 
| 
       9 
19 
     | 
    
         | 
| 
       10 
20 
     | 
    
         
             
              Scenario: Print versions
         
     | 
| 
         @@ -13,6 +23,11 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       13 
23 
     | 
    
         
             
                  And the output should contain "Generating a Rails 5."
         
     | 
| 
       14 
24 
     | 
    
         
             
                  And the output should contain " app on Ruby 2."
         
     | 
| 
       15 
25 
     | 
    
         | 
| 
      
 26 
     | 
    
         
            +
                When I run `katapult -v`
         
     | 
| 
      
 27 
     | 
    
         
            +
                Then the output should contain "Katapult"
         
     | 
| 
      
 28 
     | 
    
         
            +
                  And the output should contain "Generating a Rails 5."
         
     | 
| 
      
 29 
     | 
    
         
            +
                  And the output should contain " app on Ruby 2."
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
       16 
31 
     | 
    
         | 
| 
       17 
32 
     | 
    
         
             
              Scenario: Missing options are asked for
         
     | 
| 
       18 
33 
     | 
    
         
             
                When I run `katapult new` interactively
         
     | 
| 
         @@ -36,6 +51,10 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       36 
51 
     | 
    
         | 
| 
       37 
52 
     | 
    
         
             
            #  @announce-output
         
     | 
| 
       38 
53 
     | 
    
         
             
              Scenario: Start new Rails application
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                This scenario is particularly prone to "Spring zombies". If it fails, make
         
     | 
| 
      
 56 
     | 
    
         
            +
                sure there are no broken Spring instances (see README).
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
       39 
58 
     | 
    
         
             
                # Rails new including yarn install + installing basics takes quite some time
         
     | 
| 
       40 
59 
     | 
    
         
             
                Given the aruba exit timeout is 90 seconds
         
     | 
| 
       41 
60 
     | 
    
         | 
| 
         @@ -45,9 +64,12 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       45 
64 
     | 
    
         
             
                  And the output should contain "Generating katapult basics"
         
     | 
| 
       46 
65 
     | 
    
         | 
| 
       47 
66 
     | 
    
         
             
                  And the output should contain "Application initialization done."
         
     | 
| 
      
 67 
     | 
    
         
            +
                  And the output should contain "cd binary_test"
         
     | 
| 
       48 
68 
     | 
    
         
             
                  And the output should contain "Model your application in lib/katapult/application_model.rb"
         
     | 
| 
       49 
69 
     | 
    
         
             
                  And the output should contain "Configure public/robots.txt"
         
     | 
| 
       50 
70 
     | 
    
         
             
                  And the output should contain "Write a README"
         
     | 
| 
      
 71 
     | 
    
         
            +
                  And the output should contain "Run `bundle update`"
         
     | 
| 
      
 72 
     | 
    
         
            +
                  And the output should contain "Customize Katapult's template files"
         
     | 
| 
       51 
73 
     | 
    
         | 
| 
       52 
74 
     | 
    
         
             
                When I cd to "binary_test"
         
     | 
| 
       53 
75 
     | 
    
         
             
                Then the file "Gemfile" should contain "gem 'katapult'"
         
     | 
| 
         @@ -97,10 +119,10 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       97 
119 
     | 
    
         
             
                """
         
     | 
| 
       98 
120 
     | 
    
         
             
                model 'custom'
         
     | 
| 
       99 
121 
     | 
    
         
             
                """
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
      
 122 
     | 
    
         
            +
                  And I run `katapult fire lib/katapult/custom_model.rb`
         
     | 
| 
       101 
123 
     | 
    
         
             
                Then the output should contain "Loading katapult"
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
                  And the output should contain "parse  lib/katapult/custom_model"
         
     | 
| 
      
 125 
     | 
    
         
            +
                  And a file named "app/models/custom.rb" should exist
         
     | 
| 
       104 
126 
     | 
    
         | 
| 
       105 
127 
     | 
    
         | 
| 
       106 
128 
     | 
    
         
             
              Scenario: When the transformation fails, an error message is printed
         
     | 
| 
         @@ -115,3 +137,14 @@ Feature: Katapult binary `katapult` 
     | 
|
| 
       115 
137 
     | 
    
         
             
                And I run `katapult fire`
         
     | 
| 
       116 
138 
     | 
    
         
             
                Then the output should not contain "Model transformation done"
         
     | 
| 
       117 
139 
     | 
    
         
             
                But the output should contain "x Something went wrong"
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
              Scenario: Copying templates to the application
         
     | 
| 
      
 143 
     | 
    
         
            +
                Given a pristine Rails application
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                When I install katapult
         
     | 
| 
      
 146 
     | 
    
         
            +
                Then a directory named "lib/templates/katapult" should not exist
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                When I run `katapult templates`
         
     | 
| 
      
 149 
     | 
    
         
            +
                Then a directory named "lib/templates/katapult" should exist
         
     | 
| 
      
 150 
     | 
    
         
            +
                  And Katapult templates should have been copied to the application
         
     | 
    
        data/features/model.feature
    CHANGED
    
    | 
         @@ -188,19 +188,21 @@ Feature: Generate Models 
     | 
|
| 
       188 
188 
     | 
    
         
             
                  """
         
     | 
| 
       189 
189 
     | 
    
         
             
                  model 'Person' do |person|
         
     | 
| 
       190 
190 
     | 
    
         
             
                    person.attr :age, type: :integer, assignable_values: 9..99
         
     | 
| 
      
 191 
     | 
    
         
            +
                    person.attr :mood, assignable_values: %w[happy pensive]
         
     | 
| 
       191 
192 
     | 
    
         
             
                    person.attr :hobby, assignable_values: %w[soccer baseball], default: 'soccer', allow_blank: true
         
     | 
| 
       192 
193 
     | 
    
         
             
                  end
         
     | 
| 
       193 
194 
     | 
    
         
             
                  """
         
     | 
| 
       194 
195 
     | 
    
         
             
                And I successfully transform the application model including migrations
         
     | 
| 
       195 
     | 
    
         
            -
                Then the file "app/models/person.rb" should contain 
     | 
| 
      
 196 
     | 
    
         
            +
                Then the file "app/models/person.rb" should contain:
         
     | 
| 
       196 
197 
     | 
    
         
             
                  """
         
     | 
| 
       197 
     | 
    
         
            -
                  class Person < ApplicationRecord
         
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
             
     | 
| 
       200 
198 
     | 
    
         
             
                    assignable_values_for :age, {} do
         
     | 
| 
       201 
199 
     | 
    
         
             
                      9..99
         
     | 
| 
       202 
200 
     | 
    
         
             
                    end
         
     | 
| 
       203 
201 
     | 
    
         | 
| 
      
 202 
     | 
    
         
            +
                    assignable_values_for :mood, {} do
         
     | 
| 
      
 203 
     | 
    
         
            +
                      ["happy", "pensive"]
         
     | 
| 
      
 204 
     | 
    
         
            +
                    end
         
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
       204 
206 
     | 
    
         
             
                    assignable_values_for :hobby, {:allow_blank=>true, :default=>"soccer"} do
         
     | 
| 
       205 
207 
     | 
    
         
             
                      ["soccer", "baseball"]
         
     | 
| 
       206 
208 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -208,26 +210,19 @@ Feature: Generate Models 
     | 
|
| 
       208 
210 
     | 
    
         
             
                    def to_s
         
     | 
| 
       209 
211 
     | 
    
         
             
                      age.to_s
         
     | 
| 
       210 
212 
     | 
    
         
             
                    end
         
     | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
       212 
     | 
    
         
            -
                  end
         
     | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
       214 
213 
     | 
    
         
             
                  """
         
     | 
| 
       215 
     | 
    
         
            -
                And the file "spec/models/person_spec.rb" should contain 
     | 
| 
      
 214 
     | 
    
         
            +
                And the file "spec/models/person_spec.rb" should contain:
         
     | 
| 
       216 
215 
     | 
    
         
             
                  """
         
     | 
| 
       217 
     | 
    
         
            -
                  describe Person do
         
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
       219 
     | 
    
         
            -
                    describe '#to_s' do
         
     | 
| 
       220 
     | 
    
         
            -
                      it 'returns the #age attribute' do
         
     | 
| 
       221 
     | 
    
         
            -
                        subject.age = 9
         
     | 
| 
       222 
     | 
    
         
            -
                        expect(subject.to_s).to eq("9")
         
     | 
| 
       223 
     | 
    
         
            -
                      end
         
     | 
| 
       224 
     | 
    
         
            -
                    end
         
     | 
| 
       225 
     | 
    
         
            -
             
     | 
| 
       226 
216 
     | 
    
         
             
                    describe '#age' do
         
     | 
| 
       227 
217 
     | 
    
         
             
                      it { is_expected.to allow_value(99).for(:age) }
         
     | 
| 
       228 
218 
     | 
    
         
             
                      it { is_expected.to_not allow_value(100).for(:age) }
         
     | 
| 
       229 
219 
     | 
    
         
             
                    end
         
     | 
| 
       230 
220 
     | 
    
         | 
| 
      
 221 
     | 
    
         
            +
                    describe '#mood' do
         
     | 
| 
      
 222 
     | 
    
         
            +
                      it { is_expected.to allow_value("pensive").for(:mood) }
         
     | 
| 
      
 223 
     | 
    
         
            +
                      it { is_expected.to_not allow_value("pensive-unassignable").for(:mood) }
         
     | 
| 
      
 224 
     | 
    
         
            +
                    end
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
       231 
226 
     | 
    
         
             
                    describe '#hobby' do
         
     | 
| 
       232 
227 
     | 
    
         
             
                      it { is_expected.to allow_value("baseball").for(:hobby) }
         
     | 
| 
       233 
228 
     | 
    
         
             
                      it { is_expected.to_not allow_value("baseball-unassignable").for(:hobby) }
         
     | 
| 
         @@ -236,23 +231,41 @@ Feature: Generate Models 
     | 
|
| 
       236 
231 
     | 
    
         
             
                        expect(subject.hobby).to eq("soccer")
         
     | 
| 
       237 
232 
     | 
    
         
             
                      end
         
     | 
| 
       238 
233 
     | 
    
         
             
                    end
         
     | 
| 
      
 234 
     | 
    
         
            +
                  """
         
     | 
| 
      
 235 
     | 
    
         
            +
                  And the file "spec/factories/factories.rb" should contain:
         
     | 
| 
      
 236 
     | 
    
         
            +
                  """
         
     | 
| 
      
 237 
     | 
    
         
            +
                    factory :person do
         
     | 
| 
      
 238 
     | 
    
         
            +
                      age 9
         
     | 
| 
      
 239 
     | 
    
         
            +
                      mood "happy"
         
     | 
| 
      
 240 
     | 
    
         
            +
                    end
         
     | 
| 
      
 241 
     | 
    
         
            +
                  """
         
     | 
| 
       239 
242 
     | 
    
         | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
      
 243 
     | 
    
         
            +
                When I write to "spec/models/factory_spec.rb" with:
         
     | 
| 
       242 
244 
     | 
    
         
             
                  """
         
     | 
| 
      
 245 
     | 
    
         
            +
                  describe Person do
         
     | 
| 
       243 
246 
     | 
    
         | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
      
 247 
     | 
    
         
            +
                    describe 'person factory' do
         
     | 
| 
      
 248 
     | 
    
         
            +
                      subject { create :person }
         
     | 
| 
      
 249 
     | 
    
         
            +
             
     | 
| 
      
 250 
     | 
    
         
            +
                      it 'generates a valid record' do
         
     | 
| 
      
 251 
     | 
    
         
            +
                        expect(subject).to be_valid
         
     | 
| 
      
 252 
     | 
    
         
            +
                      end
         
     | 
| 
      
 253 
     | 
    
         
            +
                    end
         
     | 
| 
      
 254 
     | 
    
         
            +
             
     | 
| 
      
 255 
     | 
    
         
            +
                  end
         
     | 
| 
      
 256 
     | 
    
         
            +
                  """
         
     | 
| 
      
 257 
     | 
    
         
            +
                  And I run rspec
         
     | 
| 
       245 
258 
     | 
    
         
             
                Then the specs should pass
         
     | 
| 
       246 
259 
     | 
    
         | 
| 
       247 
260 
     | 
    
         | 
| 
       248 
261 
     | 
    
         
             
              Scenario: Transform the application model multiple times
         
     | 
| 
       249 
262 
     | 
    
         | 
| 
       250 
     | 
    
         
            -
                 
     | 
| 
      
 263 
     | 
    
         
            +
                Some generators inject code snippets into files. They should not do this
         
     | 
| 
      
 264 
     | 
    
         
            +
                if their snippet is already present.
         
     | 
| 
       251 
265 
     | 
    
         | 
| 
       252 
266 
     | 
    
         
             
                When I write to "lib/katapult/application_model.rb" with:
         
     | 
| 
       253 
267 
     | 
    
         
             
                  """
         
     | 
| 
       254 
     | 
    
         
            -
                   
     | 
| 
       255 
     | 
    
         
            -
                  web_ui 'Car', &:crud
         
     | 
| 
      
 268 
     | 
    
         
            +
                  crud('Car') { |c| c.attr :model }
         
     | 
| 
       256 
269 
     | 
    
         
             
                  """
         
     | 
| 
       257 
270 
     | 
    
         
             
                  And I successfully transform the application model
         
     | 
| 
       258 
271 
     | 
    
         
             
                Then the file named "config/routes.rb" should contain:
         
     | 
| 
         @@ -261,7 +274,8 @@ Feature: Generate Models 
     | 
|
| 
       261 
274 
     | 
    
         
             
                    root 'cars#index'
         
     | 
| 
       262 
275 
     | 
    
         
             
                    resources :cars
         
     | 
| 
       263 
276 
     | 
    
         
             
                  """
         
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
      
 277 
     | 
    
         
            +
             
     | 
| 
      
 278 
     | 
    
         
            +
                When I successfully transform the application model
         
     | 
| 
       265 
279 
     | 
    
         
             
                Then the file named "config/routes.rb" should contain:
         
     | 
| 
       266 
280 
     | 
    
         
             
                  """
         
     | 
| 
       267 
281 
     | 
    
         
             
                  Rails.application.routes.draw do
         
     | 
| 
         @@ -271,3 +285,5 @@ Feature: Generate Models 
     | 
|
| 
       271 
285 
     | 
    
         
             
                  And the file named "config/routes.rb" should contain "root 'cars#index'" exactly once
         
     | 
| 
       272 
286 
     | 
    
         
             
                  And the file named "config/routes.rb" should contain "resources :cars" exactly once
         
     | 
| 
       273 
287 
     | 
    
         
             
                  And the output should contain "Routes for :cars already exist! Not updated."
         
     | 
| 
      
 288 
     | 
    
         
            +
             
     | 
| 
      
 289 
     | 
    
         
            +
                  And the file named "spec/factories/factories.rb" should contain "factory :car" exactly once
         
     |