strelka 0.0.1.pre129 → 0.0.1.pre148

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/IDEAS.rdoc +26 -32
  2. data/Manifest.txt +27 -12
  3. data/README.rdoc +29 -33
  4. data/Rakefile +2 -1
  5. data/bin/leash +2 -1
  6. data/contrib/hoetemplate/README.rdoc.erb +18 -0
  7. data/contrib/hoetemplate/data/{file_name → project}/apps/file_name_app +0 -0
  8. data/contrib/hoetemplate/data/{file_name → project}/templates/layout.tmpl.erb +0 -0
  9. data/contrib/hoetemplate/data/{file_name → project}/templates/top.tmpl.erb +0 -0
  10. data/examples/config.yml +3 -0
  11. data/examples/gen-config.rb +48 -0
  12. data/examples/sessions-demo.rb +43 -0
  13. data/lib/strelka/app/errors.rb +59 -17
  14. data/lib/strelka/app/filters.rb +3 -1
  15. data/lib/strelka/app/negotiation.rb +5 -3
  16. data/lib/strelka/app/parameters.rb +33 -31
  17. data/lib/strelka/app/plugins.rb +14 -8
  18. data/lib/strelka/app/restresources.rb +3 -1
  19. data/lib/strelka/app/routing.rb +9 -7
  20. data/lib/strelka/app/sessions.rb +175 -0
  21. data/lib/strelka/app/templating.rb +6 -3
  22. data/lib/strelka/app.rb +19 -11
  23. data/lib/strelka/behavior/plugin.rb +4 -2
  24. data/lib/strelka/constants.rb +9 -0
  25. data/lib/strelka/cookie.rb +357 -0
  26. data/lib/strelka/cookieset.rb +117 -0
  27. data/lib/strelka/httprequest/acceptparams.rb +12 -10
  28. data/lib/strelka/httprequest/negotiation.rb +4 -2
  29. data/lib/strelka/httprequest/session.rb +71 -0
  30. data/lib/strelka/httprequest.rb +19 -7
  31. data/lib/strelka/httpresponse/negotiation.rb +17 -15
  32. data/lib/strelka/httpresponse/session.rb +101 -0
  33. data/lib/strelka/httpresponse.rb +26 -4
  34. data/lib/strelka/logging.rb +3 -1
  35. data/lib/strelka/mixins.rb +174 -2
  36. data/lib/strelka/{app/paramvalidator.rb → paramvalidator.rb} +25 -22
  37. data/lib/strelka/{app/defaultrouter.rb → router/default.rb} +6 -4
  38. data/lib/strelka/{app/exclusiverouter.rb → router/exclusive.rb} +6 -4
  39. data/lib/strelka/{app/router.rb → router.rb} +9 -7
  40. data/lib/strelka/session/default.rb +209 -0
  41. data/lib/strelka/session.rb +178 -0
  42. data/lib/strelka.rb +6 -4
  43. data/spec/lib/constants.rb +3 -1
  44. data/spec/lib/helpers.rb +7 -0
  45. data/spec/strelka/app/errors_spec.rb +32 -52
  46. data/spec/strelka/app/filters_spec.rb +3 -1
  47. data/spec/strelka/app/negotiation_spec.rb +3 -1
  48. data/spec/strelka/app/parameters_spec.rb +5 -3
  49. data/spec/strelka/app/plugins_spec.rb +5 -3
  50. data/spec/strelka/app/restresources_spec.rb +3 -1
  51. data/spec/strelka/app/routing_spec.rb +6 -4
  52. data/spec/strelka/app/sessions_spec.rb +109 -0
  53. data/spec/strelka/app/templating_spec.rb +3 -1
  54. data/spec/strelka/app_spec.rb +11 -2
  55. data/spec/strelka/cookie_spec.rb +194 -0
  56. data/spec/strelka/cookieset_spec.rb +159 -0
  57. data/spec/strelka/exceptions_spec.rb +3 -1
  58. data/spec/strelka/httprequest/acceptparams_spec.rb +3 -1
  59. data/spec/strelka/httprequest/negotiation_spec.rb +3 -1
  60. data/spec/strelka/httprequest/session_spec.rb +43 -0
  61. data/spec/strelka/httprequest_spec.rb +28 -1
  62. data/spec/strelka/httpresponse/negotiation_spec.rb +3 -3
  63. data/spec/strelka/httpresponse_spec.rb +13 -0
  64. data/spec/strelka/logging_spec.rb +3 -1
  65. data/spec/strelka/mixins_spec.rb +125 -1
  66. data/spec/strelka/{app/paramvalidator_spec.rb → paramvalidator_spec.rb} +4 -4
  67. data/spec/strelka/{app/defaultrouter_spec.rb → router/default_spec.rb} +6 -4
  68. data/spec/strelka/{app/exclusiverouter_spec.rb → router/exclusive_spec.rb} +6 -4
  69. data/spec/strelka/{app/router_spec.rb → router_spec.rb} +9 -7
  70. data/spec/strelka/session/default_spec.rb +210 -0
  71. data/spec/strelka/session_spec.rb +101 -0
  72. data.tar.gz.sig +1 -1
  73. metadata +64 -47
  74. metadata.gz.sig +0 -0
  75. data/contrib/hoetemplate/.autotest.erb +0 -23
