exocora 0.1.0 → 0.1.1

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.
@@ -14,9 +14,9 @@ BASEDIR = File.dirname(File.expand_path(__FILE__))
14
14
  $LOAD_PATH.unshift(BASEDIR)
15
15
  $LOAD_PATH.uniq!
16
16
 
17
- require 'string'
18
- require 'array'
19
- require 'cgi'
17
+ require 'support/string'
18
+ require 'support/array'
19
+ require 'support/cgi'
20
20
  require 'exocora/support'
21
21
  require 'exocora/errors'
22
22
  require 'exocora/validation'
@@ -28,20 +28,16 @@ module Exocora
28
28
 
29
29
  # Represents an error encountered when processing a template.
30
30
  class TemplateError < RuntimeError
31
- attr_accessor :message, :exception
32
- def initialize(message, exception)
31
+ attr_accessor :message, :original
32
+ def initialize(message, original)
33
33
  @message = message
34
- @exception = exception
34
+ @original = original
35
35
  end
36
36
 
37
37
  def to_html
38
38
  "<p>" + Erubis::XmlHelper::escape_xml(@message) + "</p>" +
39
39
  "<p>The original exception was:</p>" +
40
- if @exception.respond_to? :to_html
41
- @exception.to_html
42
- else
43
- Erubis::XmlHelper::escape_xml(@exception.to_s)
44
- end
40
+ @original.to_html
45
41
  end
46
42
  end
47
43
  end
@@ -22,6 +22,13 @@ module Exocora
22
22
  @log_file = self.class.to_s.underscore + '.log'
23
23
  end
24
24
 
25
+ # Add a validation to the validation stack
26
+ def self.add_validation(param, validation)
27
+ @@validations[param.to_sym] ||= []
28
+ @@validations[param.to_sym] << validation
29
+ validation
30
+ end
31
+
25
32
  # Adds a validation condition for a parameter.
26
33
  # validate :query { |q| q.size > 0 }
27
34
  # validate :query, "is invalid" { |q|
@@ -31,10 +38,12 @@ module Exocora
31
38
  validation.when block
32
39
  end
33
40
 
34
- @@validations[param.to_s] ||= []
35
- @@validations[param.to_s] << validation
36
-
37
- validation
41
+ add_validation param, validation
42
+ end
43
+
44
+ # Ensure that a parameter is non-nil
45
+ def self.validate_presence_of(param, *params)
46
+ add_validation param, ValidationOfPresence.new(*params)
38
47
  end
39
48
 
40
49
  # Creates an instance of this sheet, and runs it.
@@ -42,6 +51,12 @@ module Exocora
42
51
  new.run
43
52
  end
44
53
 
54
+ # Adds an error on a parameter
55
+ def add_error(param, error)
56
+ @errors[param] ||= []
57
+ @errors[param] << error
58
+ end
59
+
45
60
  # Casts incoming CGI parameters to nil, numerics, collapses single-element
46
61
  # arrays, and so forth.
47
62
  def cast_params(params)
@@ -57,6 +72,10 @@ module Exocora
57
72
  end
58
73
  end
59
74
 
75
+ # I prefer indexing by symbols
76
+ key = key.to_sym
77
+
78
+ # Store cast values
60
79
  if values.empty?
61
80
  cast[key] = nil
62
81
  elsif values.size == 1
@@ -99,10 +118,11 @@ module Exocora
99
118
  end
100
119
 
101
120
  # Breaks the normal rendering flow, and outputs an HTTP redirect header.
102
- def redirect_to(uri_fragment)
121
+ def redirect_to(uri_fragment = @cgi.uri, params = {})
103
122
  @headers['Status'] = '302 Moved'
104
- @headers['Location'] = @cgi.full_uri_for uri_fragment
123
+ @headers['Location'] = url_for(@cgi.full_uri_for(uri_fragment), params)
105
124
  output
125
+ exit
106
126
  end
107
127
 
108
128
  # Renders the erubis template for this action. Takes a hash of variables to
@@ -123,8 +143,13 @@ module Exocora
123
143
  # Perform templating
124
144
  begin
125
145
  result = eruby.evaluate context
126
- rescue
127
- raise TemplateError.new("Encountered error processing template #{template_filename}.", $!)
146
+ rescue Exception => e
147
+ if e.backtrace.first =~ /\(erubis\):(\d+)/
148
+ message = "encountered error processing template #{template_filename} at line #{$1}"
149
+ else
150
+ message = "encountered error processing template #{template_filename}"
151
+ end
152
+ raise TemplateError.new(message, e)
128
153
  end
