strelka 0.0.1.pre129 → 0.0.1.pre148

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.
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 = {