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,109 @@
1
+ /**
2
+ * Stylesheet used for styling headings, links, etc.
3
+ *
4
+ * @author Yorick Peterse
5
+ * @link http://yorickpeterse.com/
6
+ */
7
+ body
8
+ {
9
+ background: url('../images/bg.png') repeat top left;
10
+ border-top: 5px solid #444;
11
+ color: #444;
12
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, Arial, sans-serif;
13
+ font-size: 14px;
14
+ }
15
+
16
+ p
17
+ {
18
+ font-size: 14px;
19
+ line-height: 22px;
20
+ margin-bottom: 20px;
21
+ }
22
+
23
+ a
24
+ {
25
+ color: #444;
26
+ }
27
+
28
+ ol
29
+ {
30
+ margin-left: 20px;
31
+ }
32
+
33
+ ol li
34
+ {
35
+ list-style-type: decimal;
36
+ }
37
+
38
+ ul
39
+ {
40
+ margin-left: 18px;
41
+ }
42
+
43
+ ul li
44
+ {
45
+ list-style-type: disc;
46
+ }
47
+
48
+ ul, ol
49
+ {
50
+ line-height: 22px;
51
+ margin-bottom: 20px;
52
+ }
53
+
54
+ a:hover, h1 a:hover
55
+ {
56
+ color: #E33F1E;
57
+ }
58
+
59
+ h1, h2, h3, h4, h5, h6
60
+ {
61
+ font-weight: bold;
62
+ margin-bottom: 5px;
63
+ }
64
+
65
+ h1
66
+ {
67
+ font-size: 28px;
68
+ }
69
+
70
+ h2
71
+ {
72
+ font-size: 24px;
73
+ }
74
+
75
+ h3
76
+ {
77
+ font-size: 22px;
78
+ }
79
+
80
+ h4
81
+ {
82
+ font-size: 20px;
83
+ }
84
+
85
+ h5
86
+ {
87
+ font-size: 18px;
88
+ }
89
+
90
+ h6
91
+ {
92
+ font-size: 16px;
93
+ }
94
+
95
+ h1 a
96
+ {
97
+ color: #444;
98
+ text-decoration: none;
99
+ }
100
+
101
+ pre
102
+ {
103
+ margin: 20px 0px;
104
+ }
105
+
106
+ code
107
+ {
108
+ background: #eee;
109
+ }
Binary file
@@ -9,12 +9,12 @@ describe MainController do
9
9
  should 'show start page' do
10
10
  get('/').status.should == 200
11
11
  last_response['Content-Type'].should == 'text/html'
12
- last_response.should =~ /<h1>Welcome to Ramaze!<\/h1>/
12
+ last_response.should =~ /Congratulations, Ramaze is running fine/
13
13
  end
14
14
 
15
15
  should 'show /notemplate' do
16
16
  get('/notemplate').status.should == 200
17
17
  last_response['Content-Type'].should == 'text/html'
18
- last_response.should =~ /there is no 'notemplate\.xhtml' associated with this action/
18
+ last_response.should =~ /There is no 'notemplate\.xhtml' associated with this action\./
19
19
  end
20
20
  end
data/lib/proto/start.rb CHANGED
@@ -2,9 +2,19 @@
2
2
 
3
3
  # Use this file directly like `ruby start.rb` if you don't want to use the
4
4
  # `ramaze start` command.
5
+ #
5
6
  # All application related things should go into `app.rb`, this file is simply
6
7
  # for options related to running the application locally.
7
-
8
+ #
9
+ # You can run this file as following:
10
+ #
11
+ # $ ruby start.rb
12
+ # $ ./start.rb
13
+ #
14
+ # If you want to be able to do the latter you'll have to make sure the file can be
15
+ # executed:
16
+ #
17
+ # $ chmod +x ./start.rb
8
18
  require File.expand_path('../app', __FILE__)
9
19
 
10
20
  Ramaze.start(:adapter => :webrick, :port => 7000, :file => __FILE__)
@@ -1,41 +1,45 @@
1
1
  <p>
2
- Ramaze is working correctly with this application, now you can start working.
2
+ Congratulations, Ramaze is running fine and you can start working on your application.
3
3
  </p>
4
4
 
5
5
  <p>
6
- To start you can modify:
7
- <ol>
6
+ You can play around with this prototype by changing the following:
7
+ </p>
8
+
9
+ <ul>
8
10
  <li>
9
- <code>view/index.xhtml</code>, this page.
11
+ <code>view/index.xhtml</code>: the content of this page.
10
12
  </li>
11
13
  <li>
12
- <code>layout/default.xhtml</code>, the layout for this page.
14
+ <code>layout/default.xhtml</code>: the layout for this page.
13
15
  </li>
14
16
  <li>
15
- <code>controller/main.rb</code>, where you can change the header of this
16
- page and the <a href="/notemplate">notemplate</a> action
17
+ <code>controller/main.rb</code>: the controller responsible for server this page.
17
18
  </li>
18
- </ol>
19
- </p>
19
+ </ul>
20
20
 
21
- <p>For more documentation, check out <a href="http://ramaze.net">ramaze.net</a> and <a href="http://wiki.ramaze.net">wiki.ramaze.net</a>, which includes:
22
- <ul>
23
- <li>a <a href="http://wiki.ramaze.net/Walkthrough">getting started</a> guide</li>
24
- <li>some <a href="http://wiki.ramaze.net/Screencasts">screencasts</a></li>
25
- <li>and an <a href="http://wiki.ramaze.net/Tutorials/Todolist">introductory tutorial</a></li>
26
- </ul>
21
+ <p>
22
+ For more information, check out <a href="http://ramaze.net">ramaze.net</a> and
23
+ <a href="http://ramaze.net/documentation/index.html">the documentation</a>.
24
+ <br />
25
+ You can also read the
26
+ <a href="http://doc.rubyists.com/ramaze%2binnate/">YARD documentation</a>
27
+ or browse around the <a href="https://github.com/ramaze/ramaze">Ramaze source code</a>.
27
28
  </p>
28
29
 
29
30
  <p>
30
- You can also read the
31
- <a href="http://doc.rubyists.com/ramaze%2binnate/">rdocs</a>
32
- or browse around the
33
- <a href="http://source.ramaze.net">Ramaze source code</a>.
31
+ For help with Ramaze, visit
32
+ <a href="irc://chat.freenode.net/ramaze">#ramaze on irc.freenode.net</a>.
33
+ <br />
34
+ You can use <a href="http://embed.mibbit.com/?server=irc.freenode.net&channel=#ramaze,#ruby-lang&forcePrompt=true">Mibbit</a>,
35
+ an AJAX based IRC client or
36
+ <a href="http://java.freenode.net/?channel=ramaze">
37
+ the official freenode irc java applet
38
+ </a>.
34
39
  </p>
35
40
 
36
41
  <p>
37
- For help with Ramaze, visit <a href="irc://chat.freenode.net/ramaze">#ramaze on irc.freenode.net</a>.<br />
38
- You can use <a href="http://embed.mibbit.com/?server=irc.freenode.net&channel=#ramaze,#ruby-lang&forcePrompt=true">Mibbit</a>, an AJAX based IRC client or <a href="http://java.freenode.net/?channel=ramaze">the official freenode irc java applet</a>.
39
- <br />
40
- Feel free to post to the <a href="http://groups.google.com/group/ramaze">Ramaze Google Group</a>, your first mail has to go through moderation, so please be patient.
42
+ Feel free to post to the
43
+ <a href="https://groups.google.com/forum/#!forum/ramaze">Ramaze Google Group</a>, your
44
+ first mail has to go through moderation, so please be patient.
41
45
  </p>
data/lib/ramaze.rb CHANGED
@@ -92,7 +92,6 @@ module Ramaze
92
92
  m.use Rack::ETag, 'public'
93
93
  end
94
94
 
95
- m.use Rack::ETag
96
95
  m.use Rack::Head
97
96
  m.run Ramaze::AppMap
98
97
  end
data/lib/ramaze/app.rb CHANGED
@@ -3,9 +3,9 @@ module Ramaze
3
3
  # common name.
4
4
  # Every application has a location it dispatches from, this behaves similar
5
5
  # to Rack::URLMap.
6
-
7
6
  AppMap = Innate::URLMap.new
8
7
 
8
+ #:nodoc:
9
9
  def self.to(object)
10
10
  app_name = object.ancestral_trait[:app]
11
11
  App[app_name].to(object)
@@ -70,6 +70,38 @@ module Ramaze
70
70
 
71
71
  attr_reader :name, :location, :url_map, :options
72
72
 
73
+ ##
74
+ # Finds or creates an application for the given name and URI.
75
+ #
76
+ # @author Michael Fellinger
77
+ # @param [String] name The name of the application.
78
+ # @param [String] location The URI to which the app is mapped.
79
+ # @return [Ramaze::App]
80
+ #
81
+ def self.find_or_create(name, location = nil)
82
+ location = '/' if location.nil? && name == :pristine
83
+ self[name] || new(name, location)
84
+ end
85
+
86
+ ##
87
+ # Returns the application for the given name.
88
+ #
89
+ # @author Michael Fellinger
90
+ # @param [String] name The name of the application.
91
+ # @return [Ramaze::App]
92
+ #
93
+ def self.[](name)
94
+ APP_LIST[name.to_sym]
95
+ end
96
+
97
+ ##
98
+ # Creates a new instance of the application and sets the name and location.
99
+ #
100
+ # @author Michael Fellinger
101
+ # @since 30-06-2009
102
+ # @param [String] name The name of the application.
103
+ # @param [String] location The location to which the application is mapped.
104
+ #
73
105
  def initialize(name, location = nil)
74
106
  @name = name.to_sym
75
107
  @url_map = Innate::URLMap.new
@@ -80,46 +112,87 @@ module Ramaze
80
112
  @options = self.class.options.sub(@name)
81
113
  end
82
114
 
115
+ ##
116
+ # Syncs the instance of the current application with Ramaze::AppMap.
117
+ #
118
+ # @author Michael Fellinger
119
+ # @since 30-06-2009
120
+ #
83
121
  def sync
84
122
  AppMap.map(location, self)
85
123
  end
86
124
 
125
+ ##
126
+ # Sets the location and syncs the application.
127
+ #
128
+ # @author Michael Fellinger
129
+ # @since 30-06-2009
130
+ #
87
131
  def location=(location)
88
132
  @location = location.to_str.freeze
89
133
  sync
90
134
  end
91
135
 
136
+ ##
137
+ # Allows the application to be called as a Rack middleware.
138
+ #
139
+ # @author Michael Fellinger
140
+ # @since 30-06-2009
141
+ # @param [Hash] env The environment hash.
142
+ #
92
143
  def call(env)
93
144
  to_app.call(env)
94
145
  end
95
146
 
147
+ ##
148
+ # Converts the application to a Rack compatible class.
149
+ #
150
+ # @author Michael Fellinger
151
+ # @since 30-06-2009
152
+ # @return [Rack::Cascade]
153
+ #
96
154
  def to_app
97
155
  files = Ramaze::Files.new(*public_roots)
98
156
  app = Current.new(Route.new(url_map), Rewrite.new(url_map))
99
157
  Rack::Cascade.new([files, app])
100
158
  end
101
159
 
160
+ ##
161
+ # Maps an object to the given URI.
162
+ #
163
+ # @author Michael Fellinger
164
+ # @since 30-06-2009
165
+ # @param [String] location The URI to map the object to.
166
+ # @param [Object] object The object (usually a controller) to map to the
167
+ # URI.
168
+ #
102
169
  def map(location, object)
103
170
  url_map.map(location, object)
104
171
  end
105
172
 
173
+ ##
174
+ # Returns a URI to the given object.
175
+ #
176
+ # @author Michael Fellinger
177
+ # @since 30-06-2009
178
+ # @param [Object] object An object for which to generate the URI.
179
+ #
106
180
  def to(object)
107
181
  return unless mapped = url_map.to(object)
108
182
  [location, mapped].join('/').squeeze('/')
109
183
  end
110
184
 
185
+ ##
186
+ # Returns an array containing all the public directories for each root
187
+ # directory.
188
+ #
189
+ # @author Michael Fellinger
190
+ # @since 30-06-2009
191
+ # @return [Array]
192
+ #
111
193
  def public_roots
112
194
  roots, publics = [*options.roots], [*options.publics]
113
195
  roots.map{|root| publics.map{|public| ::File.join(root, public) }}.flatten
114
196
  end
115
-
116
- def self.find_or_create(name, location = nil)
117
- location = '/' if location.nil? && name == :pristine
118
- self[name] || new(name, location)
119
- end
120
-
121
- def self.[](name)
122
- APP_LIST[name.to_sym]
123
- end
124
- end
125
- end
197
+ end # App
198
+ end # Ramaze
@@ -0,0 +1,107 @@
1
+ require 'set'
2
+
3
+ module Ramaze
4
+ ##
5
+ # The AppGraph class can be used to generate a graph of all the URLs mapped in
6
+ # a Ramaze application and saves this graph as an image.
7
+ #
8
+ # == Usage
9
+ #
10
+ # In order to generate a graph of your application all you need to do is the
11
+ # following:
12
+ #
13
+ # require 'ramaze/app_graph'
14
+ #
15
+ # graph = Ramaze::AppGraph.new graph.generate graph.show
16
+ #
17
+ # Once this code is executed you can find the .dot and PNG files in the root
18
+ # directory of your application.
19
+ #
20
+ # @author Michael Fellinger
21
+ #
22
+ class AppGraph
23
+ ##
24
+ # Creates a new instance of the class.
25
+ #
26
+ # @author Michael Fellinger
27
+ #
28
+ def initialize
29
+ @out = Set.new
30
+ end
31
+
32
+ ##
33
+ # Generates the graph based on all the current routes. The graph is saved in
34
+ # the application directory.
35
+ #
36
+ # @author Michael Fellinger
37
+ #
38
+ def generate
39
+ Ramaze::AppMap.to_hash.each do |location, app|
40
+ connect(location => app.name)
41
+
42
+ app.url_map.to_hash.each do |c_location, c_node|
43
+ connect(app.name => c_node)
44
+ connect(c_node.mapping => c_node)
45
+
46
+ c_node.update_template_mappings
47
+ c_node.view_templates.each do |wish, mapping|
48
+ mapping.each do |action_name, template|
49
+ action_path = File.join(c_node.mapping, action_name)
50
+ connect(c_node => action_path, action_path => template)
51
+ end
52
+ end
53
+
54
+ c_node.update_method_arities
55
+ c_node.method_arities.each do |method, arity|
56
+ action_path = File.join(c_node.mapping, method.to_s)
57
+ connect(
58
+ action_path => "#{c_node}##{method}[#{arity}]",
59
+ c_node => action_path
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ ##
67
+ # Connects various elements in the graph to each other.
68
+ #
69
+ # @author Michael Fellinger
70
+ #
71
+ def connect(hash)
72
+ hash.each do |from, to|
73
+ @out << (" %p -> %p;" % [from.to_s, to.to_s])
74
+ end
75
+ end
76
+
77
+ ##
78
+ # Writes the dot file containing the graph data.
79
+ #
80
+ # @author Michael Fellinger
81
+ #
82
+ def write_dot
83
+ File.open('graph.dot', 'w+') do |dot|
84
+ dot.puts 'digraph appmap {'
85
+ dot.puts(*@out)
86
+ dot.puts '}'
87
+ end
88
+ end
89
+
90
+ ##
91
+ # Generates a PNG file based on the .dot file.
92
+ #
93
+ # @author Michael Fellinger
94
+ #
95
+ def show
96
+ write_dot
97
+ options = {
98
+ 'rankdir' => 'LR',
99
+ 'splines' => 'true',
100
+ 'overlap' => 'false',
101
+ }
102
+ args = options.map{|k,v| "-G#{k}=#{v}" }
103
+ system("dot -O -Tpng #{args.join(' ')} graph.dot")
104
+ system('feh graph.dot.png')
105
+ end
106
+ end # AppGraph
107
+ end # Ramaze