rack-app 0.20.0 → 0.21.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: 657c3f30f9056e50b3fe23c9ff0eb15b921f9828
4
- data.tar.gz: fd681b8d00dff5cb31a25217e2868861c3ae2235
3
+ metadata.gz: e8f30ea2966178d44130dd772b67065dedc3dc16
4
+ data.tar.gz: b711bfd0492d8c1d53ed280fa46fd5b7bd5e93e3
5
5
  SHA512:
6
- metadata.gz: a2a0dda2158f2a2c328c30bdaeac5d0e730781de5fc8d654937796fd681b9da24546aad6afa397052bfb35731c99addb0256f81a58334c687a9e17683c5f1004
7
- data.tar.gz: dad53fa0a014e003153179ed8c67b9e56c9f1177c592bcde190dce0f93df41247db95627a184a0c219198d92a02ab65476ccf123b730858e5e4bad3552366a7c
6
+ metadata.gz: df68e6acce0723868caf5f6f8f88aa52a9113763f9b0d7c71fc233558955f627f905309cbe505adb7ba2cdf615d5a6a0c58215c623192f2a9d12d6d77fe3256b
7
+ data.tar.gz: 46c05c5677227ae13983f81cf75c0215dbb061b7ef4805ac8add5ce011587606acfc9377d8d2c0c3e15ed29972978641d3c94f2edb6eb9a4dd7a7c8f9545c5a9
data/README.md CHANGED
@@ -88,13 +88,17 @@ class App < Rack::App
88
88
  return 'Hello World!'
89
89
  end
90
90
 
91
- desc 'some restful endpoint'
92
- get '/users/:user_id' do
93
- response.status = 201
94
- params['user_id'] #=> restful parameter :user_id
95
- say #=> "hello world!"
91
+ namespace '/users' do
92
+
93
+ desc 'some restful endpoint'
94
+ get '/:user_id' do
95
+ response.status = 201
96
+ params['user_id'] #=> restful parameter :user_id
97
+ say #=> "hello world!"
98
+ end
99
+
96
100
  end
97
-
101
+
98
102
  desc 'some endpoint that has error and will be rescued'
99
103
  get '/make_error' do
100
104
  raise(StandardError,'error block rescued')
@@ -176,23 +180,15 @@ end
176
180
 
177
181
  ## [Benchmarking](https://github.com/adamluzsi/rack-app.rb-benchmark)
178
182
 
179
- * Dump duration with zero business logic or routing: 2.4184169999892074e-06 s
180
- * no routing
181
- * return only a static array with static values
182
- * Rack::App duration with routing lookup: 2.9978291999967683e-05 s
183
- * with routing
184
- * with value parsing and reponse object building
185
- * Grape::API duration with routing lookup: 0.0002996424499999746 s
186
- * with routing
187
- * with value parsing and reponse object building
188
-
189
- * Rack::App 9.995314276086763x faster (0.00026966415800000693 sec) that Grape::API
190
- * returning a simple rack response array without any logic is 12.395832480544698x faster (2.7559874999978477e-05 sec) that Rack::App
191
- * the same dumb empty proc call is 123.90024135676842x faster than Grape::API (0.0002972240329999854 sec)
183
+ RackSkeleton avg duration: 5.2298899999950066e-06 s
184
+ Rack::App avg duration: 3.323366999999523e-05 s
185
+ Grape::API avg duration: 0.00031554329000000426 s
186
+
187
+ Rack::App 9.494686864256929x faster (0.000282309620000009 sec) that Grape::API
188
+ RackSkeleton 6.354563862725021x faster (2.800378000000022e-05 sec) that Rack::App
189
+ RackSkeleton 60.33459403549703x faster (0.00031031340000000924 sec) than Grape::API
192
190
 
193
- This was measured with multiple endpoints like that would be in real life example.
194
- I feared do this for Rails that is usually slower than Grape :S
195
- To be honest, I measured with grape because that is one of my favorite micro framework
191
+ To be honest, I measured with grape because that is one of my favorite micro framework!
196
192
 
197
193
  ## Roadmap
198
194
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.20.0
1
+ 0.21.0
@@ -89,6 +89,8 @@ class Rack::App
89
89
 
90
90
  def add_route(request_method, request_path, &block)
91
91
 
92
+ request_path = ::Rack::App::Utils.join(@namespaces, request_path)
93
+
92
94
  properties = endpoint_properties.merge(
93
95
  {
94
96
  :user_defined_logic => block,
@@ -108,18 +110,19 @@ class Rack::App
108
110
  def serve_files_from(relative_path, options={})
109
111
  options.merge!(endpoint_properties)
110
112
  file_server = Rack::App::File::Server.new(relative_path, options)
111
- request_path = Rack::App::Utils.join(file_server.namespace, '**', '*')
113
+ request_path = Rack::App::Utils.join(@namespaces, options[:to], file_server.namespace, '**', '*')
112
114
  router.register_endpoint!('GET', request_path, @last_description, file_server)
113
115
  @last_description = nil
114
116
  end
115
117
 
116
- def mount(api_class)
118
+ def mount(api_class, mount_prop={})
117
119
 
118
120
  unless api_class.is_a?(Class) and api_class <= Rack::App
119
121
  raise(ArgumentError, 'Invalid class given for mount, must be a Rack::App')
120
122
  end
121
123
 
122
- router.merge!(api_class.router)
124
+ merge_prop = {:namespaces => [@namespaces, mount_prop[:to]].flatten}
125
+ router.merge_router!(api_class.router, merge_prop)
123
126
 
124
127
  return nil
125
128
  end
@@ -140,6 +143,15 @@ class Rack::App
140
143
  @headers
141
144
  end
142
145
 
146
+ def namespace(request_path_namespace)
147
+ return unless block_given?
148
+ @namespaces ||= []
149
+ @namespaces.push(request_path_namespace)
150
+ yield
151
+ @namespaces.pop
152
+ nil
153
+ end
154
+
143
155
  protected
144
156
 
145
157
  def endpoint_properties
@@ -4,16 +4,21 @@ class Rack::App::File::Server
4
4
 
5
5
  def initialize(root_folder, options={})
6
6
  require 'rack/file'
7
-
8
- @properties = options
9
- @namespace = formatted_namespace(options).freeze
10
- @namespace_rgx = /#{Regexp.escape(@namespace)}/.freeze
11
- @rack_file_server = ::Rack::File.new(Rack::App::Utils.pwd(root_folder), {})
12
-
7
+ @raw_root_folder = root_folder
8
+ @root_folder = Rack::App::Utils.pwd(@raw_root_folder)
9
+ @relative_file_paths = Dir.glob(File.join(@root_folder,'**','*')).map{|file_path| file_path.sub(@root_folder,'') }.sort_by{|str| str.length }.reverse
10
+ @rack_file_server = ::Rack::File.new(@root_folder, {})
13
11
  end
14
12
 
15
13
  def call(env)
16
- env[::Rack::PATH_INFO]= clean_path_info(env).sub(@namespace_rgx, '')
14
+ path_info = clean_path_info(env)
15
+
16
+ @relative_file_paths.each do |relative_file_path|
17
+ if path_info =~ /#{Regexp.escape(relative_file_path)}$/
18
+ env[::Rack::PATH_INFO]= relative_file_path
19
+ end
20
+ end
21
+
17
22
  @rack_file_server.call(env)
18
23
  end
19
24
 
@@ -22,16 +27,6 @@ class Rack::App::File::Server
22
27
 
23
28
  protected
24
29
 
25
- def raw_namespace(options)
26
- options[:to] || '/'
27
- end
28
-
29
- def formatted_namespace(options)
30
- namespace = raw_namespace(options).to_s.sub(/^\//, '').sub(/\/$/, '')
31
- namespace += '/' unless namespace.empty?
32
- namespace
33
- end
34
-
35
30
  def clean_path_info(env)
36
31
  path_info = ::Rack::Utils.unescape(env[::Rack::PATH_INFO])
37
32
  return clean_path_info = ::Rack::Utils.clean_path_info(path_info)
@@ -37,10 +37,17 @@ class Rack::App::Router
37
37
 
38
38
  end
39
39
 
40
- def merge!(router)
40
+ def merge_router!(router,prop={})
41
41
  raise(ArgumentError, 'invalid router object, must implement :endpoints interface') unless router.respond_to?(:endpoints)
42
42
  router.endpoints.each do |endpoint|
43
- register_endpoint!(endpoint[:request_method], endpoint[:request_path], endpoint[:description], endpoint[:endpoint])
43
+ request_path = ::Rack::App::Utils.join(prop[:namespaces], endpoint[:request_path])
44
+
45
+ register_endpoint!(
46
+ endpoint[:request_method],
47
+ request_path,
48
+ endpoint[:description],
49
+ endpoint[:endpoint]
50
+ )
44
51
  end
45
52
  nil
46
53
  end
@@ -38,6 +38,7 @@ module Rack::App::Utils
38
38
  end
39
39
 
40
40
  def join(*url_path_parts)
41
+ url_path_parts = [url_path_parts].flatten.compact
41
42
  File.join(*url_path_parts).gsub(File::Separator,'/').sub(/^\/?(.*)$/,'/\1')
42
43
  end
43
44
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-02-17 00:00:00.000000000 Z
12
+ date: 2016-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler