rack-server-pages 0.0.4 → 0.0.5

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.
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: