gnarails 3.0.0 → 3.0.1
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/.github/actions/test-rails/action.yml +27 -0
- data/.github/workflows/bundler-audit.yml +19 -0
- data/.github/workflows/pronto.yml +30 -0
- data/.github/workflows/rails-test-app.yml +87 -0
- data/.github/workflows/run-unit-tests.yml +17 -0
- data/.railsrc +3 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +6 -1
- data/RELEASE_PROCESS.md +7 -8
- data/Rakefile +1 -1
- data/bin/bundle +120 -0
- data/bin/pronto +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/gnarails.gemspec +15 -4
- data/gnarly.rb +68 -50
- data/lib/gnarails/cli/application.rb +25 -153
- data/lib/gnarails/version.rb +3 -1
- data/templates/.github/workflows/brakeman.yml +22 -0
- data/templates/.github/workflows/run-tests.yml +26 -0
- data/templates/README.md +4 -5
- data/templates/bin/pronto +29 -0
- data/templates/bin/rspec +29 -0
- data/templates/bin/rubocop +29 -0
- data/templates/bin/setup +30 -0
- data/templates/docker-compose.yml/docker-compose-standard.yml +1 -1
- data/templates/esbuild.config.js +11 -0
- data/test-app/app/views/layouts/application.html.erb +2 -2
- data/test-app/spec/system/viewing_all_job_postings_spec.rb +5 -9
- metadata +30 -18
- data/.circleci/config.yml +0 -146
- data/bin/ci_pronto +0 -6
- data/bin/generate-test-app.sh +0 -22
- data/templates/.circleci/config.yml +0 -71
- data/templates/.gitignore +0 -20
- data/templates/.scss-lint.yml +0 -33
- data/templates/bin/brakeman +0 -15
- data/templates/bin/ci_pronto +0 -6
data/gnarly.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# to look up files
|
3
3
|
def source_paths
|
4
4
|
Array(super) +
|
5
|
-
[
|
5
|
+
[__dir__]
|
6
6
|
end
|
7
7
|
|
8
8
|
def create_gnarly_rails_app
|
@@ -16,14 +16,17 @@ def create_gnarly_rails_app
|
|
16
16
|
|
17
17
|
add_gems
|
18
18
|
|
19
|
-
|
19
|
+
run_bundle
|
20
20
|
|
21
21
|
after_bundle do
|
22
22
|
setup_testing
|
23
|
+
setup_binstubs
|
23
24
|
setup_database
|
24
|
-
|
25
|
+
setup_assets
|
25
26
|
setup_gitignore
|
26
|
-
|
27
|
+
setup_linting
|
28
|
+
setup_pronto
|
29
|
+
setup_simplecov
|
27
30
|
setup_environments
|
28
31
|
setup_readme
|
29
32
|
remove_dir "test"
|
@@ -35,28 +38,24 @@ end
|
|
35
38
|
|
36
39
|
def add_gems
|
37
40
|
gem_group :development, :test do
|
38
|
-
gem
|
39
|
-
gem
|
40
|
-
gem
|
41
|
-
gem
|
42
|
-
gem
|
43
|
-
gem
|
44
|
-
gem
|
45
|
-
gem
|
46
|
-
gem
|
47
|
-
gem
|
48
|
-
gem
|
49
|
-
gem
|
50
|
-
gem
|
51
|
-
gem
|
52
|
-
gem
|
53
|
-
gem
|
54
|
-
gem
|
55
|
-
gem
|
56
|
-
gem 'scss_lint', require: false
|
57
|
-
gem 'selenium-webdriver'
|
58
|
-
gem 'shoulda-matchers'
|
59
|
-
gem 'simplecov', require: false
|
41
|
+
gem "axe-core-capybara"
|
42
|
+
gem "axe-core-rspec"
|
43
|
+
gem "bullet"
|
44
|
+
gem "dotenv-rails"
|
45
|
+
gem "factory_bot_rails"
|
46
|
+
gem "gnar-style", require: false
|
47
|
+
gem "launchy"
|
48
|
+
gem "lol_dba"
|
49
|
+
gem "okcomputer"
|
50
|
+
gem "pronto"
|
51
|
+
gem "pronto-rubocop", require: false
|
52
|
+
gem "pry-byebug"
|
53
|
+
gem "pry-rails"
|
54
|
+
gem "rspec-its"
|
55
|
+
gem "rspec-rails", "~> 4"
|
56
|
+
gem "rubocop-rspec", require: false
|
57
|
+
gem "shoulda-matchers"
|
58
|
+
gem "simplecov", require: false
|
60
59
|
end
|
61
60
|
end
|
62
61
|
|
@@ -64,17 +63,26 @@ def setup_database
|
|
64
63
|
remove_file "config/database.yml"
|
65
64
|
copy_file "templates/database.yml", "config/database.yml"
|
66
65
|
gsub_file "config/database.yml", "__application_name__", app_name
|
67
|
-
|
68
66
|
gsub_file "Gemfile", /.*sqlite.*\n/, ""
|
69
67
|
end
|
70
68
|
|
71
|
-
def
|
72
|
-
run "
|
69
|
+
def setup_assets
|
70
|
+
run "yarn add esbuild-rails"
|
71
|
+
remove_file "esbuild.config.js"
|
72
|
+
copy_file "templates/esbuild.config.js", "esbuild.config.js"
|
73
|
+
run "npm set-script build 'node esbuild.config.js'"
|
73
74
|
end
|
74
75
|
|
75
76
|
def setup_gitignore
|
76
|
-
|
77
|
-
|
77
|
+
append_to_file ".gitignore" do
|
78
|
+
<<~GITIGNORE
|
79
|
+
# Ignore Byebug command history file.
|
80
|
+
.byebug_history
|
81
|
+
|
82
|
+
# Ignore output of simplecov
|
83
|
+
coverage
|
84
|
+
GITIGNORE
|
85
|
+
end
|
78
86
|
end
|
79
87
|
|
80
88
|
def setup_testing
|
@@ -115,7 +123,8 @@ end
|
|
115
123
|
def system_tests_rails_helper_text
|
116
124
|
<<~SYSTEM_TESTS
|
117
125
|
require "capybara/rails"
|
118
|
-
require "axe
|
126
|
+
require "axe-rspec"
|
127
|
+
require "axe-capybara"
|
119
128
|
require "selenium/webdriver"
|
120
129
|
SYSTEM_TESTS
|
121
130
|
end
|
@@ -188,27 +197,29 @@ def limit_test_logging
|
|
188
197
|
end
|
189
198
|
end
|
190
199
|
|
191
|
-
def
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
200
|
+
def setup_binstubs
|
201
|
+
remove_file "bin/setup"
|
202
|
+
copy_file "templates/bin/setup", "bin/setup"
|
203
|
+
run "chmod +x bin/setup"
|
204
|
+
|
205
|
+
copy_file "templates/bin/rspec", "bin/rspec"
|
206
|
+
run "chmod +x bin/rspec"
|
207
|
+
|
208
|
+
copy_file "templates/bin/rubocop", "bin/rubocop"
|
209
|
+
run "chmod +x bin/rubocop"
|
196
210
|
end
|
197
211
|
|
198
212
|
def setup_linting
|
199
213
|
copy_file "templates/.rubocop.yml", ".rubocop.yml"
|
200
|
-
copy_file "templates/.scss-lint.yml", ".scss-lint.yml"
|
201
214
|
end
|
202
215
|
|
203
216
|
def setup_pronto
|
204
217
|
copy_file "templates/.pronto.yml", ".pronto.yml"
|
205
|
-
copy_file "templates/bin/ci_pronto", "bin/ci_pronto"
|
206
|
-
run "chmod +x bin/ci_pronto"
|
207
|
-
end
|
208
218
|
|
209
|
-
|
210
|
-
|
211
|
-
|
219
|
+
copy_file "templates/bin/pronto", "bin/pronto"
|
220
|
+
run "chmod +x bin/pronto"
|
221
|
+
|
222
|
+
copy_file ".github/workflows/pronto.yml", ".github/workflows/pronto.yml"
|
212
223
|
end
|
213
224
|
|
214
225
|
def setup_simplecov
|
@@ -230,7 +241,7 @@ end
|
|
230
241
|
|
231
242
|
def setup_environments
|
232
243
|
setup_dotenv
|
233
|
-
|
244
|
+
setup_github_workflows
|
234
245
|
setup_docker
|
235
246
|
setup_procfile
|
236
247
|
configure_i18n
|
@@ -243,10 +254,12 @@ def setup_dotenv
|
|
243
254
|
gsub_file ".env.test", "__application_name__", app_name
|
244
255
|
end
|
245
256
|
|
246
|
-
def
|
247
|
-
copy_file "templates/.
|
248
|
-
|
249
|
-
|
257
|
+
def setup_github_workflows
|
258
|
+
copy_file "templates/.github/workflows/run-tests.yml", ".github/workflows/run-tests.yml"
|
259
|
+
copy_file "templates/.github/workflows/brakeman.yml", ".github/workflows/brakeman.yml"
|
260
|
+
|
261
|
+
copy_file ".github/actions/test-rails/action.yml", ".github/actions/test-rails/action.yml"
|
262
|
+
copy_file ".github/workflows/bundler-audit.yml", ".github/workflows/bundler-audit.yml"
|
250
263
|
end
|
251
264
|
|
252
265
|
def setup_docker
|
@@ -305,16 +318,21 @@ def post_install_instructions
|
|
305
318
|
puts "* Install ChromeDriver for default headless acceptance tests: brew cask install chromedriver"
|
306
319
|
puts "* Follow the post-install instructions to set up circle to allow gnarbot to comment on PRs."
|
307
320
|
puts " * https://github.com/TheGnarCo/gnarails#post-install"
|
321
|
+
puts "=========="
|
322
|
+
puts "* Make sure your package.json has the following scripts:"
|
323
|
+
puts "* \`\"build\": \"node esbuild.config.js\"\`"
|
324
|
+
puts "* \`\"build:css\": \"sass ./app/assets/stylesheets/application.sass.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules\"\`"
|
308
325
|
end
|
309
326
|
|
310
327
|
def format_ruby
|
311
|
-
run "
|
328
|
+
run "bin/rubocop -A"
|
312
329
|
end
|
313
330
|
|
314
331
|
def completion_notification
|
315
332
|
puts ""
|
316
333
|
ascii_art
|
317
334
|
post_install_instructions
|
335
|
+
puts ""
|
318
336
|
end
|
319
337
|
|
320
338
|
create_gnarly_rails_app
|
@@ -7,180 +7,52 @@ module Gnarails
|
|
7
7
|
|
8
8
|
add_runtime_options!
|
9
9
|
|
10
|
-
WEBPACKS = %w[react vue angular elm stimulus].freeze
|
11
|
-
|
12
|
-
method_option :ruby,
|
13
|
-
type: :string,
|
14
|
-
aliases: "-r",
|
15
|
-
default: Thor::Util.ruby_command,
|
16
|
-
desc: "Path to the Ruby binary of your choice", banner: "PATH"
|
17
|
-
|
18
|
-
method_option :skip_namespace,
|
19
|
-
type: :boolean,
|
20
|
-
default: false,
|
21
|
-
desc: "Skip namespace (affects only isolated applications)"
|
22
|
-
|
23
|
-
method_option :skip_yarn,
|
24
|
-
type: :boolean,
|
25
|
-
default: false,
|
26
|
-
desc: "Don't use Yarn for managing JavaScript dependencies"
|
27
|
-
|
28
|
-
method_option :skip_gemfile,
|
29
|
-
type: :boolean,
|
30
|
-
default: false,
|
31
|
-
desc: "Don't create a Gemfile"
|
32
|
-
|
33
|
-
method_option :skip_git,
|
34
|
-
type: :boolean,
|
35
|
-
aliases: "-G",
|
36
|
-
default: false,
|
37
|
-
desc: "Skip .gitignore file"
|
38
|
-
|
39
|
-
method_option :skip_keeps,
|
40
|
-
type: :boolean,
|
41
|
-
default: false,
|
42
|
-
desc: "Skip source control .keep files"
|
43
|
-
|
44
|
-
method_option :skip_action_mailer,
|
45
|
-
type: :boolean,
|
46
|
-
aliases: "-M",
|
47
|
-
default: false,
|
48
|
-
desc: "Skip Action Mailer files"
|
49
|
-
|
50
|
-
method_option :skip_active_record,
|
51
|
-
type: :boolean,
|
52
|
-
aliases: "-O",
|
53
|
-
default: false,
|
54
|
-
desc: "Skip Active Record files"
|
55
|
-
|
56
|
-
method_option :skip_active_storage,
|
57
|
-
type: :boolean,
|
58
|
-
default: false,
|
59
|
-
desc: "Skip Active Storage files"
|
60
|
-
|
61
|
-
method_option :skip_puma,
|
62
|
-
type: :boolean,
|
63
|
-
aliases: "-P",
|
64
|
-
default: false,
|
65
|
-
desc: "Skip Puma related files"
|
66
|
-
|
67
|
-
method_option :skip_action_cable,
|
68
|
-
type: :boolean,
|
69
|
-
aliases: "-C",
|
70
|
-
default: false,
|
71
|
-
desc: "Skip Action Cable files"
|
72
|
-
|
73
|
-
method_option :skip_sprockets,
|
74
|
-
type: :boolean,
|
75
|
-
aliases: "-S",
|
76
|
-
default: false,
|
77
|
-
desc: "Skip Sprockets files"
|
78
|
-
|
79
|
-
method_option :skip_spring,
|
80
|
-
type: :boolean,
|
81
|
-
default: false,
|
82
|
-
desc: "Don't install Spring application preloader"
|
83
|
-
|
84
|
-
method_option :skip_listen,
|
85
|
-
type: :boolean,
|
86
|
-
default: false,
|
87
|
-
desc: "Don't generate configuration that depends on the listen gem"
|
88
|
-
|
89
|
-
method_option :skip_coffee,
|
90
|
-
type: :boolean,
|
91
|
-
default: false,
|
92
|
-
desc: "Don't use CoffeeScript"
|
93
|
-
|
94
|
-
method_option :skip_javascript,
|
95
|
-
type: :boolean,
|
96
|
-
aliases: "-J",
|
97
|
-
default: false,
|
98
|
-
desc: "Skip JavaScript files"
|
99
|
-
|
100
|
-
method_option :skip_turbolinks,
|
101
|
-
type: :boolean,
|
102
|
-
default: false,
|
103
|
-
desc: "Skip turbolinks gem"
|
104
|
-
|
105
|
-
method_option :skip_test,
|
106
|
-
type: :boolean,
|
107
|
-
aliases: "-T",
|
108
|
-
default: false,
|
109
|
-
desc: "Skip test files"
|
110
|
-
|
111
|
-
method_option :skip_system_test,
|
112
|
-
type: :boolean,
|
113
|
-
default: false,
|
114
|
-
desc: "Skip system test files"
|
115
|
-
|
116
|
-
method_option :skip_bootsnap,
|
117
|
-
type: :boolean,
|
118
|
-
default: false,
|
119
|
-
desc: "Skip bootsnap gem"
|
120
|
-
|
121
|
-
method_option :dev,
|
122
|
-
type: :boolean,
|
123
|
-
default: false,
|
124
|
-
desc: "Setup the application with Gemfile pointing to your Rails checkout"
|
125
|
-
|
126
|
-
method_option :edge,
|
127
|
-
type: :boolean,
|
128
|
-
default: false,
|
129
|
-
desc: "Setup the application with Gemfile pointing to Rails repository"
|
130
|
-
|
131
|
-
method_option :rc,
|
132
|
-
type: :string,
|
133
|
-
default: nil,
|
134
|
-
desc: "Path to file containing extra configuration options for rails command"
|
135
|
-
|
136
|
-
method_option :no_rc,
|
137
|
-
type: :boolean,
|
138
|
-
default: false,
|
139
|
-
desc: "Skip loading of extra configuration options from .railsrc file"
|
140
|
-
|
141
|
-
method_option :api,
|
142
|
-
type: :boolean,
|
143
|
-
desc: "Preconfigure smaller stack for API only apps"
|
144
|
-
|
145
|
-
method_option :skip_bundle,
|
146
|
-
type: :boolean,
|
147
|
-
aliases: "-B",
|
148
|
-
default: false,
|
149
|
-
desc: "Don't run bundle install"
|
150
|
-
|
151
|
-
method_option :webpack,
|
152
|
-
type: :string,
|
153
|
-
default: nil,
|
154
|
-
desc: "Preconfigure for app-like JavaScript with Webpack (options: #{WEBPACKS.join('/')})"
|
155
|
-
|
156
10
|
desc "new APP_PATH [options]", "generate a gnarly rails app"
|
157
11
|
long_desc <<-LONGDESC
|
158
12
|
`gnarails new NAME` will create a new rails application called NAME,
|
159
13
|
pre-built with the same helpful default configuration you can expect from
|
160
14
|
any rails project built by The Gnar Company.
|
161
15
|
|
162
|
-
By default, we pass arguments to `rails new` that
|
163
|
-
|
16
|
+
By default, we pass arguments to `rails new` that:
|
17
|
+
- skip test unit (We'll install rspec later)
|
18
|
+
- use postgres over SQLlite,
|
19
|
+
- use Propshaft,
|
20
|
+
- Bundle CSS with cssbundling (using sass)
|
21
|
+
- bundle JS with esbuild
|
164
22
|
|
165
23
|
You should also be able to pass any other arguments you would expect to
|
166
|
-
be able to when generating a new rails app.
|
24
|
+
be able to when generating a new rails app. Use `rails -h` for more
|
25
|
+
information.
|
167
26
|
LONGDESC
|
168
27
|
def new(name)
|
169
|
-
Kernel.system
|
28
|
+
Kernel.system command(name, options)
|
170
29
|
end
|
171
30
|
|
31
|
+
DEFAULT_OPTIONS = [
|
32
|
+
"--asset-pipeline=propshaft",
|
33
|
+
"--skip-test-unit",
|
34
|
+
"--css=sass",
|
35
|
+
"--javascript=esbuild",
|
36
|
+
"--database=postgresql",
|
37
|
+
].freeze
|
38
|
+
|
172
39
|
no_tasks do
|
40
|
+
def command(name, options)
|
41
|
+
"rails new #{name} #{cli_options(options)}"
|
42
|
+
end
|
43
|
+
|
173
44
|
def cli_options(options)
|
174
|
-
options_string = "-m #{Gnarails.template_file}
|
45
|
+
options_string = "-m #{Gnarails.template_file} " + DEFAULT_OPTIONS.join(" ")
|
175
46
|
options.each_with_object(options_string) do |(k, v), str|
|
176
47
|
str << cli_option(k, v)
|
177
48
|
end
|
178
49
|
end
|
179
50
|
|
180
51
|
def cli_option(key, value)
|
181
|
-
|
52
|
+
case value
|
53
|
+
when false
|
182
54
|
""
|
183
|
-
|
55
|
+
when true
|
184
56
|
" --#{key}"
|
185
57
|
else
|
186
58
|
" --#{key}=#{value}"
|
data/lib/gnarails/version.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
name: Brakeman
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v3
|
10
|
+
|
11
|
+
- name: Setup Ruby
|
12
|
+
uses: ruby/setup-ruby@v1
|
13
|
+
with:
|
14
|
+
bundler-cache: true
|
15
|
+
|
16
|
+
- name: Brakeman
|
17
|
+
run: |
|
18
|
+
gem install brakeman --no-document
|
19
|
+
brakeman --exit-on-warn --separate-models -o tmp/brakeman.html -o tmp/brakeman.text .
|
20
|
+
brakeman_exit_code=$?
|
21
|
+
cat tmp/brakeman.text
|
22
|
+
exit $brakeman_exit_code
|
@@ -0,0 +1,26 @@
|
|
1
|
+
name: Run Tests
|
2
|
+
on: [push]
|
3
|
+
|
4
|
+
jobs:
|
5
|
+
run-tests:
|
6
|
+
runs-on: ubuntu-latest
|
7
|
+
env:
|
8
|
+
RAILS_ENV: test
|
9
|
+
DATABASE_PASSWORD: password
|
10
|
+
services:
|
11
|
+
postgres:
|
12
|
+
image: postgres:14
|
13
|
+
env:
|
14
|
+
POSTGRES_PASSWORD: password
|
15
|
+
ports: ["5432:5432"]
|
16
|
+
options:
|
17
|
+
--health-cmd pg_isready
|
18
|
+
--health-interval 10s
|
19
|
+
--health-timeout 5s
|
20
|
+
--health-retries 5
|
21
|
+
steps:
|
22
|
+
- name: Checkout code
|
23
|
+
uses: actions/checkout@v3
|
24
|
+
|
25
|
+
- name: Test
|
26
|
+
uses: ./.github/actions/test-rails
|
data/templates/README.md
CHANGED
@@ -4,10 +4,9 @@
|
|
4
4
|
|
5
5
|
```sh
|
6
6
|
$ bundle install
|
7
|
-
$
|
8
|
-
$
|
9
|
-
$
|
10
|
-
$ bundle exec rails s
|
7
|
+
$ yarn install
|
8
|
+
$ bin/setup
|
9
|
+
$ bin/dev
|
11
10
|
$ open http://localhost:3000
|
12
11
|
```
|
13
12
|
|
@@ -64,7 +63,7 @@ $ docker-compose up
|
|
64
63
|
|
65
64
|
To run rspec:
|
66
65
|
```sh
|
67
|
-
$ docker-compose run web
|
66
|
+
$ docker-compose run web ./bin/rspec
|
68
67
|
```
|
69
68
|
|
70
69
|
### Using pry with Docker
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'pronto' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if /This file was generated by Bundler/.match?(File.read(bundle_binstub, 300))
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("pronto", "pronto")
|
data/templates/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if /This file was generated by Bundler/.match?(File.read(bundle_binstub, 300))
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if /This file was generated by Bundler/.match?(File.read(bundle_binstub, 300))
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/templates/bin/setup
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
# path to your application root.
|
5
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
6
|
+
|
7
|
+
def system!(*args)
|
8
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
9
|
+
end
|
10
|
+
|
11
|
+
FileUtils.chdir APP_ROOT do
|
12
|
+
# This script is a way to set up or update your development environment automatically.
|
13
|
+
# This script is idempotent, so that you can run it at any time and get an expectable outcome.
|
14
|
+
# Add necessary setup steps to this file.
|
15
|
+
|
16
|
+
puts "== Installing dependencies =="
|
17
|
+
system! "gem install bundler --conservative"
|
18
|
+
system("bundle check") || system!("bundle install")
|
19
|
+
|
20
|
+
system! "yarn install --pure-lockfile"
|
21
|
+
|
22
|
+
puts "\n== Preparing database =="
|
23
|
+
system! "bin/rails db:prepare"
|
24
|
+
|
25
|
+
puts "\n== Removing old logs and tempfiles =="
|
26
|
+
system! "bin/rails log:clear tmp:clear"
|
27
|
+
|
28
|
+
puts "\n== Restarting application server =="
|
29
|
+
system! "bin/rails restart"
|
30
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
const path = require('path')
|
2
|
+
const rails = require('esbuild-rails')
|
3
|
+
|
4
|
+
require('esbuild').build({
|
5
|
+
entryPoints: ['application.js'],
|
6
|
+
bundle: true,
|
7
|
+
outdir: path.join(process.cwd(), 'app/assets/builds'),
|
8
|
+
absWorkingDir: path.join(process.cwd(), 'app/javascript'),
|
9
|
+
watch: process.argv.includes('--watch'),
|
10
|
+
plugins: [rails()],
|
11
|
+
}).catch(() => process.exit(1))
|
@@ -4,8 +4,8 @@
|
|
4
4
|
<title>RailsTestApp</title>
|
5
5
|
<%= csrf_meta_tags %>
|
6
6
|
|
7
|
-
<%= stylesheet_link_tag
|
8
|
-
<%=
|
7
|
+
<%= stylesheet_link_tag "application" %>
|
8
|
+
<%= javascript_include_tag "application", defer: true %>
|
9
9
|
</head>
|
10
10
|
|
11
11
|
<body>
|
@@ -5,17 +5,17 @@ RSpec.feature "Viewing all job postings", type: :system do
|
|
5
5
|
create_list :job_posting, 1
|
6
6
|
visit job_postings_path
|
7
7
|
|
8
|
-
expect(page).to
|
8
|
+
expect(page).to be_axe_clean
|
9
9
|
end
|
10
10
|
|
11
11
|
scenario "N+1 query proteection" do
|
12
12
|
job_posting = create :job_posting
|
13
|
-
job_posting.comments.create(body: "first comment")
|
14
|
-
job_posting.comments.create(body: "second comment")
|
13
|
+
job_posting.comments.create!(body: "first comment")
|
14
|
+
job_posting.comments.create!(body: "second comment")
|
15
15
|
|
16
16
|
another_posting = create :job_posting
|
17
|
-
another_posting.comments.create(body: "third comment")
|
18
|
-
another_posting.comments.create(body: "fourth comment")
|
17
|
+
another_posting.comments.create!(body: "third comment")
|
18
|
+
another_posting.comments.create!(body: "fourth comment")
|
19
19
|
|
20
20
|
expect { visit job_postings_path }
|
21
21
|
.to raise_error Bullet::Notification::UnoptimizedQueryError
|
@@ -25,10 +25,6 @@ RSpec.feature "Viewing all job postings", type: :system do
|
|
25
25
|
posting = create :job_posting
|
26
26
|
visit job_postings_path
|
27
27
|
|
28
|
-
expect(has_job_posting?(posting)).to be true
|
29
|
-
end
|
30
|
-
|
31
|
-
def has_job_posting?(posting)
|
32
28
|
within(".job-posting-#{posting.id}") do
|
33
29
|
expect(page).to have_css("td.posting-title", text: posting.title)
|
34
30
|
end
|