129
154
 
130
155
  # Output result
@@ -161,6 +186,13 @@ module Exocora
161
186
  end
162
187
  end
163
188
 
189
+ # Returns a URL for the given url and parameters
190
+ def url_for(url = @cgi.uri, params = {})
191
+ url + params.inject('?') do |query_string, pair|
192
+ query_string << CGI::escape(pair[0].to_s) + '=' + CGI::escape(pair[1].to_s)
193
+ end
194
+ end
195
+
164
196
  # Sets the name of the template to render.
165
197
  def use_template(template)
166
198
  @template = template
@@ -187,13 +219,23 @@ module Exocora
187
219
  unless values.kind_of? Array
188
220
  values = [values]
189
221
  end
190
-
191
- values.each do |value|
222
+
223
+ # if validation.kind_of? ValidationOfPresence
224
+ # # Make sure we perform a validation even if no parameters are
225
+ # # present.
226
+ # begin
227
+ # validation.validate values.first
228
+ # rescue ValidationError => e
229
+ # @errors[param] ||= []
230
+ # @errors[param] << e
231
+ # end
232
+ # end
233
+
234
+ values.each do |value|
192
235
  begin
193
236
  validation.validate(value)
194
237
  rescue ValidationError => e
195
- @errors[param] ||= []
196
- @errors[param] << e
238
+ add_error param, e
197
239
  end
198
240
  end
199
241
  end
@@ -4,9 +4,11 @@ module Exocora
4
4
  # Otherwise, compares filter === value.
5
5
 
6
6
  class Validation
7
+ DEFAULT_MESSAGE = 'must be present'
8
+
7
9
  attr_accessor :message, :filter, :negate
8
10
 
9
- def initialize(filter = Object, message = 'must be valid')
11
+ def initialize(filter=Object, message=DEFAULT_MESSAGE)
10
12
  @filter = filter
11
13
  @message = message
12
14
  @negate = false
@@ -70,4 +72,22 @@ module Exocora
70
72
  alias :with :if
71
73
  alias :when :if
72
74
  end
75
+
76
+ # ValidationOfPresence is a special validation which ensures its value
77
+ # is both present and non-empty.
78
+ class ValidationOfPresence < Validation
79
+ DEFAULT_MESSAGE = 'must be present'
80
+
81
+ def initialize(message=DEFAULT_MESSAGE)
82
+ @message = message
83
+ end
84
+
85
+ def validate(value = nil)
86
+ if value.nil? or (value.respond_to? :empty? and value.empty?)
87
+ raise ValidationError.new(value, @message)
88
+ else
89
+ value
90
+ end
91
+ end
92
+ end
73
93
  end
@@ -1,6 +1,6 @@
1
1
  module Exocora
2
2
  APP_NAME = 'exocora'
3
- APP_VERSION = '0.1.0'
3
+ APP_VERSION = '0.1.1'
4
4
  APP_AUTHOR = 'aphyr'
5
5
  APP_EMAIL = 'aphyr@aphyr.com'
6
6
  APP_URL = 'http://aphyr.com/'
File without changes
@@ -30,7 +30,7 @@ class CGI
30
30
  else
31
31
  uri << 'https://' + server_name + ':' + server_port
32
32
  end
33
- uri
33
+ uri << '/'
34
34
  end
35
35
 
36
36
  # Try to guess the relative path for this request. (http://host/directory/)
File without changes
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: exocora
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2008-03-27 00:00:00 -05:00
6
+ version: 0.1.1
7
+ date: 2008-03-30 00:00:00 -05:00
8
8
  summary: A small framework for cgi scripts
9
9
  require_paths:
10
10
  - lib
@@ -20,7 +20,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.8.6
23
+ version: 1.8.5
24
24
  version:
25
25
  platform: ruby
26
26
  signing_key:
@@ -35,10 +35,11 @@ files:
35
35
  - examples/hello_world.cgi
36
36
  - examples/request.rhtml
37
37
  - examples/request.cgi
38
- - lib/cgi.rb
39
- - lib/array.rb
40
38
  - lib/exocora.rb
41
- - lib/string.rb
39
+ - lib/support
40
+ - lib/support/cgi.rb
41
+ - lib/support/array.rb
42
+ - lib/support/string.rb
42
43
  - lib/exocora
43
44
  - lib/exocora/support.rb
44
45
  - lib/exocora/validation.rb