ki 0.4.6 → 0.4.7
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 +4 -4
- data/.rubocop.yml +24 -0
- data/Gemfile.lock +25 -6
- data/Guardfile +11 -5
- data/README.md +78 -0
- data/Rakefile +4 -4
- data/ki.gemspec +24 -23
- data/lib/ki.rb +7 -4
- data/lib/ki/base_request.rb +2 -2
- data/lib/ki/helpers.rb +7 -7
- data/lib/ki/ki.rb +12 -18
- data/lib/ki/ki_app.rb +16 -0
- data/lib/ki/ki_cli.rb +11 -12
- data/lib/ki/ki_config.rb +12 -8
- data/lib/ki/middleware/admin_interface_generator.rb +1 -1
- data/lib/ki/middleware/api_handler.rb +7 -8
- data/lib/ki/middleware/base_middleware.rb +1 -1
- data/lib/ki/middleware/coffee_compiler.rb +2 -2
- data/lib/ki/middleware/doc_generator.rb +5 -4
- data/lib/ki/middleware/haml_compiler.rb +4 -22
- data/lib/ki/{modules/format_of.rb → middleware/helpers/format_of_helper.rb} +3 -3
- data/lib/ki/middleware/helpers/haml_compiler_helper.rb +27 -0
- data/lib/ki/{modules → middleware/helpers}/public_file_helper.rb +2 -2
- data/lib/ki/{modules → middleware/helpers}/view_helper.rb +3 -3
- data/lib/ki/middleware/init_middleware.rb +1 -1
- data/lib/ki/middleware/public_file_server.rb +1 -1
- data/lib/ki/middleware/sass_compiler.rb +3 -3
- data/lib/ki/model.rb +10 -11
- data/lib/ki/modules/{model_helpers.rb → model_helper.rb} +1 -1
- data/lib/ki/modules/query_interface.rb +7 -7
- data/lib/ki/modules/restrictions.rb +4 -5
- data/lib/ki/orm.rb +11 -11
- data/lib/ki/utils/api_error.rb +4 -4
- data/lib/ki/utils/extra_ruby.rb +3 -3
- data/lib/ki/utils/indifferent_hash.rb +1 -1
- data/lib/ki/version.rb +1 -1
- data/lib/ki/views/404.haml +1 -0
- data/lib/ki/views/instadmin.haml +47 -4
- data/spec/examples/base/app.rb +5 -0
- data/spec/examples/json.northpole.ro/Gemfile +1 -1
- data/spec/lib/ki/base_request_spec.rb +24 -24
- data/spec/lib/ki/helpers_spec.rb +1 -1
- data/spec/lib/ki/ki_app_spec.rb +13 -0
- data/spec/lib/ki/ki_config_spec.rb +16 -2
- data/spec/lib/ki/ki_spec.rb +11 -0
- data/spec/lib/ki/middleware/haml_compiler_spec.rb +6 -4
- data/spec/lib/ki/{modules/format_of_spec.rb → middleware/helpers/format_of_helper_spec.rb} +4 -1
- data/spec/lib/ki/model_spec.rb +14 -14
- data/spec/lib/ki/modules/model_helper_spec.rb +4 -0
- data/spec/lib/ki/orm_spec.rb +25 -25
- data/spec/spec_helper.rb +6 -4
- data/spec/util_spec.rb +2 -2
- metadata +36 -14
- data/spec/lib/ki/modules/model_helpers_spec.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 506138e83d5016227ef6acdf6a5f7bf29e6191e8
|
4
|
+
data.tar.gz: c79f376faf3bca31d325f41d0e760ab9fb774861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00331f90e93a2dab923bf5d3131c773fd5ffdd1f6e6bf0a914cabcd5069ff24c6e2b3a27aa99758ad25ed062cda3c995cfbb1bf88b806e13a399023f68da49c9
|
7
|
+
data.tar.gz: b7d60288bbb44bdf9e7a0aa4b3502117bf36e5254131d762d514e951fcdcd163d0fe9f589b0168027f9d3aee248fe2ce39de73e4968d5093b819ff8a4998ae86
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- 'spec/examples/**/*'
|
4
|
+
|
5
|
+
Style/BracesAroundHashParameters:
|
6
|
+
Enabled: false
|
7
|
+
|
8
|
+
Style/Documentation:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Style/BlockDelimiters:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Metrics/LineLength:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Metrics/MethodLength:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Metrics/AbcSize:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Lint/UnusedMethodArgument:
|
24
|
+
Enabled: false
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ki (0.4.
|
4
|
+
ki (0.4.7)
|
5
5
|
bson_ext
|
6
6
|
bundler (~> 1.5)
|
7
7
|
coffee-script
|
8
8
|
haml
|
9
|
-
mongo
|
9
|
+
mongo (= 1.9.2)
|
10
10
|
rack
|
11
11
|
rack-cors
|
12
12
|
rack-parser
|
@@ -16,8 +16,12 @@ PATH
|
|
16
16
|
GEM
|
17
17
|
remote: https://rubygems.org/
|
18
18
|
specs:
|
19
|
-
|
20
|
-
|
19
|
+
ast (2.0.0)
|
20
|
+
astrolabe (1.3.0)
|
21
|
+
parser (>= 2.2.0.pre.3, < 3.0)
|
22
|
+
bson (1.9.2)
|
23
|
+
bson_ext (1.9.2)
|
24
|
+
bson (~> 1.9.2)
|
21
25
|
celluloid (0.15.2)
|
22
26
|
timers (~> 1.1.0)
|
23
27
|
celluloid-io (0.15.0)
|
@@ -44,6 +48,9 @@ GEM
|
|
44
48
|
guard-rspec (4.2.8)
|
45
49
|
guard (~> 2.1)
|
46
50
|
rspec (>= 2.14, < 4.0)
|
51
|
+
guard-rubocop (1.2.0)
|
52
|
+
guard (~> 2.0)
|
53
|
+
rubocop (~> 0.20)
|
47
54
|
haml (4.0.6)
|
48
55
|
tilt
|
49
56
|
listen (2.7.1)
|
@@ -53,10 +60,13 @@ GEM
|
|
53
60
|
rb-inotify (>= 0.9)
|
54
61
|
lumberjack (1.0.5)
|
55
62
|
method_source (0.8.2)
|
56
|
-
mongo (
|
57
|
-
bson (~>
|
63
|
+
mongo (1.9.2)
|
64
|
+
bson (~> 1.9.2)
|
58
65
|
multi_json (1.11.0)
|
59
66
|
nio4r (1.0.0)
|
67
|
+
parser (2.2.2.1)
|
68
|
+
ast (>= 1.1, < 3.0)
|
69
|
+
powerpack (0.1.0)
|
60
70
|
pry (0.9.12.6)
|
61
71
|
coderay (~> 1.0)
|
62
72
|
method_source (~> 0.8)
|
@@ -67,6 +77,7 @@ GEM
|
|
67
77
|
rack
|
68
78
|
rack-test (0.6.2)
|
69
79
|
rack (>= 1.0)
|
80
|
+
rainbow (2.0.0)
|
70
81
|
rake (10.1.1)
|
71
82
|
rb-fsevent (0.9.4)
|
72
83
|
rb-inotify (0.9.3)
|
@@ -79,6 +90,13 @@ GEM
|
|
79
90
|
rspec-expectations (2.14.5)
|
80
91
|
diff-lcs (>= 1.1.3, < 2.0)
|
81
92
|
rspec-mocks (2.14.6)
|
93
|
+
rubocop (0.30.1)
|
94
|
+
astrolabe (~> 1.3)
|
95
|
+
parser (>= 2.2.2.1, < 3.0)
|
96
|
+
powerpack (~> 0.1)
|
97
|
+
rainbow (>= 1.99.1, < 3.0)
|
98
|
+
ruby-progressbar (~> 1.4)
|
99
|
+
ruby-progressbar (1.7.5)
|
82
100
|
sass (3.4.13)
|
83
101
|
simplecov (0.9.2)
|
84
102
|
docile (~> 1.1.0)
|
@@ -96,6 +114,7 @@ PLATFORMS
|
|
96
114
|
DEPENDENCIES
|
97
115
|
codeclimate-test-reporter
|
98
116
|
guard-rspec
|
117
|
+
guard-rubocop
|
99
118
|
ki!
|
100
119
|
rack-test
|
101
120
|
rake
|
data/Guardfile
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
# A sample Guardfile
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
group :red_green_refactor, halt_on_fail: true do
|
5
|
+
guard :rspec do
|
6
|
+
watch(%r{^spec/.+_spec\.rb$})
|
7
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
8
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
9
|
+
end
|
9
10
|
|
11
|
+
guard :rubocop, cli: ['--config=.rubocop.yml', '--display-cop-names'] do
|
12
|
+
watch(/.+\.rb$/)
|
13
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
14
|
+
end
|
15
|
+
end
|
data/README.md
CHANGED
@@ -9,6 +9,36 @@ Tiny REST JSON ORM framework with MongoDB.
|
|
9
9
|
Ki's goal is to help you protoype your ideas blazing fast. It has a db backend
|
10
10
|
and provides a fullblown REST api on top.
|
11
11
|
|
12
|
+
**Table of Contents**
|
13
|
+
|
14
|
+
- [TLDR](#tldr)
|
15
|
+
- [Install](#install)
|
16
|
+
- [Getting started](#getting-started)
|
17
|
+
- [Create a new app](#create-a-new-app)
|
18
|
+
- [Adding a view](#adding-a-view)
|
19
|
+
- [Adding assets](#adding-assets)
|
20
|
+
- [View layout](#view-layout)
|
21
|
+
- [Middleware](#middleware)
|
22
|
+
- [Helpers](#helpers)
|
23
|
+
- [Adding a resource](#adding-a-resource)
|
24
|
+
- [Create](#create)
|
25
|
+
- [Get all](#get-all)
|
26
|
+
- [Get by id](#get-by-id)
|
27
|
+
- [Get advanced queries](#advanced-queries)
|
28
|
+
- [Update](#update)
|
29
|
+
- [Delete](#delete)
|
30
|
+
- [Required attributes](#required-attributes)
|
31
|
+
- [Unique attributes](#unique-attributes)
|
32
|
+
- [Restricting resource requests](#restricting-resource-requests)
|
33
|
+
- [Before/after callbacks](#beforeafter-callbacks)
|
34
|
+
- [Accessing the json object within the callback](#accessing-the-json-object-within-the-callback)
|
35
|
+
- [Exceptions](#exceptions)
|
36
|
+
- [Deploy](#deploy)
|
37
|
+
- [Heroku deployment](#heroku-deployment)
|
38
|
+
- [CORS enabled](#cors-enabled)
|
39
|
+
- [Documentation](#documentation)
|
40
|
+
- [Administration Interface](#administration-interface)
|
41
|
+
|
12
42
|
## TLDR
|
13
43
|
|
14
44
|
To create an api endpoint '/todo.json' with GET/POST/PATCH and restricting
|
@@ -198,6 +228,30 @@ curl -X GET http://localhost:9292/todo.json
|
|
198
228
|
curl -X GET http://localhost:9292/todo.json?id=ITEM_ID
|
199
229
|
```
|
200
230
|
|
231
|
+
#### Advanced queries
|
232
|
+
|
233
|
+
Mongo syntax is supported. See [here](http://docs.mongodb.org/manual/tutorial/query-documents/) for more details.
|
234
|
+
|
235
|
+
Some examples:
|
236
|
+
|
237
|
+
Search in array
|
238
|
+
|
239
|
+
```
|
240
|
+
curl -k -X GET -d '{"category": {"$in": ["music"]}}' "https://json.northpole.ro/storage.json?api_key=guest&secret=guest"
|
241
|
+
```
|
242
|
+
|
243
|
+
Greater than number
|
244
|
+
|
245
|
+
```
|
246
|
+
curl -k -X GET -d '{"i": {"$gt": 0}}' "https://json.northpole.ro/storage.json?api_key=guest&secret=guest"
|
247
|
+
```
|
248
|
+
|
249
|
+
OR Query
|
250
|
+
|
251
|
+
```
|
252
|
+
curl -k -X GET -d '{"$or": [{"category": "music"}, {"category": "band"}]}' "https://json.northpole.ro/storage.json?api_key=secret&secret=secret"
|
253
|
+
```
|
254
|
+
|
201
255
|
#### Update
|
202
256
|
|
203
257
|
```shell
|
@@ -224,6 +278,21 @@ end
|
|
224
278
|
This will make sure a Todo item can not be saved or updated in the database
|
225
279
|
without a title attribute.
|
226
280
|
|
281
|
+
### Unique attributes
|
282
|
+
|
283
|
+
You can add unique attributes on resources with the *unique* method. It
|
284
|
+
takes one parameter or an array of parameters as an argument.
|
285
|
+
|
286
|
+
```ruby
|
287
|
+
class Todo < Ki::Model
|
288
|
+
unique :title
|
289
|
+
end
|
290
|
+
```
|
291
|
+
|
292
|
+
This will make sure a Todo item can not be saved or updated in the database
|
293
|
+
if it is not unique.
|
294
|
+
|
295
|
+
|
227
296
|
### Restricting resource requests
|
228
297
|
|
229
298
|
Let's say you want to forbid access to deleting items. You can do that with
|
@@ -304,7 +373,16 @@ git push heroku master
|
|
304
373
|
heroku open
|
305
374
|
```
|
306
375
|
|
376
|
+
## CORS enabled
|
377
|
+
|
378
|
+
Yes.
|
379
|
+
|
307
380
|
## Documentation
|
308
381
|
|
309
382
|
Ki offers instant documentation. Add the middleware 'DocGenerator' and access
|
310
383
|
*/instadoc*.
|
384
|
+
|
385
|
+
## Administration Interface
|
386
|
+
|
387
|
+
Ki offers an instant administration interface. Add the middleware 'AdminIntefaceGenerator'
|
388
|
+
and access */instadmin*.
|
data/Rakefile
CHANGED
@@ -3,12 +3,12 @@ require 'rspec/core/rake_task'
|
|
3
3
|
require 'rdoc/task'
|
4
4
|
|
5
5
|
RDoc::Task.new do |rdoc|
|
6
|
-
rdoc.main =
|
7
|
-
rdoc.rdoc_files
|
8
|
-
include(
|
6
|
+
rdoc.main = 'README.md'
|
7
|
+
rdoc.rdoc_files
|
8
|
+
.include('README.md', 'lib/**/*.rb')
|
9
9
|
rdoc.rdoc_dir = 'doc'
|
10
10
|
end
|
11
11
|
|
12
12
|
RSpec::Core::RakeTask.new(:spec)
|
13
13
|
|
14
|
-
task :
|
14
|
+
task default: :spec
|
data/ki.gemspec
CHANGED
@@ -4,34 +4,35 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'ki/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'ki'
|
8
8
|
spec.version = Ki::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['Cristian Mircea Messel']
|
10
|
+
spec.email = ['mess110@gmail.com']
|
11
|
+
spec.summary = 'it said optional'
|
12
|
+
spec.description = 'it said optional'
|
13
|
+
spec.homepage = 'https://github.com/mess110/ki'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths =
|
19
|
+
spec.require_paths = %w(lib examples)
|
20
20
|
|
21
|
-
spec.add_runtime_dependency
|
22
|
-
spec.add_runtime_dependency
|
23
|
-
spec.add_runtime_dependency
|
24
|
-
spec.add_runtime_dependency
|
25
|
-
spec.add_runtime_dependency
|
26
|
-
spec.add_runtime_dependency
|
27
|
-
spec.add_runtime_dependency
|
28
|
-
spec.add_runtime_dependency
|
29
|
-
spec.add_runtime_dependency
|
30
|
-
spec.add_runtime_dependency
|
21
|
+
spec.add_runtime_dependency 'bundler', '~> 1.5'
|
22
|
+
spec.add_runtime_dependency 'rack'
|
23
|
+
spec.add_runtime_dependency 'rack-parser'
|
24
|
+
spec.add_runtime_dependency 'thor'
|
25
|
+
spec.add_runtime_dependency 'haml'
|
26
|
+
spec.add_runtime_dependency 'sass'
|
27
|
+
spec.add_runtime_dependency 'coffee-script'
|
28
|
+
spec.add_runtime_dependency 'mongo', '1.9.2'
|
29
|
+
spec.add_runtime_dependency 'bson_ext'
|
30
|
+
spec.add_runtime_dependency 'rack-cors'
|
31
31
|
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
32
|
+
spec.add_development_dependency 'rake'
|
33
|
+
spec.add_development_dependency 'rack-test'
|
34
|
+
spec.add_development_dependency 'rspec'
|
35
|
+
spec.add_development_dependency 'guard-rspec'
|
36
|
+
spec.add_development_dependency 'guard-rubocop'
|
37
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
37
38
|
end
|
data/lib/ki.rb
CHANGED
@@ -19,10 +19,12 @@ require 'ki/utils/indifferent_hash'
|
|
19
19
|
require 'ki/modules/query_interface'
|
20
20
|
require 'ki/modules/restrictions'
|
21
21
|
require 'ki/modules/callbacks'
|
22
|
-
require 'ki/modules/
|
23
|
-
|
24
|
-
require 'ki/
|
25
|
-
require 'ki/
|
22
|
+
require 'ki/modules/model_helper'
|
23
|
+
|
24
|
+
require 'ki/middleware/helpers/format_of_helper'
|
25
|
+
require 'ki/middleware/helpers/public_file_helper'
|
26
|
+
require 'ki/middleware/helpers/haml_compiler_helper'
|
27
|
+
require 'ki/middleware/helpers/view_helper'
|
26
28
|
|
27
29
|
require 'ki/middleware/base_middleware'
|
28
30
|
require 'ki/middleware/init_middleware'
|
@@ -39,5 +41,6 @@ require 'ki/helpers'
|
|
39
41
|
require 'ki/orm'
|
40
42
|
require 'ki/model'
|
41
43
|
require 'ki/base_request'
|
44
|
+
require 'ki/ki_app'
|
42
45
|
|
43
46
|
require 'ki/ki'
|
data/lib/ki/base_request.rb
CHANGED
@@ -19,7 +19,7 @@ module Ki
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def to_ki_model_class
|
22
|
-
|
22
|
+
path.to_s.gsub('/', '').gsub(format_of(path), '').gsub('.', '').to_class
|
23
23
|
end
|
24
24
|
|
25
25
|
def to_action
|
@@ -35,7 +35,7 @@ module Ki
|
|
35
35
|
when 'SEARCH'
|
36
36
|
:find
|
37
37
|
else
|
38
|
-
|
38
|
+
fail 'unkown action'
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/lib/ki/helpers.rb
CHANGED
@@ -2,24 +2,24 @@ module Ki
|
|
2
2
|
module Helpers
|
3
3
|
include Middleware::Helpers::View
|
4
4
|
|
5
|
-
def css
|
6
|
-
|
5
|
+
def css(url)
|
6
|
+
haml "%link{:href => '#{url}', :rel => 'stylesheet'}"
|
7
7
|
end
|
8
8
|
|
9
|
-
def js
|
10
|
-
|
9
|
+
def js(url)
|
10
|
+
haml "%script{:src => '#{url}'}"
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def haml(s)
|
14
14
|
Haml::Engine.new(s).render
|
15
15
|
end
|
16
16
|
|
17
|
-
def partial
|
17
|
+
def partial(s)
|
18
18
|
path = view_path(s)
|
19
19
|
if File.file?(path)
|
20
20
|
render_haml(File.read(path))
|
21
21
|
else
|
22
|
-
|
22
|
+
fail PartialNotFoundError, path
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/lib/ki/ki.rb
CHANGED
@@ -1,13 +1,4 @@
|
|
1
1
|
module Ki
|
2
|
-
class KiApp
|
3
|
-
# should never reach this
|
4
|
-
# middleware should catch all the requests
|
5
|
-
def call env
|
6
|
-
s = 'misplaced in space'
|
7
|
-
Rack::Response.new(s).finish
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
2
|
class Ki
|
12
3
|
PUBLIC_PATH = 'public'
|
13
4
|
VIEWS_PATH = 'views'
|
@@ -17,17 +8,20 @@ module Ki
|
|
17
8
|
|
18
9
|
@app = Rack::Builder.new do
|
19
10
|
use Middleware::InitMiddleware
|
20
|
-
|
21
|
-
|
11
|
+
use Rack::Parser, content_types: {
|
12
|
+
'application/json' => proc { |body| ::MultiJson.decode body }
|
13
|
+
}
|
14
|
+
if KiConfig.instance.cors?
|
15
|
+
use Rack::Cors do
|
16
|
+
allow do
|
17
|
+
origins '*'
|
18
|
+
resource '*', headers: :any, methods: [:get, :search, :put, :post, :delete]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
22
|
KiConfig.instance.middleware.each do |middleware|
|
23
23
|
use middleware
|
24
24
|
end
|
25
|
-
use Rack::Cors do
|
26
|
-
allow do
|
27
|
-
origins '*'
|
28
|
-
resource '*', headers: :any, methods: :any
|
29
|
-
end
|
30
|
-
end
|
31
25
|
run KiApp.new
|
32
26
|
end
|
33
27
|
end
|
@@ -41,7 +35,7 @@ module Ki
|
|
41
35
|
ENV['RACK_ENV'] || 'development'
|
42
36
|
end
|
43
37
|
|
44
|
-
def call
|
38
|
+
def call(env)
|
45
39
|
@app.call env
|
46
40
|
end
|
47
41
|
end
|