deas 0.10.0 → 0.11.0

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.
data/lib/deas.rb CHANGED
@@ -2,6 +2,7 @@ require 'ns-options'
2
2
  require 'pathname'
3
3
 
4
4
  require 'deas/version'
5
+ require 'deas/exceptions'
5
6
  require 'deas/server'
6
7
  require 'deas/view_handler'
7
8
 
@@ -0,0 +1,11 @@
1
+ module Deas
2
+
3
+ Error = Class.new(RuntimeError)
4
+ ServerError = Class.new(Error)
5
+ ServerRootError = Class.new(ServerError) do
6
+ def message
7
+ "server `root` not set but required"
8
+ end
9
+ end
10
+
11
+ end
data/lib/deas/server.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require 'ns-options'
2
2
  require 'ns-options/boolean'
3
3
  require 'pathname'
4
+ require 'set'
5
+ require 'deas/exceptions'
4
6
  require 'deas/template'
7
+ require 'deas/logging'
5
8
  require 'deas/redirect_handler'
6
9
  require 'deas/route'
7
10
  require 'deas/sinatra_app'
@@ -15,7 +18,7 @@ module Deas::Server
15
18
  # Sinatra based options
16
19
  option :env, String, :default => 'development'
17
20
 
18
- option :root, Pathname
21
+ option :root, Pathname, :required => true
19
22
  option :public_folder, Pathname
20
23
  option :views_folder, Pathname
21
24
 
@@ -31,23 +34,57 @@ module Deas::Server
31
34
  option :init_procs, Array, :default => []
32
35
  option :logger, :default => proc{ Deas::NullLogger.new }
33
36
  option :middlewares, Array, :default => []
34
- option :settings, Array, :default => []
37
+ option :settings, Hash, :default => {}
35
38
  option :verbose_logging, :default => true
36
39
  option :routes, Array, :default => []
37
40
  option :view_handler_ns, String
38
41
 
39
42
  attr_reader :template_helpers
40
43
 
41
- def initialize
44
+ def initialize(values=nil)
42
45
  # these are defaulted here because we want to use the Configuration
43
46
  # instance `root`. If we define a proc above, we will be using the
44
47
  # Configuration class `root`, which will not update these options as
45
48
  # expected.
46
- super({
49
+ super((values || {}).merge({
47
50
  :public_folder => proc{ self.root.join('public') },
48
51
  :views_folder => proc{ self.root.join('views') }
49
- })
52
+ }))
50
53
  @template_helpers = []
54
+ @valid = nil
55
+ end
56
+
57
+ def valid?
58
+ !!@valid
59
+ end
60
+
61
+ # for the config to be considered "valid", a few things need to happen. The
62
+ # key here is that this only needs to be done _once_ for each config.
63
+
64
+ def validate!
65
+ return @valid if !@valid.nil? # only need to run this once per config
66
+
67
+ # ensure all user and plugin configs/settings are applied
68
+ self.init_procs.each{ |p| p.call }
69
+ raise Deas::ServerRootError if self.root.nil?
70
+
71
+ # constantize the routes to ensure they are available
72
+ self.routes.each(&:constantize!)
73
+
74
+ # set the :erb :outvar setting if it hasn't been set. this is used
75
+ # by template helpers and plugins and needs to be queryable. the actual
76
+ # value doesn't matter - it just needs to be set
77
+ self.settings[:erb] ||= {}
78
+ self.settings[:erb][:outvar] ||= '@_out_buf'
79
+
80
+ # add the logging middleware args last. This ensures that the logging
81
+ # happens just before the app gets the request and just after the app
82
+ # sends a response.
83
+ [*Deas::Logging.middleware(self.verbose_logging)].tap do |mw_args|
84
+ self.middlewares << mw_args
85
+ end
86
+
87
+ @valid = true # if it made it this far, its valid!
51
88
  end
52
89
 
53
90
  def template_scope
@@ -141,8 +178,8 @@ module Deas::Server
141
178
  self.configuration.middlewares << args
142
179
  end
143
180
 
144
- def set(*args)
145
- self.configuration.settings << args
181
+ def set(name, value)
182
+ self.configuration.settings[name.to_sym] = value
146
183
  end
147
184
 
148
185
  def view_handler_ns(*args)
@@ -1,17 +1,11 @@
1
1
  require 'sinatra/base'
2
2
  require 'deas/error_handler'
3
- require 'deas/logging'
4
3
 
5
4
  module Deas
6
-
7
5
  module SinatraApp
8
6
 
9
7
  def self.new(server_config)
10
- # the reason this is done here is b/c the below sinatra configuration is
11
- # not considered valid until the init procs have been run and the routes
12
- # have been constantized.
13
- server_config.init_procs.each{ |p| p.call }
14
- server_config.routes.each(&:constantize!)
8
+ server_config.validate!
15
9
 
16
10
  Sinatra.new do
17
11
 
@@ -38,8 +32,6 @@ module Deas
38
32
  server_config.settings.each{ |set_args| set *set_args }
39
33
  server_config.middlewares.each{ |use_args| use *use_args }
40
34
 
41
- use Deas::Logging.middleware(server_config.verbose_logging)
42
-
43
35
  # routes
44
36
  server_config.routes.each do |route|
45
37
  send(route.method, route.path){ route.run(self) }
@@ -58,5 +50,4 @@ module Deas
58
50
  end
59
51
 
60
52
  end
61
-
62
53
  end
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.10.0"
2
+ VERSION = "0.11.0"
3
3
  end
@@ -0,0 +1,29 @@
1
+ require 'assert'
2
+ require 'deas/exceptions'
3
+
4
+ module Deas
5
+
6
+ class ErrorTests < Assert::Context
7
+ desc "Deas"
8
+
9
+ should "provide an error exception that subclasses `RuntimeError" do
10
+ assert Deas::Error
11
+ assert_kind_of RuntimeError, Deas::Error.new
12
+ end
13
+
14
+ should "provide a server exception that subclasses `Error`" do
15
+ assert Deas::ServerError
16
+ assert_kind_of Deas::Error, Deas::ServerError.new
17
+ end
18
+
19
+ should "provide a server root exception that subclasses `ServerError`" do
20
+ assert Deas::ServerRootError
21
+
22
+ e = Deas::ServerRootError.new
23
+ assert_kind_of Deas::ServerError, e
24
+ assert_equal "server `root` not set but required", e.message
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,146 @@
1
+ require 'assert'
2
+ require 'set'
3
+ require 'test/support/view_handlers'
4
+ require 'deas/exceptions'
5
+ require 'deas/template'
6
+ require 'deas/server'
7
+
8
+ class Deas::Server::Configuration
9
+
10
+ class BaseTests < Assert::Context
11
+ desc "Deas::Server::Configuration"
12
+ setup do
13
+ @configuration = Deas::Server::Configuration.new
14
+ @configuration.root = TEST_SUPPORT_ROOT
15
+ end
16
+ subject{ @configuration }
17
+
18
+ # sinatra related options
19
+ should have_imeths :env, :root, :public_folder, :views_folder
20
+ should have_imeths :dump_errors, :method_override, :sessions, :show_exceptions
21
+ should have_imeths :static_files, :reload_templates
22
+
23
+ # server handling options
24
+ should have_imeths :error_procs, :init_procs, :logger, :middlewares, :settings
25
+ should have_imeths :verbose_logging, :routes, :view_handler_ns
26
+
27
+ should have_reader :template_helpers
28
+ should have_imeths :valid?, :validate!
29
+
30
+ should "default the env to 'development'" do
31
+ assert_equal 'development', subject.env
32
+ end
33
+
34
+ should "default the public and views folders based off the root" do
35
+ assert_equal subject.root.join('public'), subject.public_folder
36
+ assert_equal subject.root.join('views'), subject.views_folder
37
+ end
38
+
39
+ should "default the Sinatra flags" do
40
+ assert_equal false, subject.dump_errors
41
+ assert_equal true, subject.method_override
42
+ assert_equal false, subject.sessions
43
+ assert_equal false, subject.show_exceptions
44
+ assert_equal true, subject.static_files
45
+ assert_equal false, subject.reload_templates
46
+ end
47
+
48
+ should "default the handling options" do
49
+ assert_empty subject.error_procs
50
+ assert_empty subject.init_procs
51
+ assert_instance_of Deas::NullLogger, subject.logger
52
+ assert_empty subject.middlewares
53
+ assert_empty subject.settings
54
+ assert_equal true, subject.verbose_logging
55
+ assert_empty subject.routes
56
+ assert_nil subject.view_handler_ns
57
+ assert_empty subject.template_helpers
58
+ end
59
+
60
+ should "build a template scope including its template helpers" do
61
+ config = Deas::Server::Configuration.new
62
+ config.template_helpers << (helper_module = Module.new)
63
+
64
+ assert_includes Deas::Template::Scope, config.template_scope.ancestors
65
+ assert_includes helper_module, config.template_scope.included_modules
66
+ end
67
+
68
+ should "not be valid until validate! has been run" do
69
+ assert_not subject.valid?
70
+
71
+ subject.validate!
72
+ assert subject.valid?
73
+ end
74
+
75
+ should "complain if validating and `root` isn't set" do
76
+ config = Deas::Server::Configuration.new
77
+ assert_raises(Deas::ServerRootError){ config.validate! }
78
+ assert_nothing_raised{ config.root '/path/to/root'; config.validate! }
79
+ end
80
+
81
+ end
82
+
83
+ class ValidationTests < BaseTests
84
+ desc "when successfully validated"
85
+ setup do
86
+ @initialized = false
87
+ @other_initialized = false
88
+ @route = Deas::Route.new(:get, '/something', 'TestViewHandler')
89
+
90
+ @configuration = Deas::Server::Configuration.new.tap do |c|
91
+ c.env = 'staging'
92
+ c.root = 'path/to/somewhere'
93
+ c.dump_errors = true
94
+ c.method_override = false
95
+ c.sessions = false
96
+ c.show_exceptions = true
97
+ c.static = true
98
+ c.reload_templates = true
99
+ c.routes = [ @route ]
100
+ c.middlewares = [ ['MyMiddleware'] ]
101
+ end
102
+ @configuration.init_procs << proc{ @initialized = true }
103
+ @configuration.init_procs << proc{ @other_initialized = true }
104
+ end
105
+
106
+ should "call init procs" do
107
+ assert_equal false, @initialized
108
+ assert_equal false, @other_initialized
109
+
110
+ subject.validate!
111
+
112
+ assert_equal true, @initialized
113
+ assert_equal true, @other_initialized
114
+ end
115
+
116
+ should "call constantize! on all routes" do
117
+ assert_nil @route.handler_class
118
+
119
+ subject.validate!
120
+
121
+ assert_equal TestViewHandler, @route.handler_class
122
+ end
123
+
124
+ should "default the :erb :outvar setting in the SinatraApp it creates" do
125
+ assert_nil subject.settings[:erb]
126
+
127
+ subject.validate!
128
+
129
+ assert_kind_of ::Hash, subject.settings[:erb]
130
+ assert_equal '@_out_buf', subject.settings[:erb][:outvar]
131
+ end
132
+
133
+ should "add the Deas::Logging middleware to the end of the middlewares" do
134
+ assert subject.verbose_logging
135
+ assert_equal 1, subject.middlewares.size
136
+ assert_not_equal [Deas::VerboseLogging], subject.middlewares.last
137
+
138
+ subject.validate!
139
+
140
+ assert_equal 2, subject.middlewares.size
141
+ assert_equal [Deas::VerboseLogging], subject.middlewares.last
142
+ end
143
+
144
+ end
145
+
146
+ end
@@ -1,8 +1,8 @@
1
1
  require 'assert'
2
- require 'deas/template'
2
+ require 'set'
3
+ require 'logger'
3
4
  require 'deas/route'
4
5
  require 'deas/server'
5
- require 'logger'
6
6
 
7
7
  module Deas::Server
8
8
 
@@ -62,7 +62,7 @@ module Deas::Server
62
62
  assert_equal [ ['MyMiddleware'] ], config.middlewares
63
63
 
64
64
  subject.set :testing_set_meth, 'it works!'
65
- assert_equal [ [:testing_set_meth, 'it works!'] ], config.settings
65
+ assert_equal({ :testing_set_meth => 'it works!'}, config.settings)
66
66
 
67
67
  stdout_logger = Logger.new(STDOUT)
68
68
  subject.logger stdout_logger
@@ -162,71 +162,11 @@ module Deas::Server
162
162
  assert_equal '::NoNsTest', route.handler_class_name
163
163
  end
164
164
 
165
- should "add and query helper modules using #template_helpers and #template_helper?" do
165
+ should "add and query helper modules" do
166
166
  subject.template_helpers(helper_module = Module.new)
167
167
  assert subject.template_helper?(helper_module)
168
168
  end
169
169
 
170
170
  end
171
171
 
172
- class ConfigurationTests < BaseTests
173
- desc "Configuration"
174
- setup do
175
- @configuration = Deas::Server::Configuration.new
176
- end
177
- subject{ @configuration }
178
-
179
- # sinatra related options
180
- should have_imeths :env, :root, :public_folder, :views_folder
181
- should have_imeths :dump_errors, :method_override, :sessions, :show_exceptions
182
- should have_imeths :static_files, :reload_templates
183
-
184
- # server handling options
185
- should have_imeths :error_procs, :init_procs, :logger, :middlewares, :settings
186
- should have_imeths :verbose_logging, :routes, :view_handler_ns
187
-
188
- should have_reader :template_helpers
189
-
190
- should "default the env to 'development'" do
191
- assert_equal 'development', subject.env
192
- end
193
-
194
- should "default the public and views folders based off the root" do
195
- subject.root = TEST_SUPPORT_ROOT
196
-
197
- assert_equal subject.root.join('public'), subject.public_folder
198
- assert_equal subject.root.join('views'), subject.views_folder
199
- end
200
-
201
- should "default the Sinatra flags" do
202
- assert_equal false, subject.dump_errors
203
- assert_equal true, subject.method_override
204
- assert_equal false, subject.sessions
205
- assert_equal false, subject.show_exceptions
206
- assert_equal true, subject.static_files
207
- assert_equal false, subject.reload_templates
208
- end
209
-
210
- should "default the handling options" do
211
- assert_empty subject.error_procs
212
- assert_empty subject.init_procs
213
- assert_instance_of Deas::NullLogger, subject.logger
214
- assert_empty subject.middlewares
215
- assert_empty subject.settings
216
- assert_equal true, subject.verbose_logging
217
- assert_empty subject.routes
218
- assert_nil subject.view_handler_ns
219
- assert_empty subject.template_helpers
220
- end
221
-
222
- should "build a template scope including its template helpers" do
223
- config = Deas::Server::Configuration.new
224
- config.template_helpers << (helper_module = Module.new)
225
-
226
- assert_includes Deas::Template::Scope, config.template_scope.ancestors
227
- assert_includes helper_module, config.template_scope.included_modules
228
- end
229
-
230
- end
231
-
232
172
  end
@@ -26,23 +26,12 @@ module Deas::SinatraApp
26
26
  end
27
27
  subject{ @sinatra_app }
28
28
 
29
- should "be a kind of Sinatra::Base" do
30
- assert_equal Sinatra::Base, subject.superclass
31
- end
32
-
33
- should "call init procs when initialized" do
34
- initialized = false
35
- other_initialized = false
36
- @configuration.init_procs << proc{ initialized = true }
37
- @configuration.init_procs << proc{ other_initialized = true }
38
- @sinatra_app = Deas::SinatraApp.new(@configuration)
39
-
40
- assert_equal true, initialized
41
- assert_equal true, other_initialized
29
+ should "ensure its config is valid" do
30
+ assert @configuration.valid?
42
31
  end
43
32
 
44
- should "call constantize! on all routes" do
45
- assert_equal TestViewHandler, @route.handler_class
33
+ should "be a kind of Sinatra::Base" do
34
+ assert_equal Sinatra::Base, subject.superclass
46
35
  end
47
36
 
48
37
  should "have it's configuration set based on the server configuration" do
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: 55
4
+ hash: 51
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 10
8
+ - 11
9
9
  - 0
10
- version: 0.10.0
10
+ version: 0.11.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,11 +16,12 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-05-14 00:00:00 Z
19
+ date: 2013-05-17 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ name: ns-options
22
23
  prerelease: false
23
- version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
24
25
  none: false
25
26
  requirements:
26
27
  - - ~>
@@ -38,12 +39,12 @@ dependencies:
38
39
  - 1
39
40
  - 4
40
41
  version: 1.1.4
41
- requirement: *id001
42
- name: ns-options
43
42
  type: :runtime
43
+ version_requirements: *id001
44
44
  - !ruby/object:Gem::Dependency
45
+ name: rack
45
46
  prerelease: false
46
- version_requirements: &id002 !ruby/object:Gem::Requirement
47
+ requirement: &id002 !ruby/object:Gem::Requirement
47
48
  none: false
48
49
  requirements:
49
50
  - - ~>
@@ -53,12 +54,12 @@ dependencies:
53
54
  - 1
54
55
  - 5
55
56
  version: "1.5"
56
- requirement: *id002
57
- name: rack
58
57
  type: :runtime
58
+ version_requirements: *id002
59
59
  - !ruby/object:Gem::Dependency
60
+ name: sinatra
60
61
  prerelease: false
61
- version_requirements: &id003 !ruby/object:Gem::Requirement
62
+ requirement: &id003 !ruby/object:Gem::Requirement
62
63
  none: false
63
64
  requirements:
64
65
  - - ~>
@@ -68,12 +69,12 @@ dependencies:
68
69
  - 1
69
70
  - 4
70
71
  version: "1.4"
71
- requirement: *id003
72
- name: sinatra
73
72
  type: :runtime
73
+ version_requirements: *id003
74
74
  - !ruby/object:Gem::Dependency
75
+ name: assert
75
76
  prerelease: false
76
- version_requirements: &id004 !ruby/object:Gem::Requirement
77
+ requirement: &id004 !ruby/object:Gem::Requirement
77
78
  none: false
78
79
  requirements:
79
80
  - - ">="
@@ -82,12 +83,12 @@ dependencies:
82
83
  segments:
83
84
  - 0
84
85
  version: "0"
85
- requirement: *id004
86
- name: assert
87
86
  type: :development
87
+ version_requirements: *id004
88
88
  - !ruby/object:Gem::Dependency
89
+ name: assert-mocha
89
90
  prerelease: false
90
- version_requirements: &id005 !ruby/object:Gem::Requirement
91
+ requirement: &id005 !ruby/object:Gem::Requirement
91
92
  none: false
92
93
  requirements:
93
94
  - - ">="
@@ -96,12 +97,12 @@ dependencies:
96
97
  segments:
97
98
  - 0
98
99
  version: "0"
99
- requirement: *id005
100
- name: assert-mocha
101
100
  type: :development
101
+ version_requirements: *id005
102
102
  - !ruby/object:Gem::Dependency
103
+ name: assert-rack-test
103
104
  prerelease: false
104
- version_requirements: &id006 !ruby/object:Gem::Requirement
105
+ requirement: &id006 !ruby/object:Gem::Requirement
105
106
  none: false
106
107
  requirements:
107
108
  - - ">="
@@ -110,9 +111,8 @@ dependencies:
110
111
  segments:
111
112
  - 0
112
113
  version: "0"
113
- requirement: *id006
114
- name: assert-rack-test
115
114
  type: :development
115
+ version_requirements: *id006
116
116
  description: Handler-based web framework powered by Sinatra
117
117
  email:
118
118
  - kelly@kellyredding.com
@@ -132,6 +132,7 @@ files:
132
132
  - deas.gemspec
133
133
  - lib/deas.rb
134
134
  - lib/deas/error_handler.rb
135
+ - lib/deas/exceptions.rb
135
136
  - lib/deas/logging.rb
136
137
  - lib/deas/rack_request_fix.rb
137
138
  - lib/deas/redirect_handler.rb
@@ -158,10 +159,12 @@ files:
158
159
  - test/support/views/with_layout.erb
159
160
  - test/system/rack_tests.rb
160
161
  - test/unit/error_handler_tests.rb
162
+ - test/unit/exceptions_tests.rb
161
163
  - test/unit/logging_tests.rb
162
164
  - test/unit/redirect_handler_tests.rb
163
165
  - test/unit/route_tests.rb
164
166
  - test/unit/runner_tests.rb
167
+ - test/unit/server_configuration_tests.rb
165
168
  - test/unit/server_tests.rb
166
169
  - test/unit/sinatra_app_tests.rb
167
170
  - test/unit/sinatra_runner_tests.rb
@@ -197,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
200
  requirements: []
198
201
 
199
202
  rubyforge_project:
200
- rubygems_version: 1.8.15
203
+ rubygems_version: 1.8.24
201
204
  signing_key:
202
205
  specification_version: 3
203
206
  summary: Handler-based web framework powered by Sinatra
@@ -214,10 +217,12 @@ test_files:
214
217
  - test/support/views/with_layout.erb
215
218
  - test/system/rack_tests.rb
216
219
  - test/unit/error_handler_tests.rb
220
+ - test/unit/exceptions_tests.rb
217
221
  - test/unit/logging_tests.rb
218
222
  - test/unit/redirect_handler_tests.rb
219
223
  - test/unit/route_tests.rb
220
224
  - test/unit/runner_tests.rb
225
+ - test/unit/server_configuration_tests.rb
221
226
  - test/unit/server_tests.rb
222
227
  - test/unit/sinatra_app_tests.rb
223
228
  - test/unit/sinatra_runner_tests.rb