rack-app 5.12.0 → 6.0.0

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: ad41bbced4baeeea08b32f690ed2268453b9491b
4
- data.tar.gz: 5b02692483edeeffb9aaf5e8f5d15ba763f426e6
3
+ metadata.gz: 115ef984aee400271ed64f69eee96b2bc3896cb9
4
+ data.tar.gz: dcb1b5ee1fd8af7b107b6dc50d9089fd9410657e
5
5
  SHA512:
6
- metadata.gz: 522f2d363ead4984e3afb39c81f801e8aec3f73cdfb6f897729756af7635a8ae40d0290f5257b99124f7bf3d9de9b3f14f1741d5868762d3dd5cdc0d2ff63619
7
- data.tar.gz: 714c400a866ed8f47c386ea7dafdee6562ab97f590338b8f45d3bdd5b5fec04981afbd47dd8c9df951a6d33c0c3c9bbb48101432caef42de202859b1734cda63
6
+ metadata.gz: a921f4cc74415fd8aef272fd97bdd3fd53e2066e42266ddddc98a9271cee6df6612d695fa6129055d7d216df533f596099cea13fa59a8c311380f3e31dfa68de
7
+ data.tar.gz: fe97b75e3b27041a03b34daa0650c40fc4719161d3d1d91e355000f6454762d50b431f1384eddad588f387c6991f69e59f4d49203df0a9428b048381ec0abe97
data/README.md CHANGED
@@ -68,7 +68,7 @@ Yes, in fact it's already powering heroku hosted micro-services.
68
68
  * syntax sugar for default header definitions
69
69
  * namespaces for endpoint request path declarations so it can be dry and unified
70
70
  * no Class method bloat, so you can enjoy pure ruby without any surprises
71
- * App mounting so you can crete separated controllers for different task
71
+ * App mounting so you can create separated controllers for different task
72
72
  * Streaming
73
73
  * O(log(n)) lookup routing
74
74
  * allows as many endpoint registration to you as you want, without impact on route lookup speed
@@ -76,7 +76,7 @@ Yes, in fact it's already powering heroku hosted micro-services.
76
76
  * simple to use class level response serializer
77
77
  * so you can choose what type of serialization you want without any enforced convention
78
78
  * static file serving so you can mount even filesystem based endpoints too
79
- * built in testing module so your app can easily written with BDD approach
79
+ * built in testing module so your app can be easily written with BDD approach
80
80
  * made with performance in mind so your app don't lose time by your framework
81
81
  * per endpoint middleware definitions
82
82
  * you can define middleware stack before endpoints and it will only applied to them, similar like protected method workflow
@@ -266,7 +266,6 @@ the benchmarking was taken on the following hardware specification:
266
266
 
267
267
  ### Endpoint to be call type: static
268
268
 
269
-
270
269
  #### number of declared endpoints: 100
271
270
 
272
271
  | name | version | current / fastest | real |
@@ -274,21 +273,28 @@ the benchmarking was taken on the following hardware specification:
274
273
  | rack-app | 4.0.0 | 1.0 | 2.2053215187043942e-05 |
275
274
  | rack-app | 5.2.0 | 1.185 | 2.6140331494390213e-05 |
276
275
  | rack-app | 5.0.0.rc3 | 1.387 | 3.0592694940592784e-05 |
277
- | ramaze | 2012.12.08 | 1.468 | 3.236885466806858e-05 |
278
- | hobbit | 0.6.1 | 2.996 | 6.607205038890137e-05 |
279
- | brooklyn | 0.0.1 | 5.243 | 0.00011562206838279088 |
280
- | nyny | 3.4.3 | 5.272 | 0.00011626420279498706 |
276
+ | rack-app | 5.10.0 | 1.687 | 3.719768107671963e-05 |
277
+ | rack-app | 5.12.0 | 1.747 | 3.852106360719058e-05 |
278
+ | rack-app | 5.7.0 | 1.784 | 3.934149001724991e-05 |
279
+ | ramaze | 2012.12.08 | 2.237 | 4.932373271523216e-05 |
280
+ | hobbit | 0.6.1 | 3.111 | 6.860981349018188e-05 |
281
+ | brooklyn | 0.0.1 | 5.245 | 0.00011567194234917104 |
281
282
  | plezi | 0.14.1 | 5.334 | 0.00011763589749898317 |
282
- | nancy | 0.3.0 | 5.649 | 0.00012458588462322884 |
283
+ | plezi | 0.14.2 | 5.588 | 0.00012324020796222724 |
284
+ | nancy | 0.3.0 | 5.725 | 0.00012626088352407584 |
285
+ | nyny | 3.4.3 | 5.744 | 0.00012667404900032145 |
286
+ | roda | 2.20.0 | 9.662 | 0.00021307581296423227 |
283
287
  | roda | 2.17.0 | 10.646 | 0.00023477471132838754 |
284
288
  | scorched | 0.25 | 12.728 | 0.0002807019599946191 |
285
- | sinatra | 1.4.7 | 21.169 | 0.0004668393424013356 |
289
+ | scorched | 0.27 | 16.074 | 0.0003544879730325173 |
290
+ | sinatra | 1.4.7 | 19.857 | 0.00043791615583657487 |
286
291
  | grape | 0.17.0 | 25.941 | 0.0005720832234016178 |
287
292
  | rails | 5.0.0 | 33.234 | 0.0007329187002032537 |
288
- | camping | 2.1.532 | 39.699 | 0.0008754866444039887 |
289
- | cuba | 3.8.0 | 54.196 | 0.001195195165998367 |
290
- | almost-sinatra | unknown | 58.613 | 0.0012926107780076503 |
291
-
293
+ | camping | 2.1.532 | 39.818 | 0.0008781073650072727 |
294
+ | grape | 0.18.0 | 41.857 | 0.000923075147962645 |
295
+ | rails | 5.0.0.1 | 47.286 | 0.0010428086559986802 |
296
+ | cuba | 3.8.0 | 55.397 | 0.0012216723478342246 |
297
+ | almost-sinatra | unknown | 58.728 | 0.0012951477793394547 |
292
298
 
293
299
  For more reports check the Benchmark repo out :)
294
300
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.12.0
1
+ 6.0.0
@@ -0,0 +1,2 @@
1
+ class Rack::App::Block < Proc
2
+ end
@@ -1,6 +1,6 @@
1
- require "rack/builder"
1
+ # frozen_string_literal: true
2
+ require 'rack/builder'
2
3
  class Rack::App::Endpoint::Builder
3
-
4
4
  def initialize(config)
5
5
  @config = config
6
6
  end
@@ -8,12 +8,21 @@ class Rack::App::Endpoint::Builder
8
8
  def build
9
9
  builder = Rack::Builder.new
10
10
  apply_middleware_build_blocks(builder)
11
- builder.run(Rack::App::Endpoint::Executor.new(@config))
11
+ builder.run(app)
12
12
  builder.to_app
13
13
  end
14
14
 
15
15
  protected
16
16
 
17
+ def app
18
+ case @config.type
19
+ when :endpoint
20
+ Rack::App::Endpoint::Executor.new(@config)
21
+ else
22
+ @config.callable
23
+ end
24
+ end
25
+
17
26
  def apply_middleware_build_blocks(builder)
18
27
  builder_blocks.each do |builder_block|
19
28
  builder_block.call(builder)
@@ -32,7 +41,6 @@ class Rack::App::Endpoint::Builder
32
41
  end
33
42
 
34
43
  def builder_blocks
35
- [@config.app_class.middlewares, @config.middleware_builders_blocks].flatten
44
+ [@config.app_class.middlewares, @config.endpoint_specific_middlewares].flatten
36
45
  end
37
-
38
46
  end
@@ -1,20 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
  class Rack::App::Endpoint::Config
3
+
3
4
  def to_hash
4
5
  error_handler
5
- middleware_builders_blocks
6
+ endpoint_specific_middlewares
6
7
  request_path
7
8
  request_methods
8
9
  defined_request_path
9
10
  @raw
10
11
  end
11
12
 
12
- def payload_builder
13
- @raw[:payload].parser_builder
13
+ def callable
14
+ @raw[:callable]
15
+ end
16
+
17
+ def type
18
+ case callable
19
+ when ::Rack::App::Block
20
+ :endpoint
21
+ else
22
+ :application
23
+ end
14
24
  end
15
25
 
16
- def application
17
- @raw[:application]
26
+ def payload_builder
27
+ @raw[:payload].parser_builder
18
28
  end
19
29
 
20
30
  def app_class
@@ -41,13 +51,10 @@ class Rack::App::Endpoint::Config
41
51
  @raw[:error_handler] ||= Rack::App::ErrorHandler.new
42
52
  end
43
53
 
44
- def middleware_builders_blocks
45
- @raw[:middleware_builders_blocks] ||= []
54
+ def endpoint_specific_middlewares
55
+ @raw[:endpoint_specific_middlewares] ||= []
46
56
  end
47
57
 
48
- def endpoint_method_name
49
- @raw[:method_name] ||= register_method_to_app_class
50
- end
51
58
 
52
59
  def request_methods
53
60
  case @raw[:request_methods] || raise('missing config: request_methods')
@@ -2,7 +2,6 @@ class Rack::App::Endpoint::Executor
2
2
 
3
3
  def initialize(endpoint_properties)
4
4
  @endpoint_properties = endpoint_properties
5
- @endpoint_properties.endpoint_method_name
6
5
  end
7
6
 
8
7
  def call(env)
@@ -35,7 +34,7 @@ class Rack::App::Endpoint::Executor
35
34
 
36
35
  def evaluate_value(request_handler)
37
36
  @endpoint_properties.error_handler.execute_with_error_handling_for(request_handler) do
38
- request_handler.__send__(@endpoint_properties.endpoint_method_name)
37
+ request_handler.instance_exec(&@endpoint_properties.callable)
39
38
  end
40
39
  end
41
40
 
@@ -27,7 +27,7 @@ class Rack::App::Endpoint
27
27
  end
28
28
 
29
29
  def to_app
30
- @config.application || self.class::Builder.new(@config).build
30
+ self.class::Builder.new(@config).build
31
31
  end
32
32
 
33
33
  def rack_app?
@@ -25,4 +25,8 @@ module Rack::App::InstanceMethods::Core
25
25
  alias finish_response finish!
26
26
  Rack::App::Utils.deprecate(self, :finish_response, :finish!, 2016,9)
27
27
 
28
+ def respond_with(respond_body)
29
+ throw(:response_body, respond_body)
30
+ end
31
+
28
32
  end
@@ -3,43 +3,43 @@ module Rack::App::SingletonMethods::HttpMethods
3
3
  protected
4
4
 
5
5
  def get(path = '/', &block)
6
- add_route(::Rack::App::Constants::HTTP::METHOD::GET, path, &block)
6
+ add_route(::Rack::App::Constants::HTTP::METHOD::GET, path, Rack::App::Block.new(&block))
7
7
  end
8
8
 
9
9
  def post(path = '/', &block)
10
- add_route(::Rack::App::Constants::HTTP::METHOD::POST, path, &block)
10
+ add_route(::Rack::App::Constants::HTTP::METHOD::POST, path, Rack::App::Block.new(&block))
11
11
  end
12
12
 
13
13
  def put(path = '/', &block)
14
- add_route(::Rack::App::Constants::HTTP::METHOD::PUT, path, &block)
14
+ add_route(::Rack::App::Constants::HTTP::METHOD::PUT, path, Rack::App::Block.new(&block))
15
15
  end
16
16
 
17
17
  def delete(path = '/', &block)
18
- add_route(::Rack::App::Constants::HTTP::METHOD::DELETE, path, &block)
18
+ add_route(::Rack::App::Constants::HTTP::METHOD::DELETE, path, Rack::App::Block.new(&block))
19
19
  end
20
20
 
21
21
  def head(path = '/', &block)
22
- add_route(::Rack::App::Constants::HTTP::METHOD::HEAD, path, &block)
22
+ add_route(::Rack::App::Constants::HTTP::METHOD::HEAD, path, Rack::App::Block.new(&block))
23
23
  end
24
24
 
25
25
  def options(path = '/', &block)
26
- add_route(::Rack::App::Constants::HTTP::METHOD::OPTIONS, path, &block)
26
+ add_route(::Rack::App::Constants::HTTP::METHOD::OPTIONS, path, Rack::App::Block.new(&block))
27
27
  end
28
28
 
29
29
  def patch(path = '/', &block)
30
- add_route(::Rack::App::Constants::HTTP::METHOD::PATCH, path, &block)
30
+ add_route(::Rack::App::Constants::HTTP::METHOD::PATCH, path, Rack::App::Block.new(&block))
31
31
  end
32
32
 
33
33
  def link(path = '/', &block)
34
- add_route(::Rack::App::Constants::HTTP::METHOD::LINK, path, &block)
34
+ add_route(::Rack::App::Constants::HTTP::METHOD::LINK, path, Rack::App::Block.new(&block))
35
35
  end
36
36
 
37
37
  def unlink(path = '/', &block)
38
- add_route(::Rack::App::Constants::HTTP::METHOD::UNLINK, path, &block)
38
+ add_route(::Rack::App::Constants::HTTP::METHOD::UNLINK, path, Rack::App::Block.new(&block))
39
39
  end
40
40
 
41
41
  def trace(path = '/', &block)
42
- add_route(::Rack::App::Constants::HTTP::METHOD::TRACE, path, &block)
42
+ add_route(::Rack::App::Constants::HTTP::METHOD::TRACE, path, Rack::App::Block.new(&block))
43
43
  end
44
44
 
45
45
  def alias_endpoint(new_request_path, original_request_path)
@@ -41,41 +41,16 @@ module Rack::App::SingletonMethods::Mounting
41
41
  nil
42
42
  end
43
43
 
44
- alias create_endpoints_for_files_in mount_directory
45
- Rack::App::Utils.deprecate(self,:create_endpoints_for_files_in, :mount_directory, 2016,9)
46
-
47
44
  def serve_files_from(file_path, options={})
48
45
  file_server = Rack::App::FileServer.new(Rack::App::Utils.expand_path(file_path))
49
- request_path = Rack::App::Utils.join(@namespaces, options[:to], Rack::App::Constants::PATH::MOUNT_POINT)
50
-
51
- endpoint = Rack::App::Endpoint.new(
52
- route_registration_properties.merge(
53
- :request_methods => [
54
- Rack::App::Constants::HTTP::METHOD::GET,
55
- Rack::App::Constants::HTTP::METHOD::OPTIONS
56
- ],
57
- :request_path => request_path,
58
- :application => file_server
59
- )
60
- )
61
-
62
- router.register_endpoint!(endpoint)
63
- route_registration_properties.clear
46
+ request_path = Rack::App::Utils.join(options[:to], Rack::App::Constants::PATH::MOUNT_POINT)
47
+ add_route(::Rack::App::Constants::HTTP::METHOD::ANY, request_path, file_server)
64
48
  nil
65
49
  end
66
50
 
67
51
  def mount_rack_interface_compatible_application(rack_based_app, options={})
68
- properties = route_registration_properties.merge(
69
- :request_methods => ::Rack::App::Constants::HTTP::METHOD::ANY,
70
- :request_path => Rack::App::Utils.join(
71
- @namespaces,
72
- options[:to],
73
- Rack::App::Constants::PATH::APPLICATION
74
- ),
75
- :application => rack_based_app
76
- )
77
-
78
- router.register_endpoint!(Rack::App::Endpoint.new(properties))
52
+ request_path = Rack::App::Utils.join(options[:to],Rack::App::Constants::PATH::APPLICATION)
53
+ add_route(::Rack::App::Constants::HTTP::METHOD::ANY, request_path, rack_based_app)
79
54
  end
80
55
 
81
56
  end
@@ -20,17 +20,17 @@ module Rack::App::SingletonMethods::RouteHandling
20
20
 
21
21
  alias desc description
22
22
 
23
- def add_route(request_method, request_path, &block)
23
+ def add_route(request_method, request_path, callable)
24
24
 
25
25
  router.register_endpoint!(
26
26
  Rack::App::Endpoint.new({
27
27
  :app_class => self,
28
+ :callable => callable,
28
29
  :payload => payload,
29
30
  :error_handler => error,
30
- :user_defined_logic => block,
31
31
  :request_methods => [request_method],
32
32
  :route => route_registration_properties.dup,
33
- :middleware_builders_blocks => next_endpoint_middlewares.dup,
33
+ :endpoint_specific_middlewares => next_endpoint_middlewares.dup,
34
34
  :request_path => ::Rack::App::Utils.join(@namespaces, request_path)
35
35
  })
36
36
  )
