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