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