From 1c3afe191272256e6828e6fbd26eb29b9c9438d8 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 7 Sep 2025 12:53:46 +0300 Subject: [PATCH] =?UTF-8?q?fiature:=20=D0=9E=D1=82=D0=B2=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=84=D1=80=D0=B5=D0=B9?= =?UTF-8?q?=D0=BC=D0=B2=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/tests_controller.rb | 8 ++++++++ app/views/tests/index.text.erb | 5 +++++ app/views/tests/list.text.erb | 5 +++++ app/views/tests/show.html.erb | 12 ++++++++++++ config.ru | 3 +++ config/routes.rb | 1 + lib/middleware/logger.rb | 24 ++++++++++++++++++++++++ lib/simpler/application.rb | 8 +++++++- lib/simpler/controller.rb | 15 +++++++++++++++ lib/simpler/router/route.rb | 2 +- lib/simpler/view.rb | 11 ++++++++++- 11 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 app/views/tests/index.text.erb create mode 100644 app/views/tests/list.text.erb create mode 100644 app/views/tests/show.html.erb create mode 100644 lib/middleware/logger.rb diff --git a/app/controllers/tests_controller.rb b/app/controllers/tests_controller.rb index 1526a689..b9910472 100644 --- a/app/controllers/tests_controller.rb +++ b/app/controllers/tests_controller.rb @@ -2,10 +2,18 @@ class TestsController < Simpler::Controller def index @time = Time.now + + render 'tests/list', text: :plain + status 201 + headers['Content-Type'] = 'text/plain' end def create end + def show + @id = params[:id] + end + end diff --git a/app/views/tests/index.text.erb b/app/views/tests/index.text.erb new file mode 100644 index 00000000..575a6f7d --- /dev/null +++ b/app/views/tests/index.text.erb @@ -0,0 +1,5 @@ +Index | Simpler application + +Simpler framework at work! + +Time <%= @time %> diff --git a/app/views/tests/list.text.erb b/app/views/tests/list.text.erb new file mode 100644 index 00000000..4d54bfba --- /dev/null +++ b/app/views/tests/list.text.erb @@ -0,0 +1,5 @@ +List | Simpler application + +Simpler framework at work! + +Time <%= @time %> diff --git a/app/views/tests/show.html.erb b/app/views/tests/show.html.erb new file mode 100644 index 00000000..77f277a7 --- /dev/null +++ b/app/views/tests/show.html.erb @@ -0,0 +1,12 @@ + + + + + Show | Simpler application + + +

Simpler framework at work!

+ +

id:<%= @id %>

+ + diff --git a/config.ru b/config.ru index 3060cc20..4e43f3b9 100644 --- a/config.ru +++ b/config.ru @@ -1,3 +1,6 @@ require_relative 'config/environment' +require_relative 'lib/middleware/logger' + +use SimplerLogger, 'log/app.log' run Simpler.application 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/logger.rb b/lib/middleware/logger.rb new file mode 100644 index 00000000..38dc8629 --- /dev/null +++ b/lib/middleware/logger.rb @@ -0,0 +1,24 @@ +require 'logger' + +class SimplerLogger + def initialize(app, log_path) + @app = app + @logger = Logger.new(Simpler.root.join(log_path)) + end + + def call(env) + status, headers, response = @app.call(env) + @logger.info(message(status, headers, env)) + + [status, headers, response] + end + + private + + def message(status, headers, env) + "\nRequest: #{env['REQUEST_METHOD']} #{env['REQUEST_URI']}\n" \ + "Handler: #{env['simpler.controller'].class}##{env['simpler.action']}\n" \ + "Parameters: #{env['simpler.controller'].request.params}\n" \ + "Response: #{status} [#{headers['Content-Type']}] #{env['simpler.template_name']}\n" \ + end +end diff --git a/lib/simpler/application.rb b/lib/simpler/application.rb index 711946a9..3a03c60c 100644 --- a/lib/simpler/application.rb +++ b/lib/simpler/application.rb @@ -28,6 +28,9 @@ def routes(&block) def call(env) route = @router.route_for(env) + + return url_not_found unless route + controller = route.controller.new(env) action = route.action @@ -37,7 +40,7 @@ def call(env) private def require_app - Dir["#{Simpler.root}/app/**/*.rb"].each { |file| require file } + Dir["#{Simpler.root}/app/**/*.rb"].sort.each { |file| require file } end def require_routes @@ -54,5 +57,8 @@ def make_response(controller, action) controller.make_response(action) end + def url_not_found + [404, { 'Content-Type' => 'text/plain' }, ["Error: URL not found\n"]] + end end end diff --git a/lib/simpler/controller.rb b/lib/simpler/controller.rb index 9383b035..9d6910f2 100644 --- a/lib/simpler/controller.rb +++ b/lib/simpler/controller.rb @@ -43,11 +43,26 @@ def render_body end def params + add_id_params @request.params end + def add_id_params + path_parts = @request.env['REQUEST_PATH'].split('/') + @request.params[:id] = path_parts.last if path_parts.last[/^\d+$/] + end + + def status(code) + @response.status = code + end + + def headers + @response.headers + end + def render(template) @request.env['simpler.template'] = template + @request.env['simpler.template_format'] = template_format end end diff --git a/lib/simpler/router/route.rb b/lib/simpler/router/route.rb index 4c66b4b7..7439de7d 100644 --- a/lib/simpler/router/route.rb +++ b/lib/simpler/router/route.rb @@ -12,7 +12,7 @@ def initialize(method, path, controller, action) end def match?(method, path) - @method == method && path.match(@path) + @method == method && path.gsub(/\d+/, ':id') == @path end end diff --git a/lib/simpler/view.rb b/lib/simpler/view.rb index 19a73b34..dd1b7b61 100644 --- a/lib/simpler/view.rb +++ b/lib/simpler/view.rb @@ -4,6 +4,7 @@ module Simpler class View VIEW_BASE_PATH = 'app/views'.freeze + FORMAT = { plain: 'text', html: 'html', json: 'json' }.freeze def initialize(env) @env = env @@ -29,10 +30,18 @@ def template @env['simpler.template'] end + def template_format + template_format = @env['simpler.template_format'] + format = template_format.nil? ? 'html'.to_sym : template_format.values.first + + FORMAT[format] + end + def template_path path = template || [controller.name, action].join('/') + @env['simpler.template_name'] = "#{path}.#{template_format}.erb" - Simpler.root.join(VIEW_BASE_PATH, "#{path}.html.erb") + Simpler.root.join(VIEW_BASE_PATH, @env['simpler.template_name']) end end