mojito 0.1.1 → 0.1.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -3,6 +3,9 @@ require 'rack'
3
3
  require 'extlib'
4
4
 
5
5
  module Mojito
6
+
7
+ PLUGINS = {}
8
+
6
9
  require 'mojito/request_extensions'
7
10
  require 'mojito/helpers'
8
11
  require 'mojito/base'
@@ -14,6 +17,7 @@ module Mojito
14
17
  M = Matchers
15
18
  H = Helpers
16
19
 
20
+
17
21
  def self.included(type)
18
22
  type.instance_exec do
19
23
  ALL_HELPERS.reverse.each do |mod|
@@ -27,7 +31,12 @@ module Mojito
27
31
  cl.instance_exec do
28
32
  include Mojito::Base
29
33
  helpers.reverse.each do |helper|
30
- include helper
34
+ case helper
35
+ when Symbol
36
+ include PLUGINS[helper]
37
+ when Module
38
+ include helper
39
+ end
31
40
  end
32
41
  end
33
42
  cl.routes &block if block
@@ -50,6 +59,9 @@ module Mojito
50
59
  (ENV['RACK_ENV'] || :development).to_sym
51
60
  end
52
61
 
62
+ def self.development?
63
+ mode == :development
64
+ end
53
65
 
54
66
  ALL_HELPERS = [Mojito::Matchers, Mojito::Rendering, Mojito::Helpers::ExceptionHandling, Mojito::Helpers::Shortcuts, Mojito::Base]
55
67
 
@@ -1,5 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'mime/types'
4
+
3
5
  module Mojito
4
6
 
5
7
  module Base
@@ -9,19 +11,25 @@ module Mojito
9
11
  end
10
12
 
11
13
  def initialize(env)
12
- @__env = env
14
+ @__request = Rack::Request.new env.dup
15
+ self.env['MOJITO/CONTEXT_PATH'] = self.env['SCRIPT_NAME']
13
16
  end
14
17
 
15
18
  def env
16
- @__env
19
+ request.env
17
20
  end
18
21
 
19
22
  def request
20
- @__request ||= Rack::Request.new(env)
23
+ @__request
21
24
  end
22
25
 
23
26
  def response
24
- @__response ||= Rack::Response.new
27
+ @__response ||= Rack::Response.new.tap do |res|
28
+ if extension = request.path[/(?<=\.)\w+$/]
29
+ type = MIME::Types.type_for(extension).first
30
+ res.headers['Content-Type'] = type.to_s if type
31
+ end
32
+ end
25
33
  end
26
34
 
27
35
  def halt!(resp = response)
@@ -42,7 +50,7 @@ module Mojito
42
50
  # Dispatches the current request to the matching routes.
43
51
  def dispatch
44
52
  instance_exec &self.class.routes if self.class.routes
45
- Rack::Response.new [], 404, 'Content-Type' => 'application/octet-stream'
53
+ [404, { 'Content-Type' => 'application/octet-stream' }, []]
46
54
  end
47
55
 
48
56
  ##
@@ -64,7 +72,7 @@ module Mojito
64
72
  def __match?(matcher)
65
73
  case matcher
66
74
  when String, Regexp
67
- instance_exec &Matchers::PATH(matcher)
75
+ instance_exec &Mojito::Matchers::PATH(matcher)
68
76
  when Proc
69
77
  instance_exec &matcher
70
78
  else
@@ -77,7 +85,7 @@ module Mojito
77
85
 
78
86
  def call(env)
79
87
  catch :halt do
80
- new(env).dispatch
88
+ self.new(env).dispatch
81
89
  end
82
90
  end
83
91
 
@@ -79,6 +79,8 @@ module Mojito
79
79
 
80
80
  end
81
81
 
82
+ Mojito::PLUGINS[:exception_handling] = ExceptionHandling
83
+
82
84
  end
83
85
 
84
86
  end
@@ -1,31 +1,37 @@
1
1
  # encoding: UTF-8
2
2
 
