dzl 1.0.0.beta3 → 1.0.0.beta4

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.
@@ -19,6 +19,7 @@ class Dzl::DSLProxies::Router < Dzl::DSLProxy
19
19
 
20
20
  @subject.call_with_scope(Proc.new, path)
21
21
  end
22
+ alias_method :namespace, :scope
22
23
 
23
24
  def endpoint(route, *request_methods)
24
25
  request_methods = [:get] if request_methods.empty?
@@ -71,9 +71,9 @@ class Dzl::DSLSubjects::Endpoint < Dzl::DSLSubject
71
71
  @route_splits = @route.split('/').select{|s| not s.empty?}
72
72
 
73
73
  route_regex_string = @route_splits.collect do |route_part|
74
- route_part.starts_with?(':') ? "/.*?" : "/#{route_part}"
75
- end.push('$').join('')
74
+ route_part.starts_with?(':') ? "/[a-zA-Z0-9._~-]+" : "/#{route_part}"
75
+ end.push('/?$').join('')
76
76
 
77
77
  @route_regex = Regexp.new('^' + route_regex_string)
78
78
  end
79
- end
79
+ end
@@ -47,7 +47,7 @@ class Dzl::DSLSubjects::Parameter < Dzl::DSLSubject
47
47
  # Returns a symbol describe the error if error,
48
48
  # returns the transformed value if not
49
49
  # TODO symbol values?
50
- def validate(input)
50
+ def validate(input, opts = {})
51
51
  # Validate type
52
52
  unless input
53
53
  if @opts[:required]
@@ -61,7 +61,21 @@ class Dzl::DSLSubjects::Parameter < Dzl::DSLSubject
61
61
  end
62
62
  end
63
63
 
64
- input = convert_type(input)
64
+ input = begin
65
+ if opts[:preformatted]
66
+ if input.is_a?(param_type)
67
+ Dzl::ValueOrError.new(
68
+ v: input
69
+ )
70
+ else
71
+ Dzl::ValueOrError.new(
72
+ e: :type_conversion_error
73
+ )
74
+ end
75
+ else
76
+ convert_type(input)
77
+ end
78
+ end
65
79
  return input if input.error?
66
80
 
67
81
  input = prevalidate_transform(input.value)
@@ -17,12 +17,14 @@ class Dzl::DSLSubjects::ParameterBlock < Dzl::DSLSubject
17
17
  pname, param = pary
18
18
  parandidate_key = param.opts[:header] ? :headers : :params
19
19
 
20
- # verror = value or error.
21
- verror = @params[pname].validate(parandidates[parandidate_key][pname])
22
- if verror.error?
23
- errors[pname] = verror.error
20
+ param = @params[pname].validate(parandidates[parandidate_key][pname], {
21
+ preformatted: request.preformatted_keys.include?(pname)
22
+ })
23
+
24
+ if param.error?
25
+ errors[pname] = param.error
24
26
  else
25
- parandidates[parandidate_key][pname] = verror.value unless verror.value == :__no_value__
27
+ parandidates[parandidate_key][pname] = param.value unless param.value == :__no_value__
26
28
  end
27
29
  end || {}
28
30
 
@@ -68,4 +68,11 @@ class Dzl::Examples::FunWithParams < Dzl::Examples::Base
68
68
  end
69
69
 
70
70
  endpoint '/foo/:bar'
71
- end
71
+
72
+ endpoint '/rofl/:copter', :post do
73
+ optional(:candy) { type Array }
74
+ optional(:cookies, :sunshine) { type Fixnum }
75
+ optional :more
76
+ required :sunshine, :steak
77
+ end
78
+ end
data/lib/dzl/request.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  class Dzl::Request < Rack::Request
2
2
  attr_accessor :silent
3
+ attr_reader :preformatted_keys
3
4
 
4
5
  def initialize(env)
5
6
  super(env)
6
7
 
7
8
  @endpoints = Hash.new({})
9
+ @preformatted_keys = []
8
10
  end
9
11
 
10
12
  def headers
@@ -19,7 +21,14 @@ class Dzl::Request < Rack::Request
19
21
  end
20
22
 
21
23
  def params
22
- @params ||= super
24
+ @params ||= begin
25
+ @request_body = body.read
26
+ unless preformatted_params.empty?
27
+ @preformatted_keys = preformatted_params.keys.collect {|k| k.to_sym}
28
+ end
29
+
30
+ super.merge(preformatted_params)
31
+ end
23
32
  end
24
33
 
25
34
  def overwrite_headers(new_headers)
@@ -51,4 +60,9 @@ class Dzl::Request < Rack::Request
51
60
  def silent?
52
61
  @silent == true
53
62
  end
54
- end
63
+
64
+ protected
65
+ def preformatted_params
66
+ @preformatted_params ||= (content_type == "application/json") ? JSON.parse(@request_body) : {}
67
+ end
68
+ end
data/lib/dzl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dzl
2
- VERSION = "1.0.0.beta3"
2
+ VERSION = "1.0.0.beta4"
3
3
  end
@@ -200,4 +200,42 @@ describe Dzl::Examples::FunWithParams do
200
200
  end
201
201
  end
202
202
  end
203
- end
203
+
204
+ describe '/rofl/:copter' do
205
+ it 'infers json-encoded body parameters' do
206
+ example_body = {
207
+ 'candy' => [1,3,4],
208
+ 'cookies' => 7,
209
+ 'steak' => 'eww',
210
+ 'sunshine' => 9
211
+ }.to_json
212
+ header "Content-Type", "application/json"
213
+ post('/rofl/haha?more=vars', example_body) do |response|
214
+ response.successful?.should be_true
215
+ params = JSON.parse(response.body)['params']
216
+ params['copter'].should == 'haha'
217
+ params['candy'].should == [1, 3, 4]
218
+ params['sunshine'].should == 9
219
+ params['more'].should == "vars"
220
+ end
221
+ end
222
+
223
+ it 'still validates types' do
224
+ example_body = {
225
+ 'candy' => 'this-will-be-a-one-element-array',
226
+ 'cookies' => ['o', 'o', 'p', 's'],
227
+ 'steak' => 'eww',
228
+ 'sunshine' => 9
229
+ }.to_json
230
+ header "Content-Type", "application/json"
231
+ post('/rofl/haha?more=vars', example_body) do |response|
232
+ response.successful?.should be_false
233
+ errors = JSON.parse(response.body)['errors']['/rofl/:copter']
234
+ errors.should == {
235
+ 'cookies' => 'type_conversion_error',
236
+ 'candy' => 'type_conversion_error'
237
+ }
238
+ end
239
+ end
240
+ end
241
+ end
@@ -13,6 +13,13 @@ describe 'endpoint request method' do
13
13
  end
14
14
  end
15
15
 
16
+ it 'ignores an extra trailing slash' do
17
+ get('/foo/') do |response|
18
+ response.status.should == 200
19
+ response.body.should == 'get'
20
+ end
21
+ end
22
+
16
23
  it 'allows specification through endpoint options' do
17
24
  post('/post_op') do |response|
18
25
  response.status.should == 200
@@ -98,4 +105,4 @@ describe 'endpoint request method' do
98
105
  end
99
106
  end
100
107
  end
101
- end
108
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dzl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta3
4
+ version: 1.0.0.beta4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-03-21 00:00:00.000000000 Z
13
+ date: 2012-03-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
17
- requirement: &70140311025420 !ruby/object:Gem::Requirement
17
+ requirement: &70279829324860 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.4.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70140311025420
25
+ version_requirements: *70279829324860
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &70140311024920 !ruby/object:Gem::Requirement
28
+ requirement: &70279829322760 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 3.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70140311024920
36
+ version_requirements: *70279829322760
37
37
  description: Small, fast racktivesupport web framework with handy DSL and explicit
38
38
  parameter validation.
39
39
  email: