diff --git a/.gitgnore b/.gitgnore new file mode 100644 index 00000000..22be9915 --- /dev/null +++ b/.gitgnore @@ -0,0 +1,2 @@ +.byebug +log/app.log diff --git a/app/controllers/tests_controller.rb b/app/controllers/tests_controller.rb index 1526a689..9293be85 100644 --- a/app/controllers/tests_controller.rb +++ b/app/controllers/tests_controller.rb @@ -1,11 +1,9 @@ class TestsController < Simpler::Controller - def index @time = Time.now end - def create - + def show + @id = params[:id] end - end diff --git a/app/models/test.rb b/app/models/test.rb index 86376668..98cea0cb 100644 --- a/app/models/test.rb +++ b/app/models/test.rb @@ -4,5 +4,4 @@ # Integer :level, default: 0 # end class Test < Sequel::Model - end diff --git a/app/views/tests/index.html.erb b/app/views/tests/index.html.erb index 39fce580..c6fbad57 100644 --- a/app/views/tests/index.html.erb +++ b/app/views/tests/index.html.erb @@ -6,7 +6,6 @@

Simpler framework at work!

- -

<%= @time %>

+

<%= @time %>

\ No newline at end of file diff --git a/app/views/tests/list.html.erb b/app/views/tests/list.html.erb index 0d430491..8ff5af24 100644 --- a/app/views/tests/list.html.erb +++ b/app/views/tests/list.html.erb @@ -2,11 +2,11 @@ + List | Simpler application

Simpler framework at work!

-

<%= @time %>

\ No newline at end of file diff --git a/app/views/tests/show.html.erb b/app/views/tests/show.html.erb new file mode 100644 index 00000000..e79e720a --- /dev/null +++ b/app/views/tests/show.html.erb @@ -0,0 +1,11 @@ + + + + + + Index | Simpler application + + +

Test ID: <%= @id %>

