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,57 +1,53 @@
1
1
  class <%= model_name(:classes) %>Controller < ApplicationController
2
- <%- if navigation -%>
3
-
4
- before_filter :set_section
5
- <%- end -%>
6
- <% if wui.find_action :index -%>
2
+ <% if web_ui.find_action :index -%>
7
3
 
8
4
  def index
9
5
  <%= method_name(:load_collection) %>
10
6
  end
11
7
  <% end -%>
12
- <% if wui.find_action :show -%>
8
+ <% if web_ui.find_action :show -%>
13
9
 
14
10
  def show
15
11
  <%= method_name(:load_object) %>
16
12
  end
17
13
  <% end -%>
18
- <% if wui.find_action :new -%>
14
+ <% if web_ui.find_action :new -%>
19
15
 
20
16
  def new
21
17
  <%= method_name(:build) %>
22
18
  end
23
19
  <% end -%>
24
- <% if wui.find_action :create -%>
20
+ <% if web_ui.find_action :create -%>
25
21
 
26
22
  def create
27
23
  <%= method_name(:build) %>
28
- <%= method_name(:save) %> or render :new
24
+ <%= method_name(:save) %>
29
25
  end
30
26
  <% end -%>
31
- <% if wui.find_action :edit -%>
27
+ <% if web_ui.find_action :edit -%>
32
28
 
33
29
  def edit
34
30
  <%= method_name(:load_object) %>
35
31
  <%= method_name(:build) %>
36
32
  end
37
33
  <% end -%>
38
- <% if wui.find_action :update -%>
34
+ <% if web_ui.find_action :update -%>
39
35
 
40
36
  def update
41
37
  <%= method_name(:load_object) %>
42
38
  <%= method_name(:build) %>
43
- <%= method_name(:save) %> or render :edit
39
+ <%= method_name(:save) %>
44
40
  end
45
41
  <% end -%>
46
- <% if wui.find_action :destroy -%>
42
+ <% if web_ui.find_action :destroy -%>
47
43
 
48
44
  def destroy
49
45
  <%= method_name(:load_object) %>
50
46
  <%= model_name(:ivar) %>.destroy
51
- redirect_to <%= wui.path(:index) %>
47
+ redirect_to <%= web_ui.path(:index) %>
52
48
  end
53
49
  <% end -%>
54
- <% wui.custom_actions.each do |action| -%>
50
+ <% web_ui.custom_actions.each do |action| -%>
55
51
 
56
52
  def <%= action.name %>
57
53
  <% if action.member? -%>
@@ -62,7 +58,7 @@ class <%= model_name(:classes) %>Controller < ApplicationController
62
58
  <% elsif action.collection? -%>
63
59
  <%= method_name(:load_collection) %>
64
60
  <%- unless action.get? -%>
65
- redirect_to <%= wui.path(:index) %>
61
+ redirect_to <%= web_ui.path(:index) %>
66
62
  <%- end -%>
67
63
  <% end -%>
68
64
  end
@@ -79,28 +75,30 @@ class <%= model_name(:classes) %>Controller < ApplicationController
79
75
  end
80
76
 
81
77
  def <%= method_name(:build) %>
82
- <%= model_name(:ivar) %> ||= <%= method_name(:scope) %>.build
78
+ <%= model_name(:ivar) %> ||= <%= method_name(:scope) %>.new
83
79
  <%= model_name(:ivar) %>.attributes = <%= method_name(:params) %>
84
80
  end
85
81
 
86
82
  def <%= method_name(:save) %>
87
83
  if <%= model_name(:ivar) %>.save
88
84
  redirect_to <%= model_name(:ivar) %>
85
+ else
86
+ action = <%= model_name(:ivar) %>.new_record? ? 'new' : 'edit'
87
+ render action, status: :unprocessable_entity
89
88
  end
90
89
  end
91
90
 
92
91
  def <%= method_name(:params) %>
93
92
  <%= method_name(:params) %> = params[:<%= model_name(:variable) %>]
94
- <%= method_name(:params) %> ? <%= method_name(:params) %>.permit(%i[<%= wui.model.attrs.map(&:name).join(' ') %>]) : {}
93
+ return {} if <%= method_name(:params) %>.blank?
94
+
95
+ <%= method_name(:params) %>.permit(
96
+ <%= web_ui.params.join(",\n ") %>,
97
+ )
95
98
  end
96
99
 
97
100
  def <%= method_name(:scope) %>
98
101
  <%= model_name(:class) %>.scoped
99
102
  end
100
103
 
101
- <%- if navigation -%>
102
- def set_section
103
- in_sections <%= navigation.section_name(wui) %>
104
- end
105
- <%- end -%>
106
104
  end
@@ -1,11 +1,11 @@
1
- # Generate a controller, routes and view files for a WUI.
1
+ # Generate a controller, routes and view files for a WebUI instance
2
2
 
3
3
  require 'katapult/generator'
4
- require 'generators/katapult/haml/haml_generator'
4
+ require 'generators/katapult/views/views_generator'
5
5
 
6
6
  module Katapult
7
7
  module Generators
8
- class WUIGenerator < Katapult::Generator
8
+ class WebUIGenerator < Katapult::Generator
9
9
 
10
10
  desc 'Generate a Web User Interface'
11
11
 
@@ -24,12 +24,11 @@ module Katapult
24
24
  if routes =~ /^\s+resources #{ route }/
25
25
  say_status :warn, <<MESSAGE, :red
26
26
  Routes for #{ route } already exist! Not updated.
27
-
28
27
  In order to keep existing routes created by the user, the config/routes.rb file
29
28
  is not wiped on model transformation. To have Katapult update the #{ route }
30
29
  route for you, delete it before transforming the application model.
31
30
  MESSAGE
32
- elsif wui.crud_only?
31
+ elsif web_ui.crud_only?
33
32
  route "resources #{ route }"
34
33
  else
35
34
  route render_partial('_route.rb')
@@ -37,7 +36,7 @@ MESSAGE
37
36
  end
38
37
 
39
38
  def generate_views
40
- Generators::HamlGenerator.new(wui).invoke_all
39
+ Generators::ViewsGenerator.new(web_ui).invoke_all
41
40
  end
42
41
 
43
42
  no_tasks do
@@ -53,17 +52,13 @@ MESSAGE
53
52
  end
54
53
 
55
54
  def model_name(kind = nil)
56
- wui.model_name(kind)
57
- end
58
-
59
- def navigation
60
- wui.application_model.navigation
55
+ web_ui.model_name(kind)
61
56
  end
62
57
  end
63
58
 
64
59
  private
65
60
 
66
- def wui
61
+ def web_ui
67
62
  @element
68
63
  end
69
64
 
@@ -1,4 +1,4 @@
1
- # Models a controller action. To be used within the block of a WUI.
1
+ # Models a controller action. To be used within the block of a WebUI.
2
2
 
3
3
  require 'katapult/element'
4
4
  require 'active_support/core_ext/module/delegation'
@@ -3,11 +3,11 @@
3
3
  module Katapult
4
4
  class ApplicationModel
5
5
 
6
- attr_reader :models, :wuis, :navigation, :authentication
6
+ attr_reader :models, :web_uis, :navigation, :authentication
7
7
 
8
8
  def initialize
9
9
  @models = []
10
- @wuis = []
10
+ @web_uis = []
11
11
  end
12
12
 
13
13
  def add_model(model)
@@ -19,13 +19,13 @@ module Katapult
19
19
  models.find { |m| m.name == name }
20
20
  end
21
21
 
22
- def add_wui(wui)
23
- wui.set_application_model(self)
24
- @wuis << wui
22
+ def add_web_ui(web_ui)
23
+ web_ui.set_application_model(self)
24
+ @web_uis << web_ui
25
25
  end
26
26
 
27
- def get_wui(name)
28
- wuis.find { |w| w.name == name }
27
+ def get_web_ui(name)
28
+ web_uis.find { |w| w.name == name }
29
29
  end
30
30
 
31
31
  def set_navigation(navigation)
@@ -43,7 +43,7 @@ module Katapult
43
43
 
44
44
  def render
45
45
  models.each &:render
46
- wuis.each &:render
46
+ web_uis.each &:render
47
47
  navigation.render if navigation
48
48
  authentication.render if authentication
49
49
  end
@@ -1,9 +1,10 @@
1
1
  # Utility methods.
2
2
 
3
- # The Katapult::Util module is used inside the `katapult` script. It should not
4
- # require any gems in order to prevent version conflicts.
5
- require_relative '../katapult'
3
+ # This module is used inside the `katapult` binary and thus should not
4
+ # require any gems in order to prevent version conflicts
5
+ require_relative '../katapult/version'
6
6
  require 'bundler'
7
+ require 'io/console'
7
8
 
8
9
  module Katapult
9
10
  module BinaryUtil
@@ -15,23 +16,60 @@ module Katapult
15
16
  end
16
17
 
17
18
  def create_rails_app(name)
18
- run "rails _#{ Katapult::RAILS_VERSION }_ new #{ name } --skip-test-unit --skip-bundle --database postgresql"
19
+ version = Katapult::RAILS_VERSION
20
+ options = %w[
21
+ --database postgresql
22
+ --webpack
23
+
24
+ --skip-test
25
+ --skip-system-test
26
+ --skip-turbolinks
27
+ ]
28
+
29
+ success = run "rails _#{version}_ new #{name} " + options.join(' ')
30
+ success or fail 'Failed to create Rails app'
31
+ end
32
+
33
+ def pink(*args, linefeed: true)
34
+ message = "> #{ args.join ' ' }"
35
+ message.prepend($/) if linefeed
36
+ message << (linefeed ? $/ : ' ')
37
+
38
+ pink_message = "\e[35m#{ message }\e[0m"
39
+ print pink_message
19
40
  end
20
41
 
21
- def puts(*args)
22
- message = "\n> #{ args.join ' ' }"
23
- Kernel.puts "\e[35m#{ message }\e[0m" # pink
42
+ def ask(question)
43
+ pink(question, linefeed: false)
44
+ gets.chomp
24
45
  end
25
46
 
26
47
  # With clean Bundler env
27
48
  def run(command)
28
49
  success = Bundler.with_clean_env { system command }
50
+ success or fail 'Something went wrong'
51
+ end
29
52
 
30
- if !success
31
- puts 'x Something went wrong'
32
- exit(1)
53
+ def job(do_something, done = 'Done.', &job)
54
+ pink "About to #{do_something}. [C]ontinue, [s]kip or [e]xit?"
55
+
56
+ case $stdin.getch
57
+ when 's' then puts('Skipped.')
58
+ when 'e' then fail('Cancelled.')
59
+ else
60
+ job.call
61
+ puts done
33
62
  end
34
63
  end
35
64
 
65
+ def fail(message)
66
+ puts "x #{message}"
67
+ exit(1)
68
+ end
69
+
70
+ def snake_case(string)
71
+ string.gsub(/([a-z])([A-Z])/,'\1_\2').downcase
72
+ end
73
+
36
74
  end
37
75
  end
@@ -1,9 +1,11 @@
1
1
  # The katapult generator base class, slightly adapted from Rails generators.
2
2
 
3
3
  require 'rails/generators'
4
+ require 'katapult/generator_goodies'
4
5
 
5
6
  module Katapult
6
7
  class Generator < Rails::Generators::NamedBase
8
+ include Katapult::GeneratorGoodies
7
9
 
8
10
  attr_accessor :element
9
11
 
@@ -15,20 +17,10 @@ module Katapult
15
17
 
16
18
  private
17
19
 
18
- def app_name
19
- File.basename(Dir.pwd)
20
- end
21
-
22
20
  def render_partial(template_path, given_binding = nil)
23
21
  path = File.join(self.class.source_root, template_path)
24
22
  ERB.new(::File.binread(path), nil, '%').result(given_binding || binding)
25
23
  end
26
24
 
27
- def run(*)
28
- Bundler.with_clean_env do
29
- super
30
- end
31
- end
32
-
33
25
  end
34
26
  end
@@ -0,0 +1,23 @@
1
+ module Katapult::GeneratorGoodies
2
+
3
+ def yarn(*args)
4
+ command = 'bin/yarn ' + args.join(' ')
5
+ run command
6
+ end
7
+
8
+ private
9
+
10
+ def app_name
11
+ File.basename(Dir.pwd)
12
+ end
13
+
14
+ # Override Thor method
15
+ def run(command, config={})
16
+ config[:capture] ||= false # false = return boolean instead of cmd output
17
+
18
+ Bundler.with_clean_env do
19
+ super(command, config) or exit(1)
20
+ end
21
+ end
22
+
23
+ end
@@ -1,4 +1,4 @@
1
- # Models a navigation.
1
+ # Models the main menu
2
2
 
3
3
  require 'katapult/element'
4
4
  require 'generators/katapult/navigation/navigation_generator'
@@ -6,12 +6,17 @@ require 'generators/katapult/navigation/navigation_generator'
6
6
  module Katapult
7
7
  class Navigation < Element
8
8
 
9
- def wuis
10
- application_model.wuis
9
+ def web_uis
10
+ application_model.web_uis
11
11
  end
12
12
 
13
- def section_name(wui)
14
- wui.model_name(:symbols)
13
+ def links
14
+ web_uis.each_with_object({}) do |web_ui, map|
15
+ next unless web_ui.find_action(:index).present?
16
+
17
+ label = web_ui.model_name :humans
18
+ map[label] = web_ui.path(:index)
19
+ end
15
20
  end
16
21
 
17
22
  def render
@@ -3,7 +3,7 @@
3
3
 
4
4
  require_relative 'application_model'
5
5
  require 'katapult/model'
6
- require 'katapult/wui'
6
+ require 'katapult/web_ui'
7
7
  require 'katapult/navigation'
8
8
  require 'katapult/authentication'
9
9
 
@@ -14,21 +14,28 @@ module Katapult
14
14
  self.application_model = Katapult::ApplicationModel.new
15
15
  end
16
16
 
17
- def parse(path_to_app_model_file)
18
- instance_eval File.read(path_to_app_model_file), path_to_app_model_file
17
+ def parse(application_model_string, path_to_model = '')
18
+ instance_eval application_model_string, path_to_model
19
19
 
20
20
  application_model
21
21
  end
22
22
 
23
- def model(name, options = {}, &block)
24
- application_model.add_model Model.new(name, options, &block)
23
+ def model(name, &block)
24
+ application_model.add_model Model.new(name, &block)
25
25
  end
26
26
 
27
- def wui(name, options = {}, &block)
28
- application_model.add_wui WUI.new(name, options, &block)
27
+ def web_ui(name, options = {}, &block)
28
+ application_model.add_web_ui WebUI.new(name, options, &block)
29
29
  end
30
30
 
31
- def navigation(name)
31
+ # A shortcut to create a #model together with a default #web_ui with CRUD
32
+ # actions
33
+ def crud(name, &block)
34
+ application_model.add_model Model.new(name, &block)
35
+ application_model.add_web_ui WebUI.new(name, &:crud)
36
+ end
37
+
38
+ def navigation(name = :main)
32
39
  application_model.set_navigation Navigation.new(name)
33
40
  end
34
41
 
@@ -1,3 +1,7 @@
1
1
  module Katapult
2
- VERSION = '0.2.0'
2
+ ruby_version_path = File.expand_path('../../.ruby-version', __dir__)
3
+
4
+ VERSION = '0.3.0'
5
+ RUBY_VERSION = File.read(ruby_version_path).strip
6
+ RAILS_VERSION = '5.1.4'
3
7
  end
@@ -3,10 +3,10 @@
3
3
 
4
4
  require 'katapult/element'
5
5
  require 'katapult/action'
6
- require 'generators/katapult/w_u_i/w_u_i_generator'
6
+ require 'generators/katapult/web_ui/web_ui_generator'
7
7
 
8
8
  module Katapult
9
- class WUI < Element
9
+ class WebUI < Element
10
10
 
11
11
  options :model
12
12
  attr_accessor :actions
@@ -14,6 +14,7 @@ module Katapult
14
14
  RAILS_ACTIONS = %w[ index show new create edit update destroy ]
15
15
  UnknownActionError = Class.new(StandardError)
16
16
  UnknownModelError = Class.new(StandardError)
17
+ MissingLabelAttrError = Class.new(StandardError)
17
18
 
18
19
  def initialize(*args)
19
20
  self.actions = []
@@ -41,7 +42,13 @@ module Katapult
41
42
  def model
42
43
  model_name = @model || self.name
43
44
  application_model.get_model(model_name) or raise UnknownModelError,
44
- "Could not find a model named #{model_name}"
45
+ "Cannot find a model named #{model_name}"
46
+ end
47
+
48
+ def params
49
+ model.attrs.map do |attr|
50
+ attr.name :symbol
51
+ end
45
52
  end
46
53
 
47
54
  def custom_actions
@@ -74,7 +81,15 @@ module Katapult
74
81
  end
75
82
 
76
83
  def render
77
- Generators::WUIGenerator.new(self).invoke_all
84
+ validate!
85
+ Generators::WebUIGenerator.new(self).invoke_all
86
+ end
87
+
88
+ private
89
+
90
+ def validate!
91
+ model.label_attr.present? or raise MissingLabelAttrError,
92
+ 'Cannot render a WebUI without a model with a label attribute'
78
93
  end
79
94
 
80
95
  end
data/lib/katapult.rb CHANGED
@@ -1,7 +1,2 @@
1
- require 'active_support'
2
- require 'active_support/core_ext/hash/slice'
3
-
4
1
  module Katapult
5
- RAILS_VERSION = '4.2.6'
6
- RUBY_VERSION = '2.3.0'
7
2
  end
data/script/console CHANGED
@@ -4,12 +4,15 @@
4
4
  # Run `script/console` from the gem root to start an IRB with the gem loaded.
5
5
 
6
6
  # Remember to require classes before using them,
7
- # i.e. run `require 'katapult/wui'` before `Katapult::WUI.new :example_name`.
7
+ # i.e. `require 'katapult/model'` before `Katapult::Model.new :example_name`
8
8
 
9
9
  irb_options = [
10
10
  '-Ilib', # add lib/ to load_path
11
11
  '-d', # set $DEBUG = true
12
- '-rkatapult', # require katapult
12
+ # Requires
13
+ '-rkatapult/version',
14
+ '-rrails',
15
+ '-rrails/generators',
13
16
  '-f' # don't read ~/.irbrc
14
17
  ]
15
18
 
