aldebaran 1.0.1

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 (97) hide show
  1. data/.gitignore +13 -0
  2. data/.travis.yml +16 -0
  3. data/.yardopts +4 -0
  4. data/AUTHORS +4 -0
  5. data/Gemfile +77 -0
  6. data/KNOWN_ISSUES +5 -0
  7. data/LICENSE +22 -0
  8. data/README.rdoc +1900 -0
  9. data/Rakefile +175 -0
  10. data/aldebaran.gemspec +19 -0
  11. data/lib/aldebaran.rb +7 -0
  12. data/lib/aldebaran/base.rb +1600 -0
  13. data/lib/aldebaran/images/404.png +0 -0
  14. data/lib/aldebaran/images/500.png +0 -0
  15. data/lib/aldebaran/main.rb +28 -0
  16. data/lib/aldebaran/showexceptions.rb +340 -0
  17. data/lib/aldebaran/version.rb +3 -0
  18. data/test/aldebaran_test.rb +17 -0
  19. data/test/base_test.rb +160 -0
  20. data/test/builder_test.rb +95 -0
  21. data/test/coffee_test.rb +92 -0
  22. data/test/contest.rb +98 -0
  23. data/test/creole_test.rb +65 -0
  24. data/test/delegator_test.rb +162 -0
  25. data/test/encoding_test.rb +20 -0
  26. data/test/erb_test.rb +104 -0
  27. data/test/extensions_test.rb +100 -0
  28. data/test/filter_test.rb +397 -0
  29. data/test/haml_test.rb +101 -0
  30. data/test/helper.rb +115 -0
  31. data/test/helpers_test.rb +1192 -0
  32. data/test/less_test.rb +67 -0
  33. data/test/liquid_test.rb +59 -0
  34. data/test/mapped_error_test.rb +259 -0
  35. data/test/markaby_test.rb +80 -0
  36. data/test/markdown_test.rb +81 -0
  37. data/test/middleware_test.rb +68 -0
  38. data/test/nokogiri_test.rb +69 -0
  39. data/test/public/favicon.ico +0 -0
  40. data/test/radius_test.rb +59 -0
  41. data/test/rdoc_test.rb +65 -0
  42. data/test/readme_test.rb +136 -0
  43. data/test/request_test.rb +45 -0
  44. data/test/response_test.rb +61 -0
  45. data/test/result_test.rb +98 -0
  46. data/test/route_added_hook_test.rb +59 -0
  47. data/test/routing_test.rb +1096 -0
  48. data/test/sass_test.rb +115 -0
  49. data/test/scss_test.rb +88 -0
  50. data/test/server_test.rb +48 -0
  51. data/test/settings_test.rb +493 -0
  52. data/test/slim_test.rb +98 -0
  53. data/test/static_test.rb +178 -0
  54. data/test/streaming_test.rb +100 -0
  55. data/test/templates_test.rb +298 -0
  56. data/test/textile_test.rb +65 -0
  57. data/test/views/a/in_a.str +1 -0
  58. data/test/views/ascii.erb +2 -0
  59. data/test/views/b/in_b.str +1 -0
  60. data/test/views/calc.html.erb +1 -0
  61. data/test/views/error.builder +3 -0
  62. data/test/views/error.erb +3 -0
  63. data/test/views/error.haml +3 -0
  64. data/test/views/error.sass +2 -0
  65. data/test/views/explicitly_nested.str +1 -0
  66. data/test/views/foo/hello.test +1 -0
  67. data/test/views/hello.builder +1 -0
  68. data/test/views/hello.coffee +1 -0
  69. data/test/views/hello.creole +1 -0
  70. data/test/views/hello.erb +1 -0
  71. data/test/views/hello.haml +1 -0
  72. data/test/views/hello.less +5 -0
  73. data/test/views/hello.liquid +1 -0
  74. data/test/views/hello.mab +1 -0
  75. data/test/views/hello.md +1 -0
  76. data/test/views/hello.nokogiri +1 -0
  77. data/test/views/hello.radius +1 -0
  78. data/test/views/hello.rdoc +1 -0
  79. data/test/views/hello.sass +2 -0
  80. data/test/views/hello.scss +3 -0
  81. data/test/views/hello.slim +1 -0
  82. data/test/views/hello.str +1 -0
  83. data/test/views/hello.test +1 -0
  84. data/test/views/hello.textile +1 -0
  85. data/test/views/layout2.builder +3 -0
  86. data/test/views/layout2.erb +2 -0
  87. data/test/views/layout2.haml +2 -0
  88. data/test/views/layout2.liquid +2 -0
  89. data/test/views/layout2.mab +2 -0
  90. data/test/views/layout2.nokogiri +3 -0
  91. data/test/views/layout2.radius +2 -0
  92. data/test/views/layout2.slim +3 -0
  93. data/test/views/layout2.str +2 -0
  94. data/test/views/layout2.test +1 -0
  95. data/test/views/nested.str +1 -0
  96. data/test/views/utf8.erb +2 -0
  97. metadata +231 -0
@@ -0,0 +1,81 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ MarkdownTest = proc do
4
+ def markdown_app(&block)
5
+ mock_app do
6
+ set :views, File.dirname(__FILE__) + '/views'
7
+ get '/', &block
8
+ end
9
+ get '/'
10
+ end
11
+
12
+ def setup
13
+ Tilt.prefer engine, 'markdown', 'mkd', 'md'
14
+ super
15
+ end
16
+
17
+ it 'uses the correct engine' do
18
+ assert_equal engine, Tilt[:md]
19
+ assert_equal engine, Tilt[:mkd]
20
+ assert_equal engine, Tilt[:markdown]
21
+ end
22
+
23
+ it 'renders inline markdown strings' do
24
+ markdown_app { markdown '# Hiya' }
25
+ assert ok?
26
+ assert_like "<h1>Hiya</h1>\n", body
27
+ end
28
+
29
+ it 'renders .markdown files in views path' do
30
+ markdown_app { markdown :hello }
31
+ assert ok?
32
+ assert_like "<h1>Hello From Markdown</h1>", body
33
+ end
34
+
35
+ it "raises error if template not found" do
36
+ mock_app { get('/') { markdown :no_such_template } }
37
+ assert_raise(Errno::ENOENT) { get('/') }
38
+ end
39
+
40
+ it "renders with inline layouts" do
41
+ mock_app do
42
+ layout { 'THIS. IS. #{yield.upcase}!' }
43
+ get('/') { markdown 'Sparta', :layout_engine => :str }
44
+ end
45
+ get '/'
46
+ assert ok?
47
+ assert_like 'THIS. IS. <P>SPARTA</P>!', body
48
+ end
49
+
50
+ it "renders with file layouts" do
51
+ markdown_app { markdown 'Hello World', :layout => :layout2, :layout_engine => :erb }
52
+ assert ok?
53
+ assert_body "ERB Layout!\n<p>Hello World</p>"
54
+ end
55
+
56
+ it "can be used in a nested fashion for partials and whatnot" do
57
+ mock_app do
58
+ template(:inner) { "hi" }
59
+ template(:outer) { "<outer><%= markdown :inner %></outer>" }
60
+ get '/' do
61
+ erb :outer
62
+ end
63
+ end
64
+
65
+ get '/'
66
+ assert ok?
67
+ assert_like '<outer><p>hi</p></outer>', body
68
+ end
69
+ end
70
+
71
+ # Will generate RDiscountTest, KramdownTest, etc.
72
+ Tilt.mappings['md'].each do |t|
73
+ begin
74
+ t.new { "" }
75
+ klass = Class.new(Test::Unit::TestCase) { define_method(:engine) { t }}
76
+ klass.class_eval(&MarkdownTest)
77
+ Object.const_set t.name[/[^:]+(?=Template$)/] << "Test", klass
78
+ rescue LoadError
79
+ warn "#{$!}: skipping markdown tests with #{t}"
80
+ end
81
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class MiddlewareTest < Test::Unit::TestCase
4
+ setup do
5
+ @app = mock_app(aldebaran::Application) {
6
+ get '/*' do
7
+ response.headers['X-Tests'] = env['test.ran'].
8
+ map { |n| n.split('::').last }.
9
+ join(', ')
10
+ env['PATH_INFO']
11
+ end
12
+ }
13
+ end
14
+
15
+ class MockMiddleware < Struct.new(:app)
16
+ def call(env)
17
+ (env['test.ran'] ||= []) << self.class.to_s
18
+ app.call(env)
19
+ end
20
+ end
21
+
22
+ class UpcaseMiddleware < MockMiddleware
23
+ def call(env)
24
+ env['PATH_INFO'] = env['PATH_INFO'].upcase
25
+ super
26
+ end
27
+ end
28
+
29
+ it "is added with aldebaran::Application.use" do
30
+ @app.use UpcaseMiddleware
31
+ get '/hello-world'
32
+ assert ok?
33
+ assert_equal '/HELLO-WORLD', body
34
+ end
35
+
36
+ class DowncaseMiddleware < MockMiddleware
37
+ def call(env)
38
+ env['PATH_INFO'] = env['PATH_INFO'].downcase
39
+ super
40
+ end
41
+ end
42
+
43
+ it "runs in the order defined" do
44
+ @app.use UpcaseMiddleware
45
+ @app.use DowncaseMiddleware
46
+ get '/Foo'
47
+ assert_equal "/foo", body
48
+ assert_equal "UpcaseMiddleware, DowncaseMiddleware", response['X-Tests']
49
+ end
50
+
51
+ it "resets the prebuilt pipeline when new middleware is added" do
52
+ @app.use UpcaseMiddleware
53
+ get '/Foo'
54
+ assert_equal "/FOO", body
55
+ @app.use DowncaseMiddleware
56
+ get '/Foo'
57
+ assert_equal '/foo', body
58
+ assert_equal "UpcaseMiddleware, DowncaseMiddleware", response['X-Tests']
59
+ end
60
+
61
+ it "works when app is used as middleware" do
62
+ @app.use UpcaseMiddleware
63
+ @app = @app.new
64
+ get '/Foo'
65
+ assert_equal "/FOO", body
66
+ assert_equal "UpcaseMiddleware", response['X-Tests']
67
+ end
68
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ begin
4
+ require 'nokogiri'
5
+
6
+ class NokogiriTest < Test::Unit::TestCase
7
+ def nokogiri_app(&block)
8
+ mock_app do
9
+ set :views, File.dirname(__FILE__) + '/views'
10
+ get '/', &block
11
+ end
12
+ get '/'
13
+ end
14
+
15
+ it 'renders inline Nokogiri strings' do
16
+ nokogiri_app { nokogiri 'xml' }
17
+ assert ok?
18
+ assert_body %(<?xml version="1.0"?>\n)
19
+ end
20
+
21
+ it 'renders inline blocks' do
22
+ nokogiri_app do
23
+ @name = "Frank & Mary"
24
+ nokogiri do |xml|
25
+ xml.couple @name
26
+ end
27
+ end
28
+ assert ok?
29
+ assert_body %(<?xml version="1.0"?>\n<couple>Frank &amp; Mary</couple>\n)
30
+ end
31
+
32
+ it 'renders .nokogiri files in views path' do
33
+ nokogiri_app do
34
+ @name = "Blue"
35
+ nokogiri :hello
36
+ end
37
+ assert ok?
38
+ assert_body "<?xml version=\"1.0\"?>\n<exclaim>You're my boy, Blue!</exclaim>\n"
39
+ end
40
+
41
+ it "renders with inline layouts" do
42
+ next if Tilt::VERSION <= "1.1"
43
+ mock_app do
44
+ layout { %(xml.layout { xml << yield }) }
45
+ get('/') { nokogiri %(xml.em 'Hello World') }
46
+ end
47
+ get '/'
48
+ assert ok?
49
+ assert_body %(<?xml version="1.0"?>\n<layout>\n <em>Hello World</em>\n</layout>\n)
50
+ end
51
+
52
+ it "renders with file layouts" do
53
+ next if Tilt::VERSION <= "1.1"
54
+ nokogiri_app do
55
+ nokogiri %(xml.em 'Hello World'), :layout => :layout2
56
+ end
57
+ assert ok?
58
+ assert_body %(<?xml version="1.0"?>\n<layout>\n <em>Hello World</em>\n</layout>\n)
59
+ end
60
+
61
+ it "raises error if template not found" do
62
+ mock_app { get('/') { nokogiri :no_such_template } }
63
+ assert_raise(Errno::ENOENT) { get('/') }
64
+ end
65
+ end
66
+
67
+ rescue LoadError
68
+ warn "#{$!.to_s}: skipping nokogiri tests"
69
+ end
File without changes
@@ -0,0 +1,59 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ begin
4
+ require 'radius'
5
+
6
+ class RadiusTest < Test::Unit::TestCase
7
+ def radius_app(&block)
8
+ mock_app do
9
+ set :views, File.dirname(__FILE__) + '/views'
10
+ get '/', &block
11
+ end
12
+ get '/'
13
+ end
14
+
15
+ it 'renders inline radius strings' do
16
+ radius_app { radius '<h1>Hiya</h1>' }
17
+ assert ok?
18
+ assert_equal "<h1>Hiya</h1>", body
19
+ end
20
+
21
+ it 'renders .radius files in views path' do
22
+ radius_app { radius :hello }
23
+ assert ok?
24
+ assert_equal "<h1>Hello From Radius</h1>\n", body
25
+ end
26
+
27
+ it "renders with inline layouts" do
28
+ mock_app do
29
+ layout { "<h1>THIS. IS. <r:yield /></h1>" }
30
+ get('/') { radius '<EM>SPARTA</EM>' }
31
+ end
32
+ get '/'
33
+ assert ok?
34
+ assert_equal "<h1>THIS. IS. <EM>SPARTA</EM></h1>", body
35
+ end
36
+
37
+ it "renders with file layouts" do
38
+ radius_app { radius 'Hello World', :layout => :layout2 }
39
+ assert ok?
40
+ assert_equal "<h1>Radius Layout!</h1>\n<p>Hello World</p>\n", body
41
+ end
42
+
43
+ it "raises error if template not found" do
44
+ mock_app { get('/') { radius :no_such_template } }
45
+ assert_raise(Errno::ENOENT) { get('/') }
46
+ end
47
+
48
+ it "allows passing locals" do
49
+ radius_app do
50
+ radius '<r:value />', :locals => { :value => 'foo' }
51
+ end
52
+ assert ok?
53
+ assert_equal 'foo', body
54
+ end
55
+ end
56
+
57
+ rescue LoadError
58
+ warn "#{$!.to_s}: skipping radius tests"
59
+ end
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ begin
4
+ require 'rdoc/markup/to_html'
5
+
6
+ class RdocTest < Test::Unit::TestCase
7
+ def rdoc_app(&block)
8
+ mock_app do
9
+ set :views, File.dirname(__FILE__) + '/views'
10
+ get '/', &block
11
+ end
12
+ get '/'
13
+ end
14
+
15
+ it 'renders inline rdoc strings' do
16
+ rdoc_app { rdoc '= Hiya' }
17
+ assert ok?
18
+ assert_body "<h1>Hiya</h1>"
19
+ end
20
+
21
+ it 'renders .rdoc files in views path' do
22
+ rdoc_app { rdoc :hello }
23
+ assert ok?
24
+ assert_body "<h1>Hello From RDoc</h1>"
25
+ end
26
+
27
+ it "raises error if template not found" do
28
+ mock_app { get('/') { rdoc :no_such_template } }
29
+ assert_raise(Errno::ENOENT) { get('/') }
30
+ end
31
+
32
+ it "renders with inline layouts" do
33
+ mock_app do
34
+ layout { 'THIS. IS. #{yield.upcase}!' }
35
+ get('/') { rdoc 'Sparta', :layout_engine => :str }
36
+ end
37
+ get '/'
38
+ assert ok?
39
+ assert_like 'THIS. IS. <P>SPARTA</P>!', body
40
+ end
41
+
42
+ it "renders with file layouts" do
43
+ rdoc_app { rdoc 'Hello World', :layout => :layout2, :layout_engine => :erb }
44
+ assert ok?
45
+ assert_body "ERB Layout!\n<p>Hello World</p>"
46
+ end
47
+
48
+ it "can be used in a nested fashion for partials and whatnot" do
49
+ mock_app do
50
+ template(:inner) { "hi" }
51
+ template(:outer) { "<outer><%= rdoc :inner %></outer>" }
52
+ get '/' do
53
+ erb :outer
54
+ end
55
+ end
56
+
57
+ get '/'
58
+ assert ok?
59
+ assert_like '<outer><p>hi</p></outer>', body
60
+ end
61
+ end
62
+
63
+ rescue LoadError
64
+ warn "#{$!.to_s}: skipping rdoc tests"
65
+ end
@@ -0,0 +1,136 @@
1
+ # Tests to check if all the README examples work.
2
+ require File.expand_path('../helper', __FILE__)
3
+
4
+ class ReadmeTest < Test::Unit::TestCase
5
+ example do
6
+ mock_app { get('/') { 'Hello world!' } }
7
+ get '/'
8
+ assert_body 'Hello world!'
9
+ end
10
+
11
+ section "Routes" do
12
+ example do
13
+ mock_app do
14
+ get '/' do
15
+ ".. show something .."
16
+ end
17
+
18
+ post '/' do
19
+ ".. create something .."
20
+ end
21
+
22
+ put '/' do
23
+ ".. replace something .."
24
+ end
25
+
26
+ patch '/' do
27
+ ".. modify something .."
28
+ end
29
+
30
+ delete '/' do
31
+ ".. annihilate something .."
32
+ end
33
+
34
+ options '/' do
35
+ ".. appease something .."
36
+ end
37
+ end
38
+
39
+ get '/'
40
+ assert_body '.. show something ..'
41
+
42
+ post '/'
43
+ assert_body '.. create something ..'
44
+
45
+ put '/'
46
+ assert_body '.. replace something ..'
47
+
48
+ patch '/'
49
+ assert_body '.. modify something ..'
50
+
51
+ delete '/'
52
+ assert_body '.. annihilate something ..'
53
+
54
+ options '/'
55
+ assert_body '.. appease something ..'
56
+ end
57
+
58
+ example do
59
+ mock_app do
60
+ get '/hello/:name' do
61
+ # matches "GET /hello/foo" and "GET /hello/bar"
62
+ # params[:name] is 'foo' or 'bar'
63
+ "Hello #{params[:name]}!"
64
+ end
65
+ end
66
+
67
+ get '/hello/foo'
68
+ assert_body 'Hello foo!'
69
+
70
+ get '/hello/bar'
71
+ assert_body 'Hello bar!'
72
+ end
73
+
74
+ example do
75
+ mock_app do
76
+ get '/hello/:name' do |n|
77
+ "Hello #{n}!"
78
+ end
79
+ end
80
+
81
+ get '/hello/foo'
82
+ assert_body 'Hello foo!'
83
+
84
+ get '/hello/bar'
85
+ assert_body 'Hello bar!'
86
+ end
87
+
88
+ example do
89
+ mock_app do
90
+ get '/say/*/to/*' do
91
+ # matches /say/hello/to/world
92
+ params[:splat].inspect # => ["hello", "world"]
93
+ end
94
+
95
+ get '/download/*.*' do
96
+ # matches /download/path/to/file.xml
97
+ params[:splat].inspect # => ["path/to/file", "xml"]
98
+ end
99
+ end
100
+
101
+ get "/say/hello/to/world"
102
+ assert_body '["hello", "world"]'
103
+
104
+ get "/download/path/to/file.xml"
105
+ assert_body '["path/to/file", "xml"]'
106
+ end
107
+
108
+ example do
109
+ mock_app do
110
+ get %r{/hello/([\w]+)} do
111
+ "Hello, #{params[:captures].first}!"
112
+ end
113
+ end
114
+
115
+ get '/hello/foo'
116
+ assert_body 'Hello, foo!'
117
+
118
+ get '/hello/bar'
119
+ assert_body 'Hello, bar!'
120
+ end
121
+
122
+ example do
123
+ mock_app do
124
+ get %r{/hello/([\w]+)} do |c|
125
+ "Hello, #{c}!"
126
+ end
127
+ end
128
+
129
+ get '/hello/foo'
130
+ assert_body 'Hello, foo!'
131
+
132
+ get '/hello/bar'
133
+ assert_body 'Hello, bar!'
134
+ end
135
+ end
136
+ end