rack-server-pages 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.md CHANGED
@@ -1,6 +1,22 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ ### [0.0.5](https://github.com/migrs/rack-server-pages/tree/v0.0.5) / 2012-03-18
5
+
6
+ * [Changes](https://github.com/migrs/rack-server-pages/compare/v0.0.4...v0.0.5)
7
+
8
+ * Feature
9
+ - Handle exceptions
10
+ - Add `config.show_exceptions` option
11
+ - Invoke `on_error` filter when an exception is caught
12
+
13
+ * Enhancement
14
+ - NotFound with 404 file
15
+ - Rack::ServerPages::NotFound['404.html']
16
+
17
+ * Bugfix
18
+ - Duplicated filters
19
+
4
20
  ### [0.0.4](https://github.com/migrs/rack-server-pages/tree/v0.0.4) / 2012-01-15
5
21
 
6
22
  * [Changes](https://github.com/migrs/rack-server-pages/compare/v0.0.3...v0.0.4)
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source :rubygems
2
2
 
3
+ #gemspec
3
4
  gem 'rack'
4
- #gemspec #didn't work in heroku
5
5
 
6
6
  group :development do
7
7
  gem 'rake'
data/README.md CHANGED
@@ -8,6 +8,7 @@ There are no controllers or models, just only views like a jsp, asp and php!
8
8
 
9
9
  [![Build Status](https://secure.travis-ci.org/migrs/rack-server-pages.png)](http://travis-ci.org/migrs/rack-server-pages)
10
10
  [![Dependency Status](https://gemnasium.com/migrs/rack-server-pages.png?travis)](https://gemnasium.com/migrs/rack-server-pages)
11
+ [![Still Maintained](http://stillmaintained.com/migrs/rack-server-pages.png)](http://stillmaintained.com/migrs/rack-server-pages)
11
12
 
12
13
  ## Features
13
14
 
@@ -18,6 +19,7 @@ There are no controllers or models, just only views like a jsp, asp and php!
18
19
  - Include a partial template
19
20
  - Layout template
20
21
  - Before/After filters
22
+ - Handle exceptions
21
23
  - Include helpers
22
24
  - Integrate with any rack applications (Rails, Sinatra, etc...)
23
25
  - Extremely simple and easy to use!
data/config.ru CHANGED
@@ -1,6 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require 'bundler/setup'
3
- require './lib/rack/server_pages'
3
+ $:.unshift File.dirname(__FILE__) + '/lib'
4
+ require 'rack-server-pages'
4
5
 
5
6
  # Tilt settings
6
7
  require 'tilt'
@@ -25,6 +26,12 @@ module SampleHelper
25
26
  end
26
27
 
27
28
  run Rack::ServerPages.new { |config|
29
+ #config.show_exceptions = false
30
+
31
+ config.on_error do
32
+ response.body = ['Error!']
33
+ end
34
+
28
35
  config.helpers SampleHelper
29
36
  config.helpers do
30
37
  def sample4
@@ -1 +1,2 @@
1
- require File.dirname(__FILE__) + "/rack/server_pages"
1
+ require 'rack/server_pages'
2
+ require 'rack-server-pages/version'
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class ServerPages
3
+ VERSION = '0.0.5'
4
+ end
5
+ end
@@ -8,7 +8,6 @@ require 'forwardable'
8
8
 
9
9
  module Rack
10
10
  class ServerPages
11
- VERSION = '0.0.4'
12
11
 
13
12
  class << self
14
13
  def call(env)
@@ -25,8 +24,8 @@ module Rack
25
24
  yield @config if block_given?
26
25
  @app = app || @config.failure_app || NotFound
27
26
 
28
- require ::File.dirname(__FILE__) + "/server_pages/sample_helper"
29
- @config.helpers Rack::ServerPages::SampleHelper
27
+ require ::File.dirname(__FILE__) + "/server_pages/php_helper"
28
+ @config.helpers Rack::ServerPages::PHPHelper
30
29
 
31
30
  @config.filter.merge_from_helpers(@config.helpers)
32
31
  @binding = Binding.extended_class(@config.helpers)
@@ -72,21 +71,34 @@ module Rack
72
71
  def server_page(template)
73
72
  lambda do |env|
74
73
  @binding.new(env).tap do |scope|
75
- catch(:halt) { @config.filter.invoke(scope) { build_response(template, scope) }}
74
+ catch(:halt) do
75
+ begin
76
+ @config.filter.invoke(scope, :before)
77
+ build_response(template, scope)
78
+ rescue
79
+ if @config.show_exceptions?
80
+ raise $!
81
+ else
82
+ scope.response.status = 500
83
+ scope.response['Content-Type'] ||= "text/html"
84
+ @config.filter.invoke(scope, :on_error)
85
+ end
86
+ ensure
87
+ @config.filter.invoke(scope, :after)
88
+ end
89
+ end
76
90
  end.response.finish
77
91
  end
78
92
  end
79
93
 
80
94
  class Filter
81
- TYPES = [:before, :after]
82
- DEFAULT = Hash[[TYPES, [[]]*TYPES.size].transpose]
83
-
95
+ TYPES = [:before, :after, :on_error]
84
96
  TYPES.each do |type|
85
97
  define_method(type) {|*fn, &block| add(type, *fn, &block) }
86
98
  end
87
99
 
88
- def initialize(filters = DEFAULT)
89
- @filters = filters
100
+ def initialize
101
+ @filters = Hash[[TYPES, Array.new(TYPES.size) {[]}].transpose]
90
102
  end
91
103
 
92
104
  def [] type
@@ -94,7 +106,7 @@ module Rack
94
106
  end
95
107
 
96
108
  def merge(other)
97
- TYPES.each { |type| self[type].concat other[type] }
109
+ TYPES.each { |type| @filters[type].concat other[type] }
98
110
  end
99
111
 
100
112
  def merge_from_helpers(helpers)
@@ -102,16 +114,12 @@ module Rack
102
114
  end
103
115
 
104
116
  def add(type, *args, &block)
105
- self[type] << block if block_given?
106
- self[type].concat args unless args.empty?
117
+ @filters[type] << block if block_given?
118
+ @filters[type].concat args unless args.empty?
107
119
  end
108
120
 
109
- def invoke(scope, type = nil)
110
- if block_given?
111
- invoke(scope, TYPES.first); yield scope; invoke(scope, TYPES.last)
112
- else
113
- self[type].each { |f| f.respond_to?(:bind) ? f.bind(scope).call : scope.instance_exec(&f) }
114
- end
121
+ def invoke(scope, type)
122
+ @filters[type].each { |f| f.respond_to?(:bind) ? f.bind(scope).call : scope.instance_exec(&f) }
115
123
  end
116
124
 
117
125
  def self.extract_filters_from_helpers(helpers)
@@ -139,8 +147,10 @@ module Rack
139
147
  end
140
148
  end
141
149
 
142
- hash_accessor :view_path, :effective_path, :cache_control, :default_charset, :failure_app
150
+ hash_accessor :view_path, :effective_path, :cache_control, :default_charset, :failure_app, :show_exceptions
151
+
143
152
  attr_reader :filter
153
+
144
154
  def_delegators :filter, *Filter::TYPES
145
155
 
146
156
  def initialize
@@ -151,6 +161,14 @@ module Rack
151
161
  @filter = Filter.new
152
162
  end
153
163
 
164
+ def show_exceptions?
165
+ if self[:show_exceptions].nil?
166
+ ENV['RACK_ENV'].nil? or (ENV['RACK_ENV'] == 'development')
167
+ else
168
+ self[:show_exceptions]
169
+ end
170
+ end
171
+
154
172
  def view_paths
155
173
  (v = self[:view_path]).kind_of?(Enumerable) ? v : [v.to_s]
156
174
  end
@@ -259,8 +277,12 @@ module Rack
259
277
  end
260
278
 
261
279
  class NotFound
280
+ def self.[](file)
281
+ ::File.file?(file) ? proc { Rack::Response.new([::File.read(file)], 404).finish } : self
282
+ end
283
+
262
284
  def self.call(env)
263
- Rack::Response.new(["Not Found: #{env['REQUEST_PATH']}"], 404).finish
285
+ Rack::Response.new(["Not Found: #{env['PATH_INFO']}"], 404).finish
264
286
  end
265
287
  end
266
288
 
@@ -1,4 +1,4 @@
1
- module Rack::ServerPages::SampleHelper
1
+ module Rack::ServerPages::PHPHelper
2
2
  require 'erb'
3
3
  def rubyinfo
4
4
  ERB.new(<<-RUBYINFO).result(binding)
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "rack-server-pages"
3
+ require "rack-server-pages/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "rack-server-pages"
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.description = %q{Rack middleware and appilcation for serving dynamic pages in very simple way.
13
13
  There are no controllers and no models, just only views like a asp, jsp and php!}
14
14
 
15
- s.rubyforge_project = "rack-server-pages"
15
+ #s.rubyforge_project = "rack-server-pages"
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -2,7 +2,7 @@
2
2
  require 'rack/test'
3
3
  require 'tapp'
4
4
  require 'simplecov'
5
- require File.dirname(__FILE__) + '/../lib/rack/server_pages'
5
+ require 'rack-server-pages'
6
6
  SimpleCov.start
7
7
 
8
8
  RSpec.configure do |conf|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-server-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-14 00:00:00.000000000Z
12
+ date: 2012-04-17 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &70348646709060 !ruby/object:Gem::Requirement
16
+ requirement: &70273387486420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70348646709060
24
+ version_requirements: *70273387486420
25
25
  description: ! "Rack middleware and appilcation for serving dynamic pages in very
26
26
  simple way.\n There are no controllers and no models, just only
27
27
  views like a asp, jsp and php!"
@@ -41,8 +41,9 @@ files:
41
41
  - Rakefile
42
42
  - config.ru
43
43
  - lib/rack-server-pages.rb
44
+ - lib/rack-server-pages/version.rb
44
45
  - lib/rack/server_pages.rb
45
- - lib/rack/server_pages/sample_helper.rb
46
+ - lib/rack/server_pages/php_helper.rb
46
47
  - public/CHANGES.erb
47
48
  - public/README.erb
48
49
  - public/_layout.html.erb
@@ -99,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
100
  - !ruby/object:Gem::Version
100
101
  version: '0'
101
102
  requirements: []
102
- rubyforge_project: rack-server-pages
103
+ rubyforge_project:
103
104
  rubygems_version: 1.8.10
104
105
  signing_key:
105
106
  specification_version: 3
@@ -108,3 +109,4 @@ summary: Rack middleware and appilcation for serving dynamic pages in very simpl
108
109
  test_files:
109
110
  - spec/lib/rack/server_pages_spec.rb
110
111
  - spec/spec_helper.rb
112
+ has_rdoc: