ramaze 2011.01.30 → 2011.07.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (229) hide show
  1. data/.gitignore +2 -1
  2. data/.mailmap +2 -0
  3. data/.rvmrc +1 -0
  4. data/README.md +119 -197
  5. data/Rakefile +14 -97
  6. data/bin/ramaze +6 -14
  7. data/doc/AUTHORS +8 -4
  8. data/doc/CHANGELOG +3784 -3339
  9. data/examples/app/chat/start.rb +2 -2
  10. data/lib/proto/app.rb +2 -3
  11. data/lib/proto/config.ru +4 -5
  12. data/lib/proto/controller/init.rb +11 -4
  13. data/lib/proto/controller/main.rb +12 -7
  14. data/lib/proto/layout/default.xhtml +56 -23
  15. data/lib/proto/model/init.rb +3 -1
  16. data/lib/proto/public/css/grid.css +107 -0
  17. data/lib/proto/public/css/layout.css +81 -0
  18. data/lib/proto/public/css/reset.css +123 -0
  19. data/lib/proto/public/css/text.css +109 -0
  20. data/lib/proto/public/images/bg.png +0 -0
  21. data/lib/proto/spec/main.rb +2 -2
  22. data/lib/proto/start.rb +11 -1
  23. data/lib/proto/view/index.xhtml +27 -23
  24. data/lib/ramaze.rb +0 -1
  25. data/lib/ramaze/app.rb +85 -12
  26. data/lib/ramaze/app_graph.rb +107 -0
  27. data/lib/ramaze/bin/console.rb +87 -0
  28. data/lib/ramaze/bin/create.rb +94 -0
  29. data/lib/ramaze/bin/helper.rb +107 -0
  30. data/lib/ramaze/bin/restart.rb +95 -0
  31. data/lib/ramaze/bin/runner.rb +141 -0
  32. data/lib/ramaze/bin/start.rb +206 -0
  33. data/lib/ramaze/bin/status.rb +152 -0
  34. data/lib/ramaze/bin/stop.rb +112 -0
  35. data/lib/ramaze/cache.rb +9 -4
  36. data/lib/ramaze/cache/localmemcache.rb +10 -13
  37. data/lib/ramaze/cache/lru.rb +49 -7
  38. data/lib/ramaze/cache/memcache.rb +170 -92
  39. data/lib/ramaze/cache/sequel.rb +301 -118
  40. data/lib/ramaze/controller.rb +108 -9
  41. data/lib/ramaze/controller/default.rb +15 -2
  42. data/lib/ramaze/current.rb +14 -2
  43. data/lib/ramaze/dependencies.rb +46 -0
  44. data/lib/ramaze/files.rb +38 -3
  45. data/lib/ramaze/gestalt.rb +12 -12
  46. data/lib/ramaze/helper.rb +0 -2
  47. data/lib/ramaze/helper/auth.rb +30 -23
  48. data/lib/ramaze/helper/blue_form.rb +175 -126
  49. data/lib/ramaze/helper/csrf.rb +76 -91
  50. data/lib/ramaze/helper/email.rb +105 -0
  51. data/lib/ramaze/helper/erector.rb +16 -15
  52. data/lib/ramaze/helper/gestalt.rb +2 -2
  53. data/lib/ramaze/helper/layout.rb +89 -73
  54. data/lib/ramaze/helper/link.rb +7 -6
  55. data/lib/ramaze/helper/localize.rb +6 -5
  56. data/lib/ramaze/helper/markaby.rb +25 -23
  57. data/lib/ramaze/helper/maruku.rb +3 -3
  58. data/lib/ramaze/helper/paginate.rb +19 -27
  59. data/lib/ramaze/helper/remarkably.rb +3 -3
  60. data/lib/ramaze/helper/request_accessor.rb +3 -3
  61. data/lib/ramaze/helper/send_file.rb +12 -8
  62. data/lib/ramaze/helper/simple_captcha.rb +5 -6
  63. data/lib/ramaze/helper/stack.rb +7 -4
  64. data/lib/ramaze/helper/tagz.rb +10 -11
  65. data/lib/ramaze/helper/thread.rb +19 -16
  66. data/lib/ramaze/helper/ultraviolet.rb +7 -4
  67. data/lib/ramaze/helper/user.rb +40 -21
  68. data/lib/ramaze/helper/xhtml.rb +29 -20
  69. data/lib/ramaze/log.rb +3 -11
  70. data/lib/ramaze/log/analogger.rb +5 -4
  71. data/lib/ramaze/log/growl.rb +9 -7
  72. data/lib/ramaze/log/hub.rb +3 -5
  73. data/lib/ramaze/log/informer.rb +15 -12
  74. data/lib/ramaze/log/knotify.rb +3 -5
  75. data/lib/ramaze/log/logger.rb +3 -5
  76. data/lib/ramaze/log/logging.rb +6 -8
  77. data/lib/ramaze/log/rotatinginformer.rb +27 -17
  78. data/lib/ramaze/log/syslog.rb +7 -7
  79. data/lib/ramaze/log/xosd.rb +3 -5
  80. data/lib/ramaze/middleware_compiler.rb +27 -4
  81. data/lib/ramaze/reloader.rb +50 -12
  82. data/lib/ramaze/reloader/watch_inotify.rb +4 -5
  83. data/lib/ramaze/reloader/watch_stat.rb +3 -3
  84. data/lib/ramaze/request.rb +18 -8
  85. data/lib/ramaze/response.rb +38 -7
  86. data/lib/ramaze/rest.rb +36 -0
  87. data/lib/ramaze/setup.rb +101 -31
  88. data/lib/ramaze/spec.rb +1 -1
  89. data/lib/ramaze/spec/bacon.rb +6 -3
  90. data/lib/ramaze/spec/helper/bacon.rb +0 -1
  91. data/lib/ramaze/version.rb +1 -1
  92. data/lib/ramaze/view.rb +2 -11
  93. data/lib/ramaze/view/erector.rb +46 -31
  94. data/lib/ramaze/view/erubis.rb +7 -3
  95. data/lib/ramaze/view/ezamar.rb +7 -3
  96. data/lib/ramaze/view/gestalt.rb +9 -3
  97. data/lib/ramaze/view/haml.rb +7 -3
  98. data/lib/ramaze/view/liquid.rb +3 -3
  99. data/lib/ramaze/view/lokar.rb +7 -3
  100. data/lib/ramaze/view/mustache.rb +11 -5
  101. data/lib/ramaze/view/nagoro.rb +3 -3
  102. data/lib/ramaze/view/sass.rb +1 -1
  103. data/lib/ramaze/view/slippers.rb +40 -13
  104. data/lib/ramaze/view/tagz.rb +9 -5
  105. data/ramaze.gemspec +23 -128
  106. data/spec/helper.rb +5 -0
  107. data/spec/ramaze/bin/app/config.ru +11 -0
  108. data/spec/ramaze/bin/create.rb +28 -0
  109. data/spec/ramaze/bin/runner.rb +30 -0
  110. data/spec/ramaze/bin/start.rb +38 -0
  111. data/spec/ramaze/cache/memcache.rb +10 -3
  112. data/spec/ramaze/cache/sequel.rb +7 -0
  113. data/spec/ramaze/controller/provide_inheritance.rb +0 -10
  114. data/spec/ramaze/dispatcher/file.rb +19 -15
  115. data/spec/ramaze/helper/auth.rb +10 -9
  116. data/spec/ramaze/helper/blue_form.rb +121 -68
  117. data/spec/ramaze/helper/email.rb +69 -0
  118. data/spec/ramaze/helper/layout.rb +12 -15
  119. data/spec/ramaze/helper/layout/alternative.xhtml +5 -0
  120. data/spec/ramaze/helper/user.rb +2 -0
  121. data/spec/ramaze/log/growl.rb +14 -1
  122. data/spec/{contrib → ramaze}/rest.rb +1 -1
  123. data/spec/ramaze/session/memcache.rb +2 -2
  124. data/spec/ramaze/view/sass.rb +1 -1
  125. data/tasks/bacon.rake +3 -3
  126. data/tasks/gem.rake +17 -18
  127. data/tasks/rcov.rake +2 -3
  128. data/tasks/release.rake +8 -65
  129. data/tasks/setup.rake +10 -8
  130. data/tasks/todo.rake +9 -5
  131. data/tasks/yard.rake +3 -2
  132. metadata +105 -397
  133. data/MANIFEST +0 -532
  134. data/TODO.md +0 -19
  135. data/benchmark/bench_templates/bench.rb +0 -67
  136. data/benchmark/bench_templates/view/large.erb +0 -79
  137. data/benchmark/bench_templates/view/large.haml +0 -41
  138. data/benchmark/bench_templates/view/large.lok +0 -79
  139. data/benchmark/bench_templates/view/large.xhtml +0 -79
  140. data/benchmark/bench_templates/view/small.erb +0 -21
  141. data/benchmark/bench_templates/view/small.haml +0 -12
  142. data/benchmark/bench_templates/view/small.lok +0 -21
  143. data/benchmark/bench_templates/view/small.xhtml +0 -21
  144. data/benchmark/results.txt +0 -131
  145. data/benchmark/run.rb +0 -355
  146. data/benchmark/suite/minimal.rb +0 -11
  147. data/benchmark/suite/no_informer.rb +0 -7
  148. data/benchmark/suite/no_sessions.rb +0 -9
  149. data/benchmark/suite/no_template.rb +0 -7
  150. data/benchmark/suite/simple.rb +0 -5
  151. data/benchmark/suite/template_erubis.rb +0 -8
  152. data/benchmark/suite/template_etanni.rb +0 -8
  153. data/benchmark/suite/template_ezamar.rb +0 -8
  154. data/benchmark/suite/template_haml.rb +0 -13
  155. data/benchmark/suite/template_liquid.rb +0 -11
  156. data/benchmark/suite/template_markaby.rb +0 -9
  157. data/benchmark/suite/template_nagoro.rb +0 -8
  158. data/benchmark/suite/template_redcloth.rb +0 -13
  159. data/benchmark/suite/template_tenjin.rb +0 -8
  160. data/benchmark/test.rb +0 -35
  161. data/doc/FAQ +0 -92
  162. data/doc/INSTALL +0 -92
  163. data/doc/TODO +0 -29
  164. data/doc/meta/announcement.txt +0 -119
  165. data/doc/meta/configuration.txt +0 -163
  166. data/doc/meta/internals.txt +0 -278
  167. data/doc/meta/users.kml +0 -64
  168. data/doc/tutorial/todolist.html +0 -1512
  169. data/doc/tutorial/todolist.txt +0 -920
  170. data/examples/app/sourceview/public/coderay.css +0 -104
  171. data/examples/app/sourceview/public/images/file.gif +0 -0
  172. data/examples/app/sourceview/public/images/folder.gif +0 -0
  173. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  174. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  175. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  176. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  177. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  178. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  179. data/examples/app/sourceview/public/jquery.js +0 -11
  180. data/examples/app/sourceview/public/jquery.treeview.css +0 -48
  181. data/examples/app/sourceview/public/jquery.treeview.js +0 -223
  182. data/examples/app/sourceview/public/sourceview.js +0 -52
  183. data/examples/app/sourceview/start.rb +0 -79
  184. data/examples/app/sourceview/view/index.haml +0 -59
  185. data/examples/helpers/httpdigest.rb +0 -107
  186. data/lib/proto/public/css/screen.css +0 -30
  187. data/lib/proto/public/js/jquery.js +0 -7179
  188. data/lib/ramaze/contrib/addressable_route.rb +0 -56
  189. data/lib/ramaze/contrib/app_graph.rb +0 -64
  190. data/lib/ramaze/contrib/email.rb +0 -88
  191. data/lib/ramaze/contrib/facebook.rb +0 -23
  192. data/lib/ramaze/contrib/facebook/facebook.rb +0 -171
  193. data/lib/ramaze/contrib/gettext.rb +0 -113
  194. data/lib/ramaze/contrib/gettext/mo.rb +0 -155
  195. data/lib/ramaze/contrib/gettext/parser.rb +0 -46
  196. data/lib/ramaze/contrib/gettext/po.rb +0 -109
  197. data/lib/ramaze/contrib/gzip_filter.rb +0 -1
  198. data/lib/ramaze/contrib/maruku_uv.rb +0 -59
  199. data/lib/ramaze/contrib/profiling.rb +0 -36
  200. data/lib/ramaze/contrib/rest.rb +0 -23
  201. data/lib/ramaze/contrib/sequel/create_join.rb +0 -26
  202. data/lib/ramaze/contrib/sequel/form_field.rb +0 -129
  203. data/lib/ramaze/contrib/sequel/image.rb +0 -196
  204. data/lib/ramaze/contrib/sequel/relation.rb +0 -98
  205. data/lib/ramaze/helper/httpdigest.rb +0 -96
  206. data/lib/ramaze/tool/bin.rb +0 -340
  207. data/lib/ramaze/tool/create.rb +0 -48
  208. data/lib/ramaze/tool/project_creator.rb +0 -120
  209. data/lib/ramaze/view/less.rb +0 -12
  210. data/lib/ramaze/view/maruku.rb +0 -15
  211. data/lib/ramaze/view/redcloth.rb +0 -21
  212. data/spec/contrib/addressable_route.rb +0 -30
  213. data/spec/examples/helpers/httpdigest.rb +0 -64
  214. data/spec/examples/templates/template_redcloth.rb +0 -13
  215. data/spec/ramaze/bin/ramaze.rb +0 -96
  216. data/spec/ramaze/helper/httpdigest.rb +0 -176
  217. data/spec/ramaze/view/less.rb +0 -60
  218. data/spec/ramaze/view/less/file.css.less +0 -8
  219. data/spec/ramaze/view/redcloth.rb +0 -66
  220. data/spec/ramaze/view/redcloth/external.redcloth +0 -8
  221. data/tasks/copyright.rake +0 -21
  222. data/tasks/gem_setup.rake +0 -112
  223. data/tasks/git.rake +0 -46
  224. data/tasks/grancher.rake +0 -12
  225. data/tasks/jquery.rake +0 -15
  226. data/tasks/manifest.rake +0 -4
  227. data/tasks/metric_changes.rake +0 -24
  228. data/tasks/reversion.rake +0 -8
  229. data/tasks/traits.rake +0 -21
@@ -1,131 +0,0 @@
1
- ====== simple ======
2
- <code ruby>
3
- require 'ramaze'
4
-
5
- class MainController < Ramaze::Controller
6
- def index
7
- "Hello, World!"
8
- end
9
- end
10
- </code>
11
-
12
- === webrick ===
13
- Mem usage before: 20.32MB
14
- Time taken for tests: 7.747022 seconds
15
- Failed requests: 0
16
- Requests per second: 129.08 [#/sec] (mean)
17
- Time per request: 77.470 [ms] (mean)
18
- Time per request: 7.747 [ms] (mean, across all concurrent requests)
19
- Mem usage after: 25.43MB
20
-
21
- === mongrel ===
22
- Mem usage before: 20.25MB
23
- Time taken for tests: 2.205161 seconds
24
- Failed requests: 0
25
- Requests per second: 453.48 [#/sec] (mean)
26
- Time per request: 22.052 [ms] (mean)
27
- Time per request: 2.205 [ms] (mean, across all concurrent requests)
28
- Mem usage after: 21.91MB
29
-
30
- === evented_mongrel ===
31
- Mem usage before: 22.64MB
32
- Time taken for tests: 1.311583 seconds
33
- Failed requests: 0
34
- Requests per second: 762.44 [#/sec] (mean)
35
- Time per request: 13.116 [ms] (mean)
36
- Time per request: 1.312 [ms] (mean, across all concurrent requests)
37
- Mem usage after: 27.03MB
38
-
39
- ====== no_template ======
40
- <code ruby>
41
- require 'ramaze'
42
-
43
- class MainController < Ramaze::Controller
44
- engine :None
45
-
46
- def index
47
- "Hello, World!"
48
- end
49
- end
50
- </code>
51
-
52
- === evented_mongrel ===
53
- Mem usage before: 22.63MB
54
- Time taken for tests: 1.151947 seconds
55
- Failed requests: 0
56
- Requests per second: 868.10 [#/sec] (mean)
57
- Time per request: 11.519 [ms] (mean)
58
- Time per request: 1.152 [ms] (mean, across all concurrent requests)
59
- Mem usage after: 27.11MB
60
-
61
- ====== no_informer ======
62
- <code ruby>
63
- require 'ramaze'
64
-
65
- class MainController < Ramaze::Controller
66
- def index
67
- "Hello, World!"
68
- end
69
- end
70
-
71
- Ramaze::Inform.loggers = []
72
- </code>
73
-
74
- === evented_mongrel ===
75
- Mem usage before: 22.63MB
76
- Time taken for tests: 1.202878 seconds
77
- Failed requests: 0
78
- Requests per second: 831.34 [#/sec] (mean)
79
- Time per request: 12.029 [ms] (mean)
80
- Time per request: 1.203 [ms] (mean, across all concurrent requests)
81
- Mem usage after: 27.07MB
82
-
83
- ====== no_sessions ======
84
- <code ruby>
85
- require 'ramaze'
86
-
87
- class MainController < Ramaze::Controller
88
- def index
89
- "Hello, World!"
90
- end
91
- end
92
-
93
- Ramaze::Inform.loggers = []
94
- Ramaze::Global.sessions = false
95
- </code>
96
-
97
- === evented_mongrel ===
98
- Mem usage before: 22.63MB
99
- Time taken for tests: 0.835254 seconds
100
- Failed requests: 0
101
- Requests per second: 1197.24 [#/sec] (mean)
102
- Time per request: 8.353 [ms] (mean)
103
- Time per request: 0.835 [ms] (mean, across all concurrent requests)
104
- Mem usage after: 26.38MB
105
-
106
- ====== minimal ======
107
- <code ruby>
108
- require 'ramaze'
109
-
110
- class MainController < Ramaze::Controller
111
- engine :None
112
-
113
- def index
114
- "Hello, World!"
115
- end
116
- end
117
-
118
- Ramaze::Global.sourcereload = false
119
- Ramaze::Global.sessions = false
120
- Ramaze::Inform.loggers = []
121
- </code>
122
-
123
- === evented_mongrel ===
124
- Mem usage before: 22.62MB
125
- Time taken for tests: 0.647273 seconds
126
- Failed requests: 0
127
- Requests per second: 1544.94 [#/sec] (mean)
128
- Time per request: 6.473 [ms] (mean)
129
- Time per request: 0.647 [ms] (mean, across all concurrent requests)
130
- Mem usage after: 26.42MB
131
-
data/benchmark/run.rb DELETED
@@ -1,355 +0,0 @@
1
- require "optparse"
2
- require "timeout"
3
- require "net/http"
4
-
5
- class String
6
- def /(o) File.join(self, o.to_s) end
7
- end
8
-
9
- class RamazeBenchmark
10
-
11
- class BasicWriter
12
- def initialize
13
- @ljust = 24
14
- end
15
-
16
- def write(key, val)
17
- if key == "Name"
18
- puts "====== #{val} ======"
19
- else
20
- puts((key.to_s + ":").ljust(@ljust) + val.to_s)
21
- end
22
- end
23
-
24
- def flush
25
- puts
26
- $stdout.flush
27
- end
28
-
29
- def close; end
30
- end
31
-
32
- class CSVWriter
33
- def initialize
34
- @keys, @vals = [], []
35
- end
36
-
37
- def write(key, val)
38
- @keys << key
39
- @vals << (val =~ /^\d[\d.]+/ ? $& : val)
40
- end
41
-
42
- def flush
43
- unless @header
44
- puts FasterCSV.generate{|csv| csv << @keys }
45
- @header = true
46
- end
47
-
48
- puts FasterCSV.generate{|csv| csv << @vals }
49
- @keys, @vals = [], []
50
- end
51
-
52
- def close; end
53
- end
54
-
55
- class GruffWriter
56
- RPS = "Requests per second"
57
-
58
- def initialize
59
- @benchmarks = {}
60
- @order = []
61
- end
62
-
63
- def write(key, val)
64
- @benchmark ||= {}
65
- @benchmark[key] = (val =~ /^\d[\d.]+/ ? $&.to_f : val)
66
- end
67
-
68
- def flush
69
- if @benchmark["Requests per second"]
70
- name = @benchmark["Name"]
71
- @benchmarks[name] ||= []
72
- @benchmarks[name] << @benchmark
73
- @order << name unless @order.include?(name)
74
- end
75
- @benchmark = nil
76
- end
77
-
78
- def close
79
- g = Gruff::SideBar.new(800)
80
- g.title = "Ramaze Benchmark"
81
- setup_gruff_data(g)
82
- g.labels = gruff_labels
83
- g.sort = false
84
- g.hide_legend = true if graph_type == :simple
85
- g.x_axis_label = "requests/sec"
86
- g.minimum_value = 0
87
- g.write
88
- end
89
-
90
- private
91
-
92
- def gruff_labels
93
- table = {}
94
- @order.each_with_index do |bname, idx|
95
- table[idx] = bname
96
- end
97
- return table
98
- end
99
-
100
- def adapters
101
- @benchmarks.to_a[0][1].map{|bm| bm["Adapter"]}.uniq
102
- end
103
-
104
- def paths
105
- @benchmarks.to_a[0][1].map{|bm| bm["Path"]}.uniq
106
- end
107
-
108
- def graph_type
109
- case [adapters.size > 1, paths.size > 1]
110
- when [true , true ]; :both
111
- when [true , false]; :adapter
112
- when [false, true ]; :path
113
- else :simple; end
114
- end
115
-
116
- def setup_gruff_data(g)
117
- case graph_type
118
- when :simple
119
- g.data("", @order.map{|name| @benchmarks[name][0][RPS] }, '#6886B4')
120
- when :adapter
121
- adapters.each do |adapter|
122
- g.data(adapter, @order.map{|name|
123
- @benchmarks[name].find{|bm| bm["Adapter"] == adapter}[RPS]
124
- })
125
- end
126
- when :path
127
- paths.each do |path|
128
- g.data(path, @order.map{|name|
129
- @benchmarks[name].find{|bm| bm["Path"] == path}[RPS]
130
- })
131
- end
132
- when :both
133
- adapters.each do |adapter|
134
- paths.each do |path|
135
- g.data("#{adapter}, #{path}", @order.map{|name|
136
- @benchmarks[name].find{|bm|
137
- bm["Adapter"] == adapter && bm["Path"] == path
138
- }[RPS]
139
- })
140
- end
141
- end
142
- end
143
- end
144
- end
145
-
146
- attr_accessor :requests, :adapters, :port, :log, :display_code, :target
147
- attr_accessor :concurrent, :paths, :benchmarker, :informer
148
- attr_accessor :mode, :show_log, :formats
149
-
150
- def initialize()
151
- @adapters = [:webrick]
152
- @port = rand(32768-1)+32768
153
- @requests = 100
154
- @concurrent = 10
155
- @signal = 'SIGKILL'
156
- @host = "127.0.0.1"
157
- @paths = ["/"]
158
- @target = /.+/
159
- @informer = true
160
- @formats = ["text"]
161
- @writers = []
162
- @mode = :live
163
- yield self
164
- end
165
-
166
- def start
167
- # setup writers
168
- @formats.each do |format|
169
- case format
170
- when "csv" ; @writers << CSVWriter.new
171
- when "gruff"; @writers << GruffWriter.new
172
- when "text" ; @writers << BasicWriter.new
173
- end
174
- end
175
-
176
- # benchmarks
177
- glob = File.expand_path('../suite/*.rb', __FILE__)
178
- Dir.glob(glob) do |filename|
179
- @adapters.each do |adapter|
180
- @paths.each do |path|
181
- benchmark(filename, adapter, path) if @target.match(filename)
182
- end
183
- end
184
- end
185
-
186
- # close writers
187
- @writers.each do |writer|
188
- writer.close
189
- end
190
- end
191
-
192
- # start to measure
193
- def benchmark(filename, adapter, path)
194
- # output informations
195
- l :Name, filename.scan(/\/([^\/]+)\.rb/).to_s
196
- l :Adapter, adapter
197
- l :Requests, @requests
198
- l :Concurrent, @concurrent
199
- l :Path, path
200
- l :Informer, @informer
201
- if @display_code
202
- l :Code, "<code ruby>\n#{File.read(filename)}\n</code>\n\n"
203
- end
204
-
205
- # real benchmark
206
- ramaze(filename, adapter) do |pid|
207
- l "Mem usage before", "#{memsize(pid)}MB"
208
- ab(path).each do |line|
209
- l *line.split(/:\s*/)
210
- end
211
- l "Mem usage after", "#{memsize(pid)}MB"
212
- end
213
-
214
- # flush writers
215
- @writers.each do |writer|
216
- writer.flush
217
- end
218
- end
219
-
220
- private
221
-
222
- # memory usage size
223
- def memsize(pid)
224
- (`ps -p #{pid} -o rss=`.strip.to_f/10.24).round/100.0
225
- end
226
-
227
- # output
228
- def l(key, val)
229
- @writers.each do |writer|
230
- writer.write(key.to_s, val)
231
- end
232
- end
233
-
234
- # url of ramaze server
235
- def url(path)
236
- "http://#{@host}:#{@port}#{path}"
237
- end
238
-
239
- # apache benchmark
240
- def ab(path)
241
- re = /^(Fail|Req|Time|Total transferred|Document Length|Transfer rate)/
242
- `ab -c #{@concurrent} -n #{@requests} #{url(path)}`.split("\n").grep(re)
243
- end
244
-
245
- # startup
246
- def ramaze(filename, adapter)
247
- pid = fork do
248
- begin
249
- require 'ramaze'
250
- Ramaze.options.mode = @mode
251
- if @informer
252
- unless @show_log
253
- require 'ramaze/log/informer'
254
- Ramaze::Log.loggers = [Ramaze::Logger::Informer.new("/dev/null")]
255
- end
256
- else
257
- Ramaze::Log.loggers = []
258
- end
259
- require filename
260
- Ramaze.start :adapter => adapter, :port => @port
261
- rescue LoadError => ex; l :Error, ex; end
262
- end
263
-
264
- yield pid if wait_to_startup
265
-
266
- Process.kill(@signal, pid)
267
- Process.waitpid2(pid)
268
- end
269
-
270
- # wait for ramaze to start up
271
- def wait_to_startup
272
- begin
273
- Timeout.timeout(5) do
274
- loop do
275
- begin
276
- sleep 1; Net::HTTP.new(@host, @port).head("/"); return true
277
- rescue Errno::ECONNREFUSED; end
278
- end
279
- end
280
- rescue Timeout::Error
281
- l "Error", "failed to start benchmark script"; return false
282
- end
283
- end
284
- end
285
-
286
- Signal.trap(:INT, proc{exit})
287
-
288
- RamazeBenchmark.new do |bm|
289
- OptionParser.new(false, 24, " ") do |opt|
290
- opt.on('-a', '--adapters NAMES', '[webrick] Specify adapters') do |adapters|
291
- bm.adapters = adapters.split(",")
292
- end
293
-
294
- opt.on('--formats (text|csv|gruff)', '[text] Specify output formats') do |formats|
295
- bm.formats = formats.split(",")
296
- bm.formats.each do |format|
297
- case format
298
- when "csv" ; require "fastercsv"
299
- when "gruff"; require "gruff"
300
- end
301
- end
302
- end
303
-
304
- opt.on('-n', '--requests NUM', '[100] Number of requests') do |n|
305
- bm.requests = n
306
- end
307
-
308
- opt.on('-c', '--concurrent NUM', '[10] Number of multiple requests') do |n|
309
- bm.concurrent = n
310
- end
311
-
312
- opt.on('--code', 'Display benchmark code') do |n|
313
- bm.display_code = true
314
- end
315
-
316
- opt.on('-p', '--port NUM',
317
- '[random(32768-65535)] Specify port number') do |n|
318
- bm.port = n
319
- end
320
-
321
- opt.on('--paths PATHS', '[/] Specify request paths') do |paths|
322
- bm.paths = paths.split(",")
323
- end
324
-
325
- opt.on('--mode MODE', '[live] Ramaze mode') do |mode|
326
- bm.mode = mode.to_sym
327
- end
328
-
329
- opt.on('--no-informer', 'Disable informer') do
330
- bm.informer = false
331
- end
332
-
333
- opt.on('--show-log', 'Show log') do
334
- bm.show_log = true
335
- end
336
-
337
- opt.on('--target REGEXP',
338
- '[/.+/] Specify benchmark scripts to measure') do |name|
339
- bm.target = Regexp.compile(name)
340
- end
341
-
342
- opt.on('-h', '--help', 'Show this message') do
343
- puts opt.help
344
- exit
345
- end
346
-
347
- begin
348
- opt.parse!(ARGV)
349
- rescue OptionParser::ParseError => ex
350
- puts "[ERROR] " + ex
351
- puts opt.help
352
- exit
353
- end
354
- end
355
- end.start