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