innate 2009.04

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 (128) hide show
  1. data/CHANGELOG +2981 -0
  2. data/COPYING +18 -0
  3. data/MANIFEST +127 -0
  4. data/README.md +563 -0
  5. data/Rakefile +35 -0
  6. data/example/app/retro_games.rb +60 -0
  7. data/example/app/todo/layout/default.xhtml +11 -0
  8. data/example/app/todo/spec/todo.rb +63 -0
  9. data/example/app/todo/start.rb +51 -0
  10. data/example/app/todo/view/index.xhtml +39 -0
  11. data/example/app/whywiki_erb/layout/wiki.html.erb +15 -0
  12. data/example/app/whywiki_erb/spec/wiki.rb +19 -0
  13. data/example/app/whywiki_erb/start.rb +42 -0
  14. data/example/app/whywiki_erb/view/edit.erb +6 -0
  15. data/example/app/whywiki_erb/view/index.erb +12 -0
  16. data/example/custom_middleware.rb +35 -0
  17. data/example/hello.rb +11 -0
  18. data/example/howto_spec.rb +35 -0
  19. data/example/link.rb +27 -0
  20. data/example/provides.rb +31 -0
  21. data/example/session.rb +38 -0
  22. data/innate.gemspec +29 -0
  23. data/lib/innate.rb +269 -0
  24. data/lib/innate/action.rb +150 -0
  25. data/lib/innate/adapter.rb +76 -0
  26. data/lib/innate/cache.rb +134 -0
  27. data/lib/innate/cache/api.rb +128 -0
  28. data/lib/innate/cache/drb.rb +58 -0
  29. data/lib/innate/cache/file_based.rb +41 -0
  30. data/lib/innate/cache/marshal.rb +17 -0
  31. data/lib/innate/cache/memory.rb +22 -0
  32. data/lib/innate/cache/yaml.rb +17 -0
  33. data/lib/innate/current.rb +37 -0
  34. data/lib/innate/dynamap.rb +96 -0
  35. data/lib/innate/helper.rb +183 -0
  36. data/lib/innate/helper/aspect.rb +124 -0
  37. data/lib/innate/helper/cgi.rb +54 -0
  38. data/lib/innate/helper/flash.rb +36 -0
  39. data/lib/innate/helper/link.rb +94 -0
  40. data/lib/innate/helper/redirect.rb +85 -0
  41. data/lib/innate/helper/render.rb +87 -0
  42. data/lib/innate/helper/send_file.rb +26 -0
  43. data/lib/innate/log.rb +20 -0
  44. data/lib/innate/log/color_formatter.rb +43 -0
  45. data/lib/innate/log/hub.rb +73 -0
  46. data/lib/innate/middleware_compiler.rb +65 -0
  47. data/lib/innate/mock.rb +49 -0
  48. data/lib/innate/node.rb +1025 -0
  49. data/lib/innate/options.rb +37 -0
  50. data/lib/innate/options/dsl.rb +202 -0
  51. data/lib/innate/options/stub.rb +7 -0
  52. data/lib/innate/request.rb +141 -0
  53. data/lib/innate/response.rb +23 -0
  54. data/lib/innate/route.rb +110 -0
  55. data/lib/innate/session.rb +121 -0
  56. data/lib/innate/session/flash.rb +94 -0
  57. data/lib/innate/spec.rb +23 -0
  58. data/lib/innate/state.rb +27 -0
  59. data/lib/innate/state/accessor.rb +130 -0
  60. data/lib/innate/state/fiber.rb +74 -0
  61. data/lib/innate/state/thread.rb +47 -0
  62. data/lib/innate/traited.rb +85 -0
  63. data/lib/innate/trinity.rb +18 -0
  64. data/lib/innate/version.rb +3 -0
  65. data/lib/innate/view.rb +60 -0
  66. data/lib/innate/view/erb.rb +15 -0
  67. data/lib/innate/view/etanni.rb +36 -0
  68. data/lib/innate/view/none.rb +9 -0
  69. data/spec/example/app/retro_games.rb +30 -0
  70. data/spec/example/hello.rb +13 -0
  71. data/spec/example/link.rb +25 -0
  72. data/spec/example/provides.rb +16 -0
  73. data/spec/example/session.rb +22 -0
  74. data/spec/helper.rb +10 -0
  75. data/spec/innate/action/layout.rb +107 -0
  76. data/spec/innate/action/layout/file_layout.xhtml +1 -0
  77. data/spec/innate/cache/common.rb +47 -0
  78. data/spec/innate/cache/marshal.rb +5 -0
  79. data/spec/innate/cache/memory.rb +5 -0
  80. data/spec/innate/cache/yaml.rb +5 -0
  81. data/spec/innate/dynamap.rb +22 -0
  82. data/spec/innate/helper.rb +86 -0
  83. data/spec/innate/helper/aspect.rb +75 -0
  84. data/spec/innate/helper/cgi.rb +37 -0
  85. data/spec/innate/helper/flash.rb +118 -0
  86. data/spec/innate/helper/link.rb +139 -0
  87. data/spec/innate/helper/redirect.rb +160 -0
  88. data/spec/innate/helper/render.rb +133 -0
  89. data/spec/innate/helper/send_file.rb +21 -0
  90. data/spec/innate/helper/view/aspect_hello.xhtml +1 -0
  91. data/spec/innate/helper/view/locals.xhtml +1 -0
  92. data/spec/innate/helper/view/loop.xhtml +4 -0
  93. data/spec/innate/helper/view/num.xhtml +1 -0
  94. data/spec/innate/helper/view/partial.xhtml +1 -0
  95. data/spec/innate/helper/view/recursive.xhtml +7 -0
  96. data/spec/innate/mock.rb +84 -0
  97. data/spec/innate/node/mapping.rb +37 -0
  98. data/spec/innate/node/node.rb +134 -0
  99. data/spec/innate/node/resolve.rb +82 -0
  100. data/spec/innate/node/view/another_layout/another_layout.xhtml +3 -0
  101. data/spec/innate/node/view/bar.xhtml +1 -0
  102. data/spec/innate/node/view/foo.html.xhtml +1 -0
  103. data/spec/innate/node/view/only_view.xhtml +1 -0
  104. data/spec/innate/node/view/with_layout.xhtml +1 -0
  105. data/spec/innate/node/wrap_action_call.rb +83 -0
  106. data/spec/innate/options.rb +115 -0
  107. data/spec/innate/parameter.rb +154 -0
  108. data/spec/innate/provides.rb +99 -0
  109. data/spec/innate/provides/list.html.xhtml +1 -0
  110. data/spec/innate/provides/list.txt.xhtml +1 -0
  111. data/spec/innate/request.rb +77 -0
  112. data/spec/innate/route.rb +135 -0
  113. data/spec/innate/session.rb +54 -0
  114. data/spec/innate/state/fiber.rb +58 -0
  115. data/spec/innate/state/thread.rb +40 -0
  116. data/spec/innate/traited.rb +55 -0
  117. data/tasks/bacon.rake +66 -0
  118. data/tasks/changelog.rake +18 -0
  119. data/tasks/gem.rake +22 -0
  120. data/tasks/gem_installer.rake +76 -0
  121. data/tasks/grancher.rake +12 -0
  122. data/tasks/install_dependencies.rake +4 -0
  123. data/tasks/manifest.rake +4 -0
  124. data/tasks/rcov.rake +19 -0
  125. data/tasks/release.rake +51 -0
  126. data/tasks/reversion.rake +8 -0
  127. data/tasks/setup.rake +28 -0
  128. metadata +181 -0
@@ -0,0 +1,160 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecRedirectHelper
4
+ Innate.node '/'
5
+
6
+ def index
7
+ self.class.name
8
+ end
9
+
10
+ def noop
11
+ 'noop'
12
+ end
13
+
14
+ def redirection
15
+ redirect :index
16
+ end
17
+
18
+ def double_redirection
19
+ redirect :redirection
20
+ end
21
+
22
+ def redirect_referer_action
23
+ redirect_referer(r(:noop))
24
+ end
25
+
26
+ def no_actual_redirect
27
+ catch(:redirect){ redirect(:index) }
28
+ 'no actual redirect'
29
+ end
30
+
31
+ def no_actual_double_redirect
32
+ catch(:redirect){ double_redirection }
33
+ 'no actual double redirect'
34
+ end
35
+
36
+ def redirect_method
37
+ redirect r(:noop)
38
+ end
39
+
40
+ def absolute_redirect
41
+ redirect 'http://localhost:7000/noop'
42
+ end
43
+
44
+ def loop
45
+ respond 'no loop'
46
+ 'loop'
47
+ end
48
+
49
+ def respond_with_status
50
+ respond 'not found', 404
51
+ end
52
+
53
+ def destructive_respond
54
+ respond! 'destructive'
55
+ end
56
+
57
+ def redirect_unmodified
58
+ raw_redirect '/noop'
59
+ end
60
+ end
61
+
62
+ describe Innate::Helper::Redirect do
63
+ behaves_like :mock
64
+
65
+ @uri = 'http://localhost:7000'
66
+
67
+ should 'retrieve index' do
68
+ get('/').body.should =='SpecRedirectHelper'
69
+ end
70
+
71
+ should 'redirect' do
72
+ get("#@uri/redirection")
73
+
74
+ last_response.status.should == 302
75
+ last_response.headers['Location'].should == "#@uri/index"
76
+ last_response.headers['Content-Type'].should == "text/html"
77
+ end
78
+
79
+ should 'redirect twice' do
80
+ get("#@uri/double_redirection")
81
+
82
+ last_response.status.should == 302
83
+ last_response.headers['Location'].should == "#@uri/redirection"
84
+ last_response.headers['Content-Type'].should == "text/html"
85
+ end
86
+
87
+ should 'redirect to referer' do
88
+ header 'HTTP_REFERER', '/index'
89
+ get("#@uri/redirect_referer_action")
90
+
91
+ last_response.status.should == 302
92
+ last_response.headers['Location'].should == "#@uri/index"
93
+ last_response.headers['Content-Type'].should == "text/html"
94
+ end
95
+
96
+ should 'redirect to fallback if referrer is identical' do
97
+ header 'HTTP_REFERER', "#@uri/redirect_referer_action"
98
+ get("#@uri/redirect_referer_action")
99
+
100
+ last_response.status.should == 302
101
+ last_response.headers['Location'].should == "#@uri/noop"
102
+ last_response.headers['Content-Type'].should == "text/html"
103
+ end
104
+
105
+ should 'use #r' do
106
+ get("#@uri/redirect_method")
107
+
108
+ last_response.status.should == 302
109
+ last_response.headers['Location'].should == "#@uri/noop"
110
+ last_response.headers['Content-Type'].should == "text/html"
111
+ end
112
+
113
+ should 'work with absolute uris' do
114
+ get("#@uri/absolute_redirect")
115
+
116
+ last_response.status.should == 302
117
+ last_response.headers['Location'].should == "#@uri/noop"
118
+ last_response.headers['Content-Type'].should == "text/html"
119
+ end
120
+
121
+ should 'support #respond' do
122
+ get("#@uri/loop")
123
+
124
+ last_response.status.should == 200
125
+ last_response.body.should == 'no loop'
126
+ end
127
+
128
+ should 'support #respond with status' do
129
+ get("#@uri/respond_with_status")
130
+
131
+ last_response.status.should == 404
132
+ last_response.body.should == 'not found'
133
+ end
134
+
135
+ should 'support #respond!' do
136
+ get("#@uri/destructive_respond")
137
+
138
+ last_response.status.should == 200
139
+ last_response.body.should == 'destructive'
140
+ end
141
+
142
+ should 'redirect without modifying the target' do
143
+ get("#@uri/redirect_unmodified")
144
+
145
+ last_response.status.should == 302
146
+ last_response.headers['Location'].should == '/noop'
147
+ end
148
+
149
+ should 'catch redirection' do
150
+ get("#@uri/no_actual_redirect")
151
+ last_response.status.should == 200
152
+ last_response.body.should == 'no actual redirect'
153
+ end
154
+
155
+ should 'catch double redirect' do
156
+ get("#@uri/no_actual_double_redirect")
157
+ last_response.status.should == 200
158
+ last_response.body.should == 'no actual double redirect'
159
+ end
160
+ end
@@ -0,0 +1,133 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecHelperRenderFull
4
+ Innate.node '/render_full'
5
+
6
+ def foo
7
+ "foo: %p" % [request.params.sort]
8
+ end
9
+
10
+ def standard
11
+ render_full(r(:foo))
12
+ end
13
+
14
+ def with_query
15
+ render_full(r(:foo), 'a' => 'b')
16
+ end
17
+
18
+ def with_session
19
+ render_full(r(:get_session, :user))
20
+ end
21
+
22
+ def get_session(key)
23
+ session[key].inspect
24
+ end
25
+
26
+ def set_session(key, value)
27
+ session[key] = value
28
+ end
29
+ end
30
+
31
+ class SpecHelperRenderPartial
32
+ Innate.node '/render_partial'
33
+
34
+ layout :layout
35
+
36
+ def standard
37
+ 'hello'
38
+ end
39
+
40
+ def layout
41
+ '{ #{@content} }'
42
+ end
43
+
44
+ def without_layout
45
+ render_partial(:standard)
46
+ end
47
+ end
48
+
49
+ class SpecHelperRenderView
50
+ Innate.node '/render_view'
51
+ map_views '/'
52
+
53
+ layout :layout
54
+
55
+ def standard
56
+ 'hello'
57
+ end
58
+
59
+ def layout
60
+ '{ #{@content} }'
61
+ end
62
+
63
+ def without_method_or_layout
64
+ render_view(:num, :n => 42)
65
+ end
66
+ end
67
+
68
+ class SpecHelperRenderMisc
69
+ Innate.node '/misc'
70
+ map_views '/'
71
+
72
+ def recursive
73
+ @n ||= 1
74
+ end
75
+ end
76
+
77
+ describe Innate::Helper::Render do
78
+ describe '#render_full' do
79
+ behaves_like :mock
80
+
81
+ it 'renders a full action' do
82
+ get('/render_full/standard').body.should == 'foo: []'
83
+ end
84
+
85
+ it 'renders full action with query parameters' do
86
+ get('/render_full/with_query').body.should == 'foo: [["a", "b"]]'
87
+ end
88
+
89
+ # this is an edge-case, we don't have a full session running if this is the
90
+ # first request from the client as Innate creates sessions only on demand
91
+ # at the end of the request/response cycle.
92
+ #
93
+ # So we have to make some request first, in this case we simply set some
94
+ # value in the session that we can get afterwards.
95
+
96
+ it 'renders full action inside a session' do
97
+ get('/render_full/set_session/user/manveru')
98
+ get('/render_full/with_session').body.should == '"manveru"'
99
+ end
100
+ end
101
+
102
+ describe '#render_partial' do
103
+ behaves_like :mock
104
+
105
+ it 'renders action with layout' do
106
+ get('/render_partial/standard').body.should == '{ hello }'
107
+ end
108
+
109
+ it 'renders partial action without layout' do
110
+ get('/render_partial/without_layout').body.should == '{ hello }'
111
+ end
112
+ end
113
+
114
+ describe '#render_view' do
115
+ behaves_like :mock
116
+
117
+ it 'renders action without calling the method or applying layout' do
118
+ get('/render_view/without_method_or_layout').body.should == '{ 42 }'
119
+ end
120
+ end
121
+
122
+ describe 'misc functionality' do
123
+ behaves_like :mock
124
+
125
+ it 'can render_partial in a loop' do
126
+ get('/misc/loop').body.scan(/\d+/).should == %w[1 2 3 4 5]
127
+ end
128
+
129
+ it 'can recursively render_partial' do
130
+ get('/misc/recursive').body.scan(/\S/).join.should == '{1{2{3{44}3}2}1}'
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecSendFile
4
+ include Innate::Node
5
+ map '/'
6
+
7
+ def this
8
+ send_file(__FILE__)
9
+ end
10
+ end
11
+
12
+ describe Innate::Helper::SendFile do
13
+ should 'send __FILE__' do
14
+ got = Innate::Mock.get('/this')
15
+
16
+ got.body.should == File.read(__FILE__)
17
+ got.status.should == 200
18
+ got['Content-Length'].should == File.size(__FILE__).to_s
19
+ got['Content-Type'].should == 'text/x-script.ruby'
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ #{@foo} #{@bar}!
@@ -0,0 +1 @@
1
+ #{say}, #{to}!
@@ -0,0 +1,4 @@
1
+ <?r (1..5).each do |n| ?>
2
+ <?r @n = n ?>
3
+ #{ render_partial('num') }
4
+ <?r end ?>
@@ -0,0 +1 @@
1
+ #{@n}
@@ -0,0 +1 @@
1
+ From Partial #{@here}
@@ -0,0 +1,7 @@
1
+ {
2
+ #{@n}
3
+ <?r if @n < 4 ?>
4
+ #{ render_partial(:recursive, :n => @n + 1) }
5
+ <?r end ?>
6
+ #{@n}
7
+ }
@@ -0,0 +1,84 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecMock
4
+ include Innate::Node
5
+ map '/'
6
+
7
+ def index
8
+ ''
9
+ end
10
+ end
11
+
12
+ class SpecMock2
13
+ include Innate::Node
14
+ map '/deep'
15
+
16
+ def index
17
+ 'spec mock 2'
18
+ end
19
+
20
+ def foo
21
+ 'spec mock 2 foo'
22
+ end
23
+ end
24
+
25
+ describe 'Innate::SpeckMock2' do
26
+ should 'handle get request' do
27
+ response = Innate::Mock.get('/deep/foo')
28
+ # '/foo/bar'
29
+ response.status.should == 200
30
+ response.body.should == 'spec mock 2 foo'
31
+ end
32
+ end
33
+
34
+ describe 'Innate::SpecMock' do
35
+ should 'handle get request' do
36
+ response = Innate::Mock.get('/')
37
+ # '/one'
38
+ response.status.should == 200
39
+ response.body.should == ''
40
+ end
41
+
42
+ should 'handle post request' do
43
+ response = Innate::Mock.post('/')
44
+ # '/'
45
+ response.status.should == 200
46
+ response.body.should == ''
47
+ end
48
+
49
+ should 'handle head request' do
50
+ response = Innate::Mock.head('/')
51
+ response.status.should == 200
52
+ response.body.should == ''
53
+ end
54
+
55
+ should 'handle delete request' do
56
+ response = Innate::Mock.delete('/')
57
+ response.status.should == 200
58
+ response.body.should == ''
59
+ end
60
+
61
+ should 'handle put request' do
62
+ response = Innate::Mock.put('/')
63
+ response.status.should == 200
64
+ response.body.should == ''
65
+ end
66
+
67
+ should 'handle options request' do
68
+ response = Innate::Mock.options('/')
69
+ response.status.should == 200
70
+ response.body.should == ''
71
+ end
72
+
73
+ should 'handle connect request' do
74
+ response = Innate::Mock.connect('/')
75
+ response.status.should == 200
76
+ response.body.should == ''
77
+ end
78
+
79
+ should 'handle trace request' do
80
+ response = Innate::Mock.trace('/')
81
+ response.status.should == 200
82
+ response.body.should == ''
83
+ end
84
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec/helper'
2
+
3
+ describe 'Node::generate_mapping' do
4
+ def gen(const)
5
+ Innate::Node.generate_mapping(const)
6
+ end
7
+
8
+ should 'transform class names into snake_case locations' do
9
+ gen( 'O').should == '/o'
10
+ gen( 'Oo').should == '/oo'
11
+ gen( 'Ooo').should == '/ooo'
12
+ gen( 'OooO').should == '/oooo'
13
+ gen( 'OooOo').should == '/ooo_oo'
14
+ gen('OooOoo').should == '/ooo_ooo'
15
+ gen('OOOooo').should == '/oooooo'
16
+ gen('OooOOO').should == '/oooooo'
17
+ gen('OoOoOo').should == '/oo_oo_oo'
18
+ end
19
+
20
+ should 'transform namespaces into leading parts of the location' do
21
+ gen('O::O').should == '/o/o'
22
+ gen('O::O::O').should == '/o/o/o'
23
+ gen('O::O::O::O').should == '/o/o/o/o'
24
+ end
25
+
26
+ should 'transform leading parts just like standalone part' do
27
+ gen( 'O::O').should == '/o/o'
28
+ gen( 'Oo::O').should == '/oo/o'
29
+ gen( 'Ooo::O').should == '/ooo/o'
30
+ gen( 'OooO::O').should == '/oooo/o'
31
+ gen( 'OooOo::O').should == '/ooo_oo/o'
32
+ gen('OooOoo::O').should == '/ooo_ooo/o'
33
+ gen('OOOooo::O').should == '/oooooo/o'
34
+ gen('OooOOO::O').should == '/oooooo/o'
35
+ gen('OoOoOo::O').should == '/oo_oo_oo/o'
36
+ end
37
+ end