jetski 0.4.0 → 0.4.3
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 +4 -4
- data/bin/jetski +19 -2
- data/bin/jetski_cli_helpers/database.rb +27 -0
- data/bin/jetski_cli_helpers/destroy.rb +7 -0
- data/bin/jetski_cli_helpers/generate.rb +27 -15
- data/bin/jetski_cli_helpers/shared_methods.rb +8 -0
- data/lib/jetski/autoloader.rb +18 -0
- data/lib/jetski/base_controller.rb +16 -76
- data/lib/jetski/database/base.rb +51 -0
- data/lib/jetski/frontend/reactive_form.js +12 -0
- data/lib/jetski/frontend/reactive_form.rb +8 -0
- data/lib/jetski/helpers/delegatable.rb +17 -0
- data/lib/jetski/helpers/view_helpers.rb +9 -0
- data/lib/jetski/model.rb +79 -0
- data/lib/jetski/router/parser.rb +1 -1
- data/lib/jetski/router/shared_methods.rb +13 -0
- data/lib/jetski/router.rb +24 -5
- data/lib/jetski/server.rb +7 -2
- data/lib/jetski/version.rb +1 -1
- data/lib/jetski/view_renderer.rb +85 -0
- data/lib/jetski.rb +10 -2
- metadata +62 -9
- /data/{bin/templates → templates}/base/Gemfile +0 -0
- /data/{bin/templates → templates}/base/app/assets/images/jetski-logo.png +0 -0
- /data/{bin/templates → templates}/base/app/assets/javascript/application.js +0 -0
- /data/{bin/templates → templates}/base/app/assets/stylesheets/application.css +0 -0
- /data/{bin/templates → templates}/base/app/assets/stylesheets/pages.css +0 -0
- /data/{bin/templates → templates}/base/app/controllers/pages_controller.rb +0 -0
- /data/{bin/templates → templates}/base/app/views/layouts/application.html.erb +0 -0
- /data/{bin/templates → templates}/base/app/views/pages/home.html.erb +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 02eebca230858e0f9461c223fba7587103618d4b84df0c9b2725ad9f28218041
|
|
4
|
+
data.tar.gz: 4331419e37d977fd5196cc8c21fda361a6468d4bbef48eb844a41e23eb230e74
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0d86c1de231237e2d535c2ed22a2257cb178d5752f041f17772806d00e714952f74fd15cc84e842e143069942cad868d1dc9f289e98458f00241b91388bc5d3a
|
|
7
|
+
data.tar.gz: 06b00efc1e4c3076fab69fbef449edaf65abd00cc803eba14c19fc1c162d4e55f1cad97a31ea9389793d12582cac926450a04602256dbd9ca9cbbaf585381d2b
|
data/bin/jetski
CHANGED
|
@@ -3,8 +3,14 @@
|
|
|
3
3
|
require 'jetski'
|
|
4
4
|
require 'optparse'
|
|
5
5
|
require 'thor'
|
|
6
|
+
require "sqlite3"
|
|
7
|
+
require "pry"
|
|
8
|
+
|
|
9
|
+
require_relative './jetski_cli_helpers/shared_methods.rb'
|
|
6
10
|
require_relative './jetski_cli_helpers/generate.rb'
|
|
7
11
|
require_relative './jetski_cli_helpers/destroy.rb'
|
|
12
|
+
require_relative './jetski_cli_helpers/database.rb'
|
|
13
|
+
|
|
8
14
|
require 'bundler/setup'
|
|
9
15
|
|
|
10
16
|
class JetskiCLI < Thor
|
|
@@ -36,8 +42,16 @@ class JetskiCLI < Thor
|
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
desc "server", "starts the jetski app"
|
|
45
|
+
method_option :port, :aliases => "-p", :desc => "Configure which port number to run server on"
|
|
39
46
|
def server
|
|
40
|
-
Jetski::Server.new.call
|
|
47
|
+
Jetski::Server.new(port: options[:port]).call
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc "console", "opens jetski console"
|
|
51
|
+
def console
|
|
52
|
+
Jetski::Autoloader.call
|
|
53
|
+
Jetski::Autoloader.load_controllers
|
|
54
|
+
Pry.start
|
|
41
55
|
end
|
|
42
56
|
|
|
43
57
|
desc "generate", "generates resources in your jetski app"
|
|
@@ -45,9 +59,12 @@ class JetskiCLI < Thor
|
|
|
45
59
|
|
|
46
60
|
desc "destroy", "destroys a resource in your jetski app"
|
|
47
61
|
subcommand "destroy", JetskiCLIHelpers::Destroy
|
|
62
|
+
|
|
63
|
+
desc "db", "commands related to database"
|
|
64
|
+
subcommand "db", JetskiCLIHelpers::Database
|
|
48
65
|
|
|
49
66
|
def self.source_root
|
|
50
|
-
File.join(File.dirname(__FILE__), 'templates')
|
|
67
|
+
File.join(File.dirname(__FILE__), '..', 'templates')
|
|
51
68
|
end
|
|
52
69
|
end
|
|
53
70
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
module JetskiCLIHelpers
|
|
3
|
+
class Database < Thor
|
|
4
|
+
include Thor::Actions, JetskiCLIHelpers::SharedMethods,
|
|
5
|
+
Jetski::Database::Base
|
|
6
|
+
desc "create", "Creates a database for your app"
|
|
7
|
+
def create
|
|
8
|
+
say "🌊 Database was created successfully!"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
desc "create_table NAME COLUMN_NAMES", "Creates a new table in your database"
|
|
12
|
+
def create_table(name, *fields)
|
|
13
|
+
db.execute create_table_sql(table_name: name, field_names: fields)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc "seed", "Seeds the database with records created from seed file"
|
|
17
|
+
def seed
|
|
18
|
+
seed_file_path = './seed.rb'
|
|
19
|
+
if File.exist?(seed_file_path)
|
|
20
|
+
Jetski::Autoloader.call
|
|
21
|
+
load(seed_file_path)
|
|
22
|
+
else
|
|
23
|
+
say "No seed file is specified create one in your app ./seed.rb"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -9,5 +9,12 @@ module JetskiCLIHelpers
|
|
|
9
9
|
view_folder = "app/views/#{name}"
|
|
10
10
|
remove_dir(view_folder)
|
|
11
11
|
end
|
|
12
|
+
|
|
13
|
+
desc "model NAME ACTION_NAMES", "Destroys a model"
|
|
14
|
+
def model(name, *actions)
|
|
15
|
+
model_file_path = "app/models/#{name}.rb"
|
|
16
|
+
remove_file(controller_file_path)
|
|
17
|
+
# TODO: Remove from db.
|
|
18
|
+
end
|
|
12
19
|
end
|
|
13
20
|
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
require 'thor'
|
|
2
2
|
module JetskiCLIHelpers
|
|
3
3
|
class Generate < Thor
|
|
4
|
-
include Thor::Actions
|
|
4
|
+
include Thor::Actions, JetskiCLIHelpers::SharedMethods,
|
|
5
|
+
Jetski::Database::Base
|
|
5
6
|
desc "controller NAME ACTION_NAMES", "Create a controller with matching actions"
|
|
6
7
|
def controller(name, *actions)
|
|
7
8
|
controller_file_path = "app/controllers/#{name}_controller.rb"
|
|
@@ -18,23 +19,34 @@ module JetskiCLIHelpers
|
|
|
18
19
|
|
|
19
20
|
end
|
|
20
21
|
ACTION_CONTENT
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
action_nl_seperator = ((idx + 1) != actions.size) ? "\n\n" : ""
|
|
23
|
+
insert_into_file(controller_file_path, "#{indent_code(action_content, 1)}#{action_nl_seperator}", before: "\nend")
|
|
24
|
+
|
|
25
|
+
if !["create", "create", "update", "destroy"].include?(action_name)
|
|
26
|
+
path_to_view = "app/views/#{name}/#{action_name}.html.erb"
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
empty_directory("app/views/#{name}")
|
|
29
|
+
create_file(path_to_view)
|
|
30
|
+
append_to_file path_to_view, <<~EXAMPLEFILE
|
|
31
|
+
<h1> #{name}##{action_name} </h1>
|
|
32
|
+
<p> edit the content of this page at app/views/#{path_to_view}/#{action_name}.html.erb </p>
|
|
33
|
+
EXAMPLEFILE
|
|
34
|
+
|
|
35
|
+
say "🌊 View your new page at http://localhost:8000/#{name}/#{action_name}"
|
|
36
|
+
end
|
|
32
37
|
end
|
|
33
38
|
end
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def
|
|
37
|
-
|
|
39
|
+
|
|
40
|
+
desc "model NAME FIELD_NAMES", "Creates a model with matching fields"
|
|
41
|
+
def model(name, *field_names)
|
|
42
|
+
db.execute create_table_sql(table_name: name, field_names: field_names)
|
|
43
|
+
model_file_path = "app/models/#{name}.rb"
|
|
44
|
+
create_file model_file_path
|
|
45
|
+
append_to_file model_file_path, <<~MODEL
|
|
46
|
+
class #{name.capitalize} < Jetski::Model
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
MODEL
|
|
38
50
|
end
|
|
39
51
|
end
|
|
40
52
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Jetski
|
|
2
|
+
module Autoloader
|
|
3
|
+
include Jetski::Router::SharedMethods
|
|
4
|
+
extend self
|
|
5
|
+
# Responsibility is to load all models in app.
|
|
6
|
+
def call
|
|
7
|
+
model_file_paths.each do |path_to_model|
|
|
8
|
+
require_relative path_to_model
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def load_controllers
|
|
13
|
+
controller_file_paths.each do |file_path|
|
|
14
|
+
require_relative file_path
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -1,32 +1,20 @@
|
|
|
1
1
|
# This is the base controller of the library
|
|
2
2
|
module Jetski
|
|
3
3
|
class BaseController
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
include ReactiveForm
|
|
5
|
+
attr_accessor :action_name, :controller_name, :controller_path,
|
|
6
|
+
:params, :cookies
|
|
7
|
+
attr_reader :res, :performed_render
|
|
7
8
|
attr_writer :root, :path, :request_method
|
|
8
9
|
|
|
9
|
-
class << self
|
|
10
|
-
def request_method(method)
|
|
11
|
-
# Really just a shell method since Im using File.readlines to use the logic in routes.
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def root
|
|
15
|
-
# another shell method
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def path(location)
|
|
19
|
-
# Another shell method
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
10
|
def initialize(res)
|
|
24
11
|
@res = res
|
|
25
12
|
@performed_render = false
|
|
26
13
|
end
|
|
27
14
|
|
|
28
15
|
# Method to render matching view with controller_name/action_name
|
|
29
|
-
|
|
16
|
+
# TODO: Make render available in view as seperate method.
|
|
17
|
+
|
|
30
18
|
def render(**args)
|
|
31
19
|
@performed_render = true
|
|
32
20
|
request_status = args[:status] || 200
|
|
@@ -42,8 +30,8 @@ module Jetski
|
|
|
42
30
|
res.body = args[:json].to_json
|
|
43
31
|
return
|
|
44
32
|
end
|
|
45
|
-
|
|
46
|
-
|
|
33
|
+
|
|
34
|
+
ViewRenderer.new(self).call
|
|
47
35
|
end
|
|
48
36
|
|
|
49
37
|
def redirect_to(url)
|
|
@@ -51,6 +39,14 @@ module Jetski
|
|
|
51
39
|
res.set_redirect(WEBrick::HTTPStatus::Found, url)
|
|
52
40
|
end
|
|
53
41
|
|
|
42
|
+
def set_cookie(name, value)
|
|
43
|
+
res.cookies.push WEBrick::Cookie.new(name.to_s, value || "")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def get_cookie(name)
|
|
47
|
+
cookies&.find { |c| c.name == name.to_s }&.value
|
|
48
|
+
end
|
|
49
|
+
|
|
54
50
|
def is_root?
|
|
55
51
|
@root == true
|
|
56
52
|
end
|
|
@@ -62,61 +58,5 @@ module Jetski
|
|
|
62
58
|
def custom_request_method
|
|
63
59
|
@request_method
|
|
64
60
|
end
|
|
65
|
-
|
|
66
|
-
private
|
|
67
|
-
def render_template_file
|
|
68
|
-
view_render = page_with_layout.gsub("\n</head>", "#{content_for_head}\n</head>")
|
|
69
|
-
res.content_type = "text/html"
|
|
70
|
-
res.body = view_render
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def page_with_layout
|
|
74
|
-
process_erb(File.read(File.join(views_folder, "layouts/application.html.erb"))) do
|
|
75
|
-
process_erb(File.read(File.join(views_folder, path_to_controller, "#{action_name}.html.erb")))
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def content_for_head
|
|
80
|
-
_content_for_head = ''
|
|
81
|
-
|
|
82
|
-
application_css_file = File.join(assets_folder, "stylesheets", "application.css")
|
|
83
|
-
if File.exist? application_css_file
|
|
84
|
-
_content_for_head += "<link rel='stylesheet' href='/application.css'>\n"
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
controller_css_file = File.join(assets_folder, "stylesheets", "#{path_to_controller}.css")
|
|
88
|
-
if File.exist? controller_css_file
|
|
89
|
-
_content_for_head += "<link rel='stylesheet' href='/#{path_to_controller}.css'>\n"
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
application_js_file = File.join(assets_folder, "javascript", "application.js")
|
|
93
|
-
if File.exist? application_js_file
|
|
94
|
-
_content_for_head += "<script src='application.js' defer></script>\n"
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
controller_js_file = File.join(assets_folder, "javascript", "#{path_to_controller}.js")
|
|
98
|
-
if File.exist? controller_js_file
|
|
99
|
-
_content_for_head += "<script src='/#{path_to_controller}.js' defer></script>\n"
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
_content_for_head
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def views_folder
|
|
106
|
-
File.join(Jetski.app_root, 'app/views')
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def assets_folder
|
|
110
|
-
File.join(Jetski.app_root, 'app/assets')
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def path_to_controller
|
|
114
|
-
controller_path[1..-1]
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def process_erb(content)
|
|
118
|
-
template = ERB.new(content)
|
|
119
|
-
template.result(binding)
|
|
120
|
-
end
|
|
121
61
|
end
|
|
122
62
|
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Jetski
|
|
2
|
+
module Database
|
|
3
|
+
module Base
|
|
4
|
+
extend self
|
|
5
|
+
|
|
6
|
+
def db
|
|
7
|
+
@_db ||= SQLite3::Database.new "test.db"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def create_table_sql(table_name:, field_names:)
|
|
11
|
+
pluralized_table_name = if table_name.chars.last == "s"
|
|
12
|
+
table_name
|
|
13
|
+
else
|
|
14
|
+
table_name + "s"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
_gen_sql = ""
|
|
18
|
+
_gen_sql += "create table #{pluralized_table_name} (\n"
|
|
19
|
+
_gen_sql += " created_at datetime,\n"
|
|
20
|
+
_gen_sql += " updated_at datetime,\n"
|
|
21
|
+
_gen_sql += " id integer,\n"
|
|
22
|
+
|
|
23
|
+
field_names.each.with_index do |field_name, idx|
|
|
24
|
+
field, field_data_type = if field_name.include?(":")
|
|
25
|
+
field_name.split(":")
|
|
26
|
+
else
|
|
27
|
+
[field_name, ""]
|
|
28
|
+
end
|
|
29
|
+
data_type = sql_data_type(field_data_type)
|
|
30
|
+
_gen_sql += " #{field} #{data_type}"
|
|
31
|
+
if (idx + 1) < field_names.size
|
|
32
|
+
_gen_sql += ",\n"
|
|
33
|
+
else
|
|
34
|
+
_gen_sql += "\n"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
_gen_sql += ");\n"
|
|
38
|
+
_gen_sql
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def sql_data_type(str)
|
|
42
|
+
case str
|
|
43
|
+
when "", "string"
|
|
44
|
+
"varchar(255)"
|
|
45
|
+
else
|
|
46
|
+
str
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
let reactiveFormELS = document.querySelectorAll("[reactive-form-path]")
|
|
2
|
+
reactiveFormELS.forEach(reactiveFormElement => {
|
|
3
|
+
reactiveFormElement.addEventListener("input", () => {
|
|
4
|
+
let reactiveFormURL = reactiveFormElement.getAttribute("reactive-form-path")
|
|
5
|
+
fetch(reactiveFormURL, {
|
|
6
|
+
body: JSON.stringify({
|
|
7
|
+
content: reactiveFormElement.value,
|
|
8
|
+
}),
|
|
9
|
+
method: "POST",
|
|
10
|
+
})
|
|
11
|
+
})
|
|
12
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require "pry"
|
|
2
|
+
|
|
3
|
+
module Jetski
|
|
4
|
+
module Helpers
|
|
5
|
+
module Delegatable
|
|
6
|
+
# delegate(:method, to: :class)
|
|
7
|
+
# Allows you to delegate a method to another class
|
|
8
|
+
def delegate(*delegatables, to:)
|
|
9
|
+
delegatables.each do |method_name|
|
|
10
|
+
define_method method_name do
|
|
11
|
+
self.public_send(to).public_send(method_name)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/jetski/model.rb
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Jetski
|
|
2
|
+
class Model
|
|
3
|
+
extend Jetski::Database::Base
|
|
4
|
+
|
|
5
|
+
def initialize(**args)
|
|
6
|
+
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
def create(**args)
|
|
11
|
+
return puts "#{table_name.capitalize}.create was called with no args" if args.size == 0
|
|
12
|
+
data_values = args.map { |k,v| v }
|
|
13
|
+
key_names = args.map { |k, v| k }
|
|
14
|
+
|
|
15
|
+
key_names.append "created_at"
|
|
16
|
+
data_values.append Time.now.to_s
|
|
17
|
+
|
|
18
|
+
sql_command = <<~SQL
|
|
19
|
+
INSERT INTO #{pluralized_table_name} (#{key_names.join(", ")})
|
|
20
|
+
VALUES (#{(1..key_names.size).map { |n| "?" }.join(", ")})
|
|
21
|
+
SQL
|
|
22
|
+
|
|
23
|
+
db.execute(sql_command, data_values)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def all
|
|
27
|
+
columns, *rows = db.execute2( "select * from #{pluralized_table_name}" )
|
|
28
|
+
_all = []
|
|
29
|
+
rows.map do |row|
|
|
30
|
+
_all << format_model_obj(row, columns)
|
|
31
|
+
end
|
|
32
|
+
_all
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def pluck_rows
|
|
36
|
+
db.execute( "select * from #{pluralized_table_name}" )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def count
|
|
40
|
+
pluck_rows.size
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def attributes
|
|
44
|
+
columns, *rows = db.execute2( "select * from #{pluralized_table_name}" )
|
|
45
|
+
columns
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def last
|
|
49
|
+
format_model_obj(pluck_rows.last)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def first
|
|
53
|
+
format_model_obj(pluck_rows.first)
|
|
54
|
+
end
|
|
55
|
+
private
|
|
56
|
+
def table_name
|
|
57
|
+
self.to_s.downcase
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def pluralized_table_name
|
|
61
|
+
if table_name[-1] == "s"
|
|
62
|
+
table_name
|
|
63
|
+
else
|
|
64
|
+
table_name + "s"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def format_model_obj(row, columns = nil)
|
|
69
|
+
return unless row
|
|
70
|
+
columns ||= attributes
|
|
71
|
+
row_obj = {}
|
|
72
|
+
columns.each.with_index do |col, idx|
|
|
73
|
+
row_obj[col] = row[idx]
|
|
74
|
+
end
|
|
75
|
+
OpenStruct.new(row_obj)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/lib/jetski/router/parser.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
module Jetski
|
|
2
2
|
class Router
|
|
3
3
|
module Parser
|
|
4
|
+
include Jetski::Router::SharedMethods
|
|
4
5
|
extend self
|
|
5
6
|
def compile_routes
|
|
6
7
|
auto_found_routes = []
|
|
7
|
-
controller_file_paths = Dir.glob([File.join(Jetski.app_root, 'app', 'controllers', '**', '*_controller.rb')])
|
|
8
8
|
controller_file_paths.each do |file_path|
|
|
9
9
|
require_relative file_path
|
|
10
10
|
controller_file_name = file_path.split('app/controllers')[1]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Jetski
|
|
2
|
+
class Router
|
|
3
|
+
module SharedMethods
|
|
4
|
+
def controller_file_paths
|
|
5
|
+
Dir.glob([File.join(Jetski.app_root, 'app', 'controllers', '**', '*_controller.rb')])
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def model_file_paths
|
|
9
|
+
Dir.glob(File.join(Jetski.app_root, 'app', 'models', '**/*.rb'))
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/jetski/router.rb
CHANGED
|
@@ -41,7 +41,10 @@ module Jetski
|
|
|
41
41
|
controller.action_name = action_name
|
|
42
42
|
controller.controller_name = controller_name
|
|
43
43
|
controller.controller_path = controller_path
|
|
44
|
-
|
|
44
|
+
if req.body
|
|
45
|
+
controller.params = parse_body(req.body, req.content_type)
|
|
46
|
+
end
|
|
47
|
+
controller.cookies = req.cookies
|
|
45
48
|
controller.send(action_name)
|
|
46
49
|
if !controller.performed_render && (request_method.upcase == "GET")
|
|
47
50
|
controller.render
|
|
@@ -56,8 +59,7 @@ module Jetski
|
|
|
56
59
|
end
|
|
57
60
|
|
|
58
61
|
def host_assets
|
|
59
|
-
|
|
60
|
-
host_css && host_images && host_javascript
|
|
62
|
+
host_css && host_images && host_javascript && host_reactive_form_js
|
|
61
63
|
end
|
|
62
64
|
|
|
63
65
|
def host_css
|
|
@@ -73,8 +75,7 @@ module Jetski
|
|
|
73
75
|
end
|
|
74
76
|
|
|
75
77
|
def host_images
|
|
76
|
-
# TODO: Expand this to support more types of images.
|
|
77
|
-
file_ext_types = ["png", "jpg"]
|
|
78
|
+
file_ext_types = ["png", "jpg"] # TODO: Expand this to support more types of images.
|
|
78
79
|
image_files = Dir.glob(
|
|
79
80
|
file_ext_types.map { |ext| File.join(Jetski.app_root, "app/assets/images/*.#{ext}") }
|
|
80
81
|
)
|
|
@@ -99,5 +100,23 @@ module Jetski
|
|
|
99
100
|
end
|
|
100
101
|
end
|
|
101
102
|
end
|
|
103
|
+
|
|
104
|
+
def host_reactive_form_js
|
|
105
|
+
server.mount_proc "/reactive-form.js" do |req, res|
|
|
106
|
+
res.content_type = "text/javascript"
|
|
107
|
+
res.body = File.read(File.join(__dir__, 'frontend/reactive_form.js'))
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
private
|
|
111
|
+
def parse_body(body, content_type = '')
|
|
112
|
+
case content_type
|
|
113
|
+
when "application/x-www-form-urlencoded"
|
|
114
|
+
Rack::Utils.parse_nested_query body
|
|
115
|
+
when "application/json"
|
|
116
|
+
OpenStruct.new(JSON.parse(body))
|
|
117
|
+
else
|
|
118
|
+
body
|
|
119
|
+
end
|
|
120
|
+
end
|
|
102
121
|
end
|
|
103
122
|
end
|
data/lib/jetski/server.rb
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
module Jetski
|
|
2
2
|
class Server
|
|
3
|
-
|
|
3
|
+
attr_reader :port
|
|
4
|
+
|
|
5
|
+
def initialize(**args)
|
|
6
|
+
@port = args[:port] || 8000
|
|
4
7
|
end
|
|
5
8
|
|
|
6
9
|
def call
|
|
7
|
-
server = WEBrick::HTTPServer.new Port:
|
|
10
|
+
server = WEBrick::HTTPServer.new Port: port
|
|
8
11
|
|
|
12
|
+
Jetski::Autoloader.call
|
|
13
|
+
|
|
9
14
|
Jetski::Router.new(server).call
|
|
10
15
|
|
|
11
16
|
trap 'INT' do server.shutdown end
|
data/lib/jetski/version.rb
CHANGED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module Jetski
|
|
2
|
+
class ViewRenderer
|
|
3
|
+
extend Jetski::Helpers::Delegatable
|
|
4
|
+
include Jetski::Helpers::ViewHelpers
|
|
5
|
+
|
|
6
|
+
attr_reader :errors, :controller
|
|
7
|
+
delegate :res, :action_name, :controller_path, to: :controller
|
|
8
|
+
|
|
9
|
+
def initialize(controller)
|
|
10
|
+
@controller = controller
|
|
11
|
+
@errors = []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
res.content_type = "text/html"
|
|
16
|
+
view_render = perform_view_render&.gsub("\n</head>", "#{content_for_head}\n</head>")
|
|
17
|
+
return error_screen if errors.any?
|
|
18
|
+
res.body = view_render
|
|
19
|
+
end
|
|
20
|
+
private
|
|
21
|
+
def error_screen
|
|
22
|
+
# TODO: Make better error screen
|
|
23
|
+
res.body = "<h1> Errors: #{errors.map {|e| e }.join(", ")} </h1>"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def perform_view_render
|
|
27
|
+
process_erb(File.read(File.join(views_folder, "layouts/application.html.erb"))) do
|
|
28
|
+
process_erb(File.read(File.join(views_folder, path_to_controller, "#{action_name}.html.erb")))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def process_erb(content)
|
|
33
|
+
template = ERB.new(content)
|
|
34
|
+
# Perserve instance variables to view render
|
|
35
|
+
# @posts from controller to posts/index.html.erb
|
|
36
|
+
controller.instance_eval do
|
|
37
|
+
template.result(binding)
|
|
38
|
+
end
|
|
39
|
+
rescue => e
|
|
40
|
+
@errors << e
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def content_for_head
|
|
45
|
+
_content_for_head = ''
|
|
46
|
+
|
|
47
|
+
application_css_file = File.join(assets_folder, "stylesheets", "application.css")
|
|
48
|
+
if File.exist? application_css_file
|
|
49
|
+
_content_for_head += "<link rel='stylesheet' href='/application.css'>\n"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
controller_css_file = File.join(assets_folder, "stylesheets", "#{path_to_controller}.css")
|
|
53
|
+
if File.exist? controller_css_file
|
|
54
|
+
_content_for_head += "<link rel='stylesheet' href='/#{path_to_controller}.css'>\n"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
application_js_file = File.join(assets_folder, "javascript", "application.js")
|
|
58
|
+
if File.exist? application_js_file
|
|
59
|
+
_content_for_head += "<script src='application.js' defer></script>\n"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
controller_js_file = File.join(assets_folder, "javascript", "#{path_to_controller}.js")
|
|
63
|
+
if File.exist? controller_js_file
|
|
64
|
+
_content_for_head += "<script src='/#{path_to_controller}.js' defer></script>\n"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Add reactive form JS code
|
|
68
|
+
_content_for_head += "<script src='/reactive-form.js' defer></script>\n"
|
|
69
|
+
|
|
70
|
+
_content_for_head
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def views_folder
|
|
74
|
+
File.join(Jetski.app_root, 'app/views')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def assets_folder
|
|
78
|
+
File.join(Jetski.app_root, 'app/assets')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def path_to_controller
|
|
82
|
+
controller_path[1..-1]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
data/lib/jetski.rb
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
require "webrick"
|
|
2
2
|
require "json"
|
|
3
|
-
require "json"
|
|
4
3
|
require "ostruct"
|
|
5
4
|
require "erb"
|
|
5
|
+
require "rack"
|
|
6
6
|
|
|
7
7
|
require_relative './jetski/version'
|
|
8
|
+
require_relative './jetski/frontend/reactive_form'
|
|
8
9
|
require_relative './jetski/base_controller'
|
|
9
|
-
require_relative './jetski/
|
|
10
|
+
require_relative './jetski/router/shared_methods'
|
|
10
11
|
require_relative './jetski/router/parser'
|
|
11
12
|
require_relative './jetski/router'
|
|
13
|
+
require_relative './jetski/autoloader'
|
|
14
|
+
require_relative './jetski/server'
|
|
15
|
+
require_relative './jetski/database/base'
|
|
16
|
+
require_relative './jetski/model'
|
|
17
|
+
require_relative './jetski/helpers/delegatable'
|
|
18
|
+
require_relative './jetski/helpers/view_helpers'
|
|
19
|
+
require_relative './jetski/view_renderer'
|
|
12
20
|
|
|
13
21
|
module Jetski
|
|
14
22
|
extend self
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jetski
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Indigo Tech Tutorials
|
|
@@ -65,6 +65,48 @@ dependencies:
|
|
|
65
65
|
- - "~>"
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: 5.1.2
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: sqlite3
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: 2.8.0
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: 2.8.0
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: pry
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 0.15.2
|
|
89
|
+
type: :runtime
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: 0.15.2
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: rack
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: 3.2.4
|
|
103
|
+
type: :runtime
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 3.2.4
|
|
68
110
|
description: 'Would you rather ride on a train or a jetski? that is the question you
|
|
69
111
|
might use when comparing using our framework or the popular Ruby on Rails framework. '
|
|
70
112
|
email: indigo@tech.tut
|
|
@@ -74,22 +116,33 @@ extensions: []
|
|
|
74
116
|
extra_rdoc_files: []
|
|
75
117
|
files:
|
|
76
118
|
- bin/jetski
|
|
119
|
+
- bin/jetski_cli_helpers/database.rb
|
|
77
120
|
- bin/jetski_cli_helpers/destroy.rb
|
|
78
121
|
- bin/jetski_cli_helpers/generate.rb
|
|
79
|
-
- bin/
|
|
80
|
-
- bin/templates/base/app/assets/images/jetski-logo.png
|
|
81
|
-
- bin/templates/base/app/assets/javascript/application.js
|
|
82
|
-
- bin/templates/base/app/assets/stylesheets/application.css
|
|
83
|
-
- bin/templates/base/app/assets/stylesheets/pages.css
|
|
84
|
-
- bin/templates/base/app/controllers/pages_controller.rb
|
|
85
|
-
- bin/templates/base/app/views/layouts/application.html.erb
|
|
86
|
-
- bin/templates/base/app/views/pages/home.html.erb
|
|
122
|
+
- bin/jetski_cli_helpers/shared_methods.rb
|
|
87
123
|
- lib/jetski.rb
|
|
124
|
+
- lib/jetski/autoloader.rb
|
|
88
125
|
- lib/jetski/base_controller.rb
|
|
126
|
+
- lib/jetski/database/base.rb
|
|
127
|
+
- lib/jetski/frontend/reactive_form.js
|
|
128
|
+
- lib/jetski/frontend/reactive_form.rb
|
|
129
|
+
- lib/jetski/helpers/delegatable.rb
|
|
130
|
+
- lib/jetski/helpers/view_helpers.rb
|
|
131
|
+
- lib/jetski/model.rb
|
|
89
132
|
- lib/jetski/router.rb
|
|
90
133
|
- lib/jetski/router/parser.rb
|
|
134
|
+
- lib/jetski/router/shared_methods.rb
|
|
91
135
|
- lib/jetski/server.rb
|
|
92
136
|
- lib/jetski/version.rb
|
|
137
|
+
- lib/jetski/view_renderer.rb
|
|
138
|
+
- templates/base/Gemfile
|
|
139
|
+
- templates/base/app/assets/images/jetski-logo.png
|
|
140
|
+
- templates/base/app/assets/javascript/application.js
|
|
141
|
+
- templates/base/app/assets/stylesheets/application.css
|
|
142
|
+
- templates/base/app/assets/stylesheets/pages.css
|
|
143
|
+
- templates/base/app/controllers/pages_controller.rb
|
|
144
|
+
- templates/base/app/views/layouts/application.html.erb
|
|
145
|
+
- templates/base/app/views/pages/home.html.erb
|
|
93
146
|
homepage: https://rubygems.org/gems/jetski
|
|
94
147
|
licenses:
|
|
95
148
|
- MIT
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|