katapult 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rspec +1 -0
- data/.ruby-version +1 -1
- data/Gemfile +9 -0
- data/README.md +122 -94
- data/Rakefile +13 -0
- data/bin/katapult +59 -25
- data/features/application_model.feature +55 -0
- data/features/authenticate.feature +88 -62
- data/features/basics.feature +64 -402
- data/features/binary.feature +56 -42
- data/features/configuration.feature +4 -4
- data/features/model.feature +21 -30
- data/features/navigation.feature +35 -48
- data/features/step_definitions/aruba_steps.rb +3 -0
- data/features/step_definitions/katapult_steps.rb +307 -8
- data/features/step_definitions/rails_steps.rb +74 -14
- data/features/step_definitions/test_steps.rb +5 -5
- data/features/step_definitions/version_steps.rb +22 -0
- data/features/support/env.rb +11 -3
- data/features/{wui.feature → web_ui.feature} +175 -148
- data/katapult.gemspec +8 -13
- data/lib/generators/katapult/app_model/app_model_generator.rb +12 -0
- data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +40 -0
- data/lib/generators/katapult/basics/basics_generator.rb +186 -51
- data/lib/generators/katapult/basics/templates/.browserslistrc +1 -0
- data/lib/generators/katapult/basics/templates/.gitignore +20 -21
- data/lib/generators/katapult/basics/templates/.rspec_parallel +3 -0
- data/lib/generators/katapult/basics/templates/Capfile +5 -1
- data/lib/generators/katapult/basics/templates/Gemfile +23 -34
- data/lib/generators/katapult/basics/templates/Guardfile +0 -12
- data/lib/generators/katapult/basics/templates/app/controllers/errors_controller.rb +9 -0
- data/lib/generators/katapult/basics/templates/app/helpers/unpoly_helper.rb +13 -0
- data/lib/generators/katapult/{haml → basics}/templates/app/views/layouts/_flashes.html.haml +1 -1
- data/lib/generators/katapult/basics/templates/app/views/layouts/_menu_bar.html.haml.tt +12 -0
- data/lib/generators/katapult/basics/templates/app/views/layouts/application.html.haml.tt +25 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/images/.keep +0 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/index.js +16 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/application.js +0 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/bootstrap.js +12 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/compilers/.keep +0 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/macros/content_link.js +17 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/macros/modal_link.js +17 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/unpoly.js +9 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_definitions.sass +25 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_environment.sass +2 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/_mixins.sass +3 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/blocks/.keep +0 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/custom_bootstrap.sass +50 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/ext/.keep +0 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/ext/bootstrap/navbar.sass +83 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/theme.sass +11 -0
- data/lib/generators/katapult/basics/templates/app/webpack/assets/stylesheets/unpoly.sass +2 -0
- data/lib/generators/katapult/basics/templates/app/webpack/packs/application.js +13 -0
- data/lib/generators/katapult/basics/templates/config/database.sample.yml +1 -1
- data/lib/generators/katapult/basics/templates/config/deploy.rb +3 -4
- data/lib/generators/katapult/basics/templates/config/environments/staging.rb +5 -0
- data/lib/generators/katapult/basics/templates/config/initializers/better_errors.rb +23 -0
- data/lib/generators/katapult/basics/templates/config/initializers/exception_notification.rb.tt +1 -1
- data/lib/generators/katapult/basics/templates/config/initializers/ext.rb +1 -1
- data/lib/generators/katapult/basics/templates/config/webpack/loaders/unpoly.js +4 -0
- data/lib/generators/katapult/basics/templates/features/support/capybara_screenshot.rb +7 -0
- data/lib/generators/katapult/basics/templates/features/support/factory_bot.rb +1 -0
- data/lib/generators/katapult/basics/templates/features/support/paths.rb +7 -2
- data/lib/generators/katapult/basics/templates/features/support/rspec_doubles.rb +1 -0
- data/lib/generators/katapult/basics/templates/features/support/selectors.rb +3 -3
- data/lib/generators/katapult/basics/templates/features/support/selenium.rb +13 -0
- data/lib/generators/katapult/basics/templates/features/support/{env-custom.rb → spreewald.rb} +0 -0
- data/lib/generators/katapult/basics/templates/features/support/webpacker.rb +35 -0
- data/lib/generators/katapult/basics/templates/lib/ext/action_view/form_for_with_development_errors.rb +31 -31
- data/lib/generators/katapult/basics/templates/lib/ext/active_record/find_by_anything.rb +4 -3
- data/lib/generators/katapult/basics/templates/public/robots.txt +5 -0
- data/lib/generators/katapult/basics/templates/spec/assets/sample.pdf +0 -0
- data/lib/generators/katapult/basics/templates/spec/factories/factories.rb +1 -1
- data/lib/generators/katapult/basics/templates/spec/support/database_cleaner.rb +20 -0
- data/lib/generators/katapult/basics/templates/spec/support/factory_bot.rb +3 -0
- data/lib/generators/katapult/basics/templates/spec/support/fixture_file.rb +6 -0
- data/lib/generators/katapult/basics/templates/spec/support/postgresql_sequences.rb +15 -0
- data/lib/generators/katapult/basics/templates/spec/support/timecop.rb +3 -0
- data/lib/generators/katapult/clearance/clearance_generator.rb +14 -2
- data/lib/generators/katapult/clearance/templates/app/views/layouts/_current_user.html.haml +11 -0
- data/lib/generators/katapult/clearance/templates/app/views/passwords/create.html.haml +10 -4
- data/lib/generators/katapult/clearance/templates/app/views/passwords/edit.html.haml +12 -12
- data/lib/generators/katapult/clearance/templates/app/views/passwords/new.html.haml +14 -11
- data/lib/generators/katapult/clearance/templates/app/views/sessions/new.html.haml +16 -15
- data/lib/generators/katapult/clearance/templates/features/authentication.feature +3 -3
- data/lib/generators/katapult/cucumber_features/templates/feature.feature +1 -1
- data/lib/generators/katapult/model_specs/templates/model_spec.rb +3 -5
- data/lib/generators/katapult/navigation/navigation_generator.rb +7 -1
- data/lib/generators/katapult/navigation/templates/app/views/layouts/_navigation.html.haml +15 -0
- data/lib/generators/katapult/transform/transform_generator.rb +12 -17
- data/lib/generators/katapult/views/templates/_form.html.haml +48 -0
- data/lib/generators/katapult/views/templates/app/helpers/table_helper.rb +14 -0
- data/lib/generators/katapult/views/templates/app/webpack/assets/stylesheets/blocks/action_bar.sass +22 -0
- data/lib/generators/katapult/views/templates/app/webpack/assets/stylesheets/blocks/title.sass +11 -0
- data/lib/generators/katapult/views/templates/custom_action.html.haml +5 -0
- data/lib/generators/katapult/views/templates/edit.html.haml +4 -0
- data/lib/generators/katapult/views/templates/index.html.haml +26 -0
- data/lib/generators/katapult/{haml → views}/templates/new.html.haml +1 -1
- data/lib/generators/katapult/views/templates/show.html.haml +39 -0
- data/lib/generators/katapult/{haml/haml_generator.rb → views/views_generator.rb} +19 -25
- data/lib/generators/katapult/{w_u_i → web_ui}/templates/_route.rb +3 -3
- data/lib/generators/katapult/{w_u_i → web_ui}/templates/controller.rb +21 -23
- data/lib/generators/katapult/{w_u_i/w_u_i_generator.rb → web_ui/web_ui_generator.rb} +7 -12
- data/lib/katapult/action.rb +1 -1
- data/lib/katapult/application_model.rb +8 -8
- data/lib/katapult/binary_util.rb +48 -10
- data/lib/katapult/generator.rb +2 -10
- data/lib/katapult/generator_goodies.rb +23 -0
- data/lib/katapult/navigation.rb +10 -5
- data/lib/katapult/parser.rb +15 -8
- data/lib/katapult/version.rb +5 -1
- data/lib/katapult/{wui.rb → web_ui.rb} +19 -4
- data/lib/katapult.rb +0 -5
- data/script/console +5 -2
- data/script/kta +8 -0
- data/script/update +80 -0
- data/spec/action_spec.rb +0 -1
- data/spec/attribute_spec.rb +0 -1
- data/spec/element_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/parser_spec.rb +26 -0
- data/spec/util_spec.rb +0 -1
- data/spec/{wui_spec.rb → web_ui_spec.rb} +24 -12
- metadata +86 -124
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_all.sass +0 -4
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_items.sass +0 -11
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_layout.sass +0 -26
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_navigation.sass +0 -11
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application/blocks/_tools.sass +0 -12
- data/lib/generators/katapult/basics/templates/app/assets/stylesheets/application.sass +0 -6
- data/lib/generators/katapult/basics/templates/config/spring.rb +0 -3
- data/lib/generators/katapult/basics/templates/features/support/factory_girl.rb +0 -1
- data/lib/generators/katapult/basics/templates/spec/support/factory_girl.rb +0 -3
- data/lib/generators/katapult/haml/templates/_form.html.haml +0 -38
- data/lib/generators/katapult/haml/templates/app/views/layouts/application.html.haml +0 -33
- data/lib/generators/katapult/haml/templates/custom_action.html.haml +0 -5
- data/lib/generators/katapult/haml/templates/edit.html.haml +0 -4
- data/lib/generators/katapult/haml/templates/index.html.haml +0 -29
- data/lib/generators/katapult/haml/templates/show.html.haml +0 -39
- data/lib/generators/katapult/install/install_generator.rb +0 -14
- data/lib/generators/katapult/install/templates/lib/katapult/application_model.rb +0 -20
- 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
|
-
|
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
|
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
|
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
|
20
|
+
<% if web_ui.find_action :create -%>
|
25
21
|
|
26
22
|
def create
|
27
23
|
<%= method_name(:build) %>
|
28
|
-
<%= method_name(:save) %>
|
24
|
+
<%= method_name(:save) %>
|
29
25
|
end
|
30
26
|
<% end -%>
|
31
|
-
<% if
|
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
|
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) %>
|
39
|
+
<%= method_name(:save) %>
|
44
40
|
end
|
45
41
|
<% end -%>
|
46
|
-
<% if
|
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 <%=
|
47
|
+
redirect_to <%= web_ui.path(:index) %>
|
52
48
|
end
|
53
49
|
<% end -%>
|
54
|
-
<%
|
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 <%=
|
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) %>.
|
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
|
-
|
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
|
1
|
+
# Generate a controller, routes and view files for a WebUI instance
|
2
2
|
|
3
3
|
require 'katapult/generator'
|
4
|
-
require 'generators/katapult/
|
4
|
+
require 'generators/katapult/views/views_generator'
|
5
5
|
|
6
6
|
module Katapult
|
7
7
|
module Generators
|
8
|
-
class
|
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
|
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::
|
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
|
-
|
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
|
61
|
+
def web_ui
|
67
62
|
@element
|
68
63
|
end
|
69
64
|
|
data/lib/katapult/action.rb
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
module Katapult
|
4
4
|
class ApplicationModel
|
5
5
|
|
6
|
-
attr_reader :models, :
|
6
|
+
attr_reader :models, :web_uis, :navigation, :authentication
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@models = []
|
10
|
-
@
|
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
|
23
|
-
|
24
|
-
@
|
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
|
28
|
-
|
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
|
-
|
46
|
+
web_uis.each &:render
|
47
47
|
navigation.render if navigation
|
48
48
|
authentication.render if authentication
|
49
49
|
end
|
data/lib/katapult/binary_util.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# Utility methods.
|
2
2
|
|
3
|
-
#
|
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
|
-
|
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
|
22
|
-
|
23
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
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
|
data/lib/katapult/generator.rb
CHANGED
@@ -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
|
data/lib/katapult/navigation.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Models
|
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
|
10
|
-
application_model.
|
9
|
+
def web_uis
|
10
|
+
application_model.web_uis
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
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
|
data/lib/katapult/parser.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require_relative 'application_model'
|
5
5
|
require 'katapult/model'
|
6
|
-
require 'katapult/
|
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(
|
18
|
-
instance_eval
|
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,
|
24
|
-
application_model.add_model Model.new(name,
|
23
|
+
def model(name, &block)
|
24
|
+
application_model.add_model Model.new(name, &block)
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
application_model.
|
27
|
+
def web_ui(name, options = {}, &block)
|
28
|
+
application_model.add_web_ui WebUI.new(name, options, &block)
|
29
29
|
end
|
30
30
|
|
31
|
-
|
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
|
|
data/lib/katapult/version.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
|
4
4
|
require 'katapult/element'
|
5
5
|
require 'katapult/action'
|
6
|
-
require 'generators/katapult/
|
6
|
+
require 'generators/katapult/web_ui/web_ui_generator'
|
7
7
|
|
8
8
|
module Katapult
|
9
|
-
class
|
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
|
-
"
|
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
|
-
|
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
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.
|
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
|
-
|
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
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
data/spec/attribute_spec.rb
CHANGED
data/spec/element_spec.rb
CHANGED
data/spec/model_spec.rb
CHANGED
data/spec/parser_spec.rb
ADDED
@@ -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