data/script/kta ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env sh
2
+
3
+ # kta = katapult_test_app
4
+ # This script executes its arguments as shell command inside the generated
5
+ # katapult test app directory
6
+
7
+ cd tmp/aruba/katapult_test_app
8
+ eval $@
data/script/update ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/katapult/version'
4
+ require_relative '../lib/katapult/binary_util'
5
+
6
+ u = Katapult::BinaryUtil
7
+ version_path = 'lib/katapult/version.rb'
8
+
9
+
10
+ # Intro ########################################################################
11
+
12
+ at_project_root = File.exists?('lib/katapult.rb')
13
+ at_project_root or fail 'Run this script from the Katapult project root.'
14
+
15
+ puts <<INTRO
16
+ Katapult #{Katapult::VERSION}
17
+
18
+ This script will help you continue development on Katapult: updating the
19
+ versions of Ruby and Rails, wiping tmp/ and more.
20
+
21
+ It will always ask before doing anything.
22
+
23
+ The script is intended as a one-time updater, but it wont' do harm if run
24
+ repeatedly.
25
+
26
+ INTRO
27
+
28
+ u.pink "The Ruby version is #{`ruby -v`.chomp}."
29
+ puts 'Should katapult use that version? [yN]'
30
+ case $stdin.getch
31
+ when 'y' then puts 'Ok.'
32
+ else
33
+ u.pink 'Please configure the Ruby version in .ruby-version, then re-run this script.'
34
+ exit
35
+ end
36
+
37
+ # Jobs #########################################################################
38
+
39
+ u.job 'update Bundler' do
40
+ system 'gem install bundler'
41
+ end
42
+
43
+ u.job "update Rails version (current: #{Katapult::RAILS_VERSION})", "#{version_path} updated." do
44
+ print 'Please enter the desired Rails version: '
45
+ rails_v = gets.strip
46
+
47
+ version_rb = File.read version_path
48
+ version_rb.gsub! /^( RAILS_VERSION =).*$/, "\\1 '#{rails_v}'"
49
+ File.open version_path, 'w' do |f|
50
+ f.write version_rb
51
+ end
52
+ end
53
+
54
+ u.job 'update installed gems' do
55
+ system 'bundle update'
56
+ end
57
+
58
+ u.job 'update README' do
59
+ system 'rake update_readme'
60
+ end
61
+
62
+ u.job 'wipe tmp directory' do
63
+ puts 'Wiping ...'
64
+ FileUtils.rm_rf 'tmp'
65
+ end
66
+
67
+ sleep 1
68
+ puts <<-DEBUG
69
+
70
+ This script is done. Now you need to fix whatever was broken by the updates.
71
+
72
+ The suggested way is to run the following features one by one, fixing issues as
73
+ they occur:
74
+ features/basics.feature
75
+ features/binary.feature
76
+ features/model.feature
77
+
78
+ In order to see the application output of Cucumber tests you may tag them with
79
+ @announce-output.
80
+ DEBUG
data/spec/action_spec.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'katapult/action'
3
2
 
4
3
  describe Katapult::Action do
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'katapult/attribute'
3
2
 
4
3
  describe Katapult::Attribute do
data/spec/element_spec.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'katapult/element'
3
2
 
4
3
  describe Katapult::Element do
data/spec/model_spec.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'katapult/model'
3
2
  require 'katapult/attribute'
4
3
 
@@ -0,0 +1,26 @@
1
+ require 'katapult/parser'
2
+
3
+ describe Katapult::Parser do
4
+
5
+ describe '#crud' do
6
+ it 'creates a model plus a web UI with crud actions' do
7
+ model = <<-MODEL
8
+ crud 'user' do |user|
9
+ user.attr :age
10
+ end
11
+ MODEL
12
+
13
+ parsed_model = subject.parse(model)
14
+ expect(parsed_model.models.count).to be 1
15
+ user = parsed_model.models.first
16
+ expect(user.name).to eq 'user'
17
+ expect(user.attrs.count).to be 1
18
+ expect(user.attrs.first.name).to eq 'age'
19
+
20
+ expect(parsed_model.web_uis.count).to be 1
21
+ web_ui = parsed_model.web_uis.first
22
+ expect(web_ui.actions.map(&:name)).to match Katapult::WebUI::RAILS_ACTIONS
23
+ end
24
+ end
25
+
26
+ end
data/spec/util_spec.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'katapult/binary_util'
3
2
 
4
3
  describe Katapult::BinaryUtil do