data/IDEAS.rdoc CHANGED
@@ -8,55 +8,49 @@ up-to-date if it does.
8
8
 
9
9
  == Leash
10
10
 
11
- Setting up a new server from scratch:
11
+ Show a list of installed applications:
12
12
 
13
- $ leash setup
13
+ $ leash discover
14
+ Searching for Strelka applications...
15
+
16
+ strelka:
17
+ hello-world
18
+
19
+ strelka-admin:
20
+ config-service strelka-admin strelka-setup
21
+
22
+ strelka-cms:
23
+ content-manager
14
24
 
15
- Adding an admin server to an existing server config:
25
+ Set up an application's runtime directory and add a route for it to an existing
26
+ mongrel2 config database:
16
27
 
17
- $ leash setup existing.sqlite
28
+ $ mkdir /service/cms
29
+ $ cd /service/cms
30
+ $ leash -c /usr/local/etc/mongrel2.sqlite setup strelka-cms content-manager
18
31
 
19
- Start all the configured apps for every server in the default config:
32
+ The application can register pre- and post-install hooks that run migrations,
33
+ prompt for config values, etc.
20
34
 
21
- $ leash start
35
+ Then, to start the app:
22
36
 
23
- The admin app will then let you examine and edit the configuration for your
24
- existing mongrel2 server, just as you would with a new server.
37
+ $ cd /service/cms
38
+ $ leash --sudo start
25
39
 
26
-
27
- === Join a Mongrel2 Cluster
28
-
29
- Once you have the first node set up, you need only point 'leash' to the admin
30
- server running on the first host to set up and automatically configure
31
- additional Mongrel2 front-ends:
32
-
33
- server2$ leash join server1
34
-
35
- This uses a 0MQ service running from the admin server that publishes the
36
- config using Mongrel2's "config from anything" protocol, so when Mongrel2
37
- itself supports the 'zmq.so' plugin, you won't even need a local SQLite
38
- database.
40
+ This stuff will probably use Isolate[https://github.com/jbarnette/isolate] for
41
+ gem sandboxing.
39
42
 
40
43
 
41
44
  == Strelka Applications
42
45
 
43
- * Apps have an appid constant (the mongrel2 UUID)
44
- * Apps are distributed in gems
45
- * A larger app can be split across multiple applets within a gem
46
- - The gem can suggest a set of routes
47
- - The Strelka admin interface can display the gem with its suggested routes
48
46
  * The framework provides convenience methods for looking up the route to
49
47
  another app via its appid.
50
48
 
51
- For example, a CMS called "Snipper" might come in a gem called 'snipper'
49
+
52
50
 
53
51
  === Future Plugins
54
52
 
55
53
  * CORS (cors) — manage {Cross-Origin Resource Sharing}[http://www.html5rocks.com/en/tutorials/cors/]
56
54
  headers
57
-
58
-
59
-
60
-
61
- == Deployment
55
+ * caching -- utilities for easy HTTP caching
62
56
 
data/Manifest.txt CHANGED
@@ -5,65 +5,80 @@ Manifest.txt
5
5
  README.rdoc
6
6
  Rakefile
7
7
  bin/leash
8
- contrib/hoetemplate/.autotest.erb
9
8
  contrib/hoetemplate/History.rdoc.erb
10
9
  contrib/hoetemplate/Manifest.txt.erb
11
10
  contrib/hoetemplate/README.rdoc.erb
12
11
  contrib/hoetemplate/Rakefile.erb
13
- contrib/hoetemplate/data/file_name/apps/file_name_app
14
- contrib/hoetemplate/data/file_name/templates/layout.tmpl.erb
15
- contrib/hoetemplate/data/file_name/templates/top.tmpl.erb
12
+ contrib/hoetemplate/data/project/apps/file_name_app
13
+ contrib/hoetemplate/data/project/templates/layout.tmpl.erb
14
+ contrib/hoetemplate/data/project/templates/top.tmpl.erb
16
15
  contrib/hoetemplate/lib/file_name.rb.erb
17
16
  contrib/hoetemplate/spec/file_name_spec.rb.erb
18
17
  data/strelka/apps/hello-world
18
+ examples/config.yml
19
+ examples/gen-config.rb
20
+ examples/sessions-demo.rb
19
21
  lib/strelka.rb
20
22
  lib/strelka/app.rb
21
- lib/strelka/app/defaultrouter.rb
22
23
  lib/strelka/app/errors.rb
23
- lib/strelka/app/exclusiverouter.rb
24
24
  lib/strelka/app/filters.rb
25
25
  lib/strelka/app/negotiation.rb
26
26
  lib/strelka/app/parameters.rb
27
- lib/strelka/app/paramvalidator.rb
28
27
  lib/strelka/app/plugins.rb
29
28
  lib/strelka/app/restresources.rb
30
- lib/strelka/app/router.rb
31
29
  lib/strelka/app/routing.rb
30
+ lib/strelka/app/sessions.rb
32
31
  lib/strelka/app/templating.rb
33
32
  lib/strelka/behavior/plugin.rb
34
33
  lib/strelka/constants.rb
34
+ lib/strelka/cookie.rb
35
+ lib/strelka/cookieset.rb
35
36
  lib/strelka/exceptions.rb
36
37
  lib/strelka/httprequest.rb
37
38
  lib/strelka/httprequest/acceptparams.rb
38
39
  lib/strelka/httprequest/negotiation.rb
40
+ lib/strelka/httprequest/session.rb
39
41
  lib/strelka/httpresponse.rb
40
42
  lib/strelka/httpresponse/negotiation.rb
43
+ lib/strelka/httpresponse/session.rb
41
44
  lib/strelka/logging.rb
42
45
  lib/strelka/mixins.rb
46
+ lib/strelka/paramvalidator.rb
47
+ lib/strelka/router.rb
48
+ lib/strelka/router/default.rb
49
+ lib/strelka/router/exclusive.rb
50
+ lib/strelka/session.rb
51
+ lib/strelka/session/default.rb
43
52
  spec/data/error.tmpl
44
53
  spec/data/layout.tmpl
45
54
  spec/data/main.tmpl
46
55
  spec/lib/constants.rb
47
56
  spec/lib/helpers.rb
48
- spec/strelka/app/defaultrouter_spec.rb
49
57
  spec/strelka/app/errors_spec.rb
50
- spec/strelka/app/exclusiverouter_spec.rb
51
58
  spec/strelka/app/filters_spec.rb
52
59
  spec/strelka/app/negotiation_spec.rb
53
60
  spec/strelka/app/parameters_spec.rb
54
- spec/strelka/app/paramvalidator_spec.rb
55
61
  spec/strelka/app/plugins_spec.rb
56
62
  spec/strelka/app/restresources_spec.rb
57
- spec/strelka/app/router_spec.rb
58
63
  spec/strelka/app/routing_spec.rb
64
+ spec/strelka/app/sessions_spec.rb
59
65
  spec/strelka/app/templating_spec.rb
60
66
  spec/strelka/app_spec.rb
67
+ spec/strelka/cookie_spec.rb
68
+ spec/strelka/cookieset_spec.rb
61
69
  spec/strelka/exceptions_spec.rb
62
70
  spec/strelka/httprequest/acceptparams_spec.rb
63
71
  spec/strelka/httprequest/negotiation_spec.rb
72
+ spec/strelka/httprequest/session_spec.rb
64
73
  spec/strelka/httprequest_spec.rb
65
74
  spec/strelka/httpresponse/negotiation_spec.rb
66
75
  spec/strelka/httpresponse_spec.rb
67
76
  spec/strelka/logging_spec.rb
68
77
  spec/strelka/mixins_spec.rb
78
+ spec/strelka/paramvalidator_spec.rb
79
+ spec/strelka/router/default_spec.rb
80
+ spec/strelka/router/exclusive_spec.rb
81
+ spec/strelka/router_spec.rb
82
+ spec/strelka/session/default_spec.rb
83
+ spec/strelka/session_spec.rb
69
84
  spec/strelka_spec.rb
data/README.rdoc CHANGED
@@ -30,39 +30,6 @@ application gems that are installed, setting up an application's
30
30
  runtime directory, and starting a Strelka application.
31
31
 
32
32
 
33
- === Leash
34
-
35
- Strelka comes with a command-line tool called 'leash' that you can use to
36
- make setting up and starting a Strelka application backend a little bit easier.
37
-
38
- To see a list of the available Strelka applications, run
39
- <tt>leash discover</tt>:
40
-
41
- $ leash discover
42
- Searching for Strelka applications...
43
- Found:
44
-
45
- hello-world
46
-
47
- $ gem install strelka-admin
48
- Successfully installed strelka-admin-1.1.0
49
- 1 gem installed
50
-
51
- $ leash discover
52
- Searching for Strelka applications...
53
- Found:
54
-
55
- hello-world strelka-admin config-service
56
-
57
-
58
- To set up a new application runtime directory, run <tt>leash setup</tt>
59
- with the path to the directory and the name of the application:
60
-
61
- $ leash setup /usr/local/myapp hello-world
62
- Creating directory...
63
- Creating barebones config...
64
-
65
-
66
33
  === The Application Framework
67
34
 
68
35
  The application framework is primarily geared towards developing web (HTTP)
@@ -139,6 +106,35 @@ easily.
139
106
  Automatically set up RESTful service resources for Sequel::Model-derived
140
107
  classes.
141
108
 
109
+
110
+ == Roadmap
111
+
112
+ Going forward, we're going to be extracting useful stuff out of our own
113
+ applications as plugins, and finishing up the packaging and deployment
114
+ stories once we've ironed out the details in own environment.
115
+
116
+ Here's a tentative list of what kinds of stuff we have planned:
117
+
118
+ === More Plugins
119
+
120
+ * CORS -- manage {Cross-Origin Resource Sharing}[http://www.html5rocks.com/en/tutorials/cors/]
121
+ headers, especially for service applications
122
+ * caching -- utilities for easy HTTP caching
123
+
124
+ === Deployment/Packaging
125
+
126
+ You'll be able to package up your applications as Rubygems for easy deployment.
127
+ The Strelka::App class already supports application discovery, but we
128
+ want to hook that up to the 'leash' command line tool so you can install
129
+ and run them with a minimum of manual monkeying around with directories,
130
+ migrations, etc.
131
+
132
+ === New Application Styles
133
+
134
+ Create some new handler classes for different application styles, similar to those
135
+ in the Tir[http://tir.mongrel2.org/] framework.
136
+
137
+
142
138
  == Contributing
143
139
 
144
140
  You can check out the current development source with Mercurial via its
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ hoespec = Hoe.spec 'strelka' do
21
21
 
22
22
  self.developer 'Michael Granger', 'ged@FaerieMUD.org'
23
23
 
24
- self.dependency 'mongrel2', '~> 0.15'
24
+ self.dependency 'mongrel2', '~> 0.16'
25
25
  self.dependency 'configurability', '~> 1.0'
26
26
  self.dependency 'inversion', '~> 0.2'
27
27
  self.dependency 'trollop', '~> 1.16'
@@ -34,6 +34,7 @@ hoespec = Hoe.spec 'strelka' do
34
34
  self.dependency 'rspec', '~> 2.6', :developer
35
35
 
36
36
  self.spec_extras[:licenses] = ["BSD"]
37
+ self.spec_extras[:rdoc_options] = ['-f', 'fivefish', '-t', 'Strelka Web Application Toolkit']
37
38
  self.require_ruby_version( '>=1.9.2' )
38
39
  self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
39
40
  self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
data/bin/leash CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # vim: set nosta noet ts=4 sw=4:
2
3
 
3
4
  require 'strelka'
4
5
  require 'trollop'
@@ -244,7 +245,7 @@ class Strelka::LeashCommand
244
245
  message "None found."
245
246
  else
246
247
  paths.each do |gemname, paths|
247
- message "Found:"
248
+ message "\n"
248
249
 
249
250
  subheader "#{gemname}:"
250
251
  filenames = paths.map {|path| path.basename.to_s }
@@ -14,4 +14,22 @@
14
14
 
15
15
  Copyright (c) <%= Time.now.strftime("%Y") %>, <%= XIF %>
16
16
  All rights reserved.
17
+ <%
17
18
 
19
+ # Okay, this is admittedly super-gross, but sow is pretty inflexible
20
+ # about its project templates. C'est la vie.
21
+ require 'pathname'
22
+ projectdir = Pathname( path ).dirname
23
+ olddir = projectdir + 'data/project'
24
+ datadir = projectdir + 'data' + project
25
+
26
+ # Rename the datadir to match the project name
27
+ mv olddir, datadir, :verbose => true
28
+
29
+ # ... then change all of the paths to match before sow moves
30
+ # 'em all.
31
+ paths.each do |path|
32
+ path.sub!( %r{/project/}, "/#{project}/" )
33
+ end
34
+
35
+ %>
@@ -0,0 +1,3 @@
1
+ mongrel2:
2
+ configdb: examples/mongrel2.sqlite
3
+
@@ -0,0 +1,48 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ #encoding: utf-8
4
+
5
+ # The Mongrel config used by the examples. Load it with:
6
+ #
7
+ # m2sh.rb -c examples/mongrel2.sqlite load examples/gen-config.rb
8
+ #
9
+
10
+ require 'strelka'
11
+ require 'mongrel2'
12
+ require 'mongrel2/config/dsl'
13
+
14
+ Strelka.load_config( 'examples/config.yml' )
15
+
16
+ # samples server
17
+ server 'examples' do
18
+
19
+ name 'Strelka Examples'
20
+ default_host 'localhost'
21
+
22
+ access_log '/logs/access.log'
23
+ error_log '/logs/error.log'
24
+ chroot '/var/mongrel2'
25
+ pid_file '/run/mongrel2.pid'
26
+
27
+ bind_addr '127.0.0.1'
28
+ port 8113
29
+
30
+ host 'localhost' do
31
+
32
+ route '/', directory( 'data/strelka/', 'examples.html', 'text/html' )
33
+ route '/source', directory( 'examples/', 'README.txt', 'text/plain' )
34
+
35
+ # Handlers
36
+ route '/hello', handler( 'tcp://127.0.0.1:9900', 'helloworld-handler' )
37
+ route '/sessions', handler( 'tcp://127.0.0.1:9905', 'sessions-demo' )
38
+
39
+ end
40
+
41
+ end
42
+
43
+ setting "zeromq.threads", 1
44
+
45
+ mkdir_p 'var'
46
+ mkdir_p 'run'
47
+ mkdir_p 'logs'
48
+
@@ -0,0 +1,43 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ #encoding: utf-8
4
+
5
+ require 'strelka'
6
+
7
+ class SessionsDemo < Strelka::App
8
+
9
+ # The Mongrel2 appid of this app
10
+ ID = 'sessions-demo'
11
+
12
+ plugins :sessions
13
+
14
+ ### Set up the run counter
15
+ def initialize( * )
16
+ @runcount = 0
17
+ super
18
+ end
19
+
20
+
21
+ ### Handle any HTTP request
22
+ def handle_request( req )
23
+ res = req.response
24
+ res.content_type = 'text/plain'
25
+ res.status = HTTP::OK
26
+
27
+ @runcount += 1
28
+ req.session.counter ||= 0
29
+ req.session.counter += 1
30
+
31
+ self.log.debug "Request session is: %p" % [ req.session ]
32
+ res.puts "Session [%s]: session counter: %d, run counter: %d" %
33
+ [ req.session.session_id, req.session.counter, @runcount ]
34
+
35
+ return res
36
+ end
37
+
38
+
39
+ end # class SessionsDemo
40
+
41
+
42
+ Strelka.load_config( 'examples/config.yml' )
43
+ SessionsDemo.run
@@ -1,4 +1,6 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
2
4
 
3
5
  require 'strelka' unless defined?( Strelka )
4
6
  require 'strelka/app' unless defined?( Strelka::App )
@@ -13,23 +15,26 @@ require 'strelka/app' unless defined?( Strelka::App )
13
15
  # class MyApp < Strelka::App
14
16
  # plugins :errors
15
17
  #
16
- # on_status HTTP::NOT_FOUND do |res|
18
+ # # Send an email when an app is going to return a 500 error
19
+ # on_status HTTP::SERVER_ERROR do |res, status|
20
+ # require 'mail'
21
+ # Mail.deliver do
22
+ # from 'app@example.com'
23
+ # to 'team@example.com'
24
+ # subject "SERVER_ERROR: %p [%s]" %
25
+ # [ self.class, self.class.version_string ]
26
+ # body "Server error while running %p [%s]: %s" %
27
+ # [ self.class, self.conn, status.message ]
28
+ # end
17
29
  # end
18
30
  #
19
- # end # class MyApp
20
- #
21
- # With the templating plugin, you can also handle it via a custom template.
22
- #
23
- # class MyApp < Strelka::App
24
- # plugins :errors, :templating
25
- #
26
- # layout 'layout.tmpl'
27
- # templates :missing => 'errors/missing.tmpl'
28
- #
29
- # on_status HTTP::NOT_FOUND, :missing
31
+ # def handle( req )
32
+ # finish_with( HTTP::SERVER_ERROR, "Oops, that doesn't exist on this server." )
33
+ # end
30
34
  #
31
35
  # end # class MyApp
32
36
  #
37
+ # See the documentation for ClassMethods.on_status for more details.
33
38
  module Strelka::App::Errors
34
39
  extend Strelka::App::Plugin
35
40
 
@@ -39,16 +44,53 @@ module Strelka::App::Errors
39
44
 
40
45
 
41
46
  # Class-level functionality
42
- module ClassMethods # :nodoc:
47
+ module ClassMethods
43
48
 
44
49
  @status_handlers = {}
45
50
 
46
- # The registered status handler callbacks, keyed by numeric HTTP status code
51
+ # The registered status handler callbacks, keyed by Integer Ranges of
52
+ # status codes to which they apply
47
53
  attr_reader :status_handlers
48
54
 
49
55
 
50
- ### Register a callback for responses that have the specified +status_code+.
51
- ### :TODO: Document all the stuff.
56
+ ### Register a callback for responses whose status code is within the specified
57
+ ### +range+. Range can either be a single integer HTTP status code, or a Range
58
+ ### of the same (e.g., 400..499) for all statuses with that range.
59
+ ###
60
+ ### # Handle only status 400 errors
61
+ ### on_status HTTP::BAD_REQUEST do |res, status|
62
+ ### # Do something on 400 errors
63
+ ### end
64
+ ###
65
+ ### # Handle any other error in the 4xx range
66
+ ### on_status 400..499 do |res, status|
67
+ ### # Do something on 4xx errors
68
+ ### end
69
+ ###
70
+ ### If no +range+ is specified, any of the HTTP error statuses will invoke
71
+ ### the callback.
72
+ ###
73
+ ### The block will be called with the response object (a subclass of
74
+ ### Mongrel2::Response appropriate for the request type), and a hash of
75
+ ### status info that will at least contain the following keys:
76
+ ###
77
+ ### [+:status+] the HTTP status code that was passed to Strelka::App#finish_with
78
+ ### [+:message+] the message string that was passed to Strelka::App#finish_with
79
+ ###
80
+ ### If you have the <tt>:templating</tt> plugin loaded, you can substitute a
81
+ ### Symbol that corresponds with one of the declared templates instead:
82
+ #### With the templating plugin, you can also handle it via a custom template.
83
+ ###
84
+ ### class MyApp < Strelka::App
85
+ ### plugins :errors, :templating
86
+ ###
87
+ ### layout 'layout.tmpl'
88
+ ### templates :missing => 'errors/missing.tmpl'
89
+ ###
90
+ ### on_status HTTP::NOT_FOUND, :missing
91
+ ###
92
+ ### end # class MyApp
93
+ ###
52
94
  def on_status( range=DEFAULT_HANDLER_STATUS_RANGE, template=nil, &block )
53
95
  range = Range.new( range, range ) unless range.is_a?( Range )
54
96
  methodname = "for_status_%s" % [ range.begin, range.end ].uniq.join('_to_')
@@ -1,4 +1,6 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
2
4
 
3
5
  require 'strelka' unless defined?( Strelka )
4
6
  require 'strelka/app' unless defined?( Strelka::App )
@@ -1,4 +1,6 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
2
4
 
3
5
  require 'strelka' unless defined?( Strelka )
4
6
  require 'strelka/app' unless defined?( Strelka::App )
@@ -11,7 +13,7 @@ require 'strelka/httpresponse/negotiation'
11
13
  # HTTP Content negotiation for Strelka applications.
12
14
  #
13
15
  # The application can test the request for which types are accepted, set
14
- # different response blocks for different acceptable content types, provides
16
+ # different response blocks for different acceptable content types, provides
15
17
  # tranformations for entity bodies and set transformations for new content
16
18
  # types.
17
19
  #
@@ -69,7 +71,7 @@ module Strelka::App::Negotiation
69
71
  end # module ClassMethods
70
72
 
71
73
 
72
- ### Extension callback -- extend the HTTPRequest and HTTPResponse classes with Negotiation
74
+ ### Extension callback -- extend the HTTPRequest and HTTPResponse classes with Negotiation
73
75
  ### support when this plugin is loaded.
74
76
  def self::included( object )
75
77
  Strelka.log.debug "Extending Request and Response with Negotiation mixins"
@@ -1,45 +1,47 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
2
4
 
3
5
  require 'strelka' unless defined?( Strelka )
4
6
  require 'strelka/app' unless defined?( Strelka::App )
5
7
  require 'strelka/app/plugins'
6
- require 'strelka/app/paramvalidator'
8
+ require 'strelka/paramvalidator'
7
9
 
8
10
 
9
11
  # Parameter validation and untainting for Strelka apps.
10
12
  #
11
13
  # The application can declare parameters globally, and then override them on a
12
14
  # per-route basis:
13
- #
14
- # class UserManager < Strelka::App
15
- #
15
+ #
16
+ # class UserManager < Strelka::App
17
+ #
16
18
  # plugins :routing, :parameters
17
- #
18
- # param :username, /\w+/, "User login", :required
19
+ #
20
+ # param :username, /\w+/, "User login", :required
19
21
  # param :email
20
- # param :id, /\d+/, "The user's numeric ID"
22
+ # param :id, /\d+/, "The user's numeric ID"
21
23
  # param :mode, ['add', 'remove']
22
- #
23
- # # :username gets validated and merged into query args; URI parameters
24
- # # clobber query params
25
- # get '/info/:username', :params => { :id => /[XRT]\d{4}-\d{8}/ } do |req|
26
- # req.params.okay?
27
- # req.params[:username]
28
- # req.params.values_at( :id, :username )
29
- # req.params.username
30
- #
31
- # req.params.error_messages
32
- # end
33
- #
34
- # end # class UserManager
35
- #
24
+ #
25
+ # # :username gets validated and merged into query args; URI parameters
26
+ # # clobber query params
27
+ # get '/info/:username', :params => { :id => /[XRT]\d{4}-\d{8}/ } do |req|
28
+ # req.params.okay?
29
+ # req.params[:username]
30
+ # req.params.values_at( :id, :username )
31
+ # req.params.username
32
+ #
33
+ # req.params.error_messages
34
+ # end
35
+ #
36
+ # end # class UserManager
37
+ #
36
38
  #
37
39
  # == To-Do
38
- #
40
+ #
39
41
  # _We may add support for other ways of passing parameters later,
40
42
  # e.g., via structured entity bodies like JSON, XML, YAML, etc_.
41
- #
42
- #
43
+ #
44
+ #
43
45
  module Strelka::App::Parameters
44
46
  extend Strelka::App::Plugin
45
47
 
@@ -80,8 +82,8 @@ module Strelka::App::Parameters
80
82
 
81
83
 
82
84
  ### Declare a parameter with the specified +name+ that will be validated using the given
83
- ### +constraint+. The +constraint+ can be any of the types supported by
84
- ### Strelka::App::ParamValidator.
85
+ ### +constraint+. The +constraint+ can be any of the types supported by
86
+ ### Strelka::ParamValidator.
85
87
  ### :call-seq:
86
88
  # param( name, *flags )
87
89
  # param( name, constraint, *flags )
@@ -98,7 +100,7 @@ module Strelka::App::Parameters
98
100
  # description ||= name.to_s.capitalize
99
101
  flags = args
100
102
 
101
- # Give a regexp constraint a named capture group for the constraint name if it
103
+ # Give a regexp constraint a named capture group for the constraint name if it
102
104
  # doesn't already have one
103
105
  if constraint.is_a?( Regexp )
104
106
  constraint = Regexp.compile( "(?<#{name}>" + constraint.to_s + ")" ) unless
@@ -143,7 +145,7 @@ module Strelka::App::Parameters
143
145
  sub_res = constraint.map( &self.method(:extract_route_from_constraint) )
144
146
  Regexp.union( sub_res )
145
147
  when Symbol
146
- re = Strelka::App::ParamValidator.pattern_for_constraint( constraint ) or
148
+ re = Strelka::ParamValidator.pattern_for_constraint( constraint ) or
147
149
  raise ScriptError, "no pattern for %p constraint" % [ constraint ]
148
150
  /(?<#{name}>#{re})/
149
151
  else
@@ -176,7 +178,7 @@ module Strelka::App::Parameters
176
178
  def handle_request( request, &block )
177
179
  profile = self.make_validator_profile( request )
178
180
  self.log.debug "Applying validator profile: %p" % [ profile ]
179
- validator = Strelka::App::ParamValidator.new( profile, request.params )
181
+ validator = Strelka::ParamValidator.new( profile, request.params )
180
182
  self.log.debug " validator: %p" % [ validator ]
181
183
 
182
184
  request.params = validator
@@ -185,7 +187,7 @@ module Strelka::App::Parameters
185
187
 
186
188
 
187
189
 
188
- ### Make a validator profile for Strelka::App::ParamValidator for the specified
190
+ ### Make a validator profile for Strelka::ParamValidator for the specified
189
191
  ### +request+ using the declared parameters in the App, returning it as a Hash.
190
192
  def make_validator_profile( request )
191
193
  profile = {