nyny 3.3.0 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 107d11189a291b7486db035f572921ff75946129
4
- data.tar.gz: 484670541b44ee3c37e59c219a5769a489caccce
3
+ metadata.gz: 6db6a9ca35676823e643db65bc2b458c44bc793f
4
+ data.tar.gz: 582642543e721156d818975ced8ad08849c5c2eb
5
5
  SHA512:
6
- metadata.gz: a130aa58b46327176465becf3d4d030bdaad6bb6b681ca0c8be4f55658b6fe72351e06050c9d1eafc7a98e4319629045697ea55b09f02725023082453e27fa8c
7
- data.tar.gz: 5fb16a4139ac277a4cea7da8320f2e3ead517d8bcaa54c5ae0b71aa20c5dbb7cfe1c75fe5462d33f7b8aa71a3adc85affb562e4997978d634563db9d8f3405db
6
+ metadata.gz: 0b4aeb7be4451c4d4663cecf2ce4bb0056bf9a2170d2afd0935399f0d114c37a32fb5f3101029509a839dee046d809fbf3dfd48a52faaa5b996c18d006cc3dfc
7
+ data.tar.gz: fc5e89993a3d8356c21fab47ca10b132ca1b0eeb1f5e46b7365f648353b35b8bfbfd873e2ec30a4a19717d191c63adfda8404c01fcc70708b203977b4ff53d23
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 3.3.1
2
+ - if the response of the route is a enumerable, NYNY will try to
3
+ send it in chunks (given that both the client and the server support it)
4
+ - NYNY::Base for those who love the barebone (lacks config, namespaces,
5
+ templates, and run!)
6
+
1
7
  3.3.0
2
8
  - App.config
3
9
  - before_initialize hooks
