racket-mvc 0.0.3

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.
Files changed (32) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING.AGPL +661 -0
  3. data/README.md +40 -0
  4. data/Rakefile +13 -0
  5. data/lib/racket.rb +53 -0
  6. data/lib/racket/application.rb +253 -0
  7. data/lib/racket/controller.rb +148 -0
  8. data/lib/racket/current.rb +49 -0
  9. data/lib/racket/request.rb +32 -0
  10. data/lib/racket/response.rb +25 -0
  11. data/lib/racket/router.rb +114 -0
  12. data/lib/racket/session.rb +37 -0
  13. data/lib/racket/utils.rb +25 -0
  14. data/lib/racket/version.rb +33 -0
  15. data/lib/racket/view_cache.rb +110 -0
  16. data/spec/_custom.rb +48 -0
  17. data/spec/_default.rb +175 -0
  18. data/spec/racket.rb +24 -0
  19. data/spec/test_custom_app/controllers/sub1/custom_sub_controller_1.rb +15 -0
  20. data/spec/test_custom_app/controllers/sub2/custom_sub_controller_2.rb +32 -0
  21. data/spec/test_custom_app/controllers/sub3/custom_sub_controller_3.rb +13 -0
  22. data/spec/test_custom_app/controllers/sub3/inherited/custom_inherited_controller.rb +9 -0
  23. data/spec/test_custom_app/extra/blob.rb +1 -0
  24. data/spec/test_custom_app/extra/blob/inner_blob.rb +1 -0
  25. data/spec/test_custom_app/layouts/sub2/zebra.erb +7 -0
  26. data/spec/test_custom_app/templates/sub2/template.erb +1 -0
  27. data/spec/test_default_app/controllers/default_root_controller.rb +32 -0
  28. data/spec/test_default_app/controllers/sub1/default_sub_controller_1.rb +15 -0
  29. data/spec/test_default_app/controllers/sub2/default_sub_controller_2.rb +15 -0
  30. data/spec/test_default_app/controllers/sub3/default_sub_controller_3.rb +7 -0
  31. data/spec/test_default_app/controllers/sub3/inherited/default_inherited_controller.rb +9 -0
  32. metadata +200 -0
data/spec/_default.rb ADDED
@@ -0,0 +1,175 @@
1
+ describe 'The default Racket test Application' do
2
+ extend Rack::Test::Methods
3
+
4
+ def app
5
+ @app ||= Racket::Application.default
6
+ end
7
+
8
+ it 'should report the correct version' do
9
+ Racket.version.should.equal(Racket::Version.current)
10
+ end
11
+
12
+ it 'has mapped controllers correctly' do
13
+ routes_by_controller = actions_by_controller = nil
14
+ routes = app.instance_eval do
15
+ router.instance_eval do
16
+ routes_by_controller = @routes_by_controller
17
+ actions_by_controller = @actions_by_controller
18
+ end
19
+ end
20
+
21
+ routes_by_controller[DefaultRootController].should.equal('/')
22
+ routes_by_controller[DefaultSubController1].should.equal('/sub1')
23
+ routes_by_controller[DefaultSubController2].should.equal('/sub2')
24
+ routes_by_controller[DefaultSubController3].should.equal('/sub3')
25
+ routes_by_controller[DefaultInheritedController].should.equal('/sub3/inherited')
26
+
27
+ actions_by_controller[DefaultRootController].length.should.equal(5)
28
+ actions_by_controller[DefaultRootController].include?(:index).should.equal(true)
29
+ actions_by_controller[DefaultRootController].include?(:my_first_route).should.equal(true)
30
+ actions_by_controller[DefaultRootController].include?(:my_second_route).should.equal(true)
31
+ actions_by_controller[DefaultSubController1].length.should.equal(3)
32
+ actions_by_controller[DefaultSubController1].include?(:route_to_root).should.equal(true)
33
+ actions_by_controller[DefaultSubController1].include?(:route_to_nonexisting).should.equal(true)
34
+ actions_by_controller[DefaultSubController2].length.should.equal(3)
35
+ actions_by_controller[DefaultSubController2].include?(:index).should.equal(true)
36
+ actions_by_controller[DefaultSubController2].include?(:current_action).should.equal(true)
37
+ actions_by_controller[DefaultSubController2].include?(:current_params).should.equal(true)
38
+ actions_by_controller[DefaultSubController3].should.equal([:index])
39
+ actions_by_controller[DefaultInheritedController].should.equal([:index])
40
+ end
41
+
42
+ it 'should set rack variables correctly' do
43
+ get '/sub2/current_action'
44
+ last_response.status.should.equal(200)
45
+ last_response.body.should.equal('current_action')
46
+
47
+ get '/sub2/current_params/foo/bar/baz'
48
+ last_response.status.should.equal(200)
49
+ JSON.parse(last_response.body).should.equal(['foo', 'bar', 'baz'])
50
+ end
51
+
52
+ it 'returns the correct respnse when calling index action' do
53
+ # RootController
54
+ get '/'
55
+ last_response.status.should.equal(200)
56
+ last_response.body.should.equal('DefaultRootController::index')
57
+
58
+ # SubController1
59
+ get '/sub1'
60
+ last_response.status.should.equal(200)
61
+ last_response.body.should.equal('DefaultSubController1::index')
62
+
63
+ # SubController2
64
+ get '/sub2'
65
+ last_response.status.should.equal(200)
66
+ last_response.body.should.equal('DefaultSubController2::index')
67
+
68
+ # SubController3
69
+ get '/sub3'
70
+ last_response.status.should.equal(200)
71
+ last_response.body.should.equal('DefaultSubController3::index')
72
+
73
+ # InheritedController
74
+ get '/sub3/inherited'
75
+ last_response.status.should.equal(200)
76
+ last_response.body.should.equal('DefaultInheritedController::index')
77
+ end
78
+
79
+ it 'should return 404 on calling nonexisting action' do
80
+ get '/nonono'
81
+ last_response.status.should.equal(404)
82
+ last_response.body.should.equal('404 Not found')
83
+
84
+ get '/sub2/nonono'
85
+ last_response.status.should.equal(404)
86
+ last_response.body.should.equal('404 Not found')
87
+ end
88
+
89
+ it 'should be able to find routes within the same controller' do
90
+ get '/my_first_route'
91
+ last_response.status.should.equal(200)
92
+ last_response.body.should.equal('/my_second_route')
93
+
94
+ get '/my_second_route'
95
+ last_response.status.should.equal(200)
96
+ last_response.body.should.equal('/my_first_route/with/params')
97
+ end
98
+
99
+ it 'should be able to find routes in other controllers' do
100
+ get '/sub1/route_to_root'
101
+ last_response.status.should.equal(200)
102
+ last_response.body.should.equal('/index')
103
+
104
+ get '/sub1/route_to_nonexisting'
105
+ last_response.status.should.equal(200)
106
+ last_response.body.should.equal('/sub3/inherited/nonono/with/params')
107
+ end
108
+
109
+ it 'should be able to log messages to everybody' do
110
+ _logger = app.options[:logger]
111
+ sio = StringIO.new
112
+ app.options[:logger] = Logger.new(sio)
113
+ app.inform_all('Informational message');
114
+ sio.string.should.match(/Informational message/)
115
+ app.options[:logger] = _logger
116
+ end
117
+
118
+ it 'should be able to log messages to developer' do
119
+ _logger = app.options[:logger]
120
+ _mode = app.options[:mode]
121
+ sio = StringIO.new
122
+ app.options[:logger] = Logger.new(sio)
123
+ app.options[:mode] = :live
124
+ app.inform_dev('Development message');
125
+ sio.string.should.be.empty
126
+ app.options[:mode] = :dev
127
+ app.inform_dev('Hey, listen up!');
128
+ sio.string.should.match(%r(Hey, listen up!))
129
+ app.options[:mode] = _mode
130
+ app.options[:logger] = _logger
131
+ end
132
+
133
+ it 'should be able to set and clear session variables' do
134
+ get '/session_as_json'
135
+ last_response.headers.keys.should.not.include('Set-Cookie')
136
+ response = JSON.parse(last_response.body)
137
+ response.class.should.equal(Hash)
138
+ response.keys.should.be.empty
139
+ get '/session_as_json?foo=bar'
140
+ last_response.headers.keys.should.include('Set-Cookie')
141
+ last_response.headers['Set-Cookie'].should.match(%r(racket.session=))
142
+ response = JSON.parse(last_response.body)
143
+ response.class.should.equal(Hash)
144
+ response.keys.length.should.equal(2)
145
+ response.keys.should.include('foo')
146
+ response.keys.should.include('session_id')
147
+ get '/session_as_json?baz=quux'
148
+ last_response.headers.keys.should.include('Set-Cookie')
149
+ last_response.headers['Set-Cookie'].should.match(%r(racket.session=))
150
+ response = JSON.parse(last_response.body)
151
+ response.class.should.equal(Hash)
152
+ response.keys.length.should.equal(3)
153
+ response.keys.should.include('foo')
154
+ response.keys.should.include('baz')
155
+ response.keys.should.include('session_id')
156
+ get '/session_as_json?drop_session'
157
+ last_response.headers.keys.should.include('Set-Cookie')
158
+ last_response.headers['Set-Cookie'].should.match(%r(racket.session=))
159
+ response = JSON.parse(last_response.body)
160
+ response.class.should.equal(Hash)
161
+ response.keys.should.be.empty
162
+ get '/session_strings'
163
+ response = JSON.parse(last_response.body)
164
+ response.length.should.equal(3)
165
+ response.each { |elem| elem.should.match(%r(Racket::Session)) }
166
+ end
167
+
168
+ it 'should be able to build paths correctly' do
169
+ Racket::Utils.build_path.should.equal(Pathname.pwd.to_s)
170
+ Racket::Utils.build_path('foo', 'bar', 'baz').should.equal(
171
+ File.join(Pathname.pwd.to_s, 'foo', 'bar', 'baz')
172
+ )
173
+ end
174
+
175
+ end
data/spec/racket.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'simplecov'
2
+ require 'stringio'
3
+
4
+ SimpleCov.start do
5
+ add_filter 'spec'
6
+ end
7
+
8
+ if ENV['CI'] == 'true'
9
+ require 'codecov'
10
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
11
+ end
12
+
13
+ TEST_DEFAULT_APP_DIR = File.absolute_path(File.join(File.dirname(__FILE__), 'test_default_app'))
14
+ TEST_CUSTOM_APP_DIR = File.absolute_path(File.join(File.dirname(__FILE__), 'test_custom_app'))
15
+
16
+ require 'racket'
17
+ require 'rack/test'
18
+ require 'bacon'
19
+
20
+ Dir.chdir(TEST_DEFAULT_APP_DIR) { require_relative '_default.rb' }
21
+
22
+ Racket::Application.class_eval { @current = nil }
23
+
24
+ Dir.chdir(TEST_CUSTOM_APP_DIR) { require_relative '_custom.rb' }
@@ -0,0 +1,15 @@
1
+ class CustomSubController1 < Racket::Controller
2
+
3
+ def index
4
+ "#{self.class}::#{__method__}"
5
+ end
6
+
7
+ def route_to_root
8
+ r(CustomRootController, :index)
9
+ end
10
+
11
+ def route_to_nonexisting
12
+ r(CustomInheritedController, :nonono, :with, :params)
13
+ end
14
+
15
+ end
@@ -0,0 +1,32 @@
1
+ class CustomSubController2 < Racket::Controller
2
+
3
+ def index
4
+ "#{self.class}::#{__method__}"
5
+ end
6
+
7
+ def current_action
8
+ racket.action
9
+ end
10
+
11
+ def current_params
12
+ racket.params.to_json
13
+ end
14
+
15
+ def template
16
+ @message = 'Message from template'
17
+ end
18
+
19
+ def hook_action
20
+ @action = 'Data added in action'
21
+ [@before, @action].to_json
22
+ end
23
+
24
+ before do
25
+ @before = 'Data added in before block'
26
+ end
27
+
28
+ after :hook_action do
29
+ response.headers['X-Hook-Action'] = 'run'
30
+ end
31
+
32
+ end
@@ -0,0 +1,13 @@
1
+ class CustomSubController3 < Racket::Controller
2
+
3
+ set_option(:top_secret, 42)
4
+
5
+ def index
6
+ "#{self.class}::#{__method__}"
7
+ end
8
+
9
+ def a_secret_place
10
+ redirect(rs(__method__, controller_option(:top_secret)))
11
+ end
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../custom_sub_controller_3.rb'
2
+
3
+ class CustomInheritedController < CustomSubController3
4
+
5
+ def index
6
+ "#{self.class}::#{__method__}"
7
+ end
8
+
9
+ end
@@ -0,0 +1 @@
1
+ class Blob; end
@@ -0,0 +1 @@
1
+ class InnerBlob; end
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <body>
4
+ <p>A groovy layout</p>
5
+ <p><%=yield%></p>
6
+ </body>
7
+ </html>
@@ -0,0 +1 @@
1
+ <%=@message%>
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+
3
+ class DefaultRootController < Racket::Controller
4
+
5
+ def index
6
+ "#{self.class}::#{__method__}"
7
+ end
8
+
9
+ def my_first_route
10
+ rs(:my_second_route)
11
+ end
12
+
13
+ def my_second_route
14
+ rs(:my_first_route, :with, 'params')
15
+ end
16
+
17
+ def session_as_json
18
+ request.GET.each_pair do |key, value|
19
+ if key == 'drop_session'
20
+ session.clear
21
+ else
22
+ session[key] = value
23
+ end
24
+ end
25
+ session.to_hash.to_json
26
+ end
27
+
28
+ def session_strings
29
+ [session.inspect, session.to_s, session.to_str].to_json
30
+ end
31
+
32
+ end
@@ -0,0 +1,15 @@
1
+ class DefaultSubController1 < Racket::Controller
2
+
3
+ def index
4
+ "#{self.class}::#{__method__}"
5
+ end
6
+
7
+ def route_to_root
8
+ r(DefaultRootController, :index)
9
+ end
10
+
11
+ def route_to_nonexisting
12
+ r(DefaultInheritedController, :nonono, :with, :params)
13
+ end
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ class DefaultSubController2 < Racket::Controller
2
+
3
+ def index
4
+ "#{self.class}::#{__method__}"
5
+ end
6
+
7
+ def current_action
8
+ racket.action
9
+ end
10
+
11
+ def current_params
12
+ racket.params.to_json
13
+ end
14
+
15
+ end
@@ -0,0 +1,7 @@
1
+ class DefaultSubController3 < Racket::Controller
2
+
3
+ def index
4
+ "#{self.class}::#{__method__}"
5
+ end
6
+
7
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../default_sub_controller_3.rb'
2
+
3
+ class DefaultInheritedController < DefaultSubController3
4
+
5
+ def index
6
+ "#{self.class}::#{__method__}"
7
+ end
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: racket-mvc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Lars Olsson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http_router
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tilt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bacon
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.0.8
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.0.8
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.10'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.10'
125
+ - !ruby/object:Gem::Dependency
126
+ name: yard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Racket is a small MVC framework built atop of rack.
140
+ email: lasso@lassoweb.se
141
+ executables: []
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - COPYING.AGPL
146
+ - README.md
147
+ - Rakefile
148
+ - lib/racket.rb
149
+ - lib/racket/application.rb
150
+ - lib/racket/controller.rb
151
+ - lib/racket/current.rb
152
+ - lib/racket/request.rb
153
+ - lib/racket/response.rb
154
+ - lib/racket/router.rb
155
+ - lib/racket/session.rb
156
+ - lib/racket/utils.rb
157
+ - lib/racket/version.rb
158
+ - lib/racket/view_cache.rb
159
+ - spec/_custom.rb
160
+ - spec/_default.rb
161
+ - spec/racket.rb
162
+ - spec/test_custom_app/controllers/sub1/custom_sub_controller_1.rb
163
+ - spec/test_custom_app/controllers/sub2/custom_sub_controller_2.rb
164
+ - spec/test_custom_app/controllers/sub3/custom_sub_controller_3.rb
165
+ - spec/test_custom_app/controllers/sub3/inherited/custom_inherited_controller.rb
166
+ - spec/test_custom_app/extra/blob.rb
167
+ - spec/test_custom_app/extra/blob/inner_blob.rb
168
+ - spec/test_custom_app/layouts/sub2/zebra.erb
169
+ - spec/test_custom_app/templates/sub2/template.erb
170
+ - spec/test_default_app/controllers/default_root_controller.rb
171
+ - spec/test_default_app/controllers/sub1/default_sub_controller_1.rb
172
+ - spec/test_default_app/controllers/sub2/default_sub_controller_2.rb
173
+ - spec/test_default_app/controllers/sub3/default_sub_controller_3.rb
174
+ - spec/test_default_app/controllers/sub3/inherited/default_inherited_controller.rb
175
+ homepage: https://github.com/lasso/racket
176
+ licenses:
177
+ - GNU AFFERO GENERAL PUBLIC LICENSE, version 3
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: 2.0.0
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.4.7
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Racket - The noisy Rack MVC framework
199
+ test_files: []
200
+ has_rdoc: