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,87 @@
1
+ require 'irb'
2
+ require 'irb/completion'
3
+
4
+ module Ramaze
5
+ #:nodoc:
6
+ module Bin
7
+ ##
8
+ # Allows the user to enter an IRB like session that takes advantage of
9
+ # everything provided by Ramaze.
10
+ #
11
+ # == Usage
12
+ #
13
+ # ramaze console
14
+ # ramaze console /path/to/app/start.rb
15
+ #
16
+ # @author Yorick Peterse
17
+ # @since 21-07-2011
18
+ #
19
+ class Console
20
+ # String containing the description of this command.
21
+ Description = 'Starts an IRB session with Ramaze loaded into the session'
22
+
23
+ # The banner that is displayed when the -h or --help option is specified.
24
+ Banner = <<-TXT.strip
25
+ Starts an IRB session and loads Ramaze into the session. All specified Rack
26
+ options are ignored and environment variables are passed to IRB.
27
+
28
+ Usage:
29
+ ramaze console [DIR] [OPTIONS]
30
+
31
+ Example:
32
+ ramaze console
33
+ ramaze console /home/foobar/ramaze/start.rb
34
+ TXT
35
+
36
+ ##
37
+ # Creates a new instance of the command and sets all the options.
38
+ #
39
+ # @author Yorick Peterse
40
+ # @since 21-07-2011
41
+ #
42
+ def initialize
43
+ @options = OptionParser.new do |opt|
44
+ opt.banner = Banner
45
+ opt.summary_indent = ' '
46
+
47
+ opt.separator "\nOptions:\n"
48
+
49
+ opt.on('-h', '--help', 'Shows this help message') do
50
+ puts @options
51
+ exit
52
+ end
53
+ end
54
+ end
55
+
56
+ ##
57
+ # Runs the command based on the given command line arguments.
58
+ #
59
+ # @author Yorick Peterse
60
+ # @since 21-07-2011
61
+ # @param [Array] argv An array of command line arguments.
62
+ #
63
+ def run(argv = [])
64
+ @options.parse!(argv)
65
+
66
+ start_file = argv.delete_at(0)
67
+ start_file = File.join(Dir.pwd, 'start.rb') if start_file.nil?
68
+
69
+ if File.directory?(start_file)
70
+ start_file = File.join(start_file, 'start.rb')
71
+ end
72
+
73
+ if !File.exist?(start_file)
74
+ abort "The file #{start_file} does not exist"
75
+ end
76
+
77
+ start_file = Pathname.new(start_file).realpath.to_s
78
+ Ramaze.options.started = true
79
+
80
+ require(start_file)
81
+
82
+ IRB.start
83
+ puts 'Ramazement has ended, go in peace.'
84
+ end
85
+ end # Console
86
+ end # Bin
87
+ end # Ramaze
@@ -0,0 +1,94 @@
1
+ require 'fileutils'
2
+
3
+ module Ramaze
4
+ #:nodoc:
5
+ module Bin
6
+ ##
7
+ # Simple command that allows users to easily create a new application based
8
+ # on the prototype that ships with Ramaze.
9
+ #
10
+ # == Usage
11
+ #
12
+ # ramaze create blog
13
+ #
14
+ # @author Yorick Peterse
15
+ # @since 21-07-2011
16
+ #
17
+ class Create
18
+ # The description of this command as shown in the global help message.
19
+ Description = 'Allows developers to easily create new Ramaze applications.'
20
+
21
+ # The banner of this command.
22
+ Banner = <<-TXT.strip
23
+ Allows developers to easily create new Ramaze applications based on the
24
+ prototype that ships with Ramaze.
25
+
26
+ Usage:
27
+ ramaze create [NAME] [OPTIONS]
28
+
29
+ Example:
30
+ ramaze create blog
31
+ TXT
32
+
33
+ ##
34
+ # Creates a new instance of the command and sets the options for
35
+ # OptionParser.
36
+ #
37
+ # @author Yorick Peterse
38
+ # @since 21-07-2011
39
+ #
40
+ def initialize
41
+ @options = {
42
+ :force => false
43
+ }
44
+
45
+ @opts = OptionParser.new do |opt|
46
+ opt.banner = Banner
47
+ opt.summary_indent = ' '
48
+
49
+ opt.separator "\nOptions:\n"
50
+
51
+ opt.on('-f', '--force', 'Overwrites existing directories') do
52
+ @options[:force] = true
53
+ end
54
+
55
+ opt.on('-h', '--help', 'Shows this help message') do
56
+ puts @opts
57
+ exit
58
+ end
59
+ end
60
+ end
61
+
62
+ ##
63
+ # Runs the command based on the specified command line arguments.
64
+ #
65
+ # @author Yorick Peterse
66
+ # @since 21-07-2011
67
+ # @param [Array] argv Array containing all command line arguments.
68
+ #
69
+ def run(argv = [])
70
+ @opts.parse!(argv)
71
+
72
+ path = argv.delete_at(0)
73
+ proto = __DIR__('../../proto')
74
+
75
+ abort 'You need to specify a name for your application' if path.nil?
76
+
77
+ if File.directory?(path) and @options[:force] === false
78
+ abort 'The specified application already exists, use -f to overwrite it'
79
+ end
80
+
81
+ if File.directory?(path) and @options[:force] === true
82
+ FileUtils.rm_rf(path)
83
+ end
84
+
85
+ begin
86
+ FileUtils.cp_r(proto, path)
87
+ puts "The application has been generated and saved in #{path}"
88
+ rescue
89
+ abort 'The application could not be generated'
90
+ end
91
+ end
92
+ end # Create
93
+ end # Bin
94
+ end # Ramaze
@@ -0,0 +1,107 @@
1
+ module Ramaze
2
+ #:nodoc:
3
+ module Bin
4
+ ##
5
+ # Module containing various helper methods useful for most commands.
6
+ #
7
+ # @author Yorick Peterse
8
+ # @author TJ Vanderpoel
9
+ # @since 21-07-2011
10
+ #
11
+ module Helper
12
+ ##
13
+ # Checks if the specified PID points to a process that's already running.
14
+ #
15
+ # @author TJ Vanderpoel
16
+ # @since 21-07-2011
17
+ # @param [String] pid The path to the PID.
18
+ # @return [TrueClass|FalseClass]
19
+ #
20
+ def is_running?(pid)
21
+ return false if !File.exist?(pid)
22
+
23
+ pid = File.read(pid).to_i
24
+
25
+ if is_windows?
26
+ wmi = WIN32OLE.connect("winmgmts://")
27
+ processes, ours = wmi.ExecQuery(
28
+ "select * from win32_process where ProcessId = #{pid}"
29
+ ), []
30
+
31
+ processes.each { |process| ours << process.Name }
32
+
33
+ return ours.first.nil?
34
+ else
35
+ begin
36
+ prio = Process.getpriority(Process::PRIO_PROCESS, pid)
37
+ return true
38
+ rescue Errno::ESRCH
39
+ return false
40
+ end
41
+ end
42
+ end
43
+
44
+ ##
45
+ # Checks if the system the user is using is Windows.
46
+ #
47
+ # @author TJ Vanderpoel
48
+ # @since 21-07-2011
49
+ # @return [TrueClass|FalseClass]
50
+ #
51
+ def is_windows?
52
+ return @is_win if @is_win
53
+
54
+ begin; require "win32ole"; rescue LoadError; end
55
+
56
+ @is_win ||= Object.const_defined?("WIN32OLE")
57
+ end
58
+
59
+ ##
60
+ # Tries to extract the path to the Rackup executable.
61
+ #
62
+ # @author TJ Vanderpoel
63
+ # @since 21-07-2001
64
+ # @return [String]
65
+ #
66
+ def rackup_path
67
+ return @rackup_path if @rackup_path
68
+
69
+ # Check with 'which' on platforms which support it
70
+ unless is_windows?
71
+ @rackup_path = %x{which rackup}.to_s.chomp
72
+
73
+ if @rackup_path.size > 0 and File.file?(@rackup_path)
74
+ return @rackup_path
75
+ end
76
+ end
77
+
78
+ # check for rackup in RUBYLIB
79
+ libs = ENV["RUBYLIB"].to_s.split(is_windows? ? ";" : ":")
80
+
81
+ if rack_lib = libs.detect { |r| r.match %r<(\\|/)rack\1> }
82
+ require "pathname"
83
+ @rackup_path = Pathname.new(rack_lib).parent.join("bin").join(
84
+ "rackup"
85
+ ).expand_path
86
+
87
+ return @rackup_path if File.file?(@rackup_path)
88
+ end
89
+
90
+ begin
91
+ require "rubygems"
92
+ require "rack"
93
+ require "pathname"
94
+
95
+ @rackup_path = Pathname.new(Gem.bindir).join("rackup").to_s
96
+
97
+ return @rackup_path if File.file?(@rackup_path)
98
+ rescue LoadError
99
+ nil
100
+ end
101
+
102
+ @rackup_path = nil
103
+ abort "Cannot find the path to the Rackup executable"
104
+ end
105
+ end # Helper
106
+ end # Bin
107
+ end # Ramaze
@@ -0,0 +1,95 @@
1
+ module Ramaze
2
+ #:nodoc:
3
+ module Bin
4
+ ##
5
+ # Restarts an application based on a specified directory/rackup file and
6
+ # PID. The PID is used to kill the process, the Rackup file is used to start
7
+ # the process again after it has been killed.
8
+ #
9
+ # == Usage
10
+ #
11
+ # ramaze restart
12
+ # ramaze restart /home/foobar/projects/ramaze/ \
13
+ # -P /home/foobar/projects/ramaze/ramaze.pid
14
+ #
15
+ # @author Yorick Peterse
16
+ # @since 21-07-2011
17
+ #
18
+ class Restart
19
+ # The description of this command, displayed in the global help message.
20
+ Description = 'Restarts an application'
21
+
22
+ # The banner, displayed when the -h or --help option is specified.
23
+ Banner = <<-TXT.strip
24
+ Restarts an active Ramaze application.
25
+
26
+ Usage:
27
+ ramaze restart [RACKUP] [OPTIONS]
28
+
29
+ Example:
30
+ ramaze restart config.ru -P ramaze.pid
31
+ TXT
32
+
33
+ ##
34
+ # Creates a new instance of the command and sets all the options.
35
+ #
36
+ # @author Yorick Peterse
37
+ # @since 21-07-2011
38
+ #
39
+ def initialize
40
+ @options = OptionParser.new do |opt|
41
+ opt.banner = Banner
42
+ opt.summary_indent = ' '
43
+
44
+ opt.separator "\nOptions:\n"
45
+
46
+ opt.on('-h', '--help', 'Shows this help message') do
47
+ puts @options
48
+ exit
49
+ end
50
+
51
+ opt.on(
52
+ '-P',
53
+ '--pid FILE',
54
+ 'Uses the PID to kill the application'
55
+ ) do |pid|
56
+ @pid = pid
57
+ end
58
+ end
59
+ end
60
+
61
+ ##
62
+ # Runs the command based on the specified command line arguments.
63
+ #
64
+ # @author Yorick Peterse
65
+ # @since 21-07-2011
66
+ # @param [Array] argv An array containing all command line arguments.
67
+ #
68
+ def run(argv = [])
69
+ @options.parse!(argv)
70
+
71
+ @rackup = argv.delete_at(0)
72
+ @rackup = File.join(Dir.pwd, 'config.ru') if @rackup.nil?
73
+
74
+ if File.directory?(@rackup)
75
+ @rackup = File.join(@rackup, 'config.ru')
76
+ end
77
+
78
+ if !File.exist?(@rackup)
79
+ abort "The Rackup file #{@rackup} does not exist"
80
+ end
81
+
82
+ stop = Ramaze::Bin::Runner::Commands[:stop].new
83
+ start = Ramaze::Bin::Runner::Commands[:start].new
84
+ params = [@rackup]
85
+
86
+ unless @pid.nil?
87
+ params.push("-P #{@pid}")
88
+ end
89
+
90
+ stop.run([@pid])
91
+ start.run(params)
92
+ end
93
+ end # Restart
94
+ end # Bin
95
+ end # Ramaze
@@ -0,0 +1,141 @@
1
+ require 'optparse'
2
+ require 'pathname'
3
+
4
+ require __DIR__('helper')
5
+ require __DIR__('start')
6
+ require __DIR__('restart')
7
+ require __DIR__('stop')
8
+ require __DIR__('create')
9
+ require __DIR__('status')
10
+ require __DIR__('console')
11
+
12
+ module Ramaze
13
+ #:nodoc:
14
+ module Bin
15
+ ##
16
+ # Module used for running a particular command based on the specified
17
+ # command line arguments.
18
+ #
19
+ # == Usage
20
+ #
21
+ # ramaze --help # Shows a help message
22
+ # ramaze -h # Shows a help message as well
23
+ # ramaze -v # Shows the version of Ramaze
24
+ #
25
+ # ramaze [COMMAND] # Runs [COMMAND]
26
+ #
27
+ # @author Yorick Peterse
28
+ # @since 21-07-2011
29
+ #
30
+ module Runner
31
+ # Hash containing all the available commands, their names and their
32
+ # classes.
33
+ Commands = {
34
+ :start => Ramaze::Bin::Start,
35
+ :stop => Ramaze::Bin::Stop,
36
+ :restart => Ramaze::Bin::Restart,
37
+ :status => Ramaze::Bin::Status,
38
+ :create => Ramaze::Bin::Create,
39
+ :console => Ramaze::Bin::Console,
40
+ }
41
+
42
+ # String containing the banner of the main command.
43
+ Banner = <<-TXT.strip
44
+ Ramaze is a simple, light and modular open-source web application
45
+ framework written in Ruby.
46
+
47
+ Usage:
48
+ ramaze [COMMAND] [OPTIONS]
49
+
50
+ Example:
51
+ ramaze create blog
52
+ TXT
53
+
54
+ ##
55
+ # Runs a particular command based on the specified array.
56
+ #
57
+ # @example
58
+ # Ramaze::Bin::Runner.run(ARGV)
59
+ # Ramaze::Bin::Runner.run(['start', '--help'])
60
+ #
61
+ # @author Yorick Peterse
62
+ # @since 21-07-2011
63
+ # @param [Array] argv An array containing command line arguments, set to
64
+ # ARGV by default.
65
+ #
66
+ def self.run(argv=ARGV)
67
+ op = OptionParser.new do |opt|
68
+ opt.banner = Banner
69
+ opt.summary_indent = ' '
70
+
71
+ opt.separator "\nCommands:\n #{commands_info.join("\n ")}"
72
+
73
+ # Show all the common options
74
+ opt.separator "\nOptions:\n"
75
+
76
+ # Show the version of Ramaze
77
+ opt.on('-v', '--version', 'Shows the version of Ramaze') do
78
+ puts Ramaze::VERSION
79
+ exit
80
+ end
81
+
82
+ opt.on('-h', '--help', 'Shows this help message') do
83
+ puts op
84
+ exit
85
+ end
86
+ end
87
+
88
+ op.order!(argv)
89
+
90
+ # Show a help message if no command has been specified
91
+ if !argv[0]
92
+ puts op.to_s
93
+ exit
94
+ end
95
+
96
+ cmd = argv.delete_at(0).to_sym
97
+
98
+ if Commands.key?(cmd)
99
+ cmd = Commands[cmd].new
100
+ cmd.run(argv)
101
+ else
102
+ abort 'The specified command is invalid'
103
+ end
104
+ end
105
+
106
+ ##
107
+ # Generates an array of "rows" where each row contains the name and
108
+ # description of a command. The descriptions of all commands are aligned
109
+ # based on the length of the longest command name.
110
+ #
111
+ # @author Yorick Peterse
112
+ # @since 21-07-2011
113
+ # @return [Array]
114
+ #
115
+ def self.commands_info
116
+ cmds = []
117
+ longest = Commands.map { |name, klass| name.to_s }.sort[0].size
118
+
119
+ Commands.each do |name, klass|
120
+ name = name.to_s
121
+ desc = ''
122
+
123
+ # Try to extract the command description
124
+ if klass.respond_to?(:const_defined?) \
125
+ and klass.const_defined?(:Description)
126
+ desc = klass.const_get(:Description)
127
+ end
128
+
129
+ # Align the description based on the length of the name
130
+ while name.size <= longest do
131
+ name += ' '
132
+ end
133
+
134
+ cmds.push(["#{name} #{desc}"])
135
+ end
136
+
137
+ return cmds
138
+ end
139
+ end # Runner
140
+ end # Bin
141
+ end # Ramaze