data/README.md CHANGED
@@ -4,7 +4,6 @@
4
4
  [![Build Status](https://api.travis-ci.org/alisnic/nyny.png)](https://travis-ci.org/alisnic/nyny)
5
5
  [![Coverage Status](https://coveralls.io/repos/alisnic/nyny/badge.png)](https://coveralls.io/r/alisnic/nyny)
6
6
  [![Code Climate](https://codeclimate.com/repos/521b7ee513d637348712864a/badges/60e3637788bbac94f1cb/gpa.png)](https://codeclimate.com/repos/521b7ee513d637348712864a/feed)
7
- [![Dependency Status](https://gemnasium.com/alisnic/nyny.png)](https://gemnasium.com/alisnic/nyny)
8
7
  [![Gem Version](https://badge.fury.io/rb/nyny.png)](http://badge.fury.io/rb/nyny)
9
8
 
10
9
  ```ruby
@@ -37,7 +36,7 @@ Open the browser at [http://localhost:9292](http://localhost:9292)
37
36
  - [TOP](#new-york-new-york)
38
37
  - [Motivation](#motivation)
39
38
  - [Philosophy](#philosophy)
40
- - [Why use NYNY instead of Sinatra](#why-use-nyny-instead-of-sinatra)
39
+ - [Why use NYNY](#why-use-nyny)
41
40
  - [Usage](#usage)
42
41
  - [Environment](#environment)
43
42
  - [Configuration](#configuration)
@@ -58,8 +57,8 @@ NYNY is unassuming, it has all the core stuff to get running, but nothing else.
58
57
  Your app is the framework. However, it's trivial to extend NYNY via its
59
58
  [extension interface](#extensions).
60
59
 
61
- # Why use NYNY instead of any other small web framework
62
- - It's __very__ small (<300 LOC), which is just a little overhead on top of Rack.
60
+ # Why use NYNY
61
+ - It's __very__ small (~300 LOC), which is just a little overhead on top of Rack.
63
62
  - You want to dig into the source code and change to your needs (NYNY's source code is more welcoming)
64
63
  - Each NYNY app is a Rack middleware, so it can be used inside of Sinatra, Rails, or any other Rack-based app.
65
64
  - __It uses Journey for routing (Rails' router)__, which makes its routing logic
@@ -124,7 +123,7 @@ class App < NYNY::App
124
123
  config.always = true
125
124
  end
126
125
 
127
- configdure :production do
126
+ configure :production do
128
127
  config.prod = true
129
128
  end
130
129
 
@@ -1,61 +1,18 @@
1
- require 'rack'
1
+ require 'nyny/base'
2
+ require 'nyny/templates'
2
3
  require 'better_errors'
3
4
  require 'ostruct'
4
- require 'nyny/primitives'
5
- require 'nyny/request_scope'
6
- require 'nyny/router'
7
- require 'nyny/templates'
8
5
 
9
6
  module NYNY
10
- class App
11
- include NYNY::Inheritable
12
- HTTP_VERBS = [:delete, :get, :head, :options, :patch, :post, :put, :trace]
13
-
14
- inheritable :builder, Rack::Builder.new
15
- inheritable :scope_class, Class.new(RequestScope)
16
- inheritable :config, OpenStruct.new
17
- inheritable :route_defs, []
18
- inheritable :before_hooks, []
19
- inheritable :after_hooks, []
20
- inheritable :before_init_hooks, []
21
- inheritable :after_init_hooks, []
22
-
23
- def initialize app=nil
24
- self.class.builder.run Router.new({
25
- :scope_class => self.class.scope_class,
26
- :route_defs => self.class.route_defs,
27
- :before_hooks => self.class.before_hooks,
28
- :after_hooks => self.class.after_hooks,
29
- :fallback => app
30
- })
31
-
32
- self.class.before_init_hooks.each {|h| h.call(self)}
33
- @app = self.class.builder.to_app
34
- self.class.after_init_hooks.each {|h| h.call(self, @app)}
35
- end
36
-
37
- def call env
38
- @app.call env
39
- end
7
+ class App < Base
8
+ inheritable :config, OpenStruct.new
9
+ register NYNY::Templates
10
+ use Rack::Chunked
40
11
 
41
- #class methods
42
12
  class << self
43
- HTTP_VERBS.each do |method|
44
- define_method method do |path, options={}, &block|
45
- options[:constraints] ||= {}
46
- options[:constraints].merge!(:request_method => method.to_s.upcase)
47
- define_route path, options, &block
48
- end
49
- end
50
-
51
- def define_route path, options, &block
52
- self.route_defs << [path, options, Proc.new(&block)]
53
- end
54
-
55
- def register *extensions
56
- extensions.each do |ext|
57
- extend ext
58
- ext.registered(self) if ext.respond_to?(:registered)
13
+ def configure *envs, &block
14
+ if envs.map(&:to_sym).include?(NYNY.env.to_sym) or envs.empty?
15
+ instance_eval(&block)
59
16
  end
60
17
  end
61
18
 
@@ -70,44 +27,11 @@ module NYNY
70
27
  builder.map (url) { use klass }
71
28
  end
72
29
 
73
- def before &blk
74
- before_hooks << Proc.new(&blk)
75
- end
76
-
77
- def after &blk
78
- after_hooks << Proc.new(&blk)
79
- end
80
-
81
- def before_initialize &blk
82
- before_init_hooks << Proc.new(&blk)
83
- end
84
-
85
- def after_initialize &blk
86
- after_init_hooks << Proc.new(&blk)
87
- end
88
-
89
- def configure *envs, &block
90
- if envs.map(&:to_sym).include?(NYNY.env.to_sym) or envs.empty?
91
- instance_eval(&block)
92
- end
93
- end
94
-
95
- def use middleware, *args, &block
96
- builder.use middleware, *args, &block
97
- end
98
-
99
- def helpers *args, &block
100
- args << Module.new(&block) if block_given?
101
- args.each {|m| scope_class.send :include, m }
102
- end
103
-
104
30
  def run! port=9292
105
31
  use Rack::CommonLogger
106
32
  use BetterErrors::Middleware unless NYNY.env.production?
107
- Rack::Handler.pick(['thin', 'webrick']).run new, :Port => port
33
+ Rack::Handler.pick(['puma', 'thin', 'webrick']).run new, :Port => port
108
34
  end
109
- end #class methods
110
-
111
- register NYNY::Templates
35
+ end
112
36
  end
113
- end
37
+ end
@@ -0,0 +1,85 @@
1
+ require 'rack'
2
+ require 'nyny/primitives'
3
+ require 'nyny/request_scope'
4
+ require 'nyny/router'
5
+
6
+ module NYNY
7
+ class Base
8
+ include NYNY::Inheritable
9
+ HTTP_VERBS = [:delete, :get, :head, :options, :patch, :post, :put, :trace]
10
+
11
+ inheritable :builder, Rack::Builder.new
12
+ inheritable :scope_class, Class.new(RequestScope)
13
+ inheritable :route_defs, []
14
+ inheritable :before_hooks, []
15
+ inheritable :after_hooks, []
16
+ inheritable :before_init_hooks, []
17
+ inheritable :after_init_hooks, []
18
+
19
+ def initialize app=nil
20
+ self.class.before_init_hooks.each {|h| h.call(self)}
21
+
22
+ self.class.builder.run Router.new({
23
+ :scope_class => self.class.scope_class,
24
+ :route_defs => self.class.route_defs,
25
+ :before_hooks => self.class.before_hooks,
26
+ :after_hooks => self.class.after_hooks,
27
+ :fallback => app
28
+ })
29
+
30
+ @app = self.class.builder.to_app
31
+ self.class.after_init_hooks.each {|h| h.call(self, @app)}
32
+ end
33
+
34
+ def call env
35
+ @app.call env
36
+ end
37
+
38
+ #class methods
39
+ class << self
40
+ HTTP_VERBS.each do |method|
41
+ define_method method do |path, options={}, &block|
42
+ options[:constraints] ||= {}
43
+ options[:constraints].merge!(:request_method => method.to_s.upcase)
44
+ define_route path, options, &block
45
+ end
46
+ end
47
+
48
+ def define_route path, options, &block
49
+ self.route_defs << [path, options, Proc.new(&block)]
50
+ end
51
+
52
+ def before &blk
53
+ before_hooks << Proc.new(&blk)
54
+ end
55
+
56
+ def after &blk
57
+ after_hooks << Proc.new(&blk)
58
+ end
59
+
60
+ def before_initialize &blk
61
+ before_init_hooks << Proc.new(&blk)
62
+ end
63
+
64
+ def after_initialize &blk
65
+ after_init_hooks << Proc.new(&blk)
66
+ end
67
+
68
+ def use middleware, *args, &block
69
+ builder.use middleware, *args, &block
70
+ end
71
+
72
+ def register *extensions
73
+ extensions.each do |ext|
74
+ extend ext
75
+ ext.registered(self) if ext.respond_to?(:registered)
76
+ end
77
+ end
78
+
79
+ def helpers *args, &block
80
+ args << Module.new(&block) if block_given?
81
+ args.each {|m| scope_class.send :include, m }
82
+ end
83
+ end #class methods
84
+ end
85
+ end
@@ -38,14 +38,6 @@ module NYNY
38
38
  end
39
39
 
40
40
  class Response < Rack::Response
41
- def rewrite str
42
- @body = []
43
- @length = 0
44
- header.delete "Content-Type"
45
- header.delete "Content-Length"
46
- write str
47
- end
48
- alias_method :body=, :rewrite
49
41
  end
50
42
 
51
43
  def self.root
@@ -24,11 +24,9 @@ module NYNY
24
24
  end
25
25
 
26
26
  def halt status, headers={}, body=''
27
- response.status = status
28
- response.headers.merge! headers
29
- response.rewrite body
27
+ @response = Response.new body, status, headers
30
28
  cookies.finish!(response) if @cookies
31
- throw :halt, response.finish
29
+ throw :halt, response
32
30
  end
33
31
 
34
32
  def redirect_to uri, status=302
@@ -37,9 +35,10 @@ module NYNY
37
35
  alias_method :redirect, :redirect_to
38
36
 
39
37
  def apply_to &handler
40
- response.write instance_eval(&handler)
38
+ data = instance_eval(&handler)
39
+ data.respond_to?(:each) ? response.body = data : response.write(data)
41
40
  cookies.finish!(response) if @cookies
42
- response.finish
41
+ response
43
42
  end
44
43
  end
45
44
  end
@@ -54,7 +54,7 @@ module NYNY
54
54
  after_hooks.each {|h| scope.instance_eval &h }
55
55
  end
56
56
 
57
- response
57
+ response.finish
58
58
  end
59
59
  end
60
60
  end
@@ -1,3 +1,3 @@
1
1
  module NYNY
2
- VERSION = "3.3.0"
2
+ VERSION = "3.3.1"
3
3
  end
@@ -1,11 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe App do
4
+ let (:klass) { mock_app_class {} }
4
5
  let (:app) { mock_app {} }
5
6
 
6
7
  it 'should return a rack response on call' do
7
- response = app.get '/'
8
- response.should be_a(Rack::Response)
8
+ env = Rack::MockRequest.env_for '/'
9
+ res = klass.new.call(env)
10
+ res.should be_a(Array)
11
+ res.size.should == 3
12
+ res[0].should == 404
13
+ res[1].should be_a(Hash)
14
+ res[2].should respond_to(:each)
9
15
  end
10
16
 
11
17
  it 'should return 404 for non-matched routes' do
@@ -144,7 +150,7 @@ describe App do
144
150
 
145
151
  it 'acts well as a middleware' do
146
152
  app = lambda do |env|
147
- [210, {}, ['Hello from downstream']]
153
+ [210, {'Content-Length' => 21}, ['Hello from downstream']]
148
154
  end
149
155
 
150
156
  app_class = mock_app_class do
@@ -76,13 +76,13 @@ describe RequestScope do
76
76
  it '#headers should set the header values' do
77
77
  subject.headers['Head'] = 'Tail'
78
78
  response = subject.apply_to &handler
79
- response[1]['Head'].should == 'Tail'
79
+ response.headers['Head'].should == 'Tail'
80
80
  end
81
81
 
82
82
  it '#status should set the response status' do
83
83
  forbid = Proc.new { status 403 }
84
84
  response = subject.apply_to &forbid
85
- response[0].should == 403
85
+ response.status.should == 403
86
86
  end
87
87
 
88
88
  it 'params should have insensitive keys' do
@@ -138,16 +138,8 @@ describe RequestScope do
138
138
  it '#redirect_to should redirect' do
139
139
  redir = Proc.new { redirect_to 'http://foo.bar' }
140
140
  response = catch(:halt) { subject.apply_to &redir }
141
- response[0] == 302
142
- response[1]['Location'].should == 'http://foo.bar'
143
- end
144
-
145
- it '#apply_to should return a Rack response' do
146
- response = subject.apply_to &handler
147
- response.length.should == 3
148
- response[0].should == 200
149
- response[1].should == subject.headers
150
- response[2].should be_a(Rack::BodyProxy)
141
+ response.status == 302
142
+ response.headers['Location'].should == 'http://foo.bar'
151
143
  end
152
144
  end
153
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nyny
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Lisnic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-04 00:00:00.000000000 Z
11
+ date: 2014-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack-contrib
@@ -126,6 +126,7 @@ files:
126
126
  - Rakefile
127
127
  - lib/nyny.rb
128
128
  - lib/nyny/app.rb
129
+ - lib/nyny/base.rb
129
130
  - lib/nyny/primitives.rb
130
131
  - lib/nyny/request_scope.rb
131
132
  - lib/nyny/router.rb
@@ -137,7 +138,6 @@ files:
137
138
  - spec/inheritance_spec.rb
138
139
  - spec/initialize_hooks_spec.rb
139
140
  - spec/nyny_spec.rb
140
- - spec/primitives_spec.rb
141
141
  - spec/request_scope_spec.rb
142
142
  - spec/runner_spec.rb
143
143
  - spec/spec_helper.rb
@@ -176,7 +176,6 @@ test_files:
176
176
  - spec/inheritance_spec.rb
177
177
  - spec/initialize_hooks_spec.rb
178
178
  - spec/nyny_spec.rb
179
- - spec/primitives_spec.rb
180
179
  - spec/request_scope_spec.rb
181
180
  - spec/runner_spec.rb
182
181
  - spec/spec_helper.rb
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'NYNY primitives' do
4
- describe NYNY::Response do
5
- it 'allows to rewrite the response' do
6
- resp = NYNY::Response.new
7
- resp.write 'foo'
8
- resp.rewrite 'banana'
9
- resp.headers['Content-Length'].should == "6"
10
- resp.body.first.should == 'banana'
11
- end
12
- end
13
- end