sinatra-browse 0.1 → 0.2
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/README.md +21 -6
- data/lib/sinatra/browse/parameter.rb +49 -0
- data/lib/sinatra/browse/route.rb +2 -2
- data/lib/sinatra/browse.rb +9 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb3a18b58acc57c6a80b56bf6a0e08d96e2b04e0
|
4
|
+
data.tar.gz: 87150a5f51798b69ac97540940caec5ba16a5f9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64b8e196681b25a346f8f0cfe135e220a9ebd1b38da76c50481491be880e9817d2384b293e588da7f4155bb0f7131cff9cef974516146bc230452775b8c285e7
|
7
|
+
data.tar.gz: 004f30d10ea627e10adce8b34a2115c820ff2b0934bbc3af47bb2a9d3116e154d04fd2d92a6d671047aaa4961674e42adf636e194706072d03c43581b8a431bf
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# sinatra-browse
|
2
2
|
|
3
|
-
|
3
|
+
Parameter declaration framework and browsable API for Sinatra.
|
4
4
|
|
5
5
|
## What problem do we solve?
|
6
6
|
|
@@ -10,6 +10,8 @@ There exist several frameworks that generate documentation based on comment bloc
|
|
10
10
|
|
11
11
|
## How do we solve it?
|
12
12
|
|
13
|
+
**Parameter Declaration**
|
14
|
+
|
13
15
|
We believe in using actual code as documentation. Take a look at the following example.
|
14
16
|
|
15
17
|
```ruby
|
@@ -21,7 +23,7 @@ class App < Sinatra::Base
|
|
21
23
|
|
22
24
|
description "Creates a new user"
|
23
25
|
param :display_name, :String, required: true
|
24
|
-
param :type, :String, in: ["admin", "moderator", "user"], default: user
|
26
|
+
param :type, :String, in: ["admin", "moderator", "user"], default: "user"
|
25
27
|
param :age, :Integer
|
26
28
|
param :gender, :String, in: ["m", "w", "M", "W"], transform: :upcase
|
27
29
|
param :activated, :Boolean, default: false
|
@@ -34,11 +36,15 @@ end
|
|
34
36
|
|
35
37
|
Here we have a clear list of what parameters are expected and how they are validated. Since this is code and not a comment block, it will always be up to date with the behaviour of our application.
|
36
38
|
|
37
|
-
|
39
|
+
The syntax is inspired by the [sinatra-param](https://github.com/mattt/sinatra-param) and [thor](https://github.com/erikhuda/thor) projects.
|
38
40
|
|
39
|
-
|
41
|
+
**Browsable API**
|
40
42
|
|
41
|
-
|
43
|
+
Sinatra-browse allows you to surf to your API. This works as documentation and allows you to send requests and see their responses directly in your browser.
|
44
|
+
|
45
|
+
http://<api_ip_address>:<api_port>/browse
|
46
|
+
|
47
|
+
*Remark:* This is still work in progress. Right now the page only shows some simple documentation.
|
42
48
|
|
43
49
|
## Parameter types
|
44
50
|
|
@@ -108,6 +114,15 @@ If a request is made that fails validation on the *lets_fail* parameter, then th
|
|
108
114
|
You can use transform to execute a quick method on any prameter provided. Anything that will respond to *to_proc* will do.
|
109
115
|
|
110
116
|
```ruby
|
111
|
-
param :only_caps, :String, transform :upcase
|
117
|
+
param :only_caps, :String, transform: :upcase
|
112
118
|
param :power_of_two, :Integer, transform: proc { |n| n * n }
|
113
119
|
```
|
120
|
+
## Removing undefined parameters
|
121
|
+
|
122
|
+
By default sinatra-browse removes all parameters that weren't defined. You can disable this behaviour with the following line.
|
123
|
+
|
124
|
+
disable :remove_undefined_parameters
|
125
|
+
|
126
|
+
You can also set a `system_parameters` variable to allow for a select few parameters that aren't removed. By default this is set to *[ "splat", "captures" ]*.
|
127
|
+
|
128
|
+
set system_parameters: [ "id", "username", "password" ]
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Sinatra::Browse
|
4
|
+
def ValidationError < Exception; end
|
5
|
+
|
6
|
+
class Validation
|
7
|
+
attr_reader :fail_message
|
8
|
+
end
|
9
|
+
|
10
|
+
class In < Validation
|
11
|
+
def fail_message(value, accepted)
|
12
|
+
"Invalid value: '#{value}'. Must be a member of #{accepted.inspect}."
|
13
|
+
end
|
14
|
+
|
15
|
+
def validate(value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def fail(value, accepted)
|
19
|
+
raise ValidationError, fail_message(value, accepted)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Parameter
|
24
|
+
attr_reader :value
|
25
|
+
|
26
|
+
def initialize(value)
|
27
|
+
@value = coerce(value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate()
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class BPString < Parameter
|
35
|
+
def coerce(v); String(v) end
|
36
|
+
end
|
37
|
+
|
38
|
+
class BPBoolean < Parameter
|
39
|
+
def coerce(v)
|
40
|
+
case v
|
41
|
+
when "y", "yes", "t", "true", "1"
|
42
|
+
true
|
43
|
+
when "n", "no", "f", "false", "0"
|
44
|
+
false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
data/lib/sinatra/browse/route.rb
CHANGED
@@ -53,8 +53,8 @@
|
|
53
53
|
}
|
54
54
|
end
|
55
55
|
|
56
|
-
def delete_undefined(params)
|
57
|
-
params.delete_if { |i| !self.has_parameter?(i) }
|
56
|
+
def delete_undefined(params, system_params)
|
57
|
+
params.delete_if { |i| !(self.has_parameter?(i) || system_params.member?(i)) }
|
58
58
|
end
|
59
59
|
|
60
60
|
def validate(params)
|
data/lib/sinatra/browse.rb
CHANGED
@@ -49,12 +49,20 @@ module Sinatra::Browse
|
|
49
49
|
def self.registered(app)
|
50
50
|
@app = app
|
51
51
|
|
52
|
+
app.enable :remove_undefined_parameters
|
53
|
+
app.set system_parameters: ["splat", "captures"]
|
54
|
+
|
52
55
|
app.before do
|
53
56
|
browse_route = app.browse_routes_for(request.request_method, request.path_info)
|
54
57
|
|
55
58
|
if browse_route
|
56
59
|
#TODO: Optionally throw error for undefined params
|
57
|
-
|
60
|
+
#TODO: Make undefined parameter deletion optional per route
|
61
|
+
|
62
|
+
if settings.remove_undefined_parameters
|
63
|
+
browse_route.delete_undefined(params, settings.system_parameters)
|
64
|
+
end
|
65
|
+
|
58
66
|
browse_route.coerce_type(params)
|
59
67
|
browse_route.set_defaults(params)
|
60
68
|
validation_result = browse_route.validate(params)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-browse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Axsh Co. LTD
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Parameter declaration framework and browsable API for Sinatra
|
14
14
|
email: dev@axsh.net
|
@@ -18,6 +18,7 @@ extra_rdoc_files: []
|
|
18
18
|
files:
|
19
19
|
- lib/sinatra/browse.rb
|
20
20
|
- lib/sinatra/browse/route.rb
|
21
|
+
- lib/sinatra/browse/parameter.rb
|
21
22
|
- lib/sinatra/browse/format.rb
|
22
23
|
- LICENSE
|
23
24
|
- README.md
|