katapult 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +34 -12
  4. data/README.md +154 -114
  5. data/Rakefile +3 -3
  6. data/bin/katapult +34 -8
  7. data/features/application_model.feature +8 -44
  8. data/features/authenticate.feature +21 -4
  9. data/features/basics.feature +16 -89
  10. data/features/binary.feature +37 -4
  11. data/features/model.feature +40 -24
  12. data/features/navigation.feature +2 -0
  13. data/features/step_definitions/katapult_steps.rb +48 -16
  14. data/features/step_definitions/test_steps.rb +2 -0
  15. data/features/templates.feature +74 -0
  16. data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +2 -2
  17. data/lib/generators/katapult/basics/basics_generator.rb +12 -1
  18. data/lib/generators/katapult/basics/templates/Capfile +5 -0
  19. data/lib/generators/katapult/basics/templates/Gemfile +3 -1
  20. data/lib/generators/katapult/basics/templates/Gemfile.lock +376 -0
  21. data/lib/generators/katapult/basics/templates/app/models/application_record.rb +28 -0
  22. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/bootstrap.js +2 -2
  23. data/lib/generators/katapult/basics/templates/config/deploy.rb +2 -3
  24. data/lib/generators/katapult/basics/templates/config/deploy/production.rb +2 -2
  25. data/lib/generators/katapult/basics/templates/config/deploy/staging.rb +1 -1
  26. data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/deploy.rake +1 -4
  27. data/lib/generators/katapult/clearance/clearance_generator.rb +13 -4
  28. data/lib/generators/katapult/clearance/templates/features/authentication.feature +3 -3
  29. data/lib/generators/katapult/model/model_generator.rb +14 -4
  30. data/lib/generators/katapult/templates/templates_generator.rb +35 -0
  31. data/lib/generators/katapult/transform/transform_generator.rb +3 -3
  32. data/lib/generators/katapult/views/views_generator.rb +1 -1
  33. data/lib/generators/katapult/web_ui/web_ui_generator.rb +1 -1
  34. data/lib/katapult/application_model.rb +7 -7
  35. data/lib/katapult/elements/attribute.rb +16 -0
  36. data/lib/katapult/elements/authentication.rb +9 -6
  37. data/lib/katapult/elements/model.rb +8 -4
  38. data/lib/katapult/elements/navigation.rb +2 -2
  39. data/lib/katapult/elements/web_ui.rb +2 -2
  40. data/lib/katapult/generator.rb +12 -2
  41. data/lib/katapult/support/generator_goodies.rb +14 -0
  42. data/lib/katapult/version.rb +1 -1
  43. data/script/update +5 -1
  44. metadata +8 -8
  45. data/features/configuration.feature +0 -24
  46. data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/passenger.rake +0 -8
  47. data/lib/generators/katapult/basics/templates/lib/ext/active_record/find_by_anything.rb +0 -20
  48. data/lib/generators/katapult/basics/templates/lib/ext/active_record/these.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e300dbf1f253287be637c885c6d9c42ee23272c4e1259c1608194c744433c6d
4
- data.tar.gz: 92e3a0218852ab314dee4de60e3e753140795031310eaa2bc90700a2b5113666
3
+ metadata.gz: da5e56a99ddf91445aed9d85f07c27e0fba63090536dcc13724b73be1d64c0fb
4
+ data.tar.gz: dc2a5956825e7624c9c6942a3b94cfcc028370e553ca14178847a6d87f22f625
5
5
  SHA512:
6
- metadata.gz: 99f96cfcd585edc21231c1d3c0d2778bbc2def2f60facdb4ffdf56f64d8498ee34eb3b6c6f751a00768a1bdc0fc690bbca3a871cf373c499c53e4a21d968171d
7
- data.tar.gz: 48655800af8a0439cc7738c6e455e03589e6d071fe25177b652b342fdea0ce1268e1c9f88974fa21f284f64961985d8706e6888c8438740e277e27bf85a20456
6
+ metadata.gz: 24ae3501b48b18939d4fe22f4236976bf249a5af74878933bcbc5385c8fe10e0032258205fca340a8d2a1a01387bdf232ab458003facc5948e5ceab19d6f1baa
7
+ data.tar.gz: 3802474a2ae1a8818b076d2aa3109b91de0c871ff728086baf0ad6a82af07a4ff75ab6399c60888abcd5e61412f978dccde60c8fed72614cea3fd8941a0529cd
data/.gitignore CHANGED
@@ -4,6 +4,7 @@
4
4
  .config
5
5
  .yardoc
6
6
  Gemfile.lock
7
+ !lib/generators/katapult/basics/templates/Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
9
10
  coverage
data/CHANGELOG.md CHANGED
@@ -1,30 +1,52 @@
1
1
  # Changelog
2
2
 
3
- ## 0.4.0 on 2018-01-15
3
+ All notable changes to this project will be documented in this file. Changes are
4
+ segmented into: New Features / Improvements.
4
5
 
5
- ### Features
6
+ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
+
8
+
9
+ ## 0.5.0
10
+
11
+ ### New Features
12
+ - Deployment ready for Opscomplete
13
+ - Copying view and controller templates over to target application via new
14
+ command `katapult template` or generator `katapult:templates`.
15
+
16
+ ### Improvements
17
+ - Generating a fixed Gemfile.lock. Run `bundle update` after code generation to
18
+ update all gems to recent versions.
19
+ - Better deployment with Webpack
20
+ - Navigation only rendered if requested
21
+ - "Usage" section in README rewritten
22
+ - Some minor fixes
23
+
24
+ ## 0.4.1 - 2018-02-16
25
+
26
+ ### Improvements
27
+ - Changed CHANGELOG to satisfy [How to write a good changelog](https://makandracards.com/makandra/54223-how-to-write-a-good-changelog) format
28
+ - Minor fixes and improvements
29
+
30
+ ## 0.4.0 - 2018-01-15
31
+
32
+ ### New Features
6
33
  - Support for has_many/belongs_to associations
7
34
  - Create a project README
8
35
  - New CHANGELOG
9
-
10
- ### Fixes
11
36
  - Models now inherit from `ApplicationRecord`
12
37
 
38
+ ## 0.3.0 2018-01-11
13
39
 
14
- ## 0.3.0 on 2018-01-11
15
-
16
- ### Features
40
+ ### New Features
17
41
  - Generating a Rails 5.1.4 app on Ruby 2.5.0
18
42
  - Dropped asset pipeline in favor of Webpacker
19
- - The generated application now has a sleek, simple design based on Bootstrap
20
43
  - Employing [Unpoly](https://unpoly.com)
21
44
  - New DSL command `crud` for creating Model plus WebUI
22
45
  - The generated application model is now a transformable example of katapult's features
23
-
24
- ### Development improvements
46
+ - The generated application now has a sleek, simple design based on Bootstrap
25
47
  - Add katapult update script
48
+
49
+ ### Improvements
26
50
  - Speed up tests (now running in about 9 min)
27
51
  - Improve development workflow (see README)
28
52
  - No bundler issues in tests any more
29
-
30
- See [all changes](https://github.com/makandra/katapult/compare/v0.2.0...v0.3.0).
data/README.md CHANGED
@@ -1,100 +1,132 @@
1
- # Katapult
1
+ # Katapult 0.4.1
2
+ Generating a Rails 5.1.4 app on Ruby 2.5.0.
2
3
 
3
4
  <img src="katapult.png" width="200px" align="right" />
4
5
 
5
6
 
6
- `Katapult` is a kickstart generator for Rails applications. It creates new Rails
7
- applications with [lots of pre-configuration](https://github.com/makandra/katapult/blob/master/lib/generators/katapult/basics/basics_generator.rb)
7
+ Katapult is a kickstart generator for Rails. It prepares a new
8
+ application with [lots of pre-configuration](https://github.com/makandra/katapult/blob/master/lib/generators/katapult/basics/basics_generator.rb)
8
9
  and offers [makandra-flavored](https://leanpub.com/growing-rails) code
9
- generation from an application model. These two features significally speed up
10
- the initial phase of a Rails project by doing in minutes what otherwise would
11
- cost you weeks.
12
- After modeling your application, which typically takes about an hour, you can
13
- instantly start implementing the meat of your application.
14
-
15
- `Katapult` only supports a single Ruby and Rails version, currently it's Rails
16
- 5.1.4 and Ruby 2.5.0.
10
+ generation from an application model. This significantly speeds up the initial
11
+ phase of Rails development by doing in minutes what would cost you weeks. When
12
+ Katapult has finished, you can instantly start implementing the interesting
13
+ parts of your application.
17
14
 
18
15
 
19
16
  ## Prerequisites
20
17
 
21
18
  Katapult uses *PostgreSQL* as database, so you'll need to install that upfront.
22
- Also, it drops the asset pipeline in favor of *Webpacker*, so you'll need Node
23
- and Yarn (see <https://makandracards.com/makandra/47477>).
19
+ Also, it drops the Rails asset pipeline in favor of *Webpacker*, so you'll need
20
+ *Node* and *Yarn* (see <https://makandracards.com/makandra/47477>).
24
21
 
25
- Also, it requires the *Bundler* and *Rake* Ruby gems, which are probably already
26
- installed on your system.
22
+ The required *Ruby* version is 2.5.0. You'll need the *Bundler* and *Rake* gems,
23
+ which are probably already installed on your system.
27
24
 
25
+ When you're using the `katapult` binary (you should), you'll also need *Git*.
28
26
 
29
- ## Installation
30
27
 
31
- Install the `katapult` gem with
28
+ ## Installation
32
29
 
33
30
  gem install katapult
34
31
 
35
- If you intend to extend an existing application, add it to the development group
36
- in your Gemfile.
37
-
38
32
 
39
33
  ## Usage
40
34
 
41
- `katapult` does two distinct things for you:
35
+ There are two usage scenarios for Katapult:
42
36
 
43
- 1. It creates a new Rails application, set up with many standard gems, snippets,
44
- useful configuration, databases, testing libraries etc.
45
- 2. It generates code from an application model, i.e. it creates models and
46
- views, controllers, styles etc.
37
+ 1. Starting a fresh Rails application
38
+ 2. Extending an existing Rails application
47
39
 
48
- You may use both or only one of them. Read on for details.
40
+ Choose your use case and read on below.
49
41
 
50
42
 
51
- ## 1) Creating a new Rails application
43
+ ## Starting a fresh Rails application
52
44
 
53
- Run the following command:
45
+ To create a new Rails application with Katapult, run the following command:
54
46
 
55
47
  katapult new $APPLICATION_NAME
56
48
 
57
- This will create a new Rails application and prepare it in more than 20 steps.
58
- Read the [BasicsGenerator](https://github.com/makandra/katapult/blob/master/lib/generators/katapult/basics/basics_generator.rb)
59
- for details: Its methods are executed one-by-one, while the method names are a
60
- description of what they do.
49
+ This will create a new Rails application, prepared and configured: bundled,
50
+ database set up, RSpec, Cucumber and Capistrano installed and much more.
51
+ Please read the [BasicsGenerator](https://github.com/makandra/katapult/blob/master/lib/generators/katapult/basics/basics_generator.rb)
52
+ for details (its methods are executed one-by-one from top to bottom).
53
+
54
+ When Katapult is done, you will find a default application model in
55
+ `lib/katapult/application_model.rb`. It contains a full example of Katapult's
56
+ DSL that you can use as an inspiration for creating your own application model.
57
+
58
+ Next, check the templates in `lib/templates/katapult`. They will be used
59
+ to generate the corresponding files, e.g. HAML views. Please modify the templates
60
+ to match your requirements. (Actually, you can customize much more templates.
61
+ Each template in Katapult's `lib/generators/katapult/<generator>/templates/` can
62
+ be overridden with a file at `lib/templates/katapult/<generator>/` in your
63
+ application.)
64
+
65
+ When your application model and the templates are ready, let Katapult generate
66
+ your code:
67
+
68
+ katapult fire
69
+
70
+ This will create models, migrations, views, styles, controllers, routes,
71
+ Cucumber features, specs, factories and more. It will also commit the results
72
+ and migrate the database.
73
+
74
+ When this is done, your application is ready to use! Start a development
75
+ server and try it out.
76
+
77
+
78
+ ## Extending an existing Rails application
61
79
 
62
- ### Alternative: Using Katapult in an existing Rails application
63
- `katapult` expects a fresh application (which it would usually generate itself).
64
- If you have an existing Rails application, you *may* use `katapult`, but be
65
- warned: it is not designed to respect existing files, although it will usually
66
- ask before overwriting something.
80
+ You can use Katapult for code generation in an existing application as well.
67
81
 
68
- After adding it to the Gemfile, run the basics generator manually:
82
+ First, add Katapult to the development group in your Gemfile:
83
+ ```
84
+ gem 'katapult'
85
+ ```
69
86
 
70
- bin/rails generate katapult:basics
87
+ Next, generate the default application model:
71
88
 
89
+ ```
90
+ bundle exec rails generate katapult:app_model
91
+ ```
72
92
 
73
- ## 2) Generating code from an application model
93
+ You'll find the application model at `lib/katapult/application_model.rb`. It
94
+ contains a full example of Katapult's features: Use it as an inspiration for
95
+ modeling your own application. (When you're used to the application model DSL,
96
+ you don't need to generate the default model. Just create a Ruby file and start
97
+ modeling.)
74
98
 
75
- After running `katapult new`, you will find a default application model in
76
- `lib/katapult/application_model.rb`. It contains a full example of `katapult`'s
77
- features that you should replace with _your_ application model.
99
+ Next, copy Katapult's template files to your application:
78
100
 
79
- When you are done, transform the model using:
101
+ ```
102
+ katapult templates
103
+ ```
80
104
 
81
- katapult fire [path/to/application_model]
105
+ This will copy some of Katapult's file templates to `lib/templates/katapult`.
106
+ Modify them, especially the view templates, to match the current state of your
107
+ application. You can customize even more templates, see the "Starting …" section
108
+ above.
82
109
 
83
- The path is optional and only needs to be specified when you've renamed the
84
- application model file. Note that you may well use separate model files for
85
- separate runs.
110
+ When model and templates are ready, trigger code generation with:
86
111
 
87
- See an overview of the DSL below. The respective sections hold examples of what
88
- options are available to each element. For details, dive into
89
- `lib/generators/katapult` where all generators are stored. The method names
90
- of a generator tell what it does.
112
+ ```
113
+ katapult fire path/to/your_model.rb
114
+ ```
91
115
 
92
- ### Generic DSL syntax example
93
- The DSL consists of _elements_, e.g. `Model` or `WebUI`. Each `katapult` element
94
- has the following syntax, taking a name, options, and a block:
95
116
 
96
- element_type 'name', options: 'example' do |element|
97
- element.some_method
117
+ ## DSL reference
118
+
119
+ Below you find an overview of the application model DSL. The respective sections
120
+ hold examples of what options are available to each element. For details, dive
121
+ into the respective generator at `lib/generators/katapult/*/*_generator.rb`. The
122
+ method names of a generator tell what it does.
123
+
124
+ ### Crud
125
+ Shortcut for creating a model together with a WebUI with CRUD actions. The block
126
+ is passed the model instance.
127
+
128
+ crud 'Customer' do |customer|
129
+ # customer.attr :name
98
130
  end
99
131
 
100
132
 
@@ -115,7 +147,7 @@ needed.
115
147
  # Default type :string
116
148
  model.attr :name
117
149
 
118
- # Inferred type :email (when attr name matches /email/)
150
+ # Inferred type :email (attribute name matches /email/)
119
151
  model.attr :email
120
152
 
121
153
  # Inferred type :password. Password fields are rendered as password_field in
@@ -139,9 +171,9 @@ needed.
139
171
  model.attr :avoid, type: :plain_json # PostgreSQL "json"
140
172
 
141
173
 
142
- ### Association
143
- Defined on Model; takes the name of another model just like you called it in the
144
- model. Adds a foreign key attribute to the model and `belongs_to`/`has_many`
174
+ #### Association
175
+ Defined on Model; takes the name of another model (just as you called it in the
176
+ application model). Adds a foreign key attribute to the model and `belongs_to`/`has_many`
145
177
  calls to the respective models.
146
178
 
147
179
  model 'Customer' do |customer|
@@ -157,7 +189,6 @@ passing Cucumber feature.
157
189
 
158
190
  web_ui 'Customer', model: 'User' do |web_ui|
159
191
  web_ui.crud # Create all the standard rails actions
160
-
161
192
  # web_ui.action :custom etc, see Action element
162
193
  end
163
194
 
@@ -180,13 +211,6 @@ and a route as needed.
180
211
  web_ui.action :custom_action, method: :post, scope: :member
181
212
  web_ui.action :other_action, method: :get, scope: :collection
182
213
 
183
- ### Crud
184
- Shortcut for creating a model together with a WebUI with CRUD actions.
185
-
186
- crud 'Customer' do |customer|
187
- customer.attr :name
188
- end
189
-
190
214
 
191
215
  ### Navigation
192
216
  Generates a main menu with links to the index pages of all WebUIs.
@@ -206,65 +230,78 @@ Rails, including Clearance mails like password reset requests.
206
230
 
207
231
  ## Development
208
232
 
209
- ### Getting started + continuing development
233
+ ### Getting started
210
234
  `Katapult` is tested with [RSpec](http://rspec.info/) and
211
235
  [Cucumber](https://cucumber.io/) + [Aruba](https://github.com/cucumber/aruba)
212
- ([API-Doc](http://www.rubydoc.info/github/cucumber/aruba/master/)).
236
+ ([API documentation](http://www.rubydoc.info/github/cucumber/aruba/master/)).
213
237
 
214
- For its full-stack integration tests, `katapult` requires a PostgreSQL account.
238
+ For its full-stack integration tests, Katapult requires a PostgreSQL account.
215
239
  Create a dedicated account on your local PostgreSQL server:
216
240
 
217
241
  $> sudo -u postgres psql
218
242
  postgres=# CREATE ROLE katapult WITH createdb LOGIN;
219
243
 
220
- Whenever you start working on `katapult`, you should run `script/update`, which
244
+
245
+ ### Continuing Development
246
+ Whenever you start working on Katapult, you should run `script/update`, which
221
247
  will guide you through a quick update process.
222
248
 
223
249
  ### Architecture
224
- `katapult` is roughly split into three parts: the `katapult` binary in bin/,
250
+ Katapult's code is roughly split into three parts: the `katapult` binary in bin/,
225
251
  the model in lib/katapult/ and the generators in lib/generators. Also, there
226
- is a script/ directory that holds some scripts to ease development. It is not
227
- part of the `katapult` gem, however.
228
-
229
- The generators of `katapult` base on the `rails/generators` you probably know
230
- from generating migration files or scaffolds; however, it lifts their usage on a
231
- new level by invoking generators programmatically with a "model object". Instead
232
- of plain text input, the `katapult` generators can explore the whole application
233
- model. They are all to be run from within a Rails application.
234
-
235
- There are three base generators that can be considered the next-lower level API
236
- of `katapult`:
237
-
238
- - `basics` generator: Enhances a pristine Rails app with all of the basic
239
- configuration `katapult` brings.
240
- - `app_model` generator: Installs a boilerplate application model that serves as
241
- a starting point for modeling your own application.
242
- - `transform` generator: Parses the application model into an internal
252
+ is a script/ directory that holds some scripts to simplify development. It is not
253
+ included in the `katapult` gem.
254
+
255
+ The generators of Katapult extend the `rails/generators` you probably know
256
+ from generating migration files or scaffolds. However, Katapult lifts them on a
257
+ higher level by passing them a model object instead
258
+ of plain text arguments. This way, the Katapult generators can explore the whole
259
+ application model and are not restricted to a few strings they've been given.
260
+
261
+ There are a few "public" Rails generators. They can be considered the next API
262
+ level after the `katapult` binary:
263
+
264
+ - `katapult:basics`: Enhances a pristine Rails app with all of the
265
+ basic configuration.
266
+ - `katapult:app_model`: Installs a boilerplate application model that
267
+ serves as a starting point for modeling an application.
268
+ - `katapult:templates`: Copies some generator templates to the target
269
+ application.
270
+ - `katapult:transform`: Parses the application model into an internal
243
271
  representation, which will be turned into code by all the other generators.
244
272
 
245
- Note that the `katapult` binary is the only Rails-independent part of Katapult;
246
- everything else runs in the context of the Rails appplication.
273
+ Note that the `katapult` binary is the only Rails-independent part of Katapult.
274
+ Everything else runs in the context of the Rails application.
247
275
 
248
276
  ### Suggested workflow
249
- When adding a feature to `katapult`, it will usually take you some time to
277
+ When adding a feature to Katapult, it will usually take you some time to
250
278
  figure out how exactly the generated code should look like. You'll be switching
251
- between `katapult`'s tests, its generators and the generated code.
279
+ between Katapult's tests, its generators and the generated code.
252
280
 
253
- Here's a the suggested process:
281
+ Here's a process for building larger code generation features:
254
282
 
255
- 1) Run a scenario (create one if needed)
256
- 2) Tag that scenario with @no-clobber. This will leave the generated test app
257
- untouched in subsequent test runs.
283
+ 1) **Start with a test:** Create a Cucumber scenario that creates and transforms
284
+ an application model. Also, write a first draft of the code that generates
285
+ what you expect.
286
+ 2) Run your scenario. This will transform your test application model.
258
287
  3) Make a commit inside the generated test application, so you'll have a clean
259
288
  working directory: `script/kta git add --all && script/kta git commit -m 'x'`
260
- 4) Modify the test app as needed. Boot a development server with
261
- `script/kta rails s` if you like.
262
- 5) Re-run the @no-clobber scenario (modify it as needed) until test and test app
263
- meet the expectations.
264
- 6) Now look at the git diff in the test app and model everything with katapult's
265
- generators.
266
- 7) Remove the @no-clobber tag and run the scenario normally to see if it's still
267
- green. Remember to stop the development server first.
289
+ 4) **Modify the generated code** inside the generated test application until it
290
+ meets your expectations. If you like, boot a development server with
291
+ `script/kta rails s`.
292
+ 5) **Finish your test:** Once you've figured how the generated code should look
293
+ like, it's time to write steps that test it. For this purpose, tag your
294
+ scenario with @no-clobber and comment out the model transformation step. This
295
+ will leave the generated test app untouched in subsequent test runs, so you
296
+ will be able to run your scenario repeatedly, without losing what you've
297
+ built, until you have covered every change. Use `git diff` in the test app to
298
+ see your changes.
299
+ 6) **Write code:** When you've completed your scenario, write the code that
300
+ generates what is needed to satisfy the test.
301
+ 7) Remove the @no-clobber tag and uncomment the transformation step. Stop the
302
+ development server if you've started one.
303
+ 8) Run your scenario normally and iterate over your code generation code until
304
+ your scenario is green.
268
305
 
269
306
  ### Guidelines
270
307
  Please respect the following guidelines during development:
@@ -272,21 +309,24 @@ Please respect the following guidelines during development:
272
309
  - The application model should be order-agnostic. There is a #prepare_render
273
310
  method in `ApplicationModel` for things that need to happen between parsing
274
311
  and rendering the application model.
312
+ - Transformation should be idempotent: it should be possible to generate the
313
+ application model over and over again without crashing or breaking things.
275
314
 
276
315
  ### Debugging
277
- Add the `@announce-output` tag to `katapult` features in order to have any output
316
+ Add the `@announce-output` tag to Katapult scenarios in order to have output
278
317
  logged to your terminal. Note that each step will print all output to date, so
279
318
  you will see things multiple times.
280
319
 
281
320
  To precisely debug errors occurring _inside_ the generated application, use
282
- `script/kta`. You could also just cd to the test app directory, but since it is
283
- destroyed between test runs, you'd need to `cd ../../aruba/katapult_test_app`
284
- after each test.
321
+ `script/kta`. It is a helper script that will execute whatever command you pass
322
+ it, but in the directory of the generated application. While you could cd to the
323
+ test app and run your command there, you'd need to `cd ../../aruba/katapult_test_app`
324
+ between test runs, because the tmp/aruba directory gets wiped before each test.
285
325
 
286
326
  When fixing issues in the generated app, make a commit in the app first. When
287
327
  you've fixed it, the diff will show you what you need to port back to katapult.
288
328
 
289
- ### Typical issues
329
+ #### Typical issues
290
330
  Be sure to check this list when you encounter strange issues during development.
291
331
 
292
332
  - Spring was running in a directory that does not exist any more. This will
@@ -295,10 +335,10 @@ Be sure to check this list when you encounter strange issues during development.
295
335
  - An outdated Rails application in `tmp/cached_*`
296
336
  - Timeout error because of a script waiting for user input
297
337
 
298
- ### Fast tests
338
+ #### Fast tests
299
339
  Generating basics and transforming the application model take quite some time
300
340
  (about 20s), because it boots the Rails application, resolves Yarn dependencies
301
- and migrates databases. To speed that up, `katapult` tests cache prepared Rails
341
+ and migrates databases. To speed that up, Katapult tests cache prepared Rails
302
342
  applications in tmp/.
303
343
 
304
344
  When debugging test suite speed, `bundle exec cucumber --format usage` is your