katapult 0.1.1 → 0.1.2
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/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
|
# """
|