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,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