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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/bin/jetski +19 -2
  3. data/bin/jetski_cli_helpers/database.rb +27 -0
  4. data/bin/jetski_cli_helpers/destroy.rb +7 -0
  5. data/bin/jetski_cli_helpers/generate.rb +27 -15
  6. data/bin/jetski_cli_helpers/shared_methods.rb +8 -0
  7. data/lib/jetski/autoloader.rb +18 -0
  8. data/lib/jetski/base_controller.rb +16 -76
  9. data/lib/jetski/database/base.rb +51 -0
  10. data/lib/jetski/frontend/reactive_form.js +12 -0
  11. data/lib/jetski/frontend/reactive_form.rb +8 -0
  12. data/lib/jetski/helpers/delegatable.rb +17 -0
  13. data/lib/jetski/helpers/view_helpers.rb +9 -0
  14. data/lib/jetski/model.rb +79 -0
  15. data/lib/jetski/router/parser.rb +1 -1
  16. data/lib/jetski/router/shared_methods.rb +13 -0
  17. data/lib/jetski/router.rb +24 -5
  18. data/lib/jetski/server.rb +7 -2
  19. data/lib/jetski/version.rb +1 -1
  20. data/lib/jetski/view_renderer.rb +85 -0
  21. data/lib/jetski.rb +10 -2
  22. metadata +62 -9
  23. /data/{bin/templates → templates}/base/Gemfile +0 -0
  24. /data/{bin/templates → templates}/base/app/assets/images/jetski-logo.png +0 -0
  25. /data/{bin/templates → templates}/base/app/assets/javascript/application.js +0 -0
  26. /data/{bin/templates → templates}/base/app/assets/stylesheets/application.css +0 -0
  27. /data/{bin/templates → templates}/base/app/assets/stylesheets/pages.css +0 -0
  28. /data/{bin/templates → templates}/base/app/controllers/pages_controller.rb +0 -0
  29. /data/{bin/templates → templates}/base/app/views/layouts/application.html.erb +0 -0
  30. /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: ffe71a8de5f4201c446a70331fae92f982af3887b388426e5b64f1b6c3d897c8
4
- data.tar.gz: 73a1faada7420962abfdbab298f7f81157431b995452ca5fc2adefd903d074ec
3
+ metadata.gz: 02eebca230858e0f9461c223fba7587103618d4b84df0c9b2725ad9f28218041
4
+ data.tar.gz: 4331419e37d977fd5196cc8c21fda361a6468d4bbef48eb844a41e23eb230e74
5
5
  SHA512:
6
- metadata.gz: 35e4cfce787089dfe046575b38969927013e09a91b855dee64af15394872eed1660a087ecdd801fb4c0ede590b491da3759b5d68f1ff2c92a49363426f5a8f38
7
- data.tar.gz: '049857042cd6299e591dab667ef9f3943637649905fe77e09174eabdc3a1131abb9849e93e35f07adb32d9c09dda067ffc19c8d671ddade29715d74ff0c9acfa'
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
- insert_into_file(controller_file_path, indent_code(action_content, 1), before: "\nend")
22
- path_to_view = "app/views/#{name}/#{action_name}.html.erb"
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
- empty_directory("app/views/#{name}")
25
- create_file(path_to_view)
26
- append_to_file path_to_view, <<~EXAMPLEFILE
27
- <h1> #{name}##{action_name} </h1>
28
- <p> edit the content of this page at app/views/#{path_to_view}/#{action_name}.html.erb </p>
29
- EXAMPLEFILE
30
-
31
- say "🌊 View your new page at http://localhost:8000/#{name}/#{action_name}"
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
- private
36
- def indent_code(code, level = 1)
37
- code.strip.split("\n").map { |l| (1..level).map { |lvl| " " }.join + l }.join("\n")
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,8 @@
1
+ module JetskiCLIHelpers
2
+ module SharedMethods
3
+ def indent_code(code, level = 1)
4
+ code.strip.split("\n").map { |l|
5
+ (1..level).map { |lvl| " " }.join + l }.join("\n")
6
+ end
7
+ end
8
+ 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
- attr_accessor :action_name, :controller_name, :controller_path, :params
5
- attr_reader :res
6
- attr_reader :performed_render
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
- render_template_file
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,8 @@
1
+ module ReactiveForm
2
+ def reactive_text_area(path, **opts)
3
+ css_classes = opts[:class]
4
+ value = opts[:value]
5
+ # Text area that auto saves to url.
6
+ "<textarea reactive-form-path='#{path}' class='#{css_classes}'>#{value}</textarea>"
7
+ end
8
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ module Jetski
2
+ module Helpers
3
+ module ViewHelpers
4
+ def render(path_to_file)
5
+ File.join(Jetski.app_root, path_to_file)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -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
@@ -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
- controller.params = OpenStruct.new(JSON.parse(req.body)) if req.body
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
- # Render stylesheets css via url
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
- def initialize
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: 8000
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
@@ -1,3 +1,3 @@
1
1
  module Jetski
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.3"
3
3
  end
@@ -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/server'
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.0
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/templates/base/Gemfile
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