From 326f8901098e5cd0b4972b1489fdd023d2e63c14 Mon Sep 17 00:00:00 2001 From: NickelGit Date: Fri, 24 Apr 2020 16:46:22 +0400 Subject: [PATCH 1/8] Inatra exercise comlited --- test/exercise/rackup/inatra.rb | 12 +++++++++++- test/exercise/rackup/test.rb | 10 ++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index a04045d9..6ce432e6 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -1,9 +1,19 @@ module Inatra + @routes = {} + class << self - def routes + def routes(&block) + instance_eval(&block) + end + + def get(path, &block) + @routes['GET'] = { path => block } end def call(env) + request_method = env['REQUEST_METHOD'] + path = env['PATH_INFO'] + @routes[request_method][path].call end end end diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index abc99cb4..b36f9b22 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -6,11 +6,9 @@ class RackTest < Test::Unit::TestCase def test_it_says_hello_world - omit do - browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) - browser.get '/hello' - assert browser.last_response.ok? - assert_equal 'Hello World', browser.last_response.body - end + browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) + browser.get '/hello' + assert browser.last_response.ok? + assert_equal 'Hello World', browser.last_response.body end end From 6a0d042291233463e2ce7aacf54ccdbe125508ab Mon Sep 17 00:00:00 2001 From: NickelGit Date: Sat, 25 Apr 2020 23:45:10 +0400 Subject: [PATCH 2/8] POST method added --- test/exercise/rackup/inatra.rb | 4 ++++ test/exercise/rackup/my_app.rb | 3 +++ test/exercise/rackup/test.rb | 3 +++ 3 files changed, 10 insertions(+) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index 6ce432e6..f27035d7 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -10,6 +10,10 @@ def get(path, &block) @routes['GET'] = { path => block } end + def post(path, &block) + @routes['POST'] = { path => block } + end + def call(env) request_method = env['REQUEST_METHOD'] path = env['PATH_INFO'] diff --git a/test/exercise/rackup/my_app.rb b/test/exercise/rackup/my_app.rb index 7c3d8ccf..3116b725 100644 --- a/test/exercise/rackup/my_app.rb +++ b/test/exercise/rackup/my_app.rb @@ -2,4 +2,7 @@ get '/hello' do [200, {}, ['Hello World']] end + post '/hello' do + [200, {}, ['Hello World! POST']] + end end diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index b36f9b22..445c7bb8 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -10,5 +10,8 @@ def test_it_says_hello_world browser.get '/hello' assert browser.last_response.ok? assert_equal 'Hello World', browser.last_response.body + browser.post '/hello' + assert browser.last_response.ok? + assert_equal 'Hello World! POST', browser.last_response.body end end From efa54174ba5cda27b24c49377a130aa1bb809e4c Mon Sep 17 00:00:00 2001 From: NickelGit Date: Tue, 28 Apr 2020 00:03:13 +0400 Subject: [PATCH 3/8] multimethods feature added. Style fixes in tests --- test/exercise/rackup/inatra.rb | 6 ++++-- test/exercise/rackup/my_app.rb | 5 +++++ test/exercise/rackup/test.rb | 26 +++++++++++++++++++------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index f27035d7..56091334 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -7,11 +7,13 @@ def routes(&block) end def get(path, &block) - @routes['GET'] = { path => block } + @routes['GET'] = {} if @routes['GET'].nil? + @routes['GET'][path] = block end def post(path, &block) - @routes['POST'] = { path => block } + @routes['POST'] = {} if @routes['POST'].nil? + @routes['POST'][path] = block end def call(env) diff --git a/test/exercise/rackup/my_app.rb b/test/exercise/rackup/my_app.rb index 3116b725..c97d8304 100644 --- a/test/exercise/rackup/my_app.rb +++ b/test/exercise/rackup/my_app.rb @@ -2,6 +2,11 @@ get '/hello' do [200, {}, ['Hello World']] end + + get '/hello/another' do + [200, {}, ['Hello World']] + end + post '/hello' do [200, {}, ['Hello World! POST']] end diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index 445c7bb8..ca4f5559 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -5,13 +5,25 @@ require_relative './my_app' class RackTest < Test::Unit::TestCase + def setup + @browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) + end + def test_it_says_hello_world - browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) - browser.get '/hello' - assert browser.last_response.ok? - assert_equal 'Hello World', browser.last_response.body - browser.post '/hello' - assert browser.last_response.ok? - assert_equal 'Hello World! POST', browser.last_response.body + @browser.get '/hello' + assert @browser.last_response.ok? + assert_equal 'Hello World', @browser.last_response.body + end + + def test_it_says_hello_world_another_path + @browser.get '/hello/another' + assert @browser.last_response.ok? + assert_equal 'Hello World', @browser.last_response.body + end + + def test_it_says_hello_world_to_post + @browser.post '/hello' + assert @browser.last_response.ok? + assert_equal 'Hello World! POST', @browser.last_response.body end end From edbcc9c1c0c93a51e0431fbf73254981073ee363 Mon Sep 17 00:00:00 2001 From: NickelGit Date: Tue, 28 Apr 2020 15:26:24 +0400 Subject: [PATCH 4/8] Tests fixed. Method for adding routes added --- test/exercise/rackup/inatra.rb | 13 +++++++++---- test/exercise/rackup/my_app.rb | 2 +- test/exercise/rackup/test.rb | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index 56091334..810a5572 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -7,13 +7,11 @@ def routes(&block) end def get(path, &block) - @routes['GET'] = {} if @routes['GET'].nil? - @routes['GET'][path] = block + add_route('GET', path, &block) end def post(path, &block) - @routes['POST'] = {} if @routes['POST'].nil? - @routes['POST'][path] = block + add_route('POST', path, &block) end def call(env) @@ -21,5 +19,12 @@ def call(env) path = env['PATH_INFO'] @routes[request_method][path].call end + + private + + def add_route(method, path, &block) + @routes[method] = {} if @routes[method].nil? + @routes[method][path] = block + end end end diff --git a/test/exercise/rackup/my_app.rb b/test/exercise/rackup/my_app.rb index c97d8304..d546efd2 100644 --- a/test/exercise/rackup/my_app.rb +++ b/test/exercise/rackup/my_app.rb @@ -4,7 +4,7 @@ end get '/hello/another' do - [200, {}, ['Hello World']] + [200, {}, ['Hello World AGAIN']] end post '/hello' do diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index ca4f5559..d2679385 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -18,7 +18,7 @@ def test_it_says_hello_world def test_it_says_hello_world_another_path @browser.get '/hello/another' assert @browser.last_response.ok? - assert_equal 'Hello World', @browser.last_response.body + assert_equal 'Hello World AGAIN', @browser.last_response.body end def test_it_says_hello_world_to_post From 731abd9c63dc3199344c3f20a7899ed8a7053bc3 Mon Sep 17 00:00:00 2001 From: NickelGit Date: Tue, 28 Apr 2020 15:56:54 +0400 Subject: [PATCH 5/8] Double-pipe equals syntaxis added --- test/exercise/rackup/inatra.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index 810a5572..5d5edc58 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -23,7 +23,7 @@ def call(env) private def add_route(method, path, &block) - @routes[method] = {} if @routes[method].nil? + @routes[method] ||= {} @routes[method][path] = block end end From 4dfd6d64853c1846dbadeebdf99de064ce136b6e Mon Sep 17 00:00:00 2001 From: NickelGit Date: Wed, 29 Apr 2020 18:35:14 +0400 Subject: [PATCH 6/8] New tests added to Inatra --- test/exercise/rackup/test.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index d2679385..476ea2b1 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -26,4 +26,25 @@ def test_it_says_hello_world_to_post assert @browser.last_response.ok? assert_equal 'Hello World! POST', @browser.last_response.body end + + def test_it_pongs + + @browser.get '/ping' + assert @browser.last_response.ok? + assert_equal 'PONG', @browser.last_response.body + end + + def test_it_says_bye + + @browser.post '/bye' + assert @browser.last_response.ok? + assert_equal 'Bye Bye', @browser.last_response.body + end + + def test_it_handles_404 + + @browser.get '/missing_method' + assert @browser.last_response.not_found? + assert_equal 'Not Found', @browser.last_response.body + end end From a3da70c82965833a663897f14c5b2d685489bd45 Mon Sep 17 00:00:00 2001 From: NickelGit Date: Wed, 29 Apr 2020 18:36:32 +0400 Subject: [PATCH 7/8] New methods added to my_app --- test/exercise/rackup/my_app.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/exercise/rackup/my_app.rb b/test/exercise/rackup/my_app.rb index d546efd2..516dbfe8 100644 --- a/test/exercise/rackup/my_app.rb +++ b/test/exercise/rackup/my_app.rb @@ -10,4 +10,12 @@ post '/hello' do [200, {}, ['Hello World! POST']] end + + get '/ping' do + [200, {}, ['PONG']] + end + + post '/bye' do + [200, {}, ['Bye Bye']] + end end From a9996e9d298854783ea72a298c28363c40304547 Mon Sep 17 00:00:00 2001 From: NickelGit Date: Wed, 29 Apr 2020 20:03:50 +0400 Subject: [PATCH 8/8] Adding new methods to routing implemented with method_missing --- test/exercise/rackup/inatra.rb | 23 +++++++++++------------ test/exercise/rackup/my_app.rb | 8 -------- test/exercise/rackup/test.rb | 15 --------------- 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index 5d5edc58..cbb42f67 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -6,25 +6,24 @@ def routes(&block) instance_eval(&block) end - def get(path, &block) - add_route('GET', path, &block) + def method_missing(missing_method_name, *args, &block) + if args.length == 1 + @routes[missing_method_name.to_s.upcase] ||= {} + @routes[missing_method_name.to_s.upcase][args[0]] = block + else + super + end end - def post(path, &block) - add_route('POST', path, &block) + def respond_to_missing?(method_name, *_args) + @routes.include?(method_name.to_s.upcase) end def call(env) request_method = env['REQUEST_METHOD'] path = env['PATH_INFO'] - @routes[request_method][path].call - end - - private - - def add_route(method, path, &block) - @routes[method] ||= {} - @routes[method][path] = block + func = @routes[request_method][path] + func ? func.call : [404, {}, ['Not Found']] end end end diff --git a/test/exercise/rackup/my_app.rb b/test/exercise/rackup/my_app.rb index 516dbfe8..d9ba5b10 100644 --- a/test/exercise/rackup/my_app.rb +++ b/test/exercise/rackup/my_app.rb @@ -3,14 +3,6 @@ [200, {}, ['Hello World']] end - get '/hello/another' do - [200, {}, ['Hello World AGAIN']] - end - - post '/hello' do - [200, {}, ['Hello World! POST']] - end - get '/ping' do [200, {}, ['PONG']] end diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index 476ea2b1..e0f8b34b 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -15,34 +15,19 @@ def test_it_says_hello_world assert_equal 'Hello World', @browser.last_response.body end - def test_it_says_hello_world_another_path - @browser.get '/hello/another' - assert @browser.last_response.ok? - assert_equal 'Hello World AGAIN', @browser.last_response.body - end - - def test_it_says_hello_world_to_post - @browser.post '/hello' - assert @browser.last_response.ok? - assert_equal 'Hello World! POST', @browser.last_response.body - end - def test_it_pongs - @browser.get '/ping' assert @browser.last_response.ok? assert_equal 'PONG', @browser.last_response.body end def test_it_says_bye - @browser.post '/bye' assert @browser.last_response.ok? assert_equal 'Bye Bye', @browser.last_response.body end def test_it_handles_404 - @browser.get '/missing_method' assert @browser.last_response.not_found? assert_equal 'Not Found', @browser.last_response.body