@@ -41,6 +41,9 @@ module Rack::App::SingletonMethods::RouteHandling
41
41
 
42
42
  end
43
43
 
44
+ def add_app_to_route(app, request_path)
45
+ end
46
+
44
47
  def namespace(request_path_namespace)
45
48
  return unless block_given?
46
49
  @namespaces ||= []
data/lib/rack/app.rb CHANGED
@@ -10,6 +10,7 @@ class Rack::App
10
10
  require 'rack/app/cli'
11
11
  require 'rack/app/test'
12
12
  require 'rack/app/utils'
13
+ require 'rack/app/block'
13
14
  require 'rack/app/logger'
14
15
  require 'rack/app/params'
15
16
  require 'rack/app/payload'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.12.0
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-20 00:00:00.000000000 Z
11
+ date: 2017-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -93,6 +93,7 @@ files:
93
93
  - dev/console
94
94
  - dev/rack-app
95
95
  - lib/rack/app.rb
96
+ - lib/rack/app/block.rb
96
97
  - lib/rack/app/bundled_extensions.rb
97
98
  - lib/rack/app/bundled_extensions/logger.rb
98
99
  - lib/rack/app/bundled_extensions/payload.rb
@@ -200,7 +201,6 @@ files:
200
201
  - spike/method_vs_instance_exec.rb
201
202
  - spike/return_vs_throw.rb
202
203
  - spike/slice_vs_sub.rb
203
- - spike/tree.rb
204
204
  - spike/validator_with_minitest.rb
205
205
  - spike/xml.rb
206
206
  - src/Net__HTTP Cheat Sheet.pdf
data/spike/tree.rb DELETED
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- rack_api_lib_folder = File.join(File.dirname(__FILE__), '..', 'lib')
5
- $LOAD_PATH.unshift(rack_api_lib_folder)
6
- require 'rack/app'
7
- require 'pp'
8
-
9
- tree = Rack::App::Router::Tree.new
10
-
11
- APP = Class.new(Rack::App)
12
-
13
- payload = Rack::App::Payload::Builder.new
14
-
15
- payload.parser_builder do
16
- accept :json
17
- end
18
-
19
- serializer = Rack::App::Serializer::FormatsBuilder.new
20
- serializer.instance_exec do
21
- on '.json', 'application/json' do |obj|
22
- JSON.dump(obj)
23
- end
24
- end
25
-
26
- endpoint = Rack::App::Endpoint.new(
27
- :route => {},
28
- :app_class => APP,
29
- :request_methods => ["GET"],
30
- :request_path => '/hello/world/:id',
31
- :middleware_builders_blocks => [],
32
- :user_defined_logic => proc{ "hy" },
33
- :serializer_builder => serializer,
34
- :payload => payload,
35
- :error_handler => Rack::App::ErrorHandler.new,
36
- )
37
-
38
-
39
- properties = {
40
- :request_methods => ::Rack::App::Constants::HTTP::METHODS,
41
- :request_path => Rack::App::Utils.join("hello", ::Rack::App::Constants::RACK_BASED_APPLICATION),
42
- :application => proc{|env| Rack::Response.new.finish }
43
- }
44
-
45
- tree.add(Rack::App::Endpoint.new(properties))
46
-
47
- endpoint = Rack::App::Endpoint.new(
48
- :route => {},
49
- :app_class => APP,
50
- :request_methods => ["GET"],
51
- :request_path => '/hello/world/:id',
52
- :middleware_builders_blocks => [],
53
- :user_defined_logic => proc{ "hy" },
54
- :serializer_builder => serializer,
55
- :payload => payload,
56
- :error_handler => Rack::App::ErrorHandler.new,
57
- )
58
-
59
- tree.add(endpoint)
60
- pp tree
61
-
62
- require 'rack'
63
- puts
64
-
65
- [
66
- "/hello/world/123.json",
67
- "/hello/world/123",
68
- "/hello/world",
69
- ].each do |path_info|
70
- env = Rack::MockRequest.env_for(path_info, :method => 'GET')
71
- resp = tree.call(env)
72
-
73
- puts(path_info)
74
- p resp.is_a?(Array) && resp.length == 3
75
- puts
76
- end