katapult 0.2.0 → 0.3.0

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.
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'