katapult 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +121 -30
- data/bin/katapult +59 -21
- data/features/binary.feature +29 -16
- data/features/katapult.feature +91 -21
- data/features/model.feature +46 -2
- data/features/step_definitions/file_steps.rb +13 -2
- data/features/step_definitions/katapult_steps.rb +9 -3
- data/features/step_definitions/rails_steps.rb +5 -4
- data/features/step_definitions/test_steps.rb +8 -4
- data/features/support/env.rb +6 -4
- data/features/wui.feature +16 -1
- data/katapult.gemspec +3 -3
- data/lib/generators/katapult/basics/basics_generator.rb +51 -26
- data/lib/generators/katapult/basics/templates/.gitignore +27 -0
- data/lib/generators/katapult/basics/templates/Gemfile +3 -2
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/{_all.css.sass → _all.sass} +0 -0
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/{_items.css.sass → _items.sass} +0 -0
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/{_layout.css.sass → _layout.sass} +0 -0
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/{_navigation.css.sass → _navigation.sass} +0 -0
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/{_tools.css.sass → _tools.sass} +0 -0
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/{application.css.sass → application.sass} +0 -0
- data/lib/generators/katapult/basics/templates/config/cucumber.yml +10 -0
- data/lib/generators/katapult/basics/templates/config/database.sample.yml +1 -4
- data/lib/generators/katapult/basics/templates/config/database.yml +2 -2
- data/lib/generators/katapult/basics/templates/config/initializers/exception_notification.rb.tt +16 -0
- data/lib/generators/katapult/basics/templates/config/initializers/find_by_anything.rb +19 -0
- data/lib/generators/katapult/basics/templates/config/initializers/form_for_with_development_errors.rb +45 -0
- data/lib/generators/katapult/basics/templates/features/support/capybara_screenshot.rb +4 -0
- data/lib/generators/katapult/basics/templates/features/support/cucumber_factory.rb +1 -0
- data/lib/generators/katapult/basics/templates/features/support/database_cleaner.rb +3 -0
- data/lib/generators/katapult/basics/templates/features/support/selectors.rb +56 -0
- data/lib/generators/katapult/basics/templates/spec/support/shoulda_matchers.rb +8 -0
- data/lib/generators/katapult/haml/templates/app/views/layouts/application.html.haml +2 -0
- data/lib/generators/katapult/transform/transform_generator.rb +13 -18
- data/lib/generators/katapult/w_u_i/w_u_i_generator.rb +14 -1
- data/lib/katapult/version.rb +1 -1
- metadata +28 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83b5fc8065a8a49c75139d70ffd14b8bd9f46153
|
4
|
+
data.tar.gz: da1546065c4be23023e74749f5ab80ce217f4a58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce71cf5e9ddd843be50e677070b5591a3f6dc48e2bff36eebc7f86651cbc2a8610f950476c9c47a407431550611202cfe65fd2a20318870f57e6745db9c6ed6a
|
7
|
+
data.tar.gz: 2285ddc6da1550f9cbf75165b49d2e6f65ba1894b97286d9b1e1b0f2efa61456e0534c37890b9758f5a37cebb40c02d2968933a8e58e26ade886fd9a0f1b9ed5
|
data/README.md
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
<img src="katapult.png" width="200px" align="right" />
|
4
4
|
|
5
5
|
|
6
|
-
`Katapult` is a kickstart generator for Rails applications. It creates
|
7
|
-
application
|
8
|
-
model, significantly speeding up the initial phase of a
|
6
|
+
`Katapult` is a kickstart generator for Rails applications. It creates a basic
|
7
|
+
application and generates ([makandra-flavored](https://leanpub.com/growing-rails))
|
8
|
+
code from an application model, significantly speeding up the initial phase of a
|
9
|
+
Rails project.
|
9
10
|
|
10
11
|
`Katapult` will always support current versions of Ruby and Rails, currently
|
11
12
|
Rails 4.2 and Ruby 2.1.
|
@@ -13,37 +14,78 @@ Rails 4.2 and Ruby 2.1.
|
|
13
14
|
|
14
15
|
## Installation
|
15
16
|
|
16
|
-
|
17
|
-
clean new Rails app. To create one, run
|
17
|
+
Install the `katapult` gem with
|
18
18
|
|
19
|
-
|
19
|
+
gem install katapult
|
20
20
|
|
21
|
-
This will add the `katapult` gem to the Gemfile and then integrate `katapult`
|
22
|
-
by running
|
23
21
|
|
24
|
-
|
25
|
-
rails generate katapult:basics
|
22
|
+
## Usage
|
26
23
|
|
24
|
+
`Katapult` does two separate things:
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
1. Create a new Rails application, set up with many standard gems, snippets,
|
27
|
+
useful configuration, databases etc.
|
28
|
+
2. Generate code from an application model, i.e. create files for models, views,
|
29
|
+
controllers, routes, stylesheets
|
31
30
|
|
32
|
-
|
33
|
-
You may also integrate the gem into an existing Rails application. Just add it to the Gemfile and run the generators stated above.
|
31
|
+
You may use both or only one of them.
|
34
32
|
|
35
33
|
|
36
|
-
##
|
34
|
+
## 1) Creating a new Rails application
|
35
|
+
|
36
|
+
Run the following command:
|
37
|
+
|
38
|
+
katapult new $APPLICATION_NAME
|
39
|
+
|
40
|
+
In detail, this will:
|
41
|
+
|
42
|
+
- create a new Rails application (without turbolinks)
|
43
|
+
- install common Gems, some of them commented out
|
44
|
+
- add a .gitignore and a .ruby-version file
|
45
|
+
- set up a `database.yml` file (for MySQL)
|
46
|
+
- create basic styles
|
47
|
+
- install some handy initializers
|
48
|
+
- install RSpec and Cucumber to the application
|
49
|
+
- create `lib/katapult/application_model.rb` (needed in Step 2)
|
50
|
+
|
51
|
+
See `lib/generators/katapult/basics/basics_generator.rb`.
|
52
|
+
|
53
|
+
### Using Katapult in existing Rails applications
|
54
|
+
`katapult` expects a clean application (that it would usually generate itself).
|
55
|
+
If you have an existing Rails application, you *may* use `katapult`, but be
|
56
|
+
warned: it is not designed to respect existing files, although it will usually
|
57
|
+
ask before overwriting files.
|
58
|
+
|
59
|
+
To add `katapult` to an existing Rails application, add
|
60
|
+
`gem 'katapult', group: :development` to the Gemfile. Then run any of the
|
61
|
+
following generators:
|
62
|
+
|
63
|
+
rails generate katapult:basics # Prepare the app with useful defaults
|
64
|
+
rails generate katapult:install # Create application model file
|
65
|
+
rails generate katapult:transform lib/katapult/application_model.rb
|
66
|
+
|
67
|
+
|
68
|
+
## 2) Generating code from an application model
|
69
|
+
|
70
|
+
> If you only want to use the code generation feature of `katapult`, but did not
|
71
|
+
> run `katapult new ...`, you need to add `katapult` to your Gemfile now and
|
72
|
+
> install it with `rails generate katapult:install`. See above.
|
37
73
|
|
38
|
-
After installation, you find a file `lib/katapult/application_model.rb`
|
39
|
-
you will define the properties of your application.
|
40
|
-
`katapult`'s simple DSL (domain specific language) to express yourself.
|
74
|
+
After installation, you will find a file `lib/katapult/application_model.rb`
|
75
|
+
where you will define the properties of your application.
|
41
76
|
|
77
|
+
Inside this file, use `katapult`'s simple DSL (domain specific language) to
|
78
|
+
express yourself. When you are done developing the application model, transform
|
79
|
+
it into code with:
|
42
80
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
options
|
81
|
+
katapult fire
|
82
|
+
|
83
|
+
See an overview of the DSL below. The respective sections hold examples of what
|
84
|
+
options are available to each element.
|
85
|
+
|
86
|
+
### Generic DSL syntax example
|
87
|
+
The DSL consists of _elements_, e.g. `Model` or `WUI` (Web User Interface). Each
|
88
|
+
`katapult` element has the same syntax, taking a name, options, and a block:
|
47
89
|
|
48
90
|
element_type 'name', options: 'example' do |element|
|
49
91
|
element.some_method
|
@@ -54,17 +96,29 @@ options, and a block:
|
|
54
96
|
Takes a name and a block:
|
55
97
|
|
56
98
|
model 'Customer' do |customer|
|
57
|
-
#
|
99
|
+
# customer.attr :name etc, see Attribute element
|
58
100
|
end
|
59
101
|
|
60
102
|
|
61
103
|
#### Attribute
|
62
104
|
Defined on Model. Takes a name and options:
|
63
105
|
|
106
|
+
# Default type :string
|
107
|
+
model.attr :name
|
108
|
+
|
109
|
+
# Inferred type :email (when attr name matches /email/)
|
64
110
|
model.attr :email
|
111
|
+
|
112
|
+
# Specify assignable values. Available options: allow_blank, default
|
65
113
|
model.attr :age, type: :integer, assignable_values: 18..99, allow_blank: true
|
114
|
+
|
115
|
+
# Will be rendered as number_field in forms, and with a € sign in show views
|
66
116
|
model.attr :income, type: :money
|
117
|
+
|
118
|
+
# All attribute types take an optional default
|
67
119
|
model.attr :homepage, type: :url, default: 'http://www.makandra.de'
|
120
|
+
|
121
|
+
# Boolean fields are modeled as flags. Default required!
|
68
122
|
model.attr :locked, type: :flag, default: false
|
69
123
|
|
70
124
|
|
@@ -72,22 +126,32 @@ Defined on Model. Takes a name and options:
|
|
72
126
|
Takes a name, options and a block:
|
73
127
|
|
74
128
|
wui 'Customer', model: 'User' do |wui|
|
75
|
-
#
|
129
|
+
# wui.crud, see Action element
|
130
|
+
end
|
131
|
+
|
132
|
+
# Inferred model name: 'Customer'
|
133
|
+
wui 'Customer' do |wui|
|
134
|
+
# wui.crud, see Action element
|
76
135
|
end
|
77
136
|
|
78
137
|
|
79
138
|
#### Action
|
80
139
|
Defined on WUI. Takes a name and options:
|
81
140
|
|
141
|
+
# Create all the standard rails actions
|
142
|
+
wui.crud
|
143
|
+
|
144
|
+
# Select single Rails actions
|
82
145
|
wui.action :index
|
83
146
|
wui.action :show
|
84
147
|
wui.action :create # also creates :new
|
85
148
|
wui.action :update # also creates :edit
|
86
149
|
wui.action :destroy
|
87
|
-
|
150
|
+
|
151
|
+
# Add custom actions
|
88
152
|
wui.action :custom_action, method: :post, scope: :member
|
89
153
|
wui.action :other_action, method: :get, scope: :collection
|
90
|
-
|
154
|
+
|
91
155
|
|
92
156
|
### Navigation
|
93
157
|
Takes a name, will generate a navigation with links to the index pages of all
|
@@ -98,19 +162,46 @@ WUIs.
|
|
98
162
|
|
99
163
|
## Development
|
100
164
|
|
101
|
-
|
165
|
+
### Basic information
|
166
|
+
`Katapult` is tested with [RSpec](http://rspec.info/) and
|
167
|
+
[Cucumber](https://cucumber.io/) + [Aruba](https://github.com/cucumber/aruba)
|
168
|
+
([API-Doc](http://www.rubydoc.info/github/cucumber/aruba/master/)).
|
169
|
+
|
170
|
+
It caches a pristine Rails application inside its `tmp/` directory to
|
102
171
|
speed up test runs. Keep this in mind, as it may lead to caching issues when
|
103
172
|
switching Ruby versions or installing a new version of the Rails gem.
|
104
173
|
|
105
174
|
Since `katapult` has full-stack integration tests, it requires a MySQL account.
|
106
|
-
Create a dedicated account on your MySQL server by running this command in
|
107
|
-
MySQL console (as-is):
|
175
|
+
Create a dedicated account on your local MySQL server by running this command in
|
176
|
+
a MySQL console (as-is):
|
108
177
|
|
109
178
|
GRANT ALL ON *.* TO 'katapult'@'localhost' IDENTIFIED BY 'secret';
|
110
179
|
|
111
180
|
The user `katapult` is hereby granted any action (SELECT, UPDATE, etc. except
|
112
181
|
for granting privileges) on any database and table (`*.*`).
|
113
182
|
|
183
|
+
### Continuing development
|
184
|
+
When you continue development on `katapult`, remove its `tmp/` directory first.
|
185
|
+
It contains cached data that might lead to confusion.
|
186
|
+
|
187
|
+
### Debugging
|
188
|
+
Add the `@announce-output` tag to `katapult` features in order to have any output
|
189
|
+
logged to your terminal.
|
190
|
+
|
191
|
+
To precisely debug errors occurring _inside_ the generated application, you may
|
192
|
+
cd to `tmp/aruba/katapult_test_app`. Run the failing command manually.
|
193
|
+
|
194
|
+
Note that after running a katapult feature, you need to call
|
195
|
+
`cd ../../aruba/katapult_test_app` inside the generated app terminal. This is
|
196
|
+
required because the `tmp/aruba` directory is being wiped before each scenario.
|
197
|
+
|
198
|
+
### Typical errors
|
199
|
+
- Timeout error because of a script waiting for user input
|
200
|
+
- Executing (bash) commands in the test application without resetting the
|
201
|
+
katapult gem's Bundler settings. Wrap into `Bundler.with_clean_env { }`.
|
202
|
+
- Spring running inside the test application encumbers parallel_tests
|
203
|
+
- An outdated Rails application in `tmp/cached_test_app`
|
204
|
+
|
114
205
|
|
115
206
|
## Credits
|
116
207
|
|
data/bin/katapult
CHANGED
@@ -1,44 +1,82 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# This script simplifies the usage of `katapult` by grouping relevant actions
|
4
|
+
# that the user else had to perform manually.
|
5
|
+
# See bottom for USAGE.
|
6
|
+
|
3
7
|
require_relative '../lib/katapult/util'
|
8
|
+
require 'bundler'
|
9
|
+
|
10
|
+
def pink_puts(*args)
|
11
|
+
message = "\n> #{ args.join ' ' }"
|
12
|
+
Kernel.puts "\e[35m#{ message }\e[0m" # pink
|
13
|
+
end
|
4
14
|
|
5
|
-
|
6
|
-
|
15
|
+
# With clean Bundler env
|
16
|
+
def run(command)
|
17
|
+
Bundler.with_clean_env { system command }
|
18
|
+
end
|
19
|
+
|
20
|
+
case (transform_command = ARGV.shift)
|
21
|
+
when 'new'
|
22
|
+
interactive = !ARGV.delete('--non-interactive')
|
7
23
|
app_name = ARGV.shift
|
24
|
+
basics_command = 'bundle exec rails generate katapult:basics'
|
8
25
|
|
9
|
-
|
10
|
-
|
26
|
+
if interactive
|
27
|
+
pink_puts 'Please enter your database user: '
|
28
|
+
basics_command << ' --db-user ' << gets.chomp
|
29
|
+
|
30
|
+
pink_puts 'Please enter your database password: '
|
31
|
+
basics_command << ' --db-password ' << gets.chomp
|
32
|
+
end
|
33
|
+
|
34
|
+
pink_puts 'Creating new Rails application ...'
|
35
|
+
run "rails new #{ app_name } --skip-test-unit --skip-bundle --database mysql"
|
11
36
|
|
12
37
|
Dir.chdir app_name
|
13
38
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Katapult::Util.git_commit "rails new #{app_name}"
|
39
|
+
pink_puts 'Initializing git repository ...'
|
40
|
+
run 'git init'
|
41
|
+
Katapult::Util.git_commit "rails new #{ app_name }"
|
18
42
|
|
19
|
-
|
20
|
-
puts 'Installing katapult ...'
|
43
|
+
pink_puts 'Installing katapult ...'
|
21
44
|
File.open('Gemfile', 'a') do |file|
|
22
|
-
file.puts "gem 'katapult'#{ ENV['KATAPULT_GEMFILE_OPTIONS'] }"
|
45
|
+
file.puts "gem 'katapult'#{ ENV['KATAPULT_GEMFILE_OPTIONS'] }, group: :development"
|
23
46
|
end
|
24
|
-
|
25
|
-
|
47
|
+
run 'bundle install'
|
48
|
+
run 'bundle exec rails generate katapult:install'
|
26
49
|
Katapult::Util.git_commit 'rails generate katapult:install'
|
27
50
|
|
28
|
-
|
29
|
-
|
30
|
-
system 'bundle exec rails generate katapult:basics'
|
51
|
+
pink_puts 'Generating katapult basics ...'
|
52
|
+
run basics_command
|
31
53
|
Katapult::Util.git_commit 'rails generate katapult:basics'
|
32
54
|
|
33
|
-
|
34
|
-
|
55
|
+
pink_puts <<-INSTRUCTIONS
|
56
|
+
Application initialization done.
|
57
|
+
|
58
|
+
Next step: Model your application in lib/katapult/application_model.rb and
|
59
|
+
transform it into code by running `katapult fire`.
|
60
|
+
INSTRUCTIONS
|
35
61
|
|
36
62
|
when 'fire'
|
37
63
|
app_model_path = 'lib/katapult/application_model.rb'
|
64
|
+
transform_command = 'bin/rails generate katapult:transform ' + app_model_path
|
65
|
+
|
66
|
+
pink_puts 'Loading katapult ...'
|
67
|
+
run transform_command
|
68
|
+
Katapult::Util.git_commit transform_command
|
69
|
+
|
70
|
+
pink_puts <<-INSTRUCTIONS
|
71
|
+
Model transformation done.
|
38
72
|
|
39
|
-
|
40
|
-
|
73
|
+
Now boot up your development server (e.g. with `rails server`) and try your
|
74
|
+
kickstarted application in the browser!
|
75
|
+
INSTRUCTIONS
|
41
76
|
|
42
77
|
else
|
43
|
-
puts
|
78
|
+
puts <<-USAGE
|
79
|
+
Usage: katapult [new APP_NAME | fire]
|
80
|
+
Hint: Suppress database credentials prompt with `--non-interactive`
|
81
|
+
USAGE
|
44
82
|
end
|
data/features/binary.feature
CHANGED
@@ -1,13 +1,21 @@
|
|
1
1
|
Feature: Katapult binary `katapult`
|
2
2
|
|
3
3
|
Scenario: Start new Rails application
|
4
|
-
Given the default aruba timeout is 120 seconds
|
4
|
+
Given the default aruba exit timeout is 120 seconds
|
5
5
|
|
6
|
-
When I
|
6
|
+
When I run `katapult new binary_test` interactively
|
7
|
+
And I type "katapult"
|
8
|
+
And I type "secret"
|
7
9
|
Then the output should contain "Creating new Rails application"
|
8
10
|
And the output should contain "Installing katapult"
|
9
11
|
And the output should contain "Generating katapult basics"
|
10
|
-
And the output should contain
|
12
|
+
And the output should contain:
|
13
|
+
"""
|
14
|
+
Application initialization done.
|
15
|
+
|
16
|
+
Next step: Model your application in lib/katapult/application_model.rb and
|
17
|
+
transform it into code by running `katapult fire`.
|
18
|
+
"""
|
11
19
|
|
12
20
|
When I cd to "binary_test"
|
13
21
|
|
@@ -15,9 +23,14 @@ Feature: Katapult binary `katapult`
|
|
15
23
|
Then the file "Gemfile" should contain "gem 'katapult'"
|
16
24
|
And a file named "lib/katapult/application_model.rb" should exist
|
17
25
|
|
18
|
-
# test
|
19
|
-
|
20
|
-
|
26
|
+
# test correct insertion of database credentials
|
27
|
+
And the file "config/database.yml" should contain "username: katapult"
|
28
|
+
And the file "config/database.yml" should contain "password: secret"
|
29
|
+
|
30
|
+
# Not working, probably because Bundler sees an empty BUNDLER_GEMFILE var
|
31
|
+
# # test whether the application is already bundled
|
32
|
+
# When I run `bundle check`
|
33
|
+
# Then the output should contain "The Gemfile's dependencies are satisfied"
|
21
34
|
|
22
35
|
# test whether katapult made git commits
|
23
36
|
When I run `git log`
|
@@ -26,21 +39,15 @@ Feature: Katapult binary `katapult`
|
|
26
39
|
And the output should contain "rails generate katapult:basics"
|
27
40
|
And the output should contain "Author: katapult <katapult@makandra.com>"
|
28
41
|
|
29
|
-
And the output should contain:
|
30
|
-
"""
|
31
|
-
Next step: Model your application in lib/katapult/application_model.rb and
|
32
|
-
trigger the code generation by running `katapult fire`.
|
33
|
-
"""
|
34
|
-
|
35
42
|
|
36
43
|
Scenario: Forget to pass application name
|
37
|
-
When I run `katapult
|
44
|
+
When I run `katapult new --non-interactive # Without app name`
|
38
45
|
Then the output should contain "No value provided for required arguments 'app_path'"
|
39
46
|
|
40
47
|
|
41
48
|
Scenario: Run without arguments
|
42
49
|
When I run `katapult # without arguments`
|
43
|
-
Then the output should contain "Usage: katapult [
|
50
|
+
Then the output should contain "Usage: katapult [new APP_NAME | fire]"
|
44
51
|
|
45
52
|
|
46
53
|
Scenario: Transform the application model
|
@@ -55,6 +62,12 @@ Feature: Katapult binary `katapult`
|
|
55
62
|
|
56
63
|
And the output should contain:
|
57
64
|
"""
|
58
|
-
|
59
|
-
|
65
|
+
Model transformation done.
|
66
|
+
|
67
|
+
Now boot up your development server (e.g. with `rails server`) and try your
|
68
|
+
kickstarted application in the browser!
|
60
69
|
"""
|
70
|
+
|
71
|
+
When I run `git log`
|
72
|
+
Then the output should contain "rails generate katapult:transform lib/katapult/application_model.rb"
|
73
|
+
And the output should contain "Author: katapult <katapult@makandra.com>"
|
data/features/katapult.feature
CHANGED
@@ -32,21 +32,35 @@ Feature: Katapult in general
|
|
32
32
|
|
33
33
|
Scenario: Generate basic files and settings
|
34
34
|
Given I install katapult
|
35
|
+
|
35
36
|
When I generate katapult basics
|
36
37
|
Then the file ".ruby-version" should contain "2.1.5"
|
37
|
-
|
38
|
+
|
39
|
+
|
40
|
+
And the file "config/cucumber.yml" should contain:
|
41
|
+
"""
|
42
|
+
default: <%= std_opts %> features
|
43
|
+
wip: --tags @wip:3 --wip features
|
44
|
+
parallel: <%= std_opts %> features <%= log_failures %>
|
45
|
+
rerun: -r features --format pretty --strict <%= rerun_failures %> <%= log_failures %>
|
46
|
+
"""
|
47
|
+
|
48
|
+
|
49
|
+
And the file ".gitignore" should contain "config/database.yml"
|
50
|
+
And the file "Gemfile" should contain "gem 'rails', '4.2.4'"
|
51
|
+
And the file "Gemfile" should contain exactly:
|
38
52
|
"""
|
39
53
|
source 'https://rubygems.org'
|
40
54
|
|
41
55
|
# from original Gemfile
|
42
|
-
gem 'rails', '4.2.
|
43
|
-
gem 'mysql2'
|
56
|
+
gem 'rails', '4.2.4'
|
44
57
|
gem 'jquery-rails'
|
45
58
|
gem 'jbuilder', '~> 2.0'
|
46
59
|
gem 'katapult', path: '../../..'
|
47
60
|
|
48
61
|
# engines
|
49
62
|
gem 'haml-rails'
|
63
|
+
gem 'mysql2', '~> 0.3.18' # Work around require-error in Rails 4.2
|
50
64
|
|
51
65
|
# internal
|
52
66
|
gem 'exception_notification'
|
@@ -88,6 +102,7 @@ Feature: Katapult in general
|
|
88
102
|
gem 'binding_of_caller'
|
89
103
|
gem 'thin'
|
90
104
|
|
105
|
+
gem 'parallel_tests'
|
91
106
|
gem 'guard-livereload', require: false
|
92
107
|
gem 'rack-livereload'
|
93
108
|
gem 'spring-commands-rspec'
|
@@ -102,15 +117,14 @@ Feature: Katapult in general
|
|
102
117
|
end
|
103
118
|
|
104
119
|
group :test do
|
105
|
-
gem 'parallel_tests'
|
106
120
|
gem 'database_cleaner'
|
107
121
|
gem 'timecop'
|
108
122
|
gem 'launchy'
|
109
123
|
|
110
124
|
gem 'capybara'
|
125
|
+
gem 'capybara-screenshot'
|
111
126
|
gem 'cucumber-rails', require: false
|
112
127
|
gem 'cucumber_factory'
|
113
|
-
gem 'cucumber_spinner'
|
114
128
|
gem 'selenium-webdriver'
|
115
129
|
gem 'spreewald'
|
116
130
|
|
@@ -120,7 +134,11 @@ Feature: Katapult in general
|
|
120
134
|
|
121
135
|
"""
|
122
136
|
|
123
|
-
|
137
|
+
|
138
|
+
|
139
|
+
# Config
|
140
|
+
And the file "config/application.rb" should contain "config.time_zone = 'Berlin'"
|
141
|
+
And the file "config/database.yml" should contain exactly:
|
124
142
|
"""
|
125
143
|
common: &common
|
126
144
|
adapter: mysql2
|
@@ -135,10 +153,8 @@ Feature: Katapult in general
|
|
135
153
|
test: &test
|
136
154
|
<<: *common
|
137
155
|
database: katapult_test_app_test<%= ENV['TEST_ENV_NUMBER'] %>
|
138
|
-
|
139
|
-
cucumber:
|
140
|
-
<<: *test
|
141
156
|
"""
|
157
|
+
|
142
158
|
And the file "config/database.sample.yml" should contain exactly:
|
143
159
|
"""
|
144
160
|
common: &common
|
@@ -151,30 +167,84 @@ Feature: Katapult in general
|
|
151
167
|
<<: *common
|
152
168
|
database: katapult_test_app_development
|
153
169
|
|
154
|
-
test:
|
170
|
+
test:
|
155
171
|
<<: *common
|
156
172
|
database: katapult_test_app_test<%= ENV['TEST_ENV_NUMBER'] %>
|
173
|
+
"""
|
174
|
+
|
175
|
+
And the file "config/cucumber.yml" should contain:
|
176
|
+
"""
|
177
|
+
default: <%= std_opts %> features
|
178
|
+
wip: --tags @wip:3 --wip features
|
179
|
+
parallel: <%= std_opts %> features <%= log_failures %>
|
180
|
+
rerun: -r features --format pretty --strict <%= rerun_failures %> <%= log_failures %>
|
181
|
+
"""
|
182
|
+
And the file "config/initializers/find_by_anything.rb" should contain:
|
183
|
+
"""
|
184
|
+
ActiveRecord::Base.class_eval do
|
157
185
|
|
158
|
-
|
159
|
-
|
186
|
+
def self.find_by_anything(identifier)
|
187
|
+
"""
|
188
|
+
And the file "config/initializers/exception_notification.rb" should contain:
|
189
|
+
"""
|
190
|
+
ExceptionNotification.configure do |config|
|
160
191
|
|
192
|
+
config.add_notifier :email, {
|
193
|
+
email_prefix: '[katapult_test_app] ',
|
194
|
+
exception_recipients: %w[fail@makandra.de],
|
161
195
|
"""
|
196
|
+
And the file "config/initializers/form_for_with_development_errors.rb" should contain:
|
197
|
+
"""
|
198
|
+
if Rails.env == 'development'
|
199
|
+
|
200
|
+
ActionView::Helpers::FormHelper.class_eval do
|
201
|
+
|
202
|
+
def form_for_with_development_errors(*args, &block)
|
203
|
+
"""
|
204
|
+
|
205
|
+
|
162
206
|
|
207
|
+
# Tests
|
163
208
|
And the file "features/support/env-custom.rb" should contain:
|
164
209
|
"""
|
165
210
|
require 'spreewald/all_steps'
|
166
211
|
"""
|
167
|
-
And
|
168
|
-
|
212
|
+
And the file "features/support/cucumber_factory.rb" should contain:
|
213
|
+
"""
|
214
|
+
Cucumber::Factory.add_steps(self)
|
215
|
+
"""
|
216
|
+
And the file "features/support/capybara_screenshot.rb" should contain:
|
217
|
+
"""
|
218
|
+
require 'capybara-screenshot/cucumber'
|
219
|
+
|
220
|
+
# Keep up to the number of screenshots specified in the hash
|
221
|
+
Capybara::Screenshot.prune_strategy = { keep: 10 }
|
222
|
+
"""
|
223
|
+
And the file "features/support/database_cleaner.rb" should contain:
|
224
|
+
"""
|
225
|
+
DatabaseCleaner.clean_with(:deletion) # clean once, now
|
226
|
+
DatabaseCleaner.strategy = :transaction
|
227
|
+
Cucumber::Rails::Database.javascript_strategy = :deletion
|
228
|
+
"""
|
229
|
+
And a file named "features/support/paths.rb" should exist
|
230
|
+
And a file named "features/support/selectors.rb" should exist
|
231
|
+
And the file "spec/rails_helper.rb" should match /^Dir.Rails.root.join.+spec.support/
|
232
|
+
And the file "spec/support/shoulda_matchers.rb" should contain:
|
169
233
|
"""
|
170
|
-
require 'rspec/rails'
|
171
234
|
require 'shoulda/matchers'
|
235
|
+
|
236
|
+
Shoulda::Matchers.configure do |config|
|
237
|
+
config.integrate do |with|
|
238
|
+
with.test_framework :rspec
|
239
|
+
with.library :rails
|
240
|
+
end
|
241
|
+
end
|
172
242
|
"""
|
173
243
|
|
174
244
|
|
175
245
|
|
176
246
|
# styles
|
177
|
-
And the file "app/assets/stylesheets/application.
|
247
|
+
And the file "app/assets/stylesheets/application.sass" should contain:
|
178
248
|
"""
|
179
249
|
@import compass
|
180
250
|
@import bootstrap
|
@@ -182,7 +252,7 @@ Feature: Katapult in general
|
|
182
252
|
@import application/blocks/all
|
183
253
|
|
184
254
|
"""
|
185
|
-
And the file "app/assets/stylesheets/application/blocks/_all.
|
255
|
+
And the file "app/assets/stylesheets/application/blocks/_all.sass" should contain exactly:
|
186
256
|
"""
|
187
257
|
@import items
|
188
258
|
@import layout
|
@@ -190,10 +260,10 @@ Feature: Katapult in general
|
|
190
260
|
@import tools
|
191
261
|
|
192
262
|
"""
|
193
|
-
And a file named "app/assets/stylesheets/application/blocks/_items.
|
194
|
-
And a file named "app/assets/stylesheets/application/blocks/_layout.
|
195
|
-
And a file named "app/assets/stylesheets/application/blocks/_navigation.
|
196
|
-
And a file named "app/assets/stylesheets/application/blocks/_tools.
|
263
|
+
And a file named "app/assets/stylesheets/application/blocks/_items.sass" should exist
|
264
|
+
And a file named "app/assets/stylesheets/application/blocks/_layout.sass" should exist
|
265
|
+
And a file named "app/assets/stylesheets/application/blocks/_navigation.sass" should exist
|
266
|
+
And a file named "app/assets/stylesheets/application/blocks/_tools.sass" should exist
|
197
267
|
|
198
268
|
# And the file "config/deploy.rb" should contain exactly:
|
199
269
|
# """
|