rack-server-pages 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,11 +1,12 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
- require "bundler/gem_tasks"
3
+ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
- task :default => :spec
6
+ desc 'Run all specs in spec directory'
7
+ RSpec::Core::RakeTask.new :spec
7
8
 
8
- desc "Run all specs in spec directory"
9
- RSpec::Core::RakeTask.new(:spec) do |t|
10
- t.rspec_opts = %w(-fs --color)
11
- end
9
+ require 'rubocop/rake_task'
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: [:rubocop, :spec]
data/config.ru CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require 'bundler/setup'
3
- $:.unshift File.dirname(__FILE__) + '/lib'
3
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/lib'
4
4
  require 'rack-server-pages'
5
5
 
6
6
  # Tilt settings
@@ -9,7 +9,7 @@ require 'slim'
9
9
 
10
10
  # .php as ERB template :)
11
11
  Rack::ServerPages::Template::ERBTemplate.extensions << 'php' # ERBTemplate
12
- #Rack::ServerPages::Template.use_tilt false
12
+ # Rack::ServerPages::Template.use_tilt false
13
13
  Tilt.register Tilt::ERBTemplate, 'php' # TiltTemplate
14
14
 
15
15
  module SampleHelper
@@ -26,7 +26,7 @@ module SampleHelper
26
26
  end
27
27
 
28
28
  run Rack::ServerPages.new { |config|
29
- #config.show_exceptions = false
29
+ # config.show_exceptions = false
30
30
 
31
31
  config.on_error do
32
32
  response.body = ['Error!']
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class ServerPages
3
- VERSION = '0.0.6'
3
+ VERSION = '0.1.0'.freeze
4
4
  end
5
5
  end
@@ -8,13 +8,12 @@ require 'forwardable'
8
8
 
9
9
  module Rack
10
10
  class ServerPages
11
-
12
11
  class << self
13
12
  def call(env)
14
13
  new.call(env)
15
14
  end
16
15
 
17
- def [](options={}, &block)
16
+ def [](options = {}, &block)
18
17
  new(nil, options, &block)
19
18
  end
20
19
  end
@@ -24,13 +23,13 @@ module Rack
24
23
  yield @config if block_given?
25
24
  @app = app || @config.failure_app || NotFound
26
25
 
27
- require ::File.dirname(__FILE__) + "/server_pages/php_helper"
26
+ require ::File.dirname(__FILE__) + '/server_pages/php_helper'
28
27
  @config.helpers Rack::ServerPages::PHPHelper
29
28
 
30
29
  @config.filter.merge_from_helpers(@config.helpers)
31
30
  @binding = Binding.extended_class(@config.helpers)
32
31
 
33
- @path_regex = %r!^#{@config.effective_path}/((?:[\w-]+/)+)?([A-z0-9][\w\.\-]*?\w)?(\.\w+)?$!
32
+ @path_regex = %r{^#{@config.effective_path}/((?:[\w-]+/)+)?([A-z0-9][\w\.\-\@]*?\w)?(\.\w+)?$}
34
33
  end
35
34
 
36
35
  def call(env)
@@ -39,18 +38,18 @@ module Rack
39
38
 
40
39
  def serving(env)
41
40
  files = find_template_files(env['PATH_INFO'])
42
- unless files.nil? or files.empty?
43
- file = select_template_file(files)
44
- (tpl = Template[file]) ? server_page(tpl) : StaticFile.new(file, @config.cache_control)
45
- else
41
+ if files.nil? || files.empty?
46
42
  @app
43
+ else
44
+ file = select_template_file(files)
45
+ (tpl = Template[file]) ? server_page(tpl) : File.new(file.split(env['PATH_INFO']).first)
47
46
  end.call(env)
48
47
  end
49
48
 
50
49
  def find_template_files(path_info)
51
50
  if m = path_info.match(@path_regex)
52
51
  @config.view_paths.inject([]) do |files, path|
53
- files.concat Dir["#{path}/#{m[1]}#{m[2]||'index'}#{m[3]}{.*,}"].select{|s|s.include?('.')}
52
+ files.concat Dir["#{path}/#{m[1]}#{m[2] || 'index'}#{m[3]}{.*,}"].select { |s| s.include?('.') }
54
53
  end
55
54
  end
56
55
  end
@@ -80,7 +79,7 @@ module Rack
80
79
  raise $!
81
80
  else
82
81
  scope.response.status = 500
83
- scope.response['Content-Type'] ||= "text/html"
82
+ scope.response['Content-Type'] ||= 'text/html'
84
83
  @config.filter.invoke(scope, :on_error)
85
84
  end
86
85
  ensure
@@ -92,16 +91,16 @@ module Rack
92
91
  end
93
92
 
94
93
  class Filter
95
- TYPES = [:before, :after, :on_error]
94
+ TYPES = [:before, :after, :on_error].freeze
96
95
  TYPES.each do |type|
97
- define_method(type) {|*fn, &block| add(type, *fn, &block) }
96
+ define_method(type) { |*fn, &block| add(type, *fn, &block) }
98
97
  end
99
98
 
100
99
  def initialize
101
- @filters = Hash[[TYPES, Array.new(TYPES.size) {[]}].transpose]
100
+ @filters = Hash[[TYPES, Array.new(TYPES.size) { [] }].transpose]
102
101
  end
103
102
 
104
- def [] type
103
+ def [](type)
105
104
  @filters[type]
106
105
  end
107
106
 
@@ -163,14 +162,14 @@ module Rack
163
162
 
164
163
  def show_exceptions?
165
164
  if self[:show_exceptions].nil?
166
- ENV['RACK_ENV'].nil? or (ENV['RACK_ENV'] == 'development')
165
+ ENV['RACK_ENV'].nil? || (ENV['RACK_ENV'] == 'development')
167
166
  else
168
167
  self[:show_exceptions]
169
168
  end
170
169
  end
171
170
 
172
171
  def view_paths
173
- (v = self[:view_path]).kind_of?(Enumerable) ? v : [v.to_s]
172
+ (v = self[:view_path]).is_a?(Enumerable) ? v : [v.to_s]
174
173
  end
175
174
 
176
175
  def helpers(*args, &block)
@@ -181,9 +180,8 @@ module Rack
181
180
  end
182
181
 
183
182
  class Template
184
-
185
183
  class << self
186
- def [] file
184
+ def [](file)
187
185
  engine.new(file).find_template
188
186
  end
189
187
 
@@ -192,10 +190,10 @@ module Rack
192
190
  end
193
191
 
194
192
  def tilt?
195
- @use_tilt.nil? ? (@use_tilt ||= !!defined?(Tilt)) : @use_tilt and defined?(Tilt)
193
+ @use_tilt.nil? ? (@use_tilt ||= !!defined?(Tilt)) : @use_tilt && defined?(Tilt)
196
194
  end
197
195
 
198
- def use_tilt bool = true
196
+ def use_tilt(bool = true)
199
197
  @use_tilt = !!bool
200
198
  end
201
199
  end
@@ -212,16 +210,16 @@ module Rack
212
210
  end
213
211
 
214
212
  def mime_type_with_charset(charset = 'utf-8')
215
- if (m = mime_type) =~ %r!^(text/\w+|application/(?:javascript|(xhtml\+)?xml|json))$!
216
- "#{m}; charset=#{charset}"
213
+ if (m = mime_type) =~ %r{^(text/\w+|application/(?:javascript|(xhtml\+)?xml|json))$}
214
+ "#{m}; charset=#{charset}"
217
215
  else
218
- m
216
+ m
219
217
  end
220
218
  end
221
219
 
222
220
  def render_with_layout(scope, locals = {}, &block)
223
- content = render(scope, locals = {}, &block)
224
- if layout = scope.layout and layout_file = Dir["#{layout}{.*,}"].first
221
+ content = render(scope, locals, &block)
222
+ if (layout = scope.layout) && (layout_file = Dir["#{layout}{.*,}"].first)
225
223
  scope.layout(false)
226
224
  Template[layout_file].render_with_layout(scope) { content }
227
225
  else
@@ -231,7 +229,8 @@ module Rack
231
229
 
232
230
  class TiltTemplate < Template
233
231
  def find_template
234
- (@tilt ||= Tilt[@file]) ? self : nil
232
+ @tilt ||= Tilt[@file]
233
+ @tilt ? self : nil
235
234
  end
236
235
 
237
236
  def render(scope, locals = {}, &block)
@@ -252,31 +251,20 @@ module Rack
252
251
  end
253
252
 
254
253
  def find_template
255
- (@file =~ /\.(#{self.class.extensions.join('|')})$/) and ::File.exist?(@file) ? self : nil
254
+ (@file =~ /\.(#{self.class.extensions.join('|')})$/) && ::File.exist?(@file) ? self : nil
256
255
  end
257
256
 
258
- def render(scope, locals = {}, &block)
257
+ def render(scope, _locals = {}, &block)
259
258
  ## TODO: support locals
260
259
  ERB.new(IO.read(@file)).result(scope._binding(&block))
261
260
  end
262
261
 
263
262
  def default_mime_type
264
- "text/html"
263
+ 'text/html'
265
264
  end
266
265
  end
267
266
  end
268
267
 
269
- class StaticFile < File
270
- def initialize(path, cache_control = nil)
271
- @path = path
272
- @cache_control = cache_control
273
- end
274
-
275
- def _call(env)
276
- serving(env)
277
- end
278
- end
279
-
280
268
  class NotFound
281
269
  def self.[](file)
282
270
  ::File.file?(file) ? proc { Rack::Response.new([::File.read(file)], 404).finish } : self
@@ -288,13 +276,13 @@ module Rack
288
276
  end
289
277
 
290
278
  module CoreHelper
291
- def redirect(target, status=302)
279
+ def redirect(target, status = 302)
292
280
  response.redirect(target, status)
293
281
  halt
294
282
  end
295
283
 
296
284
  def partial(file, locals = {}, &block)
297
- if tpl_file = Dir["#{file}{.*,}"].first and template = Template[tpl_file]
285
+ if (tpl_file = Dir["#{file}{.*,}"].first) && (template = Template[tpl_file])
298
286
  template.render(self, locals, &block)
299
287
  else
300
288
  IO.read(file)
@@ -307,18 +295,18 @@ module Rack
307
295
  end
308
296
 
309
297
  def halt(*args)
310
- if args[0].kind_of? Fixnum
311
- response.headers.merge! args[1] if (a1_is_h = args[1].kind_of? Hash)
312
- response.body = [(a1_is_h) ? args[2] : args[1]]
298
+ if args[0].is_a? Integer
299
+ response.headers.merge! args[1] if (a1_is_h = args[1].is_a? Hash)
300
+ response.body = [a1_is_h ? args[2] : args[1]]
313
301
  response.status = args[0]
314
- else
302
+ elsif args[0]
315
303
  response.body = [args[0]]
316
304
  end
317
305
  throw :halt
318
306
  end
319
307
 
320
- def url(path = "")
321
- env['SCRIPT_NAME'] + (path.to_s[0,1]!= '/' ? '/' : '') + path.to_s
308
+ def url(path = '')
309
+ env['SCRIPT_NAME'] + (path.to_s[0, 1] != '/' ? '/' : '') + path.to_s
322
310
  end
323
311
  end
324
312
 
@@ -347,7 +335,7 @@ module Rack
347
335
  def initialize(env)
348
336
  @request = Rack::Request.new(env)
349
337
  @response = Rack::Response.new
350
- @response['Content-Type'] = nil
338
+ # @response['Content-Type'] = nil
351
339
  end
352
340
 
353
341
  def _binding
@@ -59,7 +59,7 @@ module Rack::ServerPages::PHPHelper
59
59
  <% if defined?(Tilt) %>
60
60
  <h2>Tilt</h2>
61
61
  <table border="0" cellpadding="3" width="600">
62
- <% for key, value in Tilt.mappings do %>
62
+ <% for key, value in (Tilt.respond_to?(:mappings) ? Tilt.mappings : Tilt.lazy_map) do %>
63
63
  <tr><td class="e"><%= key %></td><td class="v"><%= value %></td></tr>
64
64
  <% end %>
65
65
  </table>
@@ -4,6 +4,6 @@
4
4
  <link href="<%=url("/style.css")%>" media="screen" rel="stylesheet" type="text/css" />
5
5
  </head>
6
6
  <body>
7
- <%=yield%>
7
+ <%= yield if block_given? %>
8
8
  </body>
9
9
  </html>
Binary file
Binary file
@@ -1,23 +1,24 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "rack-server-pages/version"
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'rack-server-pages/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "rack-server-pages"
6
+ s.name = 'rack-server-pages'
7
7
  s.version = Rack::ServerPages::VERSION
8
- s.authors = ["Masato Igarashi"]
9
- s.email = ["m@igrs.jp"]
10
- s.homepage = "http://github.com/migrs/rack-server-pages"
11
- s.summary = %q{Rack middleware and appilcation for serving dynamic pages in very simple way.}
12
- s.description = %q{Rack middleware and appilcation for serving dynamic pages in very simple way.
13
- There are no controllers and no models, just only views like a asp, jsp and php!}
8
+ s.authors = ['Masato Igarashi', 'Daniel Doubrovkine']
9
+ s.email = ['m@igrs.jp']
10
+ s.homepage = 'http://github.com/migrs/rack-server-pages'
11
+ s.licenses = ['MIT']
12
+ s.summary = 'Rack middleware and appilcation for serving dynamic pages in very simple way.'
13
+ s.description = 'Rack middleware and appilcation for serving dynamic pages in very simple way.
14
+ There are no controllers and no models, just only views like a asp, jsp and php!'
14
15
 
15
- #s.rubyforge_project = "rack-server-pages"
16
+ # s.rubyforge_project = "rack-server-pages"
16
17
 
17
18
  s.files = `git ls-files`.split("\n")
18
19
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
21
+ s.require_paths = ['lib']
21
22
 
22
23
  s.add_dependency 'rack'
23
24
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ Capybara.app, = Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__))
4
+ Capybara.current_driver = :selenium
5
+
6
+ describe 'Integration', js: true do
7
+ context 'root' do
8
+ before do
9
+ visit '/'
10
+ end
11
+ it 'loads homepage' do
12
+ expect(page.find('h1')).to have_content 'rack-server-pages'
13
+ end
14
+ it 'loads markdown README' do
15
+ click_link 'README'
16
+ expect(page.first('h1')).to have_content 'Rack Server Pages'
17
+ end
18
+ it 'rendered ERB' do
19
+ click_link 'sample.erb'
20
+ expect(page).to have_content 'PartAPartB'
21
+ end
22
+ it 'rendered PHP' do
23
+ click_link 'info.php'
24
+ expect(page).to have_content 'CGI/1.1'
25
+ end
26
+ end
27
+ it 'renders all tilt examples' do
28
+ visit '/examples/'
29
+ page.all('body ul li a').map { |a| a['href'] }.each do |href|
30
+ puts href
31
+ visit href
32
+ end
33
+ end
34
+ end
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper'
2
2
  begin
3
- require 'ruby-debug'
4
- require 'tapp'
3
+ require 'ruby-debug'
4
+ require 'tapp'
5
5
  rescue LoadError
6
6
  end
7
7
 
@@ -37,50 +37,56 @@ describe 'Rack::ServerPages' do
37
37
  should_be_ok '/betty.css'
38
38
  should_be_ok '/betty.css.sass'
39
39
  end
40
+
41
+ context 'content-type: image/png' do
42
+ let(:content_type) { 'image/png' }
43
+ should_be_ok '/rack_logo.png'
44
+ should_be_ok '/rack_logo@2x.png'
45
+ end
40
46
  end
41
47
 
42
48
  describe 'Rack::ServerPages private methods' do
43
49
  describe '#evalute_path_info' do
44
- subject { m = app.new.instance_variable_get(:@path_regex).match(path_info); m[1,3] if m }
50
+ subject { m = app.new.instance_variable_get(:@path_regex).match(path_info); m[1, 3] if m }
45
51
 
46
52
  context '/aaa/bbb.erb' do
47
53
  let(:path_info) { '/aaa/bbb.erb' }
48
- it { should eq %w(aaa/ bbb .erb) }
54
+ it { is_expected.to eq %w(aaa/ bbb .erb) }
49
55
  end
50
56
 
51
57
  context '/aaa/bbb/ccc.erb' do
52
58
  let(:path_info) { '/aaa/bbb/ccc.erb' }
53
- it { should eq %w(aaa/bbb/ ccc .erb) }
59
+ it { is_expected.to eq %w(aaa/bbb/ ccc .erb) }
54
60
  end
55
61
 
56
62
  context '/aaa/bbb/ccc.' do
57
63
  let(:path_info) { '/aaa/bbb/ccc.' }
58
- it { should be_nil }
64
+ it { is_expected.to be_nil }
59
65
  end
60
66
 
61
67
  context '/aaa/bbb/ccc' do
62
68
  let(:path_info) { '/aaa/bbb/ccc' }
63
- it { should eq ['aaa/bbb/', 'ccc', nil] }
69
+ it { is_expected.to eq ['aaa/bbb/', 'ccc', nil] }
64
70
  end
65
71
 
66
72
  context '/aaa-bbb/ccc' do
67
73
  let(:path_info) { '/aaa-bbb/ccc' }
68
- it { should eq ['aaa-bbb/', 'ccc', nil] }
74
+ it { is_expected.to eq ['aaa-bbb/', 'ccc', nil] }
69
75
  end
70
76
 
71
77
  context '/aaa/bbb/' do
72
78
  let(:path_info) { '/aaa/bbb/' }
73
- it { should eq ['aaa/bbb/', nil, nil] }
79
+ it { is_expected.to eq ['aaa/bbb/', nil, nil] }
74
80
  end
75
81
 
76
82
  context '/' do
77
83
  let(:path_info) { '/' }
78
- it { should eq [nil, nil, nil] }
84
+ it { is_expected.to eq [nil, nil, nil] }
79
85
  end
80
86
 
81
87
  context path = '/aaa/bbb/AB-c.182-d.min.js' do
82
88
  let(:path_info) { path }
83
- it { should eq ['aaa/bbb/', 'AB-c.182-d.min', '.js'] }
89
+ it { is_expected.to eq ['aaa/bbb/', 'AB-c.182-d.min', '.js'] }
84
90
  end
85
91
  end
86
92
  end