deas 0.40.0 → 0.41.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc1b0541f8352e417fcaea600dfc199984f4ee5f
4
- data.tar.gz: 55e89c13f41a75441fb281025d62deb3fa114080
3
+ metadata.gz: 5e46a609344a9bab5fd5dd0aa922a7109258c2fb
4
+ data.tar.gz: 6b809e7cc1cc9c9fbfdf17115f88f00e06adbe0a
5
5
  SHA512:
6
- metadata.gz: 066f4eac74ffd2e34af998f5622291a9d3db400381e3e3b1bbb68fd819ca00880d208460462f2b340980659b1518da9a575d4b58d67a8750b099688c6b5d7187
7
- data.tar.gz: c4bf700bfe1196493333e38cf2bf437841d4f86258bd6e713159c5c9838db19c5d3526ab04f18619d5fd30c6e513b8369589c91e0a368ca081ba747c41d1de57
6
+ metadata.gz: 6a4dd5daee23f0ebd8ae06588a15330ffa0fb57ca59fcf8027c7db0b3c3d7f0aba97251ceb6b098c954cb47a56c8c0aaa72b19f612c4ebb6108dac31b4dc6585
7
+ data.tar.gz: 53ab6f0f9d22a00248a4c3e195d3e553856d3e4cdd3e44f47d04c8d4c3343b3732761640b7e870f1d9d2d01004b61631e0999d3df02defbdbcf3908ef17e24ec
data/README.md CHANGED
@@ -9,10 +9,12 @@ Handler-based web framework powered by Sinatra.
9
9
 
10
10
  require 'deas'
11
11
 
12
- class MyApp
12
+ class MyServer
13
13
  include Deas::Server
14
14
 
15
- get '/', 'HelloWorldHandler'
15
+ router do
16
+ get '/', 'HelloWorldHandler'
17
+ end
16
18
 
17
19
  end
18
20
 
@@ -25,8 +27,8 @@ class HellowWorldHandler
25
27
 
26
28
  end
27
29
 
28
- app = MyApp.new
29
- run app
30
+ server = MyServer.new
31
+ run server
30
32
  ```
31
33
 
32
34
  ## Installation
data/deas.gemspec CHANGED
@@ -18,11 +18,10 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.add_development_dependency("assert", ["~> 2.15.1"])
22
- gem.add_development_dependency("assert-rack-test", ["~> 1.0.3"])
21
+ gem.add_development_dependency("assert", ["~> 2.16.1"])
22
+ gem.add_development_dependency("assert-rack-test", ["~> 1.0.4"])
23
23
 
24
- gem.add_dependency("much-plugin", ["~> 0.1.0"])
25
- gem.add_dependency("ns-options", ["~> 1.1.6"])
24
+ gem.add_dependency("much-plugin", ["~> 0.2.0"])
26
25
  gem.add_dependency("rack", ["~> 1.1"])
27
26
  gem.add_dependency("sinatra", ["~> 1.2"])
28
27
 
data/lib/deas.rb CHANGED
@@ -1,6 +1,4 @@
1
- require 'ns-options'
2
1
  require 'pathname'
3
-
4
2
  require 'deas/version'
5
3
  require 'deas/exceptions'
6
4
  require 'deas/server'
@@ -9,4 +7,5 @@ require 'deas/view_handler'
9
7
  # TODO - remove with future version of Rack (> v1.5.2)
10
8
  require 'deas/rack_request_fix'
11
9
 
12
- module Deas; end
10
+ module Deas
11
+ end
data/lib/deas/router.rb CHANGED
@@ -6,7 +6,7 @@ module Deas
6
6
 
7
7
  class Router
8
8
 
9
- DEFAULT_REQUEST_TYPE_NAME = 'default'
9
+ DEFAULT_REQUEST_TYPE_NAME = 'default'.freeze
10
10
 
11
11
  attr_reader :request_types, :urls, :routes, :definitions
12
12
  attr_reader :escape_query_value_proc
@@ -53,7 +53,13 @@ module Deas
53
53
  def url_for(name, *args)
54
54
  url = self.urls[name.to_sym]
55
55
  raise ArgumentError, "no route named `#{name.to_sym.inspect}`" unless url
56
- prepend_base_url(url.path_for(*args))
56
+ begin
57
+ prepend_base_url(url.path_for(*args))
58
+ rescue Deas::Url::NonHashParamsError => err
59
+ raise ArgumentError, "url param values must be passed as a Hash"
60
+ rescue Deas::Url::EmptyNamedValueError => err
61
+ raise ArgumentError, err.message
62
+ end
57
63
  end
58
64
 
59
65
  def default_request_type_name(value = nil)
data/lib/deas/runner.rb CHANGED
@@ -52,11 +52,8 @@ module Deas
52
52
 
53
53
  def body(value = nil)
54
54
  if !value.nil?
55
- unless value.respond_to?(:each)
56
- raise ArgumentError, "this body value (class `#{value.class}`), does not "\
57
- "respond to `each`."
58
- end
59
- @body = value
55
+ # String#each is a thing in 1.8.7, so account for it here
56
+ @body = !value.respond_to?(:each) || value.kind_of?(String) ? [*value] : value
60
57
  end
61
58
  @body
62
59
  end
@@ -68,7 +65,7 @@ module Deas
68
65
  def halt(*args)
69
66
  self.status(args.shift) if args.first.instance_of?(::Fixnum)
70
67
  self.headers(args.shift) if args.first.kind_of?(::Hash)
71
- self.body(args.shift) if args.first.respond_to?(:each)
68
+ self.body(args.shift)
72
69
  throw :halt
73
70
  end
74
71
 
data/lib/deas/server.rb CHANGED
@@ -1,7 +1,4 @@
1
1
  require 'much-plugin'
2
- require 'ns-options'
3
- require 'ns-options/boolean'
4
- require 'pathname'
5
2
  require 'deas/exceptions'
6
3
  require 'deas/logger'
7
4
  require 'deas/logging'
@@ -34,169 +31,197 @@ module Deas
34
31
  # TODO: needed while Deas is powered by Sinatra
35
32
  # eventually do an initialize method more like Sanford does
36
33
  def new
37
- Deas::SinatraApp.new(self.configuration)
34
+ Deas::SinatraApp.new(self.config)
38
35
  end
39
36
 
40
- def configuration
41
- @configuration ||= Configuration.new
37
+ def config
38
+ @config ||= Config.new
42
39
  end
43
40
 
44
- # sinatra settings DSL
45
-
46
- def env(*args)
47
- self.configuration.env *args
48
- end
49
-
50
- def root(*args)
51
- self.configuration.root *args
41
+ def env(value = nil)
42
+ self.config.env = value if !value.nil?
43
+ self.config.env
52
44
  end
53
45
 
54
- def public_root(*args)
55
- self.configuration.public_root *args
46
+ def root(value = nil)
47
+ self.config.root = value if !value.nil?
48
+ self.config.root
56
49
  end
57
50
 
58
- def views_root(*args)
59
- self.configuration.views_root *args
51
+ def views_path(value = nil)
52
+ self.config.views_path = value if !value.nil?
53
+ self.config.views_path
60
54
  end
61
55
 
62
- def dump_errors(*args)
63
- self.configuration.dump_errors *args
56
+ def views_root
57
+ self.config.views_root
64
58
  end
65
59
 
66
- def method_override(*args)
67
- self.configuration.method_override *args
60
+ def public_path(value = nil)
61
+ self.config.public_path = value if !value.nil?
62
+ self.config.public_path
68
63
  end
69
64
 
70
- def sessions(*args)
71
- self.configuration.sessions *args
65
+ def public_root
66
+ self.config.public_root
72
67
  end
73
68
 
74
- def show_exceptions(*args)
75
- self.configuration.show_exceptions *args
69
+ def default_encoding(value = nil)
70
+ self.config.default_encoding = value if !value.nil?
71
+ self.config.default_encoding
76
72
  end
77
73
 
78
- def static_files(*args)
79
- self.configuration.static_files *args
74
+ def set(name, value)
75
+ self.config.settings[name.to_sym] = value
80
76
  end
81
77
 
82
- def reload_templates(*args)
83
- self.configuration.reload_templates *args
78
+ def settings
79
+ self.config.settings
84
80
  end
85
81
 
86
- # Server handling DSL
87
-
88
- def init(&block)
89
- self.configuration.init_procs << block
82
+ def template_helpers(*helper_modules)
83
+ helper_modules.each{ |m| self.config.template_helpers << m }
84
+ self.config.template_helpers
90
85
  end
91
86
 
92
- def error(&block)
93
- self.configuration.error_procs << block
87
+ def template_helper?(helper_module)
88
+ self.config.template_helpers.include?(helper_module)
94
89
  end
95
90
 
96
- def template_helpers(*helper_modules)
97
- helper_modules.each{ |m| self.configuration.template_helpers << m }
98
- self.configuration.template_helpers
91
+ def use(*args)
92
+ self.config.middlewares << args
99
93
  end
100
94
 
101
- def template_helper?(helper_module)
102
- self.configuration.template_helpers.include?(helper_module)
95
+ def middlewares
96
+ self.config.middlewares
103
97
  end
104
98
 
105
- def use(*args)
106
- self.configuration.middlewares << args
99
+ def init(&block)
100
+ self.config.init_procs << block
107
101
  end
108
102
 
109
- def set(name, value)
110
- self.configuration.settings[name.to_sym] = value
103
+ def init_procs
104
+ self.config.init_procs
111
105
  end
112
106
 
113
- def verbose_logging(*args)
114
- self.configuration.verbose_logging *args
107
+ def error(&block)
108
+ self.config.error_procs << block
115
109
  end
116
110
 
117
- def logger(*args)
118
- self.configuration.logger *args
111
+ def error_procs
112
+ self.config.error_procs
119
113
  end
120
114
 
121
- def default_encoding(*args)
122
- self.configuration.default_encoding *args
115
+ def template_source(value = nil)
116
+ self.config.template_source = value if !value.nil?
117
+ self.config.template_source
123
118
  end
124
119
 
125
- def template_source(*args)
126
- self.configuration.template_source *args
120
+ def logger(value = nil)
121
+ self.config.logger = value if !value.nil?
122
+ self.config.logger
127
123
  end
128
124
 
129
125
  # router handling
130
126
 
131
- def router(value = nil)
132
- self.configuration.router = value if !value.nil?
133
- self.configuration.router
127
+ def router(value = nil, &block)
128
+ self.config.router = value if !value.nil?
129
+ self.config.router.instance_eval(&block) if block
130
+ self.config.router
134
131
  end
135
132
 
136
- def view_handler_ns(*args); self.router.view_handler_ns(*args); end
137
- def base_url(*args); self.router.base_url(*args); end
138
-
139
- def url(*args, &block); self.router.url(*args, &block); end
140
133
  def url_for(*args, &block); self.router.url_for(*args, &block); end
141
134
 
142
- def default_request_type_name(*args); self.router.default_request_type_name(*args); end
143
- def add_request_type(*args, &block); self.router.add_request_type(*args, &block); end
144
- def request_type_name(*args); self.router.request_type_name(*args); end
135
+ # flags
145
136
 
146
- def get(*args, &block); self.router.get(*args, &block); end
147
- def post(*args, &block); self.router.post(*args, &block); end
148
- def put(*args, &block); self.router.put(*args, &block); end
149
- def patch(*args, &block); self.router.patch(*args, &block); end
150
- def delete(*args, &block); self.router.delete(*args, &block); end
137
+ def dump_errors(value = nil)
138
+ self.config.dump_errors = value if !value.nil?
139
+ self.config.dump_errors
140
+ end
151
141
 
152
- def route(*args, &block); self.router.route(*args, &block); end
153
- def redirect(*args, &block); self.router.redirect(*args, &block); end
142
+ def method_override(value = nil)
143
+ self.config.method_override = value if !value.nil?
144
+ self.config.method_override
145
+ end
154
146
 
155
- end
147
+ def reload_templates(value = nil)
148
+ self.config.reload_templates = value if !value.nil?
149
+ self.config.reload_templates
150
+ end
156
151
 
157
- class Configuration
158
- include NsOptions::Proxy
152
+ def sessions(value = nil)
153
+ self.config.sessions = value if !value.nil?
154
+ self.config.sessions
155
+ end
159
156
 
160
- # Sinatra-based options
157
+ def show_exceptions(value = nil)
158
+ self.config.show_exceptions = value if !value.nil?
159
+ self.config.show_exceptions
160
+ end
161
161
 
162
- option :env, String, :default => 'development'
162
+ def static_files(value = nil)
163
+ self.config.static_files = value if !value.nil?
164
+ self.config.static_files
165
+ end
163
166
 
164
- option :root, Pathname, :required => true
165
- option :public_root, Pathname
166
- option :views_root, Pathname
167
+ def verbose_logging(value = nil)
168
+ self.config.verbose_logging = value if !value.nil?
169
+ self.config.verbose_logging
170
+ end
167
171
 
168
- option :dump_errors, NsOptions::Boolean, :default => false
169
- option :method_override, NsOptions::Boolean, :default => true
170
- option :sessions, NsOptions::Boolean, :default => false
171
- option :show_exceptions, NsOptions::Boolean, :default => false
172
- option :static_files, NsOptions::Boolean, :default => true
173
- option :reload_templates, NsOptions::Boolean, :default => false
174
- option :default_encoding, String, :default => 'utf-8'
172
+ end
175
173
 
176
- # server handling options
174
+ class Config
175
+
176
+ DEFAULT_ENV = 'development'.freeze
177
+ DEFAULT_VIEWS_PATH = 'views'.freeze
178
+ DEFAULT_PUBLIC_PATH = 'public'.freeze
179
+ DEFAULT_ENCODING = 'utf-8'.freeze
180
+
181
+ attr_accessor :env, :root, :views_path, :public_path, :default_encoding
182
+ attr_accessor :settings, :template_helpers, :middlewares
183
+ attr_accessor :init_procs, :error_procs, :template_source, :logger, :router
184
+
185
+ attr_accessor :dump_errors, :method_override, :reload_templates
186
+ attr_accessor :sessions, :show_exceptions, :static_files
187
+ attr_accessor :verbose_logging
188
+
189
+ def initialize
190
+ @env = DEFAULT_ENV
191
+ @root = ENV['PWD']
192
+ @views_path = DEFAULT_VIEWS_PATH
193
+ @public_path = DEFAULT_PUBLIC_PATH
194
+ @default_encoding = DEFAULT_ENCODING
195
+ @settings = {}
196
+ @template_helpers = []
197
+ @middlewares = []
198
+ @init_procs = []
199
+ @error_procs = []
200
+ @template_source = nil
201
+ @logger = Deas::NullLogger.new
202
+ @router = Deas::Router.new
203
+
204
+ @dump_errors = false
205
+ @method_override = true
206
+ @reload_templates = false
207
+ @sessions = false
208
+ @show_exceptions = false
209
+ @static_files = true
210
+ @verbose_logging = true
211
+
212
+ @valid = nil
213
+ end
177
214
 
178
- option :verbose_logging, NsOptions::Boolean, :default => true
179
- option :logger
180
- option :template_source
215
+ def views_root
216
+ File.expand_path(@views_path.to_s, @root.to_s)
217
+ end
181
218
 
182
- attr_accessor :settings, :init_procs, :error_procs, :template_helpers
183
- attr_accessor :middlewares, :router
219
+ def public_root
220
+ File.expand_path(@public_path.to_s, @root.to_s)
221
+ end
184
222
 
185
- def initialize(values = nil)
186
- # these are defaulted here because we want to use the Configuration
187
- # instance `root`. If we define a proc above, we will be using the
188
- # Configuration class `root`, which will not update these options as
189
- # expected.
190
- super((values || {}).merge({
191
- :public_root => proc{ self.root.join('public') },
192
- :views_root => proc{ self.root.join('views') },
193
- :logger => proc{ Deas::NullLogger.new },
194
- :template_source => proc{ Deas::NullTemplateSource.new(self.root) }
195
- }))
196
- @settings = {}
197
- @init_procs, @error_procs, @template_helpers, @middlewares = [], [], [], []
198
- @router = Deas::Router.new
199
- @valid = nil
223
+ def template_source
224
+ @template_source ||= Deas::NullTemplateSource.new(self.root)
200
225
  end
201
226
 
202
227
  def urls
@@ -207,25 +232,18 @@ module Deas
207
232
  self.router.routes
208
233
  end
209
234
 
210
- def to_hash
211
- super.merge({
212
- :error_procs => self.error_procs,
213
- :router => self.router
214
- })
215
- end
216
-
217
235
  def valid?
218
236
  !!@valid
219
237
  end
220
238
 
221
- # for the config to be considered "valid", a few things need to happen. The
222
- # key here is that this only needs to be done _once_ for each config.
239
+ # for the config to be considered "valid", a few things need to happen.
240
+ # The key here is that this only needs to be done _once_ for each config.
223
241
 
224
242
  def validate!
225
243
  return @valid if !@valid.nil? # only need to run this once per config
226
244
 
227
245
  # ensure all user and plugin configs/settings are applied
228
- self.init_procs.each{ |p| p.call }
246
+ self.init_procs.each(&:call)
229
247
  raise Deas::ServerRootError if self.root.nil?
230
248
 
231
249
  # validate the router
@@ -235,11 +253,10 @@ module Deas
235
253
  # that the logging and exception showing happens just before the app gets
236
254
  # the request and just after the app sends a response.
237
255
  self.middlewares << [Deas::ShowExceptions] if self.show_exceptions
238
- [*Deas::Logging.middleware(self.verbose_logging)].tap do |mw_args|
239
- self.middlewares << mw_args
240
- end
256
+ logging_mw_args = [*Deas::Logging.middleware(self.verbose_logging)]
257
+ self.middlewares << logging_mw_args
241
258
 
242
- @valid = true # if it made it this far, its valid!
259
+ @valid = true # if it made it this far, its valid!
243
260
  end
244
261
 
245
262
  end