hobby 0.0.2 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7bc8b664dad60ba755a291e2b6ecac6e330b227
4
- data.tar.gz: 2dce16045fe1301e04a45b6057787b2b036b9332
3
+ metadata.gz: 4b0ae0b8efe38c2fa31277c8170148944aef182b
4
+ data.tar.gz: ad2dd203359e369d4df8a17836e099f97f00a7e8
5
5
  SHA512:
6
- metadata.gz: fd1088888933b0786921737b63f546110078a91372bfc59db7b266efdfcf8e796c59f3e4cc28c5678030541583d9f59ea7d61b633b2e1f8e5c2f169fc16e85f3
7
- data.tar.gz: 2874923dffc328ff549ba1d7e2104ba170722a2a5a0f93ffb6276607153489a1b9ca7bd67f263a3b9c4274e80eab9cd302ec558ad762c7b3e3255a40c563ffba
6
+ metadata.gz: 60dc8490104a8edbad0ec129d0fe916984bafecdabc8f234952521d2f39bc067c916d4d3e8c1afa5e4c82a8caeeed7eb73b5f4024593b8acdf73684728088513
7
+ data.tar.gz: 646a11c3a09a480b3ab53bcf4c99df141786c4d708e64fe8e975e9cea8eeabbbef60cfe66f777f527b9d6854b1ec4edcea865e318d8299f54c99d4385cdede9a
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'hobby'
7
- spec.version = '0.0.2'
7
+ spec.version = '0.0.3'
8
8
  spec.authors = ['Anatoly Chernow']
9
9
  spec.email = ['chertoly@gmail.com']
10
10
  spec.summary = %q{A minimal DSL over rack}
@@ -1,9 +1,65 @@
1
1
  require 'rack'
2
2
  require 'forwardable'
3
3
 
4
+ require 'hobby/router'
5
+
4
6
  module Hobby
7
+ App = Hobby # to stay compatible old code
5
8
  VERBS = %w[DELETE GET HEAD OPTIONS PATCH POST PUT]
6
- end
7
9
 
8
- require 'hobby/router'
9
- require 'hobby/app'
10
+ def self.included app
11
+ app.extend Singleton
12
+ app.builder, app.router = Rack::Builder.new, Router.new
13
+ app.request, app.response = Rack::Request, Rack::Response
14
+ end
15
+
16
+ module Singleton
17
+ attr_accessor :builder, :router, :request, :response
18
+
19
+ def new (*)
20
+ builder.run super
21
+ builder.to_app
22
+ end
23
+
24
+ extend Forwardable
25
+ delegate [:map, :use] => :builder
26
+
27
+ VERBS.each do |verb|
28
+ define_method verb.downcase do |path = '/', &action|
29
+ router.add_route verb, path, &action
30
+ end
31
+ end
32
+ end
33
+
34
+ def call env
35
+ dup.handle env
36
+ end
37
+
38
+ protected
39
+ def handle env
40
+ route = self.class.router.route_for (@env = env)
41
+
42
+ if route
43
+ response.write instance_exec &route
44
+ else
45
+ response.status = 404
46
+ end
47
+
48
+ response
49
+ end
50
+
51
+ private
52
+ attr_reader :env
53
+
54
+ def request
55
+ @request ||= self.class.request.new env
56
+ end
57
+
58
+ def response
59
+ @response ||= self.class.response.new
60
+ end
61
+
62
+ def my
63
+ env.fetch :path_params, {}
64
+ end
65
+ end
@@ -1,7 +1,6 @@
1
1
  require 'devtools/spec_helper'
2
2
 
3
3
  require 'hobby'
4
- require 'hobby/rspec/router'
5
4
 
6
5
  require 'minitest'
7
6
  require 'minitest-power_assert'
@@ -17,5 +16,4 @@ end
17
16
 
18
17
  RSpec.configure do |config|
19
18
  config.expect_with :rspec, :minitest
20
- config.include Hobby::RSpec::Router, type: :router
21
19
  end
@@ -0,0 +1,33 @@
1
+ module RouterMatchers
2
+ extend self
3
+ SOME_ROUTE = ->{:some_route}
4
+
5
+ def env_for path, verb = 'GET'
6
+ {'REQUEST_METHOD' => verb, 'PATH_INFO' => path }
7
+ end
8
+
9
+ def add_routes *routes
10
+ routes.each { |route| subject.add_route 'GET', route, &SOME_ROUTE }
11
+ end
12
+
13
+ extend RSpec::Matchers::DSL
14
+
15
+ define :find_route do |path, verb = 'GET'|
16
+ match do |subject|
17
+ env = env_for path, verb
18
+ route = subject.route_for env
19
+
20
+ params_are_ok = (@params ? (@params.to_a - env[:path_params].to_a).empty? : true)
21
+
22
+ route && (route.to_proc.call == SOME_ROUTE.call) && params_are_ok
23
+ end
24
+
25
+ chain :and_set_params do |**params|
26
+ @params = params
27
+ end
28
+ end
29
+
30
+ def self.included example_group
31
+ example_group.extend self
32
+ end
33
+ end
@@ -1,6 +1,9 @@
1
1
  require 'helper'
2
+ require 'router_matchers'
3
+
4
+ describe Hobby::Router do
5
+ include RouterMatchers
2
6
 
