katapult 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +1 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile +9 -0
  5. data/README.md +122 -94
  6. data/Rakefile +13 -0
  7. data/bin/katapult +59 -25
  8. data/features/application_model.feature +55 -0
  9. data/features/authenticate.feature +88 -62
  10. data/features/basics.feature +64 -402
  11. data/features/binary.feature +56 -42
  12. data/features/configuration.feature +4 -4
  13. data/features/model.feature +21 -30
  14. data/features/navigation.feature +35 -48
  15. data/features/step_definitions/aruba_steps.rb +3 -0
  16. data/features/step_definitions/katapult_steps.rb +307 -8
  17. data/features/step_definitions/rails_steps.rb +74 -14
  18. data/features/step_definitions/test_steps.rb +5 -5
  19. data/features/step_definitions/version_steps.rb +22 -0
  20. data/features/support/env.rb +11 -3
  21. data/features/{wui.feature → web_ui.feature} +175 -148
  22. data/katapult.gemspec +8 -13
  23. data/lib/generators/katapult/app_model/app_model_generator.rb +12 -0
  24. data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +40 -0
  25. data/lib/generators/katapult/basics/basics_generator.rb +186 -51
  26. data/lib/generators/katapult/basics/templates/.browserslistrc +1 -0
  27. data/lib/generators/katapult/basics/templates/.gitignore +20 -21
  28. data/lib/generators/katapult/basics/templates/.rspec_parallel +3 -0
  29. data/lib/generators/katapult/basics/templates/Capfile +5 -1
  30. data/lib/generators/katapult/basics/templates/Gemfile +23 -34
  31. data/lib/generators/katapult/basics/templates/Guardfile +0 -12
  32. data/lib/generators/katapult/basics/templates/app/controllers/errors_controller.rb +9 -0
  33. data/lib/generators/katapult/basics/templates/app/helpers/unpoly_helper.rb +13 -0
  34. data/lib/generators/katapult/{haml → basics}/templates/app/views/layouts/_flashes.html.haml +1 -1
  35. data/lib/generators/katapult/basics/templates/app/views/layouts/_menu_bar.html.haml.tt +12 -0
  36. data/lib/generators/katapult/basics/templates/app/views/layouts/application.html.haml.tt +25 -0
  37. data/lib/generators/katapult/basics/templates/app/webpack/assets/images/.keep +0 -0
  38. data/lib/generators/katapult/basics/templates/app/webpack/assets/index.js +16 -0
  39. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/application.js +0 -0
  40. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/bootstrap.js +12 -0
  41. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/compilers/.keep +0 -0
  42. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/macros/content_link.js +17 -0
  43. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/macros/modal_link.js +17 -0
  44. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/unpoly.js +9 -0
  45. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_definitions.sass +25 -0
  46. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_environment.sass +2 -0
  47. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_mixins.sass +3 -0
  48. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/blocks/.keep +0 -0
  49. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/custom_bootstrap.sass +50 -0
  50. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/ext/.keep +0 -0
  51. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/ext/bootstrap/navbar.sass +83 -0
  52. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/theme.sass +11 -0
  53. data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/unpoly.sass +2 -0
  54. data/lib/generators/katapult/basics/templates/app/webpack/packs/application.js +13 -0
  55. data/lib/generators/katapult/basics/templates/config/database.sample.yml +1 -1
  56. data/lib/generators/katapult/basics/templates/config/deploy.rb +3 -4
  57. data/lib/generators/katapult/basics/templates/config/environments/staging.rb +5 -0
  58. data/lib/generators/katapult/basics/templates/config/initializers/better_errors.rb +23 -0
  59. data/lib/generators/katapult/basics/templates/config/initializers/exception_notification.rb.tt +1 -1
  60. data/lib/generators/katapult/basics/templates/config/initializers/ext.rb +1 -1
  61. data/lib/generators/katapult/basics/templates/config/webpack/loaders/unpoly.js +4 -0
  62. data/lib/generators/katapult/basics/templates/features/support/capybara_screenshot.rb +7 -0
  63. data/lib/generators/katapult/basics/templates/features/support/factory_bot.rb +1 -0
  64. data/lib/generators/katapult/basics/templates/features/support/paths.rb +7 -2
  65. data/lib/generators/katapult/basics/templates/features/support/rspec_doubles.rb +1 -0
  66. data/lib/generators/katapult/basics/templates/features/support/selectors.rb +3 -3
  67. data/lib/generators/katapult/basics/templates/features/support/selenium.rb +13 -0
  68. data/lib/generators/katapult/basics/templates/features/support/{env-custom.rb → spreewald.rb} +0 -0
  69. data/lib/generators/katapult/basics/templates/features/support/webpacker.rb +35 -0
  70. data/lib/generators/katapult/basics/templates/lib/ext/action_view/form_for_with_development_errors.rb +31 -31
  71. data/lib/generators/katapult/basics/templates/lib/ext/active_record/find_by_anything.rb +4 -3
  72. data/lib/generators/katapult/basics/templates/public/robots.txt +5 -0
  73. data/lib/generators/katapult/basics/templates/spec/assets/sample.pdf +0 -0
  74. data/lib/generators/katapult/basics/templates/spec/factories/factories.rb +1 -1
  75. data/lib/generators/katapult/basics/templates/spec/support/database_cleaner.rb +20 -0
  76. data/lib/generators/katapult/basics/templates/spec/support/factory_bot.rb +3 -0
  77. data/lib/generators/katapult/basics/templates/spec/support/fixture_file.rb +6 -0
  78. data/lib/generators/katapult/basics/templates/spec/support/postgresql_sequences.rb +15 -0
  79. data/lib/generators/katapult/basics/templates/spec/support/timecop.rb +3 -0
  80. data/lib/generators/katapult/clearance/clearance_generator.rb +14 -2
  81. data/lib/generators/katapult/clearance/templates/app/views/layouts/_current_user.html.haml +11 -0
  82. data/lib/generators/katapult/clearance/templates/app/views/passwords/create.html.haml +10 -4
  83. data/lib/generators/katapult/clearance/templates/app/views/passwords/edit.html.haml +12 -12
  84. data/lib/generators/katapult/clearance/templates/app/views/passwords/new.html.haml +14 -11
  85. data/lib/generators/katapult/clearance/templates/app/views/sessions/new.html.haml +16 -15
  86. data/lib/generators/katapult/clearance/templates/features/authentication.feature +3 -3
  87. data/lib/generators/katapult/cucumber_features/templates/feature.feature +1 -1
  88. data/lib/generators/katapult/model_specs/templates/model_spec.rb +3 -5
  89. data/lib/generators/katapult/navigation/navigation_generator.rb +7 -1
  90. data/lib/generators/katapult/navigation/templates/app/views/layouts/_navigation.html.haml +15 -0
  91. data/lib/generators/katapult/transform/transform_generator.rb +12 -17
  92. data/lib/generators/katapult/views/templates/_form.html.haml +48 -0
  93. data/lib/generators/katapult/views/templates/app/helpers/table_helper.rb +14 -0
  94. data/lib/generators/katapult/views/templates/app/webpack/assets/stylesheets/blocks/action_bar.sass +22 -0
  95. data/lib/generators/katapult/views/templates/app/webpack/assets/stylesheets/blocks/title.sass +11 -0
  96. data/lib/generators/katapult/views/templates/custom_action.html.haml +5 -0
  97. data/lib/generators/katapult/views/templates/edit.html.haml +4 -0
  98. data/lib/generators/katapult/views/templates/index.html.haml +26 -0
  99. data/lib/generators/katapult/{haml → views}/templates/new.html.haml +1 -1
  100. data/lib/generators/katapult/views/templates/show.html.haml +39 -0
  101. data/lib/generators/katapult/{haml/haml_generator.rb → views/views_generator.rb} +19 -25
  102. data/lib/generators/katapult/{w_u_i → web_ui}/templates/_route.rb +3 -3
  103. data/lib/generators/katapult/{w_u_i → web_ui}/templates/controller.rb +21 -23
  104. data/lib/generators/katapult/{w_u_i/w_u_i_generator.rb → web_ui/web_ui_generator.rb} +7 -12
  105. data/lib/katapult/action.rb +1 -1
  106. data/lib/katapult/application_model.rb +8 -8
  107. data/lib/katapult/binary_util.rb +48 -10
  108. data/lib/katapult/generator.rb +2 -10
  109. data/lib/katapult/generator_goodies.rb +23 -0
  110. data/lib/katapult/navigation.rb +10 -5
  111. data/lib/katapult/parser.rb +15 -8
  112. data/lib/katapult/version.rb +5 -1
  113. data/lib/katapult/{wui.rb → web_ui.rb} +19 -4
  114. data/lib/katapult.rb +0 -5
  115. data/script/console +5 -2
  116. data/script/kta +8 -0
  117. data/script/update +80 -0
  118. data/spec/action_spec.rb +0 -1
  119. data/spec/attribute_spec.rb +0 -1
  120. data/spec/element_spec.rb +0 -1
  121. data/spec/model_spec.rb +0 -1
  122. data/spec/parser_spec.rb +26 -0
  123. data/spec/util_spec.rb +0 -1
  124. data/spec/{wui_spec.rb → web_ui_spec.rb} +24 -12
  125. metadata +86 -124
  126. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_all.sass +0 -4
  127. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_items.sass +0 -11
  128. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_layout.sass +0 -26
  129. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_navigation.sass +0 -11
  130. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_tools.sass +0 -12
  131. data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application.sass +0 -6
  132. data/lib/generators/katapult/basics/templates/config/spring.rb +0 -3
  133. data/lib/generators/katapult/basics/templates/features/support/factory_girl.rb +0 -1
  134. data/lib/generators/katapult/basics/templates/spec/support/factory_girl.rb +0 -3
  135. data/lib/generators/katapult/haml/templates/_form.html.haml +0 -38
  136. data/lib/generators/katapult/haml/templates/app/views/layouts/application.html.haml +0 -33
  137. data/lib/generators/katapult/haml/templates/custom_action.html.haml +0 -5
  138. data/lib/generators/katapult/haml/templates/edit.html.haml +0 -4
  139. data/lib/generators/katapult/haml/templates/index.html.haml +0 -29
  140. data/lib/generators/katapult/haml/templates/show.html.haml +0 -39
  141. data/lib/generators/katapult/install/install_generator.rb +0 -14
  142. data/lib/generators/katapult/install/templates/lib/katapult/application_model.rb +0 -20
  143. data/lib/generators/katapult/navigation/templates/app/models/navigation.rb +0 -12
