diff --git a/app/controllers/tests_controller.rb b/app/controllers/tests_controller.rb index 1526a689..8e5687e0 100644 --- a/app/controllers/tests_controller.rb +++ b/app/controllers/tests_controller.rb @@ -5,7 +5,9 @@ def index end def create - end + def show + @test = Test.find(id: params[:id]) + end end diff --git a/app/views/tests/index.html.erb b/app/views/tests/index.html.erb index 39fce580..0915cef4 100644 --- a/app/views/tests/index.html.erb +++ b/app/views/tests/index.html.erb @@ -9,4 +9,4 @@

<%= @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..0e35f0af --- /dev/null +++ b/app/views/tests/show.html.erb @@ -0,0 +1,12 @@ + + + + + Show | Simpler application + + +

Simpler framework at work!

+ +

Test id: <%= @test_id %>

+ + diff --git a/config.ru b/config.ru index 3060cc20..f8c72a1c 100644 --- a/config.ru +++ b/config.ru @@ -1,3 +1,4 @@ require_relative 'config/environment' +use SimplerLogger run Simpler.application diff --git a/config/environment.rb b/config/environment.rb index 7a0d38c3..28e320c8 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,3 +1,4 @@ +require_relative '../middleware/simpler_logger' require_relative '../lib/simpler' 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/db/test_guru.sqlite b/db/test_guru.sqlite index 8624a03a..f8fa32e5 100644 Binary files a/db/test_guru.sqlite and b/db/test_guru.sqlite differ diff --git a/lib/simpler/application.rb b/lib/simpler/application.rb index 711946a9..a19c3ebb 100644 --- a/lib/simpler/application.rb +++ b/lib/simpler/application.rb @@ -53,6 +53,5 @@ def setup_database def make_response(controller, action) controller.make_response(action) end - end end diff --git a/lib/simpler/controller.rb b/lib/simpler/controller.rb index 9383b035..65adde0f 100644 --- a/lib/simpler/controller.rb +++ b/lib/simpler/controller.rb @@ -1,4 +1,5 @@ require_relative 'view' +require 'rack' module Simpler class Controller @@ -9,6 +10,7 @@ def initialize(env) @name = extract_name @request = Rack::Request.new(env) @response = Rack::Response.new + @route_params = env["simpler.route_params"] || {} end def make_response(action) @@ -39,16 +41,33 @@ def write_response end def render_body - View.new(@request.env).render(binding) + if @request.env["simpler.plain_text"] + @response["Content-Type"] = "text/plain" + @request.env["simpler.plain_text"] + else + View.new(@request.env).render(binding) + end end def params - @request.params + @route_params || {} + @request.params.merge(@route_params) end - def render(template) - @request.env['simpler.template'] = template + def render(template = nil, plain = nil) + if plain + @request.env['simpler.plain_text'] = plain + else + @request.env['simpler.template'] = template + end end + def status(status_code) + @response.status = status_code + end + + def headers + @response + end end end diff --git a/lib/simpler/router.rb b/lib/simpler/router.rb index 14b3415c..4f242c6b 100644 --- a/lib/simpler/router.rb +++ b/lib/simpler/router.rb @@ -36,6 +36,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..62df8728 100644 --- a/lib/simpler/router/route.rb +++ b/lib/simpler/router/route.rb @@ -9,12 +9,24 @@ def initialize(method, path, controller, action) @path = path @controller = controller @action = action + @params = {} + @regexp_path = regexp_path end def match?(method, path) - @method == method && path.match(@path) + @method == method && path.match(@regexp_path) end + def add_params(path) + path_params = path.scan(%r{\w+/\d+}).join("/").split("/") + params[:id] = path_params.last.to_i + end + + private + + def regexp_path + Regexp.new("^#{@path.gsub(/:id/, '\d+')}$") + end end end end diff --git a/log/app.log b/log/app.log new file mode 100644 index 00000000..e646e17f --- /dev/null +++ b/log/app.log @@ -0,0 +1,18 @@ +Request: GET /tests +Handler: NilClass# +Parameters: {} +Response: 200 OK [text/html] N/A +-------------------------------------- +Request: GET /tests/101 +Handler: NilClass# +Parameters: {} +Response: 200 OK [text/html] N/A +-------------------------------------- +Request: GET /tests/101 +Handler: NilClass# +Parameters: {} +Response: 200 OK [text/html] N/A +-------------------------------------- +Request: GET /favicon.ico +Handler: NilClass# +Parameters: {} diff --git a/middleware/simpler_logger.rb b/middleware/simpler_logger.rb new file mode 100644 index 00000000..d6d7dd47 --- /dev/null +++ b/middleware/simpler_logger.rb @@ -0,0 +1,44 @@ +require 'logger' + +class SimplerLogger + def initialize(app) + @app = app + @logger = Logger.new('log/app.log') + @logger.formatter = proc do |severity, datetime, progname, msg| + "#{msg}\n" + end + end + + def call(env) + request = Rack::Request.new(env) + log_request(request) + status, headers, body = @app.call(env) + log_response(status, headers, env) + log_separator + [status, headers, body] + end + + private + + def log_request(request) + @logger.info "Request: #{request.request_method} #{request.path}" + @logger.info "Handler: #{env_to_handler(request.env)}" + @logger.info "Parameters: #{request.params}" + end + + def log_response(status, headers, env) + response_content_type = headers['Content-Type'] + template = env['simpler.template'] || 'N/A' + @logger.info "Response: #{status} #{Rack::Utils::HTTP_STATUS_CODES[status]} [#{response_content_type}] #{template}" + end + + def env_to_handler(env) + controller = env['simpler.controller'] + action = env['simpler.action'] + "#{controller.class}##{action}" + end + + def log_separator + @logger.info "--------------------------------------" + end +end