ramaze 2008.06 → 2008.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/README.markdown +6 -6
  2. data/Rakefile +33 -3
  3. data/bin/ramaze +18 -0
  4. data/doc/CHANGELOG +960 -0
  5. data/doc/LEGAL +5 -1
  6. data/doc/meta/announcement.txt +20 -36
  7. data/doc/tutorial/todolist.html +421 -313
  8. data/doc/tutorial/todolist.mkd +33 -16
  9. data/examples/app/blog/spec/blog.rb +3 -3
  10. data/examples/app/rapaste/controller/paste.rb +8 -1
  11. data/examples/app/rapaste/model/paste.rb +3 -0
  12. data/examples/app/rapaste/spec/rapaste.rb +3 -1
  13. data/examples/app/rapaste/start.rb +3 -2
  14. data/examples/app/sourceview/public/sourceview.js +2 -2
  15. data/examples/app/todolist/spec/todolist.rb +6 -6
  16. data/examples/app/todolist/template/index.xhtml +1 -1
  17. data/examples/app/whywiki/spec/whywiki.rb +2 -2
  18. data/examples/app/wikore/spec/wikore.rb +2 -2
  19. data/examples/app/wikore/src/model.rb +4 -3
  20. data/examples/app/wiktacular/spec/wiktacular.rb +7 -7
  21. data/examples/basic/simple.rb +2 -2
  22. data/examples/helpers/paginate.rb +71 -0
  23. data/examples/misc/simple_auth.rb +20 -8
  24. data/lib/proto/controller/init.rb +10 -0
  25. data/lib/proto/controller/main.rb +1 -3
  26. data/lib/proto/model/init.rb +4 -0
  27. data/lib/proto/public/dispatch.fcgi +1 -1
  28. data/lib/proto/spec/main.rb +2 -1
  29. data/lib/proto/start.rb +3 -3
  30. data/lib/proto/start.ru +1 -1
  31. data/lib/proto/view/error.xhtml +4 -4
  32. data/lib/ramaze.rb +8 -3
  33. data/lib/ramaze/action.rb +6 -6
  34. data/lib/ramaze/adapter.rb +1 -6
  35. data/lib/ramaze/adapter/base.rb +30 -27
  36. data/lib/ramaze/adapter/cgi.rb +1 -0
  37. data/lib/ramaze/cache.rb +1 -3
  38. data/lib/ramaze/cache/memcached.rb +3 -5
  39. data/lib/ramaze/contrib/auto_params.rb +2 -2
  40. data/lib/ramaze/contrib/auto_params/get_args.rb +2 -1
  41. data/lib/ramaze/contrib/gems.rb +17 -18
  42. data/lib/ramaze/contrib/gzip_filter.rb +22 -9
  43. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  44. data/lib/ramaze/contrib/profiling.rb +1 -1
  45. data/lib/ramaze/contrib/rest.rb +16 -13
  46. data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
  47. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  48. data/lib/ramaze/contrib/sequel/image.rb +198 -0
  49. data/lib/ramaze/contrib/sequel/relation.rb +82 -0
  50. data/lib/ramaze/controller.rb +33 -34
  51. data/lib/ramaze/controller/resolve.rb +29 -9
  52. data/lib/ramaze/current.rb +60 -20
  53. data/lib/ramaze/current/request.rb +8 -7
  54. data/lib/ramaze/current/response.rb +15 -3
  55. data/lib/ramaze/current/session/flash.rb +8 -0
  56. data/lib/ramaze/dispatcher.rb +17 -9
  57. data/lib/ramaze/dispatcher/action.rb +4 -5
  58. data/lib/ramaze/dispatcher/directory.rb +1 -1
  59. data/lib/ramaze/dispatcher/error.rb +4 -4
  60. data/lib/ramaze/dispatcher/file.rb +4 -4
  61. data/lib/ramaze/gestalt.rb +15 -20
  62. data/lib/ramaze/helper/cgi.rb +7 -15
  63. data/lib/ramaze/helper/formatting.rb +41 -1
  64. data/lib/ramaze/helper/httpdigest.rb +20 -7
  65. data/lib/ramaze/helper/link.rb +4 -6
  66. data/lib/ramaze/helper/paginate.rb +233 -0
  67. data/lib/ramaze/helper/redirect.rb +1 -1
  68. data/lib/ramaze/helper/rest.rb +1 -1
  69. data/lib/ramaze/helper/thread.rb +17 -0
  70. data/lib/ramaze/helper/ultraviolet.rb +44 -0
  71. data/lib/ramaze/helper/user.rb +4 -9
  72. data/lib/ramaze/log.rb +2 -2
  73. data/lib/ramaze/log/analogger.rb +21 -23
  74. data/lib/ramaze/log/growl.rb +21 -23
  75. data/lib/ramaze/log/hub.rb +1 -1
  76. data/lib/ramaze/log/informer.rb +97 -99
  77. data/lib/ramaze/log/knotify.rb +14 -16
  78. data/lib/ramaze/log/logger.rb +11 -13
  79. data/lib/ramaze/log/logging.rb +61 -63
  80. data/lib/ramaze/log/rotatinginformer.rb +168 -0
  81. data/lib/ramaze/log/syslog.rb +41 -31
  82. data/lib/ramaze/log/xosd.rb +70 -72
  83. data/lib/ramaze/option.rb +9 -6
  84. data/lib/ramaze/option/holder.rb +5 -27
  85. data/lib/ramaze/reloader.rb +186 -0
  86. data/lib/ramaze/setup.rb +1 -1
  87. data/lib/ramaze/snippets.rb +13 -0
  88. data/lib/ramaze/snippets/array/put_within.rb +31 -24
  89. data/lib/ramaze/snippets/binding/locals.rb +23 -11
  90. data/lib/ramaze/snippets/dictionary.rb +2 -2
  91. data/lib/ramaze/snippets/fiber.rb +63 -0
  92. data/lib/ramaze/snippets/kernel/constant.rb +36 -21
  93. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +12 -6
  94. data/lib/ramaze/snippets/numeric/filesize_format.rb +24 -17
  95. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  96. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  97. data/lib/ramaze/snippets/object/acquire.rb +40 -0
  98. data/lib/ramaze/snippets/object/instance_variable_defined.rb +16 -5
  99. data/lib/ramaze/snippets/object/pretty.rb +14 -4
  100. data/lib/ramaze/snippets/object/scope.rb +14 -7
  101. data/lib/ramaze/snippets/ordered_set.rb +25 -14
  102. data/lib/ramaze/snippets/proc/locals.rb +17 -9
  103. data/lib/ramaze/snippets/ramaze/deprecated.rb +13 -0
  104. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  105. data/lib/ramaze/snippets/ramaze/state.rb +86 -0
  106. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  107. data/lib/ramaze/snippets/string/camel_case.rb +13 -8
  108. data/lib/ramaze/snippets/string/color.rb +24 -20
  109. data/lib/ramaze/snippets/string/each.rb +14 -3
  110. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  111. data/lib/ramaze/snippets/string/esc.rb +26 -21
  112. data/lib/ramaze/snippets/string/ord.rb +12 -6
  113. data/lib/ramaze/snippets/string/snake_case.rb +13 -7
  114. data/lib/ramaze/snippets/string/start_with.rb +16 -5
  115. data/lib/ramaze/snippets/string/unindent.rb +23 -15
  116. data/lib/ramaze/snippets/thread/into.rb +3 -3
  117. data/lib/ramaze/spec/helper/bacon.rb +5 -5
  118. data/lib/ramaze/spec/helper/mock_http.rb +1 -1
  119. data/lib/ramaze/spec/helper/pretty_output.rb +2 -2
  120. data/lib/ramaze/spec/helper/snippets.rb +8 -0
  121. data/lib/ramaze/template.rb +4 -1
  122. data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
  123. data/lib/ramaze/template/maruku.rb +34 -0
  124. data/lib/ramaze/template/tagz.rb +2 -2
  125. data/lib/ramaze/template/xslt.rb +2 -2
  126. data/lib/ramaze/tool/create.rb +27 -53
  127. data/lib/ramaze/tool/localize.rb +8 -4
  128. data/lib/ramaze/tool/mime.rb +11 -1
  129. data/lib/ramaze/tool/project_creator.rb +110 -0
  130. data/lib/ramaze/trinity.rb +4 -1
  131. data/lib/ramaze/version.rb +1 -1
  132. data/lib/vendor/bacon.rb +323 -0
  133. data/rake_tasks/gem.rake +10 -1
  134. data/rake_tasks/maintenance.rake +40 -2
  135. data/rake_tasks/metric.rake +24 -0
  136. data/rake_tasks/release.rake +17 -4
  137. data/rake_tasks/spec.rake +1 -2
  138. data/ramaze.gemspec +549 -495
  139. data/spec/contrib/auto_params.rb +3 -3
  140. data/spec/contrib/profiling.rb +2 -2
  141. data/spec/examples/simple_auth.rb +2 -2
  142. data/spec/examples/templates/template_haml.rb +0 -2
  143. data/spec/ramaze/action/file_cache.rb +22 -0
  144. data/spec/ramaze/adapter.rb +2 -2
  145. data/spec/ramaze/controller/actionless_templates.rb +1 -1
  146. data/spec/ramaze/controller/subclass.rb +15 -0
  147. data/spec/ramaze/controller/template_resolving.rb +1 -1
  148. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  149. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  150. data/spec/ramaze/current/session.rb +1 -1
  151. data/spec/ramaze/dispatcher/file.rb +2 -2
  152. data/spec/ramaze/helper/aspect.rb +26 -17
  153. data/spec/ramaze/helper/formatting.rb +13 -0
  154. data/spec/ramaze/log/informer.rb +10 -10
  155. data/spec/ramaze/log/syslog.rb +67 -4
  156. data/spec/ramaze/rewrite.rb +1 -1
  157. data/spec/ramaze/route.rb +1 -1
  158. data/spec/ramaze/struct.rb +47 -0
  159. data/spec/ramaze/template/markaby.rb +1 -1
  160. data/spec/ramaze/template/tagz.rb +1 -1
  161. data/spec/snippets/binding/locals.rb +9 -0
  162. data/spec/snippets/numeric/time.rb +12 -0
  163. data/spec/snippets/{kernel → object}/__dir__.rb +0 -0
  164. data/spec/snippets/{kernel → object}/acquire.rb +0 -0
  165. metadata +90 -81
  166. data/cache.yaml +0 -7
  167. data/examples/app/rammit/spec/rammit.rb +0 -31
  168. data/examples/app/rammit/src/controller/main.rb +0 -3
  169. data/examples/app/rammit/src/controller/page.rb +0 -16
  170. data/examples/app/rammit/src/model.rb +0 -33
  171. data/examples/app/rammit/start.rb +0 -8
  172. data/examples/app/rammit/template/index.xhtml +0 -14
  173. data/examples/app/rammit/template/page/view.xhtml +0 -4
  174. data/lib/ramaze/snippets/kernel/__dir__.rb +0 -23
  175. data/lib/ramaze/snippets/kernel/acquire.rb +0 -34
  176. data/lib/ramaze/snippets/object/thread_accessor.rb +0 -5
  177. data/lib/ramaze/snippets/ramaze/thread_accessor.rb +0 -58
  178. data/lib/ramaze/snippets/struct/fill.rb +0 -23
  179. data/lib/ramaze/snippets/struct/values_at.rb +0 -39
  180. data/lib/ramaze/snippets/symbol/to_proc.rb +0 -24
  181. data/lib/ramaze/sourcereload.rb +0 -176
  182. data/spec/snippets/struct/fill.rb +0 -26
  183. data/spec/snippets/struct/values_at.rb +0 -52
  184. data/spec/snippets/symbol/to_proc.rb +0 -13
@@ -1,10 +1,10 @@
1
1
  # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
+ # Extensions for Thread
5
+
4
6
  class Thread
5
- # Copy following:
6
- # :action, :response, :request, :session,
7
- # :task, :adapter, :controller, :exception
7
+ # Copy all thread variables into the new thread
8
8
 
9
9
  def self.into *args
10
10
  Thread.new(Thread.current, *args) do |thread, *args|
@@ -1,7 +1,7 @@
1
- require 'bacon'
2
-
3
- dir = File.dirname(__FILE__)
4
- require File.join(File.dirname(__FILE__), 'pretty_output')
5
-
1
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), '../../../'))
2
+ $LOAD_PATH.unshift libdir
3
+ require 'vendor/bacon'
4
+ require 'ramaze/spec/helper/pretty_output'
6
5
  Bacon.extend Bacon::PrettyOutput
6
+ # Bacon.extend Bacon::TestUnitOutput
7
7
  Bacon.summary_on_exit
@@ -57,7 +57,7 @@ module MockHTTP
57
57
  def make_query query
58
58
  return query unless query and not query.is_a?(String)
59
59
  query.map{|key, value|
60
- "#{CGI::escape(key.to_s)}=#{CGI::escape(value.to_s)}"
60
+ "#{Rack::Utils.escape(key)}=#{Rack::Utils.escape(value)}"
61
61
  }.join('&')
62
62
  end
63
63
  end
@@ -16,9 +16,9 @@ module Bacon
16
16
  error = yield
17
17
 
18
18
  unless error.empty?
19
- if defined?(Ramaze::Logging::Logging)
19
+ if defined?(Ramaze::Logging)
20
20
  puts '', " #{NAME} -- #{description} [FAILED]".center(70, '-'), ''
21
- colors = Ramaze::Logging::Logger::Informer::COLORS
21
+ colors = Ramaze::Logger::Informer::COLORS
22
22
 
23
23
  until RamazeLogger.history.empty?
24
24
  tag, line = RamazeLogger.history.shift
@@ -1,6 +1,14 @@
1
1
  if caller
2
2
  snippet = caller.grep(%r!spec/snippets/!).first.split(':').first
3
3
  require File.expand_path(snippet).gsub('/spec/', '/lib/ramaze/')
4
+
5
+ if defined?(Ramaze::CoreExtensions)
6
+ Ramaze::CoreExtensions.constants.each do |const|
7
+ ext = Ramaze::CoreExtensions.const_get(const)
8
+ into = Module.const_get(const)
9
+ into.__send__(:include, ext)
10
+ end
11
+ end
4
12
  end
5
13
 
6
14
  require 'lib/ramaze/spec/helper/bacon'
@@ -16,7 +16,10 @@ module Ramaze
16
16
 
17
17
  ENGINES = {} unless defined?(ENGINES)
18
18
 
19
- AVAILABLE_ENGINES = %w[ Amrita2 Builder Erubis Haml Liquid Markaby Nagoro None RedCloth Remarkably Sass XSLT Tenjin Tagz ]
19
+ AVAILABLE_ENGINES = %w[
20
+ Amrita2 Builder Erubis Haml Liquid Markaby Maruku Nagoro None RedCloth
21
+ Remarkably Sass Tagz Tenjin XSLT
22
+ ]
20
23
 
21
24
  AVAILABLE_ENGINES.each do |const|
22
25
  autoload(const, "ramaze/template/#{const.downcase}")
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: HTML (Ezamar)
3
+ fileTypes:
4
+ - xhtml
5
+ scopeName: text.html.ruby
6
+ uuid: 45D7E1FC-7D0B-4205-A1A2-3D10BB555A5C
7
+ foldingStartMarker: |-
8
+ (?x)
9
+ (<(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|form|dl)\b.*?>
10
+ |<!--(?!.*-->)
11
+ |\{\s*($|\?>\s*$|//|/\*(.*\*/\s*$|(?!.*?\*/)))
12
+ )
13
+ patterns:
14
+ - name: source.ruby.ezamar.embedded.html
15
+ captures:
16
+ "0":
17
+ name: punctuation.section.embedded.ruby
18
+ begin: "<?r"
19
+ end: "?>"
20
+ patterns:
21
+ - name: comment.line.number-sign.ruby
22
+ captures:
23
+ "1":
24
+ name: punctuation.definition.comment.ruby
25
+ match: (#).*?(?=-?\?>)
26
+ - include: source.ruby.ezamar
27
+ - include: text.html.basic
28
+ foldingStopMarker: |-
29
+ (?x)
30
+ (</(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|form|dl)>
31
+ |^\s*-->
32
+ |(^|\s)\}
33
+ )
34
+ keyEquivalent: ^~R
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ require 'maruku'
5
+
6
+ module Ramaze
7
+ module Template
8
+
9
+ # Is responsible for compiling a template using the Ezamar templating engine.
10
+
11
+ class Maruku < Template
12
+
13
+ ENGINES[self] = %w[ mkd ]
14
+
15
+ class << self
16
+
17
+ # Transforms an action into the XHTML code for parsing and returns
18
+ # the result
19
+ def transform(action)
20
+ maruku = wrap_compile(action)
21
+ maruku.to_html
22
+ end
23
+
24
+ # Compile a template, applying all transformations from the pipeline
25
+ # and returning an instance of ::Ezamar::Template
26
+
27
+ def compile(action, template)
28
+ ::Maruku.new(template)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -55,11 +55,11 @@ module Ramaze
55
55
  end
56
56
 
57
57
  def p *a
58
- a.each{|elem| tagz << "#{ CGI.escapeHTML elem.inspect }#{ eol }"}
58
+ a.each{|elem| tagz << "#{ Rack::Utils.escape_html elem.inspect }#{ eol }"}
59
59
  end
60
60
 
61
61
  def pp *a
62
- a.each{|elem| tagz << "#{ CGI.escapeHTML PP.pp(elem, '') }#{ eol }"}
62
+ a.each{|elem| tagz << "#{ Rack::Utils.escape_html PP.pp(elem, '') }#{ eol }"}
63
63
  end
64
64
 
65
65
  def eol
@@ -55,8 +55,8 @@ module Ramaze
55
55
  end
56
56
 
57
57
  # Synchronize the block to run with the mutex
58
- def ext_functions_synchronize &block
59
- XSLT_EXT_FUNCTIONS_LOCK.synchronize &block
58
+ def ext_functions_synchronize(&block)
59
+ XSLT_EXT_FUNCTIONS_LOCK.synchronize(&block)
60
60
  end
61
61
 
62
62
  # Expose functors
@@ -1,6 +1,8 @@
1
1
  # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
+ require 'ramaze/tool/project_creator'
5
+
4
6
  module Ramaze
5
7
  module Tool
6
8
 
@@ -14,60 +16,32 @@ module Ramaze
14
16
  # where project is the directory you want the content put into.
15
17
 
16
18
  class Create
17
- class << self
18
-
19
- # a method to create a new project by copying the contents of lib/proto
20
- # to the position you specify (project)
21
- #
22
- # It is just a nice wrapper showing you what files/directories are put
23
- # in place.
24
-
25
- def create project
26
- @basedir = ::Ramaze::BASEDIR / 'proto'
27
- @destdir = Dir.pwd / project
28
-
29
- if File.directory?(@destdir)
30
- puts "Error: #{project}/ already exists. Rename or delete directory and try again."
31
- return
32
- end
33
-
34
- puts "Creating project #{project}"
35
-
36
- FileUtils.mkdir_p(project)
37
-
38
- puts "Copying skeleton project to new project (#@destdir)..."
39
-
40
- directories, files =
41
- Dir[@basedir / '**' / '*'].partition{ |f| File.directory?(f) }
42
-
43
- # gem packaging removes empty model directory, so add it in ourselves
44
- create_dirs(*Array[ @basedir/'model', *directories ].uniq)
45
- copy_files(*files)
46
-
47
- puts "\nStart your new ramaze app: ruby #{project}/start.rb"
48
- end
49
-
50
- # create the directories recursivly
51
-
52
- def create_dirs(*dirs)
53
- dirs.each do |dir|
54
- dest = dir.gsub(@basedir, @destdir)
55
-
56
- puts "Create directory: '#{dest}'"
57
- FileUtils.mkdir_p(dest)
58
- end
59
- end
60
-
61
- # copy the files over
62
-
63
- def copy_files(*files)
64
- files.each do |file|
65
- dest = file.gsub(@basedir, @destdir)
66
19
 
67
- puts "Copy file: '#{dest}'"
68
- FileUtils.cp(file, dest)
69
- end
70
- end
20
+ # Default options passed to Create::create
21
+ # :proto is the directory to duplicate
22
+ # :amend no files may be overwritten but missing files will be added
23
+ # :force will overwrite existing files
24
+ # :layout copy one subdirectory in +proto+
25
+
26
+ DEFAULT = {
27
+ :proto => File.join(::Ramaze::BASEDIR, 'proto'),
28
+ :amend => false,
29
+ :force => false,
30
+ :layout => '/',
31
+ }
32
+
33
+ # Using ProjectCreator to copy all files and directories from lib/proto
34
+ # to another location.
35
+ # +options+ are described in the DEFAULT constant and should be:
36
+ # :force => (true|false|nil)
37
+ # :amend => (true|false|nil)
38
+ # :layout => (String|nil)
39
+ # :proto => String
40
+
41
+ def self.create(project, options = {})
42
+ options = DEFAULT.merge(options)
43
+ creator = ProjectCreator.new(project, options)
44
+ creator.create
71
45
  end
72
46
  end
73
47
  end
@@ -63,10 +63,14 @@ module Ramaze
63
63
 
64
64
  def call(response, options = {})
65
65
  return response unless trait[:enable]
66
- return response if response.body.nil?
67
- return response if response.body.respond_to?(:read)
68
- response.body = localize_body(response.body, options)
69
- response
66
+
67
+ body = []
68
+
69
+ response.body.each do |chunk|
70
+ body << localize_body(chunk, options)
71
+ end
72
+
73
+ response.body = body
70
74
  end
71
75
 
72
76
  # Localizes a response body. It reacts to a regular expression as given
@@ -15,10 +15,20 @@ module Ramaze
15
15
 
16
16
  # Get MIME-type for the given filename based on extension.
17
17
  # Answers with an empty string if none is found.
18
- def type_for file
18
+ def type_for(file)
19
19
  ext = File.extname(file)
20
20
  trait[:types][ext].to_s
21
21
  end
22
+
23
+ def ext_for(mime)
24
+ exts = []
25
+
26
+ trait[:types].each do |ext, mime_type|
27
+ exts << ext if mime == mime_type
28
+ end
29
+
30
+ exts.sort_by{|e| e.size }.first
31
+ end
22
32
  end
23
33
  end
24
34
  end
@@ -0,0 +1,110 @@
1
+ # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ require 'fileutils'
5
+ require 'find'
6
+
7
+ class ProjectCreator
8
+ PROTO = ['~/.proto/']
9
+ attr_accessor :name, :options
10
+
11
+ def initialize(name, options = {})
12
+ @name, @options = name, options
13
+ end
14
+
15
+ def target
16
+ File.expand_path(name)
17
+ end
18
+
19
+ def proto
20
+ PROTO.map!{|pr| File.expand_path(pr) }
21
+ proto = options[:proto] ||= PROTO.find{|f| File.directory?(f) }
22
+ layout = options[:layout] ||= '/'
23
+ File.expand_path(File.join(proto, layout))
24
+ end
25
+
26
+ def create_root?
27
+ return true unless File.directory?(target)
28
+ return true if amend? or force?
29
+ fatal "%p is a directory, choose different project name or use --amend/--force" % target
30
+ end
31
+
32
+ def got_proto?
33
+ return true if File.directory?(proto)
34
+ fatal "Cannot create, %p doesn't exist, use --proto or create the proto directory" % proto
35
+ end
36
+
37
+ def create
38
+ got_proto?
39
+
40
+ puts "Found proto at: %p, proceeding...\n\n" % proto
41
+ mkdir(relate('/')) if create_root?
42
+ proceed
43
+ end
44
+
45
+ def proceed
46
+ files, directories = partition{|path| File.file?(path) }
47
+ proceed_directories(directories)
48
+ proceed_files(files)
49
+ end
50
+
51
+ def proceed_files(files)
52
+ files.each{|file| copy(file, relate(file)) }
53
+ end
54
+
55
+ def proceed_directories(dirs)
56
+ dirs.each{|dir| mkdir(relate(dir)) }
57
+ end
58
+
59
+ def mkdir(dir)
60
+ exists = File.directory?(dir)
61
+ return if exists and amend?
62
+ return if exists and not force?
63
+ puts "mkdir(%p)" % dir
64
+ FileUtils.mkdir_p(dir)
65
+ end
66
+
67
+ def copy(from, to)
68
+ return unless copy_check(to)
69
+ puts "copy(%p, %p)" % [from, to]
70
+ FileUtils.cp(from, to)
71
+ post_process(to)
72
+ end
73
+
74
+ def copy_check(to)
75
+ exists = File.file?(to)
76
+ return if exists and amend?
77
+ return if exists and not force?
78
+ return true
79
+ end
80
+
81
+ # Think about a useful way to process the generated files it should be
82
+ # possible to substitute some things like the project name in the
83
+ # configuration
84
+
85
+ def post_process(file)
86
+ return
87
+ source = File.read(file)
88
+ File.open(file, 'w+') do |io|
89
+ io.write(source.gsub('$project', "'#@name'"))
90
+ end
91
+ end
92
+
93
+ def relate(path)
94
+ File.join(target, path.to_s.sub(proto, ''))
95
+ end
96
+
97
+ def amend?; options[:amend] end
98
+ def force?; options[:force] end
99
+
100
+ def fatal(message)
101
+ warn message
102
+ exit 1
103
+ end
104
+
105
+ def each
106
+ Dir["#{proto}/**/*"].each{|path| yield(path) }
107
+ end
108
+
109
+ include Enumerable
110
+ end
@@ -2,12 +2,15 @@
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
4
  module Ramaze
5
+ STATE = State.new
5
6
 
6
7
  # The module to be included into the Controller it basically just provides
7
8
  # #request, #response and #session, each accessing Thread.current to
8
9
  # retrieve the demanded object
9
10
 
10
11
  module Trinity
11
- thread_accessor :request, :response, :session
12
+ extend StateAccessor
13
+
14
+ state_accessor :request, :response, :session
12
15
  end
13
16
  end
@@ -2,5 +2,5 @@
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
4
  module Ramaze
5
- VERSION = "2008.06"
5
+ VERSION = "2008.10"
6
6
  end