3
- describe Hobby::Router, type: :router do
4
7
  routes = %w!
5
8
  /with.dot
6
9
  /with-hyphen
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hobby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anatoly Chernow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-13 00:00:00.000000000 Z
11
+ date: 2016-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -40,11 +40,9 @@ files:
40
40
  - Rakefile
41
41
  - hobby.gemspec
42
42
  - lib/hobby.rb
43
- - lib/hobby/app.rb
44
43
  - lib/hobby/router.rb
45
44
  - lib/hobby/router/route.rb
46
45
  - lib/hobby/router/routes.rb
47
- - lib/hobby/rspec/router.rb
48
46
  - spec/app_spec.rb
49
47
  - spec/apps/Decorator.rb
50
48
  - spec/apps/Env.rb
@@ -55,7 +53,7 @@ files:
55
53
  - spec/apps/Use.rb
56
54
  - spec/apps/WithoutPath.rb
57
55
  - spec/helper.rb
58
- - spec/router_group_spec.rb
56
+ - spec/router_matchers.rb
59
57
  - spec/router_spec.rb
60
58
  homepage: https://github.com/ch1c0t/hobby
61
59
  licenses:
@@ -92,5 +90,5 @@ test_files:
92
90
  - spec/apps/Use.rb
93
91
  - spec/apps/WithoutPath.rb
94
92
  - spec/helper.rb
95
- - spec/router_group_spec.rb
93
+ - spec/router_matchers.rb
96
94
  - spec/router_spec.rb
@@ -1,59 +0,0 @@
1
- module Hobby
2
- module App
3
- def self.included app
4
- app.extend Singleton
5
- app.builder, app.router = Rack::Builder.new, Router.new
6
- app.request, app.response = Rack::Request, Rack::Response
7
- end
8
-
9
- module Singleton
10
- attr_accessor :builder, :router, :request, :response
11
-
12
- def new (*)
13
- builder.run super
14
- builder.to_app
15
- end
16
-
17
- extend Forwardable
18
- delegate [:map, :use] => :builder
19
-
20
- VERBS.each do |verb|
21
- define_method verb.downcase do |path = '/', &action|
22
- router.add_route verb, path, &action
23
- end
24
- end
25
- end
26
-
27
- def call env
28
- dup.handle env
29
- end
30
-
31
- protected
32
- def handle env
33
- route = self.class.router.route_for (@env = env)
34
-
35
- if route
36
- response.write instance_exec &route
37
- else
38
- response.status = 404
39
- end
40
-
41
- response
42
- end
43
-
44
- private
45
- attr_reader :env
46
-
47
- def request
48
- @request ||= self.class.request.new env
49
- end
50
-
51
- def response
52
- @response ||= self.class.response.new
53
- end
54
-
55
- def my
56
- env.fetch :path_params, {}
57
- end
58
- end
59
- end
@@ -1,35 +0,0 @@
1
- module Hobby::RSpec
2
- module Router
3
- extend self
4
- SOME_ROUTE = ->{:some_route}
5
-
6
- def env_for path, verb = 'GET'
7
- {'REQUEST_METHOD' => verb, 'PATH_INFO' => path }
8
- end
9
-
10
- def add_routes *routes
11
- routes.each { |route| subject.add_route 'GET', route, &SOME_ROUTE }
12
- end
13
-
14
- extend RSpec::Matchers::DSL
15
-
16
- define :find_route do |path, verb = 'GET'|
17
- match do |subject|
18
- env = env_for path, verb
19
- route = subject.route_for env
20
-
21
- params_are_ok = (@params ? (@params.to_a - env[:path_params].to_a).empty? : true)
22
-
23
- route && (route.to_proc.call == SOME_ROUTE.call) && params_are_ok
24
- end
25
-
26
- chain :and_set_params do |**params|
27
- @params = params
28
- end
29
- end
30
-
31
- def self.included example_group
32
- example_group.extend self
33
- end
34
- end
35
- end
@@ -1,46 +0,0 @@
1
- require 'helper'
2
-
3
- describe Hobby::RSpec::Router do
4
- before do
5
- @Group = Class.new do
6
- def subject
7
- @router ||= Hobby::Router.new
8
- end
9
- end.include described_class
10
- end
11
-
12
- it 'contains a few helpers in its singleton' do
13
- [:env_for, :add_routes, :find_route].each do |name|
14
- assert { @Group.respond_to? name }
15
- end
16
- end
17
-
18
- describe 'env_for' do
19
- context 'two arguments passed' do
20
- it 'returns an environment' do
21
- env = { "REQUEST_METHOD" => 'POST', "PATH_INFO" => '/some_path' }
22
- assert { env == (@Group.env_for '/some_path', 'POST') }
23
- end
24
- end
25
-
26
- context 'one argument passed' do
27
- it 'defaults to GET' do
28
- env = { "REQUEST_METHOD" => 'GET', "PATH_INFO" => '/some_path' }
29
- assert { env == (@Group.env_for '/some_path') }
30
- end
31
- end
32
- end
33
-
34
- describe 'add_routes' do
35
- it do
36
- routes = %w! first second third!
37
- group = @Group.new
38
-
39
- group.add_routes *routes
40
-
41
- routes.each do |route|
42
- expect(group.subject.route_for group.env_for 'first').to be_truthy
43
- end
44
- end
45
- end
46
- end