@@ -1,78 +1,107 @@
1
1
  # Generates model-independent application basics (see method names).
2
2
 
3
+ require 'katapult/generator_goodies'
4
+ require 'katapult/version' # For writing .ruby-version
5
+
3
6
  module Katapult
4
7
  module Generators
5
8
  class BasicsGenerator < Rails::Generators::Base
6
-
7
- SKIP_GEMS = %w(sass-rails coffee-rails turbolinks sdoc uglifier)
9
+ include Katapult::GeneratorGoodies
10
+
11
+ WEBPACK_DIR = 'app/webpack'
12
+ YARN_PACKAGES = %w[
13
+ autoprefixer
14
+ autosize
15
+ bootstrap-sass
16
+ jquery
17
+ jquery-ujs
18
+ unpoly
19
+ ]
8
20
 
9
21
  desc 'Generate basics like test directories and gems'
10
22
  source_root File.expand_path('../templates', __FILE__)
11
23
 
12
- class_option :db_user, type: :string, default: 'root',
24
+ class_option :db_user, type: :string, default: '',
13
25
  description: 'The user to set in config/database.yml'
14
26
  class_option :db_password, type: :string, default: '',
15
27
  description: 'The password to set in config/database.yml'
16
28
 
29
+ def write_ruby_version
30
+ template '.ruby-version'
31
+ end
17
32
 
18
33
  def add_gitignore
19
34
  template '.gitignore', force: true
20
35
  end
21
36
 
22
- def write_ruby_version
23
- template '.ruby-version'
37
+ def add_robots_txt
38
+ template 'public/robots.txt', force: true
24
39
  end
25
40
 
26
- def write_database_ymls
27
- @db_user = options.db_user
28
- @db_password = options.db_password
41
+ # Gems ###################################################################
29
42
 
30
- template 'config/database.yml', force: true
31
- template 'config/database.sample.yml'
32
- end
33
-
34
- # Overwrite Gemfile with the template, but transfer all gems that are not
35
- # skipped (see SKIP_GEMS).
36
43
  def enhance_gemfile
37
- gem_lines = File.readlines('Gemfile').select{ |line| line =~ /^gem/ }
38
- @original_gems = gem_lines.reject do |line|
39
- line =~ /'(#{ SKIP_GEMS.join '|' })'/
40
- end
41
-
44
+ # Need to transfer the katapult line, because in tests, katapult is
45
+ # installed with a custom :path option
46
+ @katapult = File.readlines('Gemfile').find{ |line| line =~ /^gem 'katapult'/ }
42
47
  template 'Gemfile', force: true
43
48
  end
44
49
 
45
50
  def bundle_install
46
51
  run 'bundle install'
47
52
 
53
+ # Fix Bundler for parallel_tests
54
+ run 'bundle config --local disable_exec_load true'
55
+
48
56
  # This is relevant for the server, so it may happen after bundling here.
49
57
  # By having Nokogiri use system libraries, it will get automatic updates
50
58
  # of the frequently broken libxml (i.e. when the system libxml updates).
51
59
  run 'bundle config --local build.nokogiri --use-system-libraries'
52
60
  end
53
61
 
54
- def remove_turbolinks_js
55
- gsub_file 'app/assets/javascripts/application.js', "//= require turbolinks\n", ''
56
- gsub_file 'app/views/layouts/application.html.erb', ", 'data-turbolinks-track' => true", ''
62
+
63
+ # Database ###############################################################
64
+
65
+ def write_database_ymls
66
+ @db_user = options.db_user
67
+ @db_password = options.db_password
68
+
69
+ template 'config/database.yml', force: true
70
+ template 'config/database.sample.yml'
71
+ end
72
+
73
+ def create_databases
74
+ # Need to unset RAILS_ENV variable for this sub command because
75
+ # parallel_tests defaults to "test" only if the variable is not set (<->
76
+ # empty string value). However, because this is run from a Rails
77
+ # generator, the variable is already set to "development". Cannot set to
78
+ # "test" either because parallel_tests is only loaded in development.
79
+ run 'unset RAILS_ENV; bundle exec rake db:drop db:create parallel:drop parallel:create'
57
80
  end
58
81
 
59
- def setup_spring
60
- # run 'spring binstub --all'
61
- # # remove_file 'bin/bundle' # Won't play together with parallel_tests
62
- # template 'config/spring.rb'
63
- # template 'bin/rake'
64
- run 'spring stop' # Reload (just in case)
82
+
83
+ # Configure Rails ########################################################
84
+
85
+ def install_application_layout
86
+ remove_file 'app/views/layouts/application.html.erb'
87
+ directory 'app/views/layouts'
65
88
  end
66
89
 
67
- def setup_guard
68
- template 'Guardfile'
69
- environment 'config.middleware.use Rack::LiveReload', env: :development
90
+ # We're using Webpacker
91
+ def remove_asset_pipeline_traces
92
+ remove_dir 'app/assets'
93
+ end
94
+
95
+ def disable_migration_errors
96
+ development = 'config/environments/development.rb'
97
+ gsub_file development, /(migration_error =) :page_load/, '\1 false'
70
98
  end
71
99
 
72
100
  def setup_staging
73
- FileUtils.copy 'config/environments/production.rb', 'config/environments/staging.rb'
74
- secret = `rake secret`.chomp
101
+ template 'config/environments/staging.rb'
102
+
75
103
  # Cheating in the "staging" secret between "test" and "production"
104
+ secret = run('bundle exec rake secret', capture: true).chomp
76
105
  insert_into_file 'config/secrets.yml', <<~SECRET, after: "test:\n"
77
106
  secret_key_base: #{ secret }
78
107
 
@@ -80,14 +109,26 @@ module Katapult
80
109
  SECRET
81
110
  end
82
111
 
83
- def create_databases
84
- run 'rake db:drop:all db:create:all parallel:create'
112
+ def configure_test_environment
113
+ test_env = 'config/environments/test.rb'
114
+
115
+ gsub_file test_env,
116
+ /# Do not eager load code on boot.*config\.eager_load = false/m,
117
+ 'config.eager_load = true'
118
+ gsub_file test_env,
119
+ / # Show full error.*\n config\.consider_all_requests_local\s.*$/,
120
+ ' config.consider_all_requests_local = false'
121
+ gsub_file test_env,
122
+ / # Disable request forgery protection.*\n config\.action_controller\.allow_forgery_protection\s.*$\n/,
123
+ ''
124
+ gsub_file test_env, /config\.action_controller\.perform_caching\s.*$/,
125
+ 'config.action_controller.perform_caching = true'
85
126
  end
86
127
 
87
128
  def configure_action_mailer
88
129
  app_con = 'app/controllers/application_controller.rb'
89
130
  inject_into_file app_con, <<-CONFIG, before: /end\n\z/
90
- before_filter :make_action_mailer_use_request_host_and_protocol
131
+ before_action :make_action_mailer_use_request_host_and_protocol
91
132
 
92
133
  private
93
134
 
@@ -96,20 +137,42 @@ module Katapult
96
137
  ActionMailer::Base.default_url_options[:host] = request.host_with_port
97
138
  end
98
139
  CONFIG
140
+
141
+ gsub_file 'app/mailers/application_mailer.rb',
142
+ /(^\s+default from:).*$/, '\1 Rails.configuration.system_email'
99
143
  end
100
144
 
101
145
  def set_timezone
146
+ # This results in correct indentation :)
147
+ application <<-'LOAD_PATHS'
148
+ config.time_zone = 'Berlin'
149
+ config.active_record.default_timezone = :local
150
+ config.active_record.time_zone_aware_attributes = false
151
+ LOAD_PATHS
102
152
  gsub_file 'config/application.rb',
103
153
  /# config\.time_zone =.*$/,
104
154
  "config.time_zone = 'Berlin'"
105
155
  end
106
156
 
157
+ def configure_system_email
158
+ application "config.system_email = 'system@#{app_name}.com'\n"
159
+ end
160
+
107
161
  def disable_asset_debugging # Faster
108
162
  gsub_file 'config/environments/development.rb',
109
163
  /config\.assets\.debug =.*$/,
110
164
  'config.assets.debug = false'
111
165
  end
112
166
 
167
+ def install_helpers
168
+ directory 'app/helpers'
169
+ end
170
+
171
+ def install_errors_controller
172
+ template 'app/controllers/errors_controller.rb'
173
+ route 'resources :errors, only: :new'
174
+ end
175
+
113
176
  def install_initializers
114
177
  directory 'config/initializers'
115
178
  end
@@ -118,6 +181,42 @@ module Katapult
118
181
  directory 'lib/ext'
119
182
  end
120
183
 
184
+
185
+ # Configure 3rd party ####################################################
186
+
187
+ def setup_spring
188
+ run 'spring binstub --all'
189
+
190
+ # Enhance Spring config
191
+ config = 'config/spring.rb'
192
+ inject_into_file config, <<-DIR, after: /\A%w\(\n/
193
+ lib/templates
194
+ DIR
195
+ prepend_to_file config, <<-MKDIR
196
+ # Custom generator templates are put into lib/templates
197
+ FileUtils.mkdir_p 'lib/templates'
198
+
199
+ MKDIR
200
+
201
+ # Parallel-fix binstubs
202
+ Dir['bin/*'].each do |binstub|
203
+ if File.read(binstub) =~ /load.*spring/
204
+ inject_into_file binstub, <<-PARALLEL, after: /\A.*\n/
205
+ running_in_parallel = ENV.has_key?('TEST_ENV_NUMBER') || ARGV.any? { |arg| arg =~ /^parallel:/ }
206
+
207
+ PARALLEL
208
+
209
+ gsub_file binstub, /^(\s*load .*spring.*)$/, '\1 unless running_in_parallel'
210
+ end
211
+ end
212
+ end
213
+
214
+ def setup_guard
215
+ template 'Guardfile'
216
+ environment "config.middleware.use Rack::LiveReload\n", env: :development
217
+ environment "config.assets.digest = false # For Guard::Livereload\n", env: :development
218
+ end
219
+
121
220
  def add_modularity_load_paths
122
221
  # This results in correct indentation :)
123
222
  application <<-'LOAD_PATHS'
@@ -129,22 +228,36 @@ config.autoload_paths << "#{Rails.root}/app/controllers/shared"
129
228
  end
130
229
 
131
230
  def install_cucumber
231
+ run 'spring stop' # Spring constantly causes trouble here
232
+
132
233
  generate 'cucumber:install'
133
234
  directory 'features/support'
134
235
  template 'config/cucumber.yml', force: true
135
236
 
136
237
  # Remove cucumber section from database.yml. Don't need this.
137
238
  gsub_file 'config/database.yml', /^cucumber.*\z/m, ''
239
+
240
+ environment <<~ACTIVE_JOB, env: 'test'
241
+ config.active_job.queue_adapter = :inline
242
+ ACTIVE_JOB
138
243
  end
139
244
 
140
245
  def install_rspec
141
246
  generate 'rspec:install'
142
247
 
248
+ directory 'spec'
249
+
143
250
  gsub_file '.rspec', "--warnings\n", '' # Don't show Ruby warnings
144
- uncomment_lines 'spec/rails_helper.rb', /Dir.Rails.root.join.+spec.support/
145
- template 'spec/support/shoulda_matchers.rb'
146
- template 'spec/support/factory_girl.rb'
147
- directory 'spec/factories'
251
+ template '.rspec_parallel'
252
+
253
+ merge_rails_helper_into_spec_helper
254
+
255
+ uncomment_lines 'spec/spec_helper.rb', /Dir.Rails.root.join.+spec.support/
256
+ gsub_file 'spec/spec_helper.rb',
257
+ /^ config\.use_transactional_fixtures = true/, <<-CONTENT
258
+ # RSpec's transaction logic needs to be disabled for DatabaseCleaner to work
259
+ config.use_transactional_fixtures = false
260
+ CONTENT
148
261
  end
149
262
 
150
263
  def install_capistrano
@@ -153,6 +266,8 @@ config.autoload_paths << "#{Rails.root}/app/controllers/shared"
153
266
  template 'Capfile', force: true
154
267
  run 'cap install'
155
268
 
269
+ deploy_rb = File.read('config/deploy.rb')
270
+ @version = deploy_rb[/^lock.*?([\d\.]+)/, 1]
156
271
  template 'config/deploy.rb', force: true
157
272
  template 'config/deploy/staging.rb', force: true
158
273
  template 'config/deploy/production.rb', force: true
@@ -161,22 +276,42 @@ config.autoload_paths << "#{Rails.root}/app/controllers/shared"
161
276
  template 'lib/tasks/pending_migrations.rake'
162
277
  end
163
278
 
164
- def install_styles
165
- remove_file 'app/assets/stylesheets/application.css'
166
- directory 'app/assets/stylesheets', force: true
167
- end
279
+ def setup_webpacker
280
+ remove_dir 'app/javascript'
281
+ directory WEBPACK_DIR
282
+ directory 'config/webpack'
168
283
 
284
+ gsub_file 'config/webpacker.yml', /^( source_path:).*$/, '\1 ' + WEBPACK_DIR
285
+ inject_into_file 'config/webpack/environment.js', <<~JQUERY, after: /\A.*\n/ # 1st line
286
+ const webpack = require('webpack')
169
287
 
170
- private
288
+ environment.plugins.set('Provide', new webpack.ProvidePlugin({
289
+ $: 'jquery',
290
+ jQuery: 'jquery'
291
+ })
292
+ )
293
+ JQUERY
171
294
 
172
- def app_name
173
- File.basename(Dir.pwd)
295
+ yarn :add, *YARN_PACKAGES
174
296
  end
175
297
 
176
- def run(*)
177
- Bundler.with_clean_env do
178
- super
179
- end
298
+ def configure_autoprefixer
299
+ template '.browserslistrc'
300
+ end
301
+
302
+ # Bundler prefers installed gems, but we want the newest versions possible
303
+ def update_gems
304
+ run 'bundle install'
305
+ end
306
+
307
+ private
308
+
309
+ def merge_rails_helper_into_spec_helper
310
+ spec_helper = File.read 'spec/spec_helper.rb'
311
+ spec_helper.gsub! /.*^RSpec\.configure.+?$/m, '' # Remove introduction
312
+ gsub_file 'spec/rails_helper.rb', /end\n\z/, spec_helper
313
+
314
+ FileUtils.mv 'spec/rails_helper.rb', 'spec/spec_helper.rb', force: true
180
315
  end
181
316
 
182
317
  end
@@ -1,28 +1,27 @@
1
- log/*
2
- tmp/*
3
- storage/*
4
- db/*.sqlite3
1
+ # See https://git-scm.com/docs/gitignore#_pattern_format
2
+
3
+ config/database.yml
5
4
  db/schema.rb
6
5
  db/structure.sql
7
- public/system
8
- public/storage
9
- public/uploads
10
- .project
11
- .idea/
12
- public/javascripts/all*
13
- public/stylesheets/all*
14
- public/stylesheets/*.css
15
- config/database.yml
16
- *~
17
- *#*
18
- .#*
6
+ /log/*
7
+ /node_modules
8
+ /public/assets
9
+ /public/packs*
10
+ /public/system
11
+ /public/storage
12
+ /public/uploads
13
+ /storage
14
+ /tmp/*
15
+
16
+ /.idea
17
+ .byebug_history
19
18
  .DS_Store
20
- webrat-*.html
21
19
  capybara-*.html
22
20
  rerun.txt
23
- coverage.data
24
- coverage/*
25
- dump_for_download.dump
21
+ yarn-error.log
22
+
23
+ *~
24
+ *#*
25
+ .#*
26
26
  .~lock.*
27
27
  .*.swp
28
- .byebug_history
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --format progress
3
+ --format ParallelTests::RSpec::RuntimeLogger --out tmp/parallel_runtime_rspec.log
@@ -4,6 +4,10 @@ require 'capistrano/setup'
4
4
  # Include default deployment tasks
5
5
  require 'capistrano/deploy'
6
6
 
7
+ # Use Git
8
+ require 'capistrano/scm/git'
9
+ install_plugin Capistrano::SCM::Git
10
+
7
11
  # Include tasks from other gems included in your Gemfile
8
12
  require 'capistrano/bundler'
9
13
  require 'capistrano/maintenance'
@@ -11,7 +15,7 @@ require 'capistrano/rails/assets'
11
15
  require 'capistrano/rails/migrations'
12
16
  require 'whenever/capistrano'
13
17
 
14
- Dir.glob('lib/capistrano/tasks/*.rake').each do |r|
18
+ Dir.glob('lib/capistrano/tasks/*.rake').sort.each do |r|
15
19
  # `import r` calls Rake.application.add_import(r), which imports the file only
16
20
  # *after* this file has been processed, so the imported tasks would not be
17
21
  # available to the hooks below.
@@ -1,63 +1,52 @@
1
1
  source 'https://rubygems.org'
2
+ git_source(:github) { |repo_path| "https://github.com/#{repo_path}.git" }
2
3
 
3
- <%= @original_gems.join %>
4
+ gem 'rails'
5
+ gem 'pg'
6
+ gem 'webpacker'
7
+ <%= @katapult -%>
4
8
 
5
- # internal
9
+ # Internals and security
6
10
  gem 'exception_notification'
7
11
  # gem 'admin_cleaner', git: 'git@code.makandra.de:makandra/admin_cleaner.git'
8
12
 
9
- # security
10
- gem 'breach-mitigation-rails'
11
- gem 'safe_cookies'
12
-
13
- # better coding
14
- gem 'modularity'
13
+ # Models
14
+ gem 'active_type'
15
+ gem 'assignable_values'
15
16
  gem 'edge_rider'
16
- gem 'andand'
17
-
18
- # models
19
17
  gem 'has_defaults'
20
- gem 'assignable_values'
21
-
22
- # gem 'carrierwave'
23
- # gem 'mini_magick'
24
-
25
- # gem 'spreadsheet'
26
- # gem 'vcard'
18
+ gem 'modularity'
27
19
 
28
- # views
29
- # gem 'simple_form'
30
- # gem 'nested_form'
20
+ # Views
21
+ gem 'haml-rails'
31
22
  gem 'will_paginate'
32
- gem 'makandra-navy', require: 'navy'
33
23
 
34
- # assets
35
- gem 'haml-rails'
36
- gem 'bootstrap-sass'
37
- gem 'sass-rails'
38
- gem 'autoprefixer-rails'
39
- gem 'coffee-rails'
40
- gem 'therubyracer', platform: :ruby
41
- gem 'uglifier'
42
- gem 'compass-rails'
43
- gem 'compass-rgbapng'
24
+ # Jobs
25
+ gem 'whenever'
44
26
 
45
27
  group :development do
46
28
  gem 'query_diet'
47
29
  gem 'better_errors'
48
30
  gem 'binding_of_caller'
31
+
32
+ gem 'web-console'
33
+ gem 'listen', '< 3.2'
34
+
49
35
  gem 'thin'
50
36
 
51
37
  gem 'parallel_tests'
38
+
52
39
  gem 'guard-livereload', require: false
53
40
  gem 'rack-livereload'
41
+
54
42
  gem 'spring-commands-rspec'
55
43
  gem 'spring-commands-cucumber'
56
44
  end
57
45
 
58
46
  group :development, :test do
59
47
  gem 'byebug'
60
- gem 'factory_girl_rails'
48
+
49
+ gem 'factory_bot_rails'
61
50
  gem 'rspec-rails'
62
51
  gem 'spring'
63
52
  end
@@ -69,7 +58,7 @@ group :test do
69
58
 
70
59
  gem 'capybara'
71
60
  gem 'capybara-screenshot'
72
- gem 'cucumber', '< 2' # Incompatible with Cucumber Factory
61
+ gem 'cucumber', '< 2.2' # Incompatible with Cucumber Factory
73
62
  gem 'cucumber-rails', require: false
74
63
  gem 'cucumber_factory'
75
64
  gem 'selenium-webdriver'
@@ -25,20 +25,8 @@
25
25
 
26
26
  guard 'livereload' do
27
27
  watch %r{app/views/.+\.(erb|haml)$}
28
- watch 'app/models/navigation.rb' # Navy
29
28
  watch 'app/models/power.rb' # Consul
30
29
  watch %r{app/helpers/.+\.rb}
31
- watch %r{public/.+\.(css|js|html)}
32
30
  watch %r{config/locales/.+\.yml}
33
31
  watch %r{spec/javascripts/} # Jasmine
34
-
35
- # Rails Assets Pipeline
36
- watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|sass|js|coffee|html|png|jpg))).*}) do |m|
37
- filename = m[3]
38
- # When a .sass (or .css.sass) file was changed, tell the client to load the .css version.
39
- # Similarly, for .coffee / .js.coffee files we ask the client to reload the .js file.
40
- filename.gsub! /(\.css)?\.sass$/, '.css'
41
- filename.gsub! /(\.js)?\.coffee$/, '.js'
42
- "/assets/#{filename}"
43
- end
44
32
  end
@@ -0,0 +1,9 @@
1
+ class ErrorsController < ApplicationController
2
+
3
+ TestException = Class.new(StandardError)
4
+
5
+ def new
6
+ raise TestException, 'Test exception. All is well.'
7
+ end
8
+
9
+ end
@@ -0,0 +1,13 @@
1
+ module UnpolyHelper
2
+
3
+ def content_link_to(*args, **options, &block)
4
+ target = options.delete(:target) || ''
5
+ link_to *args, **options.merge('content-link': target), &block
6
+ end
7
+
8
+ def modal_link_to(*args, **options, &block)
9
+ target = options.delete(:target) || ''
10
+ link_to *args, **options.merge('modal-link': target), &block
11
+ end
12
+
13
+ end
@@ -1,3 +1,3 @@
1
- - flash.each do |level, message|
1
+ - flash.each do |_level, message|
2
2
  .flash.alert.alert-info
3
3
  = message
@@ -0,0 +1,12 @@
1
+ %nav.navbar.navbar-default
2
+ .container-fluid
3
+ .navbar-header
4
+ -# Mobile menu button
5
+ %button.navbar-toggle.collapsed{ data: { target: '#navbar', toggle: 'collapse' } }
6
+ %span.icon-bar
7
+ %span.icon-bar
8
+ %span.icon-bar
9
+
10
+ = link_to '<%= app_name.titleize %>', root_path, class: 'navbar-brand'
11
+
12
+ #navbar.navbar-collapse.collapse
@@ -0,0 +1,25 @@
1
+ !!!
2
+ %html{ lang: I18n.locale }
3
+
4
+ %head
5
+ %meta(charset='utf-8')
6
+ %meta(http-equiv='x-ua-compatible' content='ie=edge')
7
+ %meta(name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no')
8
+
9
+ = csrf_meta_tags
10
+
11
+ %title
12
+ <%= app_name.titlecase %>
13
+
14
+ = javascript_pack_tag 'application'
15
+ = stylesheet_pack_tag 'application'
16
+
17
+ %body{ data: {env: Rails.env} }
18
+ = query_diet_widget(bad_count: 15) if Rails.env.development?
19
+
20
+ .container
21
+ = render 'layouts/menu_bar'
22
+ = render 'layouts/flashes'
23
+
24
+ .content
25
+ = yield
@@ -0,0 +1,16 @@
1
+ // This file will be processed when the directory gets imported
2
+
3
+ // Javascript
4
+ let webpackContext = require.context('./javascripts', true, /\.js$/)
5
+ for(let key of webpackContext.keys()) { webpackContext(key) }
6
+
7
+ // Images
8
+ require.context('./images', true, /\.(?:png|jpg|gif|ico|svg)$/)
9
+
10
+ // Styles
11
+ import './stylesheets/custom_bootstrap'
12
+ import './stylesheets/theme'
13
+ import './stylesheets/unpoly'
14
+
15
+ require.context('./stylesheets/blocks', true, /\.sass$/)
16
+ require.context('./stylesheets/ext', true, /\.sass$/)
@@ -0,0 +1,12 @@
1
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/transition'
2
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/alert'
3
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/button'
4
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/carousel'
5
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/collapse'
6
+ import 'bootstrap-sass/assets/javascripts/bootstrap/dropdown'
7
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/modal'
8
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/tab'
9
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/affix'
10
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/scrollspy'
11
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/tooltip'
12
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/popover'