+ + \ No newline at end of file diff --git a/config.ru b/config.ru index 3060cc20..059e2cd1 100644 --- a/config.ru +++ b/config.ru @@ -1,3 +1,5 @@ require_relative 'config/environment' +use Rack::Reloader, 0 +use SimplerLogger, logdev: 'log/app.log' run Simpler.application diff --git a/config/environment.rb b/config/environment.rb index 7a0d38c3..06955542 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,3 +1,4 @@ require_relative '../lib/simpler' +require_relative '../lib/middleware/simpler_logger' Simpler.application.bootstrap! diff --git a/config/routes.rb b/config/routes.rb index 4a751251..1700ff3a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Simpler.application.routes do get '/tests', 'tests#index' post '/tests', 'tests#create' + get '/tests/:id', 'tests#show' end diff --git a/lib/middleware/simpler_logger.rb b/lib/middleware/simpler_logger.rb new file mode 100644 index 00000000..c6943636 --- /dev/null +++ b/lib/middleware/simpler_logger.rb @@ -0,0 +1,35 @@ +require 'logger' + +class SimplerLogger + def initialize(app, **options) + @logger = Logger.new(options[:logdev] || STDOUT) + @app = app + end + + def call(env) + request = Rack::Request.new(env) + response = @app.call(env) + + write_log(request, response) + + response + end + + def write_log(request, response) + time = Time.now + method = request.request_method + url = request.fullpath + controller = request.env['simpler.controller'].class + action = request.env['simpler.action'] + params = request.env['simpler.params'] || '-' + status = response[0] + type_response = response[1]['Content-Type'] + template = request.env['simpler.view_template'] + + @logger << "#{time} + Requiest: #{method} #{url} + Handler: #{controller}##{action} + Parameters: #{params} + Respponse: #{status} [#{type_response}] #{template}\n" + end +end diff --git a/lib/simpler.rb b/lib/simpler.rb index f9dfe3c4..d4d365c9 100644 --- a/lib/simpler.rb +++ b/lib/simpler.rb @@ -2,7 +2,6 @@ require_relative 'simpler/application' module Simpler - class << self def application Application.instance @@ -12,5 +11,4 @@ def root Pathname.new(File.expand_path('..', __dir__)) end end - end diff --git a/lib/simpler/application.rb b/lib/simpler/application.rb index 711946a9..7cf30789 100644 --- a/lib/simpler/application.rb +++ b/lib/simpler/application.rb @@ -6,7 +6,6 @@ module Simpler class Application - include Singleton attr_reader :db @@ -29,9 +28,13 @@ def routes(&block) def call(env) route = @router.route_for(env) controller = route.controller.new(env) + rescue StandardError + invalid_request_path + else action = route.action + params = route.params - make_response(controller, action) + make_response(controller, action, params) end private @@ -50,9 +53,15 @@ def setup_database @db = Sequel.connect(database_config) end - def make_response(controller, action) - controller.make_response(action) + def make_response(controller, action, params) + controller.make_response(action, params) end + def invalid_request_path + response = Rack::Response.new + response.status = 404 + response.write("Route for this URL not found\n") + response.finish + end end end diff --git a/lib/simpler/controller.rb b/lib/simpler/controller.rb index 9383b035..29c23659 100644 --- a/lib/simpler/controller.rb +++ b/lib/simpler/controller.rb @@ -2,7 +2,6 @@ module Simpler class Controller - attr_reader :name, :request, :response def initialize(env) @@ -11,11 +10,16 @@ def initialize(env) @response = Rack::Response.new end - def make_response(action) + def make_response(action, params) @request.env['simpler.controller'] = self @request.env['simpler.action'] = action - set_default_headers + set_params(params) + @request.env['simpler.params'] = self.params + + set_headers + set_status + send(action) write_response @@ -28,8 +32,16 @@ def extract_name self.class.name.match('(?.+)Controller')[:name].downcase end - def set_default_headers - @response['Content-Type'] = 'text/html' + def set_headers(type = 'text/html') + @response['Content-Type'] = type + end + + def set_status(sym = :ok) + @response.status = "#{Rack::Utils::SYMBOL_TO_STATUS_CODE[sym]} #{sym}" + end + + def set_params(hash) + hash.each { |key, value| @request.update_param(key, value) } end def write_response @@ -39,7 +51,7 @@ def write_response end def render_body - View.new(@request.env).render(binding) + @request.env['simpler.plain_text'] || View.new(@request.env).render(binding) end def params @@ -47,8 +59,11 @@ def params end def render(template) - @request.env['simpler.template'] = template + if template.is_a? String + @request.env['simpler.template'] = template + elsif template.is_a? Hash + @request.env['simpler.plain_text'] = template[:plain] if template[:plain] + end end - end end diff --git a/lib/simpler/router.rb b/lib/simpler/router.rb index 14b3415c..b05449b3 100644 --- a/lib/simpler/router.rb +++ b/lib/simpler/router.rb @@ -2,7 +2,6 @@ module Simpler class Router - def initialize @routes = [] end @@ -36,6 +35,5 @@ def add_route(method, path, route_point) def controller_from_string(controller_name) Object.const_get("#{controller_name.capitalize}Controller") end - end end diff --git a/lib/simpler/router/route.rb b/lib/simpler/router/route.rb index 4c66b4b7..87191e24 100644 --- a/lib/simpler/router/route.rb +++ b/lib/simpler/router/route.rb @@ -1,20 +1,50 @@ module Simpler class Router class Route - - attr_reader :controller, :action + attr_reader :controller, :action, :params def initialize(method, path, controller, action) @method = method @path = path @controller = controller @action = action + @params = {} end def match?(method, path) - @method == method && path.match(@path) + @method == method && match_path(path) + end + + private + + def path_to_array(any_path) + any_path.split('/').reject! { |i| i.empty? } + end + + def match_path(path) + path_request = path_to_array(path) + path_route = path_to_array(@path) + + compare(path_request, path_route) end + def compare(request_path, route_path) + return false unless request_path.size == route_path.size + + request_path.each_index do |i| + next if route_path[i] == request_path[i] + + return false unless route_path[i] =~ /^:id$/ + + get_params_from_request(route_path[i], request_path[i]) + end + end + + def get_params_from_request(key, value) + key = key[1..-1] if key.chr == ':' + key_sym = key.intern + @params[key_sym] = value + end end end end diff --git a/lib/simpler/view.rb b/lib/simpler/view.rb index 19a73b34..6aa2b06e 100644 --- a/lib/simpler/view.rb +++ b/lib/simpler/view.rb @@ -2,7 +2,6 @@ module Simpler class View - VIEW_BASE_PATH = 'app/views'.freeze def initialize(env) @@ -31,9 +30,8 @@ def template def template_path path = template || [controller.name, action].join('/') - + @env['simpler.view_template'] = "#{path}.html.erb" Simpler.root.join(VIEW_BASE_PATH, "#{path}.html.erb") end - end end diff --git a/log/app.log b/log/app.log new file mode 100644 index 00000000..e69de29b