ramaze 2011.01.30 → 2011.07.25

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 (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