3
- module Mojito::Helpers::Shortcuts
3
+ module Mojito::Helpers
4
4
 
5
- def captures
6
- request.captures
7
- end
8
-
9
- def locals
10
- request.locals
11
- end
12
-
13
- def script_name
14
- request.script_name
15
- end
16
-
17
- def path_info
18
- request.path_info
19
- end
5
+ module Shortcuts
20
6
 
21
- def session
22
- request.session
23
- end
24
-
25
- module ClassMethods
7
+ def captures
8
+ request.captures
9
+ end
10
+
11
+ def locals
12
+ request.locals
13
+ end
26
14
 
15
+ def script_name
16
+ request.script_name
17
+ end
27
18
 
19
+ def path_info
20
+ request.path_info
21
+ end
22
+
23
+ def session
24
+ request.session
25
+ end
26
+
27
+ module ClassMethods
28
+
29
+
30
+
31
+ end
28
32
 
29
33
  end
30
34
 
35
+ Mojito::PLUGINS[:shortcuts] = Shortcuts
36
+
31
37
  end
@@ -10,4 +10,6 @@ module Mojito::Matchers
10
10
 
11
11
  end
12
12
 
13
+ Mojito::PLUGINS[:environment] = Environment
14
+
13
15
  end
@@ -30,4 +30,6 @@ module Mojito::Matchers
30
30
 
31
31
  end
32
32
 
33
+ Mojito::PLUGINS[:methods] = Methods
34
+
33
35
  end
@@ -4,9 +4,9 @@ module Mojito::Matchers
4
4
 
5
5
  module Path
6
6
 
7
- def PATH(pattern)
7
+ def PATH(pattern, delimiter = %r{/|\z})
8
8
  consume_path = proc do |pattern|
9
- if match = env['PATH_INFO'].match(%r<\A/*#{pattern}(?=/|\z)>)
9
+ if match = env['PATH_INFO'].match(%r<\A/*#{pattern}(?=#{delimiter})>)
10
10
  env['SCRIPT_NAME'] = match.to_s
11
11
  env['PATH_INFO'] = match.post_match
12
12
  request.locals.update match.names.inject({}) {|hash, name| hash[name.to_sym] = match[name] ; hash }
@@ -19,7 +19,7 @@ module Mojito::Matchers
19
19
  proc do
20
20
  if p = case pattern
21
21
  when String
22
- pattern.gsub(%r{/?:\?\w+}) {|name| "(?:/(?<#{name[2..-1]}>[^/]+))?" }.gsub(%r{:\w+}) {|name| "(?<#{name[1..-1]}>[^/]+)" }
22
+ pattern.gsub(%r{/?:\?\w+}) {|name| "(?:/(?<#{name[2..-1]}>[^/]+?))?" }.gsub(%r{:\w+}) {|name| "(?<#{name[1..-1]}>[^/]+?)" }
23
23
  when Regexp
24
24
  pattern
25
25
  end
@@ -32,4 +32,6 @@ module Mojito::Matchers
32
32
 
33
33
  end
34
34
 
35
+ Mojito::PLUGINS[:path] = Path
36
+
35
37
  end
@@ -10,4 +10,6 @@ module Mojito::Matchers
10
10
 
11
11
  end
12
12
 
13
+ Mojito::PLUGINS[:session] = Session
14
+
13
15
  end
@@ -19,4 +19,6 @@ module Mojito::Matchers
19
19
 
20
20
  end
21
21
 
22
- end
22
+ Mojito::PLUGINS[:url_scheme] = UrlScheme
23
+
24
+ end
@@ -19,4 +19,6 @@ module Mojito::Matchers
19
19
 
20
20
  end
21
21
 
22
+ Mojito::PLUGINS[:virtual_host] = VirtualHost
23
+
22
24
  end
@@ -8,6 +8,17 @@ module Mojito::Rendering
8
8
  response.write content
9
9
  end
10
10
 
11
+ def render_as(type, content, *args)
12
+ renderer = "to_#{type}".to_sym
13
+ if content.respond_to? renderer
14
+ response.write(content.send(renderer, *args[0...content.method(renderer).arity]))
15
+ else
16
+ Mojito::Rendering::StatusCodes.instance_method(:not_found!).bind(self).call
17
+ end
18
+ end
19
+
11
20
  end
12
21
 
22
+ Mojito::PLUGINS[:content] = Content
23
+
13
24
  end
@@ -17,4 +17,6 @@ module Mojito::Rendering
17
17
 
18
18
  end
19
19
 
20
+ Mojito::PLUGINS[:content_types] = ContentTypes
21
+
20
22
  end
@@ -10,4 +10,6 @@ module Mojito::Rendering
10
10
 
11
11
  end
12
12
 
13
+ Mojito::PLUGINS[:delegation] = Delegation
14
+
13
15
  end
@@ -6,9 +6,10 @@ module Mojito::Rendering
6
6
  require 'pathname'
7
7
  require 'mime/types'
8
8
  require 'time'
9
+ require 'where'
9
10
 
10
11
  def file!(filename)
11
- path = Pathname === filename ? filename : Pathname.new(filename.to_s)
12
+ path = Where.cdir(1) + filename
12
13
  restrict_path! path if respond_to? :restrict_path!
13
14
  if path.readable? and path.file?
14
15
  body = FileResponse.new path
@@ -50,4 +51,6 @@ module Mojito::Rendering
50
51
 
51
52
  end
52
53
 
54
+ Mojito::PLUGINS[:file] = File
55
+
53
56
  end
@@ -35,4 +35,6 @@ module Mojito::Rendering
35
35
 
36
36
  end
37
37
 
38
+ Mojito::PLUGINS[:status_codes] = StatusCodes
39
+
38
40
  end
@@ -13,6 +13,7 @@ module Mojito::Rendering
13
13
  Tilt[args.first].new { args.last }
14
14
  elsif args.size == 1
15
15
  file = Where.cdir(1) + args.first
16
+ Mojito::R::StatusCodes.instance_method(:not_found!).bind(self).call unless file.exist?
16
17
  if %r{\.(?<extension>\w+)\.\w+$} =~ file.to_s
17
18
  response['Content-Type'] = MIME::Types.type_for(extension)
18
19
  end
@@ -23,4 +24,6 @@ module Mojito::Rendering
23
24
 
24
25
  end
25
26
 
27
+ Mojito::PLUGINS[:templates] = Templates
28
+
26
29
  end
@@ -10,6 +10,10 @@ class ::Rack::Request
10
10
  @env['mojito/locals'] ||= Mash.new
11
11
  end
12
12
 
13
+ def context_path
14
+ @env['MOJITO/CONTEXT_PATH']
15
+ end
16
+
13
17
  def script_name
14
18
  @env['SCRIPT_NAME']
15
19
  end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+ require 'simplecov' and SimpleCov.start do
3
+ add_filter "spec/"
4
+ end
5
+ require 'mojito'
6
+
7
+ describe Mojito::Base do
8
+
9
+ subject do
10
+ Mojito.base_application :status_codes do
11
+ on Mojito::Matchers::PATH('test.:extension') do ok! end
12
+ end.mock_request
13
+ end
14
+
15
+ it { subject.get('/test.html').headers.should include('Content-Type') }
16
+ it { subject.get('/test.html').headers['Content-Type'].should == 'text/html' }
17
+ it { subject.get('/test.txt').headers.should include('Content-Type') }
18
+ it { subject.get('/test.txt').headers['Content-Type'].should == 'text/plain' }
19
+ it { subject.get('/test.rb').headers.should include('Content-Type') }
20
+ it { subject.get('/test.rb').headers['Content-Type'].should == 'application/x-ruby' }
21
+
22
+ end
@@ -7,21 +7,23 @@ require 'mojito'
7
7
  describe Mojito::Rendering::Delegation do
8
8
 
9
9
  subject do
10
- sub_app = Mojito.base_application Mojito::R::Content, Mojito::R::Delegation do
10
+ sub_app = Mojito.base_application Mojito::R::Content, Mojito::M::Path do
11
+ on PATH('this/is/the/sub-application') do write request.context_path ; halt! end
11
12
  on true do write 'sub-application' ; halt! end
12
13
  end
13
14
  Mojito.base_application Mojito::Rendering::Content, Mojito::Rendering::Delegation do
14
- on true do run! sub_app end
15
+ on 'to/sub/app' do run! sub_app end
15
16
  end.mock_request
16
17
  end
17
18
 
18
- it { subject.get('/').status.should == 200 }
19
- it { subject.get('/').body.should == 'sub-application' }
19
+ it { subject.get('/to/sub/app').status.should == 200 }
20
+ it { subject.get('/to/sub/app').body.should == 'sub-application' }
21
+ it { subject.get('/to/sub/app/this/is/the/sub-application').body.should == '/to/sub/app' }
20
22
 
21
23
  context do
22
24
 
23
25
  subject do
24
- sub_app = Mojito.base_application Mojito::R::Content, Mojito::R::Delegation, Mojito::H::Shortcuts do
26
+ sub_app = Mojito.base_application Mojito::R::Content, Mojito::H::Shortcuts do
25
27
  on true do write("#{path_info} #{captures.first}") ; halt! end
26
28
  end
27
29
  Mojito.base_application Mojito::M::Path, Mojito::R::Content, Mojito::R::Delegation do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mojito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
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-05-25 00:00:00.000000000 Z
12
+ date: 2012-06-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &19113520 !ruby/object:Gem::Requirement
16
+ requirement: &15854720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.4.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *19113520
24
+ version_requirements: *15854720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mime-types
27
- requirement: &19113040 !ruby/object:Gem::Requirement
27
+ requirement: &15854100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.18'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *19113040
35
+ version_requirements: *15854100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: tilt
38
- requirement: &19112500 !ruby/object:Gem::Requirement
38
+ requirement: &15853440 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.3.3
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *19112500
46
+ version_requirements: *15853440
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: extlib
49
- requirement: &19111980 !ruby/object:Gem::Requirement
49
+ requirement: &15852680 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.9.15
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *19111980
57
+ version_requirements: *15852680
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: where-am-i
60
- requirement: &19111420 !ruby/object:Gem::Requirement
60
+ requirement: &15851760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.0
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *19111420
68
+ version_requirements: *15851760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &19110940 !ruby/object:Gem::Requirement
71
+ requirement: &15850760 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 2.8.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *19110940
79
+ version_requirements: *15850760
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rdoc
82
- requirement: &19110400 !ruby/object:Gem::Requirement
82
+ requirement: &15850180 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '3.12'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *19110400
90
+ version_requirements: *15850180
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: bundler
93
- requirement: &19109880 !ruby/object:Gem::Requirement
93
+ requirement: &15849540 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.0.0
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *19109880
101
+ version_requirements: *15849540
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: jeweler
104
- requirement: &19208400 !ruby/object:Gem::Requirement
104
+ requirement: &15848960 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 1.8.3
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *19208400
112
+ version_requirements: *15848960
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rcov
115
- requirement: &19207820 !ruby/object:Gem::Requirement
115
+ requirement: &15848300 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *19207820
123
+ version_requirements: *15848300
124
124
  description: A simple yet powerful webframework largely inspired by Rum and Cuba
125
125
  email: dev@trense.info
126
126
  executables: []
@@ -152,6 +152,7 @@ files:
152
152
  - lib/mojito/rendering/templates.rb
153
153
  - lib/mojito/request_extensions.rb
154
154
  - lib/mojito/utils/status_codes.rb
155
+ - spec/mojito/base_spec.rb
155
156
  - spec/mojito/helpers_spec.rb
156
157
  - spec/mojito/matchers/methods_spec.rb
157
158
  - spec/mojito/matchers/path_spec.rb