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
@@ -0,0 +1,206 @@
1
+ module Ramaze
2
+ #:nodoc:
3
+ module Bin
4
+ ##
5
+ # The start command is used to start a Ramaze application. The ramaze start
6
+ # command optionally takes a directory or path to a file. If it's a
7
+ # directory this command will look for a Rackup file in that directory,
8
+ # otherwise it assumes the specified file is a Rackup file.
9
+ #
10
+ # == Usage
11
+ #
12
+ # ramaze start
13
+ # ramaze start /home/foobar/projects/blog/config.ru
14
+ # ramaze start /home/foobar/projects/blog
15
+ #
16
+ # @author Yorick Peterse
17
+ # @since 21-07-2011
18
+ #
19
+ class Start
20
+ include Ramaze::Bin::Helper
21
+
22
+ # The description of this command, displayed when the global help menu is
23
+ # invoked.
24
+ Description = 'Starts an instance of an application'
25
+
26
+ # The banner of this command, displayed when it's invoked with the -h or
27
+ # --help option.
28
+ Banner = <<-TXT.strip
29
+ Starts an instance of an application using the settings
30
+ specified in a Rackup file in the current directory.
31
+
32
+ Usage:
33
+ ramaze start [RACKUP CONFIG] [OPTIONS]
34
+
35
+ Example:
36
+ ramaze start --help
37
+ TXT
38
+
39
+ ##
40
+ # Creates a new instance of the command and prepares OptionParser.
41
+ #
42
+ # @author Yorick Peterse
43
+ # @since 21-07-2011
44
+ #
45
+ def initialize
46
+ @ruby_options = {}
47
+ @rack_options = {}
48
+ @options = OptionParser.new do |opt|
49
+ opt.banner = Banner
50
+ opt.summary_indent = ' '
51
+
52
+ # Sets all Ruby options
53
+ opt.separator "\nRuby Options:\n"
54
+
55
+ opt.on('-e', '--eval LINE', 'Evaluates a line of code') do |code|
56
+ @ruby_options['-e'] = code
57
+ end
58
+
59
+ opt.on('-d', '--debug', 'Set debugging flags (set $DEBUG to true)') do
60
+ @ruby_options['-d'] = nil
61
+ end
62
+
63
+ opt.on('-w', '--warn', 'Turns warnings on for the script') do
64
+ @ruby_options['-w'] = nil
65
+ end
66
+
67
+ opt.on('-I', '--include PATH', 'specifies the $LOAD_PATH') do |path|
68
+ @ruby_options['-I'] = path
69
+ end
70
+
71
+ opt.on(
72
+ '-r',
73
+ '--require LIBRARY',
74
+ 'requires the library before starting'
75
+ ) do |library|
76
+ @ruby_options['-r'] = library
77
+ end
78
+
79
+ # Set all Rack options
80
+ opt.separator "\nRack Options:\n"
81
+
82
+ opt.on(
83
+ '-s',
84
+ '--server SERVER',
85
+ 'Serve the application using the given server'
86
+ ) do |server|
87
+ @rack_options['-s'] = server
88
+ end
89
+
90
+ opt.on(
91
+ '-o',
92
+ '--host HOST',
93
+ 'Listens on the given host (0.0.0.0 by default)'
94
+ ) do |host|
95
+ @rack_options['-o'] = host
96
+ end
97
+
98
+ opt.on(
99
+ '-p',
100
+ '--port PORT',
101
+ 'Uses the given port, set to 9292 by default'
102
+ ) do |port|
103
+ @rack_options['-p'] = port
104
+ end
105
+
106
+ opt.on(
107
+ '-O',
108
+ '--option NAME[=VALUE]',
109
+ 'Passes the given option and it\'s value to the server'
110
+ ) do |name|
111
+ @rack_options['-O'] = name
112
+ end
113
+
114
+ opt.on(
115
+ '-E',
116
+ '--env ENVIRONMENT',
117
+ 'Uses the specified environment, set to development by default'
118
+ ) do |env|
119
+ @rack_options['-E'] = env
120
+ end
121
+
122
+ opt.on('-D', '--daemonize', 'Runs as a daemon in the background') do
123
+ @rack_options['-D'] = nil
124
+ end
125
+
126
+ opt.on(
127
+ '-P',
128
+ '--pid FILE',
129
+ 'File to store the PID in, defaults to rack.pid'
130
+ ) do |pid|
131
+ @rack_options['-P'] = pid
132
+ end
133
+
134
+ # Set all common options
135
+ opt.separator "\nOptions\n"
136
+
137
+ opt.on('-h', '--help', 'Shows this help message') do
138
+ puts @options
139
+ exit
140
+ end
141
+ end
142
+ end
143
+
144
+ ##
145
+ # Runs the command based on the given command line arguments.
146
+ #
147
+ # @author Yorick Peterse
148
+ # @since 21-07-2011
149
+ # @param [Array] argv An array of command line arguments.
150
+ #
151
+ def run(argv = [])
152
+ begin
153
+ @options.parse!(argv)
154
+ rescue => e
155
+ warn "Error: #{e.message}"
156
+ abort @options.to_s
157
+ end
158
+
159
+ # Remove all trailing/leading whitespace from the options
160
+ @rack_options.each do |k, v|
161
+ @rack_options[k] = v.strip if v.respond_to?(:strip)
162
+ end
163
+
164
+ @ruby_options.each do |k, v|
165
+ @ruby_options[k] = v.strip if v.respond_to?(:strip)
166
+ end
167
+
168
+ rackup_config = argv.delete_at(0)
169
+ rackup_config = File.join(Dir.pwd, 'config.ru') if rackup_config.nil?
170
+
171
+ # Check if the config is a directory or file
172
+ if File.directory?(rackup_config)
173
+ rackup_config = File.join(rackup_config, 'config.ru')
174
+ end
175
+
176
+ if !File.exist?(rackup_config)
177
+ abort "The Rackup config #{rackup_config} does not exist"
178
+ end
179
+
180
+ # Set the default port and server to use.
181
+ if !@rack_options['-p']
182
+ @rack_options['-p'] = 7000
183
+ end
184
+
185
+ # Set the default server to use
186
+ if !@rack_options['-s']
187
+ @rack_options['-s'] = Ramaze.options.adapter.handler.to_s
188
+ end
189
+
190
+ # If a PID is supplied we should first check to see if Ramaze isn't
191
+ # already running.
192
+ if @rack_options.key?('-P') and is_running?(@rack_options['-P'])
193
+ abort 'This application is already running'
194
+ end
195
+
196
+ params = []
197
+
198
+ @ruby_options.merge(@rack_options).each do |opt, value|
199
+ params.push("#{opt}#{value}")
200
+ end
201
+
202
+ exec('ruby', rackup_path, rackup_config, *params)
203
+ end
204
+ end # Start
205
+ end # Bin
206
+ end # Ramaze
@@ -0,0 +1,152 @@
1
+ module Ramaze
2
+ #:nodoc:
3
+ module Bin
4
+ ##
5
+ # The status command can be used to show the details, such as the PID and
6
+ # the CPU usage, of a running Ramaze application.
7
+ #
8
+ # == Usage
9
+ #
10
+ # ramaze status
11
+ # ramaze status /home/projects/ramaze/ramaze.pid
12
+ #
13
+ # @author Yorick Peterse
14
+ # @author TJ Vanderpoel
15
+ # @since 21-07-2011
16
+ #
17
+ class Status
18
+ include Ramaze::Bin::Helper
19
+
20
+ # Description of this command, displayed in the glboal help message.
21
+ Description = 'Shows the status of a running Ramaze application'
22
+
23
+ # The banner of this command, displayed when the -h or --help option is
24
+ # specified.
25
+ Banner = <<-TXT.strip
26
+ Shows the status of a running Ramaze application. If a PID is specified this
27
+ command will use that PID, otherwise it will try to look for a PID in the
28
+ current directory.
29
+
30
+ Usage:
31
+ ramaze status [PID] [OPTIONS]
32
+
33
+ Example:
34
+ ramaze status blog/blog.pid
35
+ TXT
36
+
37
+ # String containing the message that's used to display all statistics
38
+ Statistics = <<-TXT.strip
39
+ Ramaze is running!
40
+ Name: %s
41
+ Command Line: %s
42
+ Virtual Size: %s
43
+ Started: %s
44
+ Exec Path: %s
45
+ Status: %s
46
+ TXT
47
+
48
+ ##
49
+ # Creates a new instance of the command and sets all the option parser
50
+ # options.
51
+ #
52
+ # @author Yorick Peterse
53
+ # @since 21-07-2011
54
+ #
55
+ def initialize
56
+ @options = OptionParser.new do |opt|
57
+ opt.banner = Banner
58
+ opt.summary_indent = ' '
59
+
60
+ opt.separator "\nOptions:\n"
61
+
62
+ opt.on('-h', '--help', 'Shows this help message') do
63
+ puts @options
64
+ exit
65
+ end
66
+ end
67
+ end
68
+
69
+ ##
70
+ # Runs the command based on the given command line arguments.
71
+ #
72
+ # @author Yorick Peterse
73
+ # @author TJ Vanderpoel
74
+ # @since 21-07-2011
75
+ # @param [Array] argv Array containing all teh command line arguments.
76
+ #
77
+ def run(argv = [])
78
+ @options.parse!(argv)
79
+
80
+ pid_path = argv.delete_at(0)
81
+ dirname = Pathname.new('.').realpath.basename.to_s
82
+ pid_path = File.join(Dir.pwd, dirname + '.pid') if pid_path.nil?
83
+
84
+ # Is it a directory?
85
+ if File.directory?(pid_path)
86
+ pid_path = File.join(pid_path, File.basename(pid_path) + '.pid')
87
+ end
88
+
89
+ pid_path = Pathname.new(pid_path).expand_path.to_s
90
+
91
+ if !File.exist?(pid_path)
92
+ abort "The PID #{pid_path} does not exist"
93
+ end
94
+
95
+ # Is the app running?
96
+ unless is_running?(pid_path)
97
+ abort "The Ramaze application for #{pid_path} isn't running"
98
+ end
99
+
100
+ pid = File.read(pid_path).to_i
101
+
102
+ # Gather various statistics about the process
103
+ if is_windows?
104
+ wmi = WIN32OLE.connect("winmgmts://")
105
+ ours = []
106
+ processes = wmi.ExecQuery(
107
+ "select * from win32_process where ProcessId = #{pid}"
108
+ )
109
+
110
+ processes.each do |p|
111
+ ours << [
112
+ p.Name,
113
+ p.CommandLine,
114
+ p.VirtualSize,
115
+ p.CreationDate,
116
+ p.ExecutablePath,
117
+ p.Status
118
+ ]
119
+ end
120
+
121
+ puts Statistics % ours.first
122
+ # Unix like systems
123
+ else
124
+ if File.directory?(proc_dir = Pathname.new('/proc'))
125
+ proc_dir = proc_dir.join(pid.to_s)
126
+ # If we have a "stat" file, we'll assume linux and get as much info
127
+ # as we can
128
+ if File.file?(stat_file = proc_dir.join("stat"))
129
+ stats = File.read(stat_file).split
130
+
131
+ puts Statistics % [
132
+ nil,
133
+ File.read(proc_dir.join("cmdline")).split("\000").join(" "),
134
+ "%s k" % (stats[22].to_f / 1024),
135
+ File.mtime(proc_dir),
136
+ File.readlink(proc_dir.join("exe")),
137
+ stats[2]
138
+ ]
139
+ end
140
+ # /proc does not exist, use "ps"
141
+ else
142
+ begin
143
+ puts %x{ps l #{pid}}
144
+ rescue
145
+ puts "Sadly no more information is available"
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end # Status
151
+ end # Bin
152
+ end # Ramaze
@@ -0,0 +1,112 @@
1
+ module Ramaze
2
+ #:nodoc:
3
+ module Bin
4
+ ##
5
+ # Stops a running instance of Ramaze by killing it's process. The PID of
6
+ # this process can be supplied via the command line. If no PID is given this
7
+ # command tries to find it in the current directory. If the latter is the
8
+ # case this command tries to find a file of which the name matches the name
9
+ # of the current directory.
10
+ #
11
+ # == Usage
12
+ #
13
+ # ramaze stop
14
+ # ramaze stop /home/foobar/projects/ramaze/ramaze.pid
15
+ #
16
+ # @author Yorick Peterse
17
+ # @author TJ Vanderpoel
18
+ # @since 21-07-2011
19
+ #
20
+ class Stop
21
+ include Ramaze::Bin::Helper
22
+
23
+ # The description of this command, shown when the global help menu is
24
+ # displayed.
25
+ Description = 'Stops a running instance of Ramaze'
26
+
27
+ # The banner of this command.
28
+ Banner = <<-TXT.strip
29
+ Stops a running instance of Ramaze by killing it's process using a PID. If no
30
+ PID is given this command tries to look for it in the current directory.
31
+
32
+ Usage:
33
+ ramaze stop [PID] [OPTIONS]
34
+
35
+ Example:
36
+ ramaze stop /home/foobar/projects/ramaze/ramaze.pid
37
+ TXT
38
+
39
+ ##
40
+ # Creates a new instance of the command and sets all the OptionParser
41
+ # options.
42
+ #
43
+ # @author Yorick Peterse
44
+ # @since 21-07-2011
45
+ #
46
+ def initialize
47
+ @options = OptionParser.new do |opt|
48
+ opt.banner = Banner
49
+ opt.summary_indent = ' '
50
+
51
+ opt.separator "\nOptions:\n"
52
+
53
+ opt.on('-h', '--help', 'Shows this help message') do
54
+ puts @options
55
+ exit
56
+ end
57
+ end
58
+ end
59
+
60
+ ##
61
+ # Runs the command based on the specified command line arguments.
62
+ #
63
+ # @author Yorick Peterse
64
+ # @author TJ Vanderpoel
65
+ # @since 21-07-2011
66
+ # @param [Array] argv Array containing all the command line arguments.
67
+ #
68
+ def run(argv = [])
69
+ @options.parse!(argv)
70
+
71
+ pid_path = argv.delete_at(0)
72
+ dirname = Pathname.new('.').expand_path.basename.to_s
73
+ pid_path = File.join(Dir.pwd, dirname + '.pid') if pid_path.nil?
74
+
75
+ if File.directory?(pid_path)
76
+ pid_path = File.join(pid_path, File.basename(pid_path) + '.pid')
77
+ end
78
+
79
+ pid_path = Pathname.new(pid_path).expand_path.to_s
80
+
81
+ if !File.exist?(pid_path)
82
+ abort "The PID #{pid_path} does not exist"
83
+ end
84
+
85
+ pid = File.read(pid_path).to_i
86
+ puts 'Stopping the process using SIGINT'
87
+
88
+ begin
89
+ Process.kill('INT', pid)
90
+ rescue => e
91
+ abort "Failed to kill the process: #{e.message}"
92
+ end
93
+
94
+ sleep(2)
95
+
96
+ # Verify that the process has been killed
97
+ if is_running?(pid_path)
98
+ $stderr.puts "The process is still running, let's kill it with -9"
99
+
100
+ begin
101
+ Process.kill(9, pid)
102
+ rescue => e
103
+ abort "Failed to kill the process: #{e.message}"
104
+ end
105
+ end
106
+
107
+ File.unlink(pid_path) if File.exist?(pid_path)
108
+ puts 'Ramazement has ended, go in peace.'
109
+ end
110
+ end # Stop
111
+ end # Bin
112
+ end # Ramaze