deas 0.24.0 → 0.24.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/deas/logging.rb CHANGED
@@ -102,7 +102,7 @@ module Deas
102
102
  'method' => request.request_method,
103
103
  'path' => request.path,
104
104
  'handler' => env['deas.handler_class_name'],
105
- 'params' => env['sinatra.params'],
105
+ 'params' => env['deas.params'],
106
106
  'time' => env['deas.time_taken'],
107
107
  'status' => status
108
108
  }
data/lib/deas/route.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'deas/sinatra_runner'
2
2
 
3
3
  module Deas
4
+
4
5
  class Route
5
6
 
6
7
  attr_reader :method, :path, :handler_proxy, :handler_class
@@ -15,14 +16,16 @@ module Deas
15
16
 
16
17
  # TODO: unit test this??
17
18
  def run(sinatra_call)
19
+ runner = Deas::SinatraRunner.new(self.handler_class, sinatra_call)
18
20
  sinatra_call.request.env.tap do |env|
19
- env['sinatra.params'] = sinatra_call.params
21
+ env['deas.params'] = runner.params
20
22
  env['deas.handler_class_name'] = self.handler_class.name
21
23
  env['deas.logging'].call " Handler: #{env['deas.handler_class_name']}"
22
- env['deas.logging'].call " Params: #{env['sinatra.params'].inspect}"
24
+ env['deas.logging'].call " Params: #{env['deas.params'].inspect}"
23
25
  end
24
- Deas::SinatraRunner.run(self.handler_class, sinatra_call)
26
+ runner.run
25
27
  end
26
28
 
27
29
  end
30
+
28
31
  end
data/lib/deas/runner.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'rack/utils'
2
+
1
3
  module Deas
2
4
 
3
5
  class Runner
@@ -19,6 +21,28 @@ module Deas
19
21
  def partial(*args); raise NotImplementedError; end
20
22
  def send_file(*args); raise NotImplementedError; end
21
23
 
24
+ class NormalizedParams
25
+
26
+ attr_reader :value
27
+
28
+ def initialize(value)
29
+ @value = if value.is_a?(::Array)
30
+ value.map{ |i| self.class.new(i).value }
31
+ elsif Rack::Utils.params_hash_type?(value)
32
+ value.inject({}){ |h, (k, v)| h[k.to_s] = self.class.new(v).value; h }
33
+ elsif self.file_type?(value)
34
+ value
35
+ else
36
+ value.to_s
37
+ end
38
+ end
39
+
40
+ def file_type?(value)
41
+ raise NotImplementedError
42
+ end
43
+
44
+ end
45
+
22
46
  end
23
47
 
24
48
  end
@@ -5,21 +5,17 @@ module Deas
5
5
 
6
6
  class SinatraRunner < Runner
7
7
 
8
- def self.run(*args)
9
- self.new(*args).run
10
- end
11
-
12
8
  attr_reader :app_settings
13
9
 
14
10
  def initialize(handler_class, sinatra_call)
15
11
  @sinatra_call = sinatra_call
16
12
  @app_settings = @sinatra_call.settings
17
13
 
18
- @request = @sinatra_call.request
19
- @response = @sinatra_call.response
20
- @params = normalize_params(@sinatra_call.params)
21
- @logger = @sinatra_call.settings.logger
22
- @session = @sinatra_call.session
14
+ @request = @sinatra_call.request
15
+ @response = @sinatra_call.response
16
+ @params = NormalizedParams.new(@sinatra_call.params).value
17
+ @logger = @sinatra_call.settings.logger
18
+ @session = @sinatra_call.session
23
19
 
24
20
  super(handler_class)
25
21
  end
@@ -89,19 +85,9 @@ module Deas
89
85
  File.extname(template_name)[1..-1] || 'html'
90
86
  end
91
87
 
92
- def normalize_params(params)
93
- StringifiedKeys.new(params)
94
- end
95
-
96
- module StringifiedKeys
97
- def self.new(value)
98
- if value.is_a?(::Array)
99
- value.map{ |i| StringifiedKeys.new(i) }
100
- elsif Rack::Utils.params_hash_type?(value)
101
- value.inject({}){ |h, (k, v)| h[k.to_s] = StringifiedKeys.new(v); h }
102
- else
103
- value
104
- end
88
+ class NormalizedParams < Deas::Runner::NormalizedParams
89
+ def file_type?(value)
90
+ value.kind_of?(::Tempfile)
105
91
  end
106
92
  end
107
93
 
@@ -12,11 +12,11 @@ module Deas
12
12
  args = (args || {}).dup
13
13
  @app_settings = OpenStruct.new(args.delete(:app_settings))
14
14
 
15
- @request = args.delete(:request)
16
- @response = args.delete(:response)
17
- @params = normalize_params(args.delete(:params) || {})
18
- @logger = args.delete(:logger) || Deas::NullLogger.new
19
- @session = args.delete(:session)
15
+ @request = args.delete(:request)
16
+ @response = args.delete(:response)
17
+ @params = NormalizedParams.new(args.delete(:params) || {}).value
18
+ @logger = args.delete(:logger) || Deas::NullLogger.new
19
+ @session = args.delete(:session)
20
20
 
21
21
  super(handler_class)
22
22
  args.each{|key, value| @handler.send("#{key}=", value) }
@@ -82,26 +82,9 @@ module Deas
82
82
  end
83
83
  SendFileArgs = Struct.new(:file_path, :options, :block)
84
84
 
85
- private
86
-
87
- def normalize_params(params)
88
- Stringify.new(params)
89
- end
90
-
91
- module Stringify
92
- def self.new(value)
93
- if value.is_a?(::Array)
94
- value.map{ |i| Stringify.new(i) }
95
- elsif Rack::Utils.params_hash_type?(value)
96
- value.inject({}){ |h, (k, v)| h[k.to_s] = Stringify.new(v); h }
97
- elsif self.file_type?(value)
98
- value
99
- else
100
- value.to_s
101
- end
102
- end
103
-
104
- def self.file_type?(value)
85
+ class NormalizedParams < Deas::Runner::NormalizedParams
86
+ def file_type?(value)
87
+ value.kind_of?(::Tempfile) ||
105
88
  value.kind_of?(::File) ||
106
89
  value.kind_of?(::Rack::Multipart::UploadedFile) ||
107
90
  (defined?(::Rack::Test::UploadedFile) && value.kind_of?(::Rack::Test::UploadedFile))
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.24.0"
2
+ VERSION = "0.24.1"
3
3
  end
@@ -0,0 +1,24 @@
1
+ module Deas; end
2
+ class Deas::Runner
3
+
4
+ class NormalizedParamsSpy
5
+ attr_reader :params, :value_called
6
+
7
+ def initialize
8
+ @params = nil
9
+ @value_called = false
10
+ end
11
+
12
+ def new(params)
13
+ @params = params
14
+ self
15
+ end
16
+
17
+ def value
18
+ @value_called = true
19
+ @params
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -5,7 +5,7 @@ require 'deas/route'
5
5
 
6
6
  class Deas::Route
7
7
 
8
- class BaseTests < Assert::Context
8
+ class UnitTests < Assert::Context
9
9
  desc "Deas::Route"
10
10
  setup do
11
11
  @handler_proxy = Deas::RouteProxy.new('TestViewHandler')
@@ -5,7 +5,7 @@ require 'test/support/view_handlers'
5
5
 
6
6
  class Deas::Runner
7
7
 
8
- class BaseTests < Assert::Context
8
+ class UnitTests < Assert::Context
9
9
  desc "Deas::Runner"
10
10
  setup do
11
11
  @runner = Deas::Runner.new(TestViewHandler)
@@ -43,4 +43,69 @@ class Deas::Runner
43
43
 
44
44
  end
45
45
 
46
+ class NormalizedParamsTests < UnitTests
47
+ desc "NormalizedParams"
48
+
49
+ should "convert any non-Array or non-Hash values to strings" do
50
+ exp_params = {
51
+ 'nil' => '',
52
+ 'int' => '42',
53
+ 'str' => 'string'
54
+ }
55
+ assert_equal exp_params, normalized({
56
+ 'nil' => nil,
57
+ 'int' => 42,
58
+ 'str' => 'string'
59
+ })
60
+ end
61
+
62
+ should "recursively convert array values to strings" do
63
+ exp_params = {
64
+ 'array' => ['', '42', 'string']
65
+ }
66
+ assert_equal exp_params, normalized({
67
+ 'array' => [nil, 42, 'string']
68
+ })
69
+ end
70
+
71
+ should "recursively convert hash values to strings" do
72
+ exp_params = {
73
+ 'values' => {
74
+ 'nil' => '',
75
+ 'int' => '42',
76
+ 'str' => 'string'
77
+ }
78
+ }
79
+ assert_equal exp_params, normalized({
80
+ 'values' => {
81
+ 'nil' => nil,
82
+ 'int' => 42,
83
+ 'str' => 'string'
84
+ }
85
+ })
86
+ end
87
+
88
+ should "convert any non-string hash keys to string keys" do
89
+ exp_params = {
90
+ 'nil' => '',
91
+ 'vals' => { '42' => 'int', 'str' => 'string' }
92
+ }
93
+ assert_equal exp_params, normalized({
94
+ 'nil' => '',
95
+ :vals => { 42 => :int, 'str' => 'string' }
96
+ })
97
+ end
98
+
99
+ private
100
+
101
+ def normalized(params)
102
+ TestNormalizedParams.new(params).value
103
+ end
104
+
105
+ class TestNormalizedParams < Deas::Runner::NormalizedParams
106
+ def file_type?(value); false; end
107
+ end
108
+
109
+ end
110
+
46
111
  end
@@ -1,17 +1,35 @@
1
1
  require 'assert'
2
2
  require 'deas/sinatra_runner'
3
3
 
4
+ require 'deas/runner'
5
+ require 'deas/template'
4
6
  require 'test/support/fake_sinatra_call'
5
7
  require 'test/support/view_handlers'
6
- require 'deas/template'
7
8
 
8
9
  class Deas::SinatraRunner
9
10
 
10
11
  class UnitTests < Assert::Context
11
12
  desc "Deas::SinatraRunner"
12
13
  setup do
14
+ @runner_class = Deas::SinatraRunner
15
+ end
16
+ subject{ @runner_class }
17
+
18
+ should "be a Runner" do
19
+ assert subject < Deas::Runner
20
+ end
21
+
22
+ end
23
+
24
+ class InitTests < UnitTests
25
+ desc "when init"
26
+ setup do
27
+ @params = { 'value' => '1' }
28
+ @norm_params_spy = Deas::Runner::NormalizedParamsSpy.new
29
+ Assert.stub(NormalizedParams, :new){ |p| @norm_params_spy.new(p) }
30
+
13
31
  @fake_sinatra_call = FakeSinatraCall.new
14
- @runner = Deas::SinatraRunner.new(FlagViewHandler, @fake_sinatra_call)
32
+ @runner = @runner_class.new(FlagViewHandler, @fake_sinatra_call)
15
33
  end
16
34
  subject{ @runner }
17
35
 
@@ -26,6 +44,11 @@ class Deas::SinatraRunner
26
44
  assert_equal @fake_sinatra_call.session, subject.session
27
45
  end
28
46
 
47
+ should "call to normalize its params" do
48
+ assert_equal @fake_sinatra_call.params, @norm_params_spy.params
49
+ assert_true @norm_params_spy.value_called
50
+ end
51
+
29
52
  should "call the sinatra_call's halt with" do
30
53
  return_value = catch(:halt){ subject.halt('test') }
31
54
  assert_equal [ 'test' ], return_value
@@ -87,8 +110,8 @@ class Deas::SinatraRunner
87
110
 
88
111
  end
89
112
 
90
- class RunTests < UnitTests
91
- desc "run"
113
+ class RunTests < InitTests
114
+ desc "and run"
92
115
  setup do
93
116
  @return_value = @runner.run
94
117
  @handler = @runner.instance_variable_get("@handler")
@@ -111,41 +134,28 @@ class Deas::SinatraRunner
111
134
 
112
135
  end
113
136
 
114
- class ParamsTests < UnitTests
115
- desc "normalizing params"
116
-
117
- should "convert any non-string hash keys to string keys" do
118
- exp_params = {
119
- 'a' => 'aye',
120
- 'b' => 'bee',
121
- 'attachment' => {
122
- 'tempfile' => 'a-file',
123
- 'content_type' => 'whatever'
124
- },
125
- 'attachments' => [
126
- { 'tempfile' => 'a-file' },
127
- { 'tempfile' => 'b-file' }
128
- ]
129
- }
130
- assert_equal exp_params, runner_params({
131
- :a => 'aye',
132
- 'b' => 'bee',
133
- 'attachment' => {
134
- :tempfile => 'a-file',
135
- :content_type => 'whatever'
136
- },
137
- 'attachments' => [
138
- { :tempfile => 'a-file' },
139
- { 'tempfile' => 'b-file' }
140
- ]
137
+ class NormalizedParamsTests < UnitTests
138
+ desc "NormalizedParams"
139
+ setup do
140
+ @norm_params_class = Deas::SinatraRunner::NormalizedParams
141
+ end
142
+
143
+ should "be a normalized params subclass" do
144
+ assert @norm_params_class < Deas::Runner::NormalizedParams
145
+ end
146
+
147
+ should "not convert Tempfile param values to strings" do
148
+ tempfile = Class.new(::Tempfile){ def initialize; end }.new
149
+ params = normalized({
150
+ 'attachment' => { :tempfile => tempfile }
141
151
  })
152
+ assert_kind_of ::Tempfile, params['attachment']['tempfile']
142
153
  end
143
154
 
144
155
  private
145
156
 
146
- def runner_params(params)
147
- @fake_sinatra_call.params = params
148
- Deas::SinatraRunner.new(FlagViewHandler, @fake_sinatra_call).params
157
+ def normalized(params)
158
+ @norm_params_class.new(params).value
149
159
  end
150
160
 
151
161
  end
@@ -3,6 +3,7 @@ require 'deas/test_runner'
3
3
 
4
4
  require 'rack/test'
5
5
  require 'deas/runner'
6
+ require 'test/support/normalized_params_spy'
6
7
  require 'test/support/view_handlers'
7
8
 
8
9
  class Deas::TestRunner
@@ -10,17 +11,29 @@ class Deas::TestRunner
10
11
  class UnitTests < Assert::Context
11
12
  desc "Deas::TestRunner"
12
13
  setup do
13
- @runner = Deas::TestRunner.new(TestRunnerViewHandler)
14
+ @runner_class = Deas::TestRunner
15
+ end
16
+ subject{ @runner_class }
17
+
18
+ should "be a Runner" do
19
+ assert subject < Deas::Runner
20
+ end
21
+
22
+ end
23
+
24
+ class InitTests < UnitTests
25
+ desc "when init"
26
+ setup do
27
+ @params = { 'value' => '1' }
28
+ @norm_params_spy = Deas::Runner::NormalizedParamsSpy.new
29
+ Assert.stub(NormalizedParams, :new){ |p| @norm_params_spy.new(p) }
30
+ @runner = @runner_class.new(TestRunnerViewHandler, :params => @params)
14
31
  end
15
32
  subject{ @runner }
16
33
 
17
34
  should have_readers :app_settings, :return_value
18
35
  should have_imeths :run
19
36
 
20
- should "be a Runner" do
21
- assert subject.class < Deas::Runner
22
- end
23
-
24
37
  should "know its app_settings" do
25
38
  assert_kind_of OpenStruct, subject.app_settings
26
39
  end
@@ -28,11 +41,21 @@ class Deas::TestRunner
28
41
  should "default its settings" do
29
42
  assert_nil subject.request
30
43
  assert_nil subject.response
31
- assert_equal Hash.new, subject.params
44
+ assert_kind_of ::Hash, subject.params
32
45
  assert_kind_of Deas::NullLogger, subject.logger
33
46
  assert_nil subject.session
34
47
  end
35
48
 
49
+ should "default its params" do
50
+ runner = @runner_class.new(TestRunnerViewHandler)
51
+ assert_equal ::Hash.new, runner.params
52
+ end
53
+
54
+ should "call to normalize its params" do
55
+ assert_equal @params, @norm_params_spy.params
56
+ assert_true @norm_params_spy.value_called
57
+ end
58
+
36
59
  should "write any non-standard settings on the handler" do
37
60
  runner = Deas::TestRunner.new(TestRunnerViewHandler, :custom_value => 42)
38
61
  assert_equal 42, runner.handler.custom_value
@@ -120,70 +143,35 @@ class Deas::TestRunner
120
143
 
121
144
  end
122
145
 
123
- class ParamsTests < UnitTests
124
- desc "normalizing params"
125
-
126
- should "convert any non-Array or non-Hash values to strings" do
127
- exp_params = {
128
- 'nil' => '',
129
- 'int' => '42',
130
- 'str' => 'string'
131
- }
132
- assert_equal exp_params, runner_params({
133
- 'nil' => nil,
134
- 'int' => 42,
135
- 'str' => 'string'
136
- })
137
- end
138
-
139
- should "recursively convert array values to strings" do
140
- exp_params = {
141
- 'array' => ['', '42', 'string']
142
- }
143
- assert_equal exp_params, runner_params({
144
- 'array' => [nil, 42, 'string']
145
- })
146
+ class NormalizedParamsTests < UnitTests
147
+ desc "NormalizedParams"
148
+ setup do
149
+ @norm_params_class = Deas::TestRunner::NormalizedParams
146
150
  end
147
151
 
148
- should "recursively convert hash values to strings" do
149
- exp_params = {
150
- 'values' => {
151
- 'nil' => '',
152
- 'int' => '42',
153
- 'str' => 'string'
154
- }
155
- }
156
- assert_equal exp_params, runner_params({
157
- 'values' => {
158
- 'nil' => nil,
159
- 'int' => 42,
160
- 'str' => 'string'
161
- }
162
- })
152
+ should "be a normalized params subclass" do
153
+ assert @norm_params_class < Deas::Runner::NormalizedParams
163
154
  end
164
155
 
165
- should "convert any non-string hash keys to string keys" do
166
- exp_params = {
167
- 'nil' => '',
168
- 'vals' => { '42' => 'int', 'str' => 'string' }
169
- }
170
- assert_equal exp_params, runner_params({
171
- 'nil' => '',
172
- :vals => { 42 => :int, 'str' => 'string' }
156
+ should "not convert Tempfile param values to strings" do
157
+ tempfile = Class.new(::Tempfile){ def initialize; end }.new
158
+ params = normalized({
159
+ 'attachment' => { :tempfile => tempfile }
173
160
  })
161
+ assert_kind_of ::Tempfile, params['attachment']['tempfile']
174
162
  end
175
163
 
176
164
  should "not convert File param values to strings" do
177
165
  tempfile = File.new(TEST_SUPPORT_ROOT.join('routes.rb'))
178
- params = runner_params({
166
+ params = normalized({
179
167
  'attachment' => { :tempfile => tempfile }
180
168
  })
181
- assert_kind_of File, params['attachment']['tempfile']
169
+ assert_kind_of ::File, params['attachment']['tempfile']
182
170
  end
183
171
 
184
172
  should "not convert Rack::Multipart::UploadedFile param values to strings" do
185
173
  tempfile = Rack::Multipart::UploadedFile.new(TEST_SUPPORT_ROOT.join('routes.rb'))
186
- params = runner_params({
174
+ params = normalized({
187
175
  'attachment' => { :tempfile => tempfile }
188
176
  })
189
177
  assert_kind_of Rack::Multipart::UploadedFile, params['attachment']['tempfile']
@@ -191,7 +179,7 @@ class Deas::TestRunner
191
179
 
192
180
  should "not convert Rack::Test::UploadedFile param values to strings" do
193
181
  tempfile = Rack::Test::UploadedFile.new(TEST_SUPPORT_ROOT.join('routes.rb'))
194
- params = runner_params({
182
+ params = normalized({
195
183
  'attachment' => { :tempfile => tempfile }
196
184
  })
197
185
  assert_kind_of Rack::Test::UploadedFile, params['attachment']['tempfile']
@@ -199,8 +187,8 @@ class Deas::TestRunner
199
187
 
200
188
  private
201
189
 
202
- def runner_params(params)
203
- Deas::TestRunner.new(TestRunnerViewHandler, :params => params).params
190
+ def normalized(params)
191
+ @norm_params_class.new(params).value
204
192
  end
205
193
 
206
194
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deas
3
3
  version: !ruby/object:Gem::Version
4
- hash: 127
4
+ hash: 125
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 24
9
- - 0
10
- version: 0.24.0
9
+ - 1
10
+ version: 0.24.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-06-24 00:00:00 Z
19
+ date: 2014-06-26 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -169,6 +169,7 @@ files:
169
169
  - log/.gitkeep
170
170
  - test/helper.rb
171
171
  - test/support/fake_sinatra_call.rb
172
+ - test/support/normalized_params_spy.rb
172
173
  - test/support/routes.rb
173
174
  - test/support/view_handlers.rb
174
175
  - test/support/views/_info.erb
@@ -241,6 +242,7 @@ summary: Handler-based web framework powered by Sinatra
241
242
  test_files:
242
243
  - test/helper.rb
243
244
  - test/support/fake_sinatra_call.rb
245
+ - test/support/normalized_params_spy.rb
244
246
  - test/support/routes.rb
245
247
  - test/support/view_handlers.rb
246
248
  - test/support/views/_info.erb