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
@@ -1,129 +0,0 @@
1
- require 'ramaze/gestalt'
2
-
3
- # job = Job[4]
4
- # puts CGI::pretty(FormField.new(job, :contract, show_errors = true, Job::CONTRACTS).to_s)
5
-
6
- class FormField
7
- attr_accessor :this, :field, :show_errors, :hint, :db_type, :id, :value
8
-
9
- # show_errors may be a number indicating how many errors it should display at
10
- # maximum, 0 displays none, -1 all
11
-
12
- def initialize(this, field, show_errors = true, hint = nil)
13
- @this, @field, @show_errors, @hint =
14
- this, field.to_sym, show_errors, hint
15
- @db_type = db_type
16
- @id = "form_#{@field}"
17
- @value = this.send(@field)
18
- end
19
-
20
- def db_type
21
- if field_schema = this.class.db_schema[field]
22
- field_schema[:db_type]
23
- else
24
- nil
25
- end
26
- end
27
-
28
- def to_s
29
- unless label = @this.class::FORM_LABEL[field]
30
- raise("No FORM_LABEL for %p on %p" % [field, @this.class])
31
- end
32
-
33
- label += ':'
34
- id = @id
35
- _self = self
36
-
37
- Ramaze::Gestalt.build{
38
- div(:class => :pair){
39
- label(:for => id){ label }
40
- _self.build_tag(self)
41
- _self.build_errors(self)
42
- }
43
- }
44
- end
45
-
46
- def password(gestalt)
47
- gestalt.input(@args.merge :type => :password, :value => value)
48
- end
49
-
50
- def checkbox(gestalt)
51
- @args[:checked] = :checked if value
52
- gestalt.input(@args.merge :type => :checkbox)
53
- end
54
-
55
- def select(gestalt)
56
- gestalt.select @args do
57
- v = value.to_s
58
- hint.each do |h|
59
- h = h.to_s
60
- if h == v
61
- gestalt.option(:value => h, :selected => :selected){ h }
62
- else
63
- gestalt.option(:value => h){ h }
64
- end
65
- end
66
- end
67
- end
68
-
69
- def input(gestalt)
70
- gestalt.input(@args.merge :type => :text, :value => value)
71
- end
72
-
73
- def file(gestalt)
74
- gestalt.input(@args.merge :type => :file)
75
- end
76
-
77
- def textarea(gestalt)
78
- gestalt.textarea(@args){ value.to_s }
79
- end
80
-
81
- def build_tag(gestalt)
82
- @args = {:id => id, :name => field}
83
-
84
- case hint
85
- when :password
86
- password(gestalt)
87
- when :boolean, :checkbox
88
- checkbox(gestalt)
89
- when :textarea
90
- textarea(gestalt)
91
- when :file
92
- file(gestalt)
93
- when Array, Range
94
- select(gestalt)
95
- else
96
- case db_type
97
- when /varchar|integer/
98
- input(gestalt)
99
- when /boolean/
100
- checkbox(gestalt)
101
- when /string/
102
- textarea(gestalt)
103
- else
104
- raise("Unsupported type: (%p : %p)" % [db_type || hint, field])
105
- end
106
- end
107
- end
108
-
109
- def build_errors(gestalt)
110
- each_error do |error|
111
- gestalt.span(:class => :error){ error }
112
- end
113
- end
114
-
115
- # TODO: suggest 'validated?' feature to sequel
116
- def each_error(&block)
117
- return unless show_errors
118
-
119
- this.validate if this.errors.empty?
120
- this.errors[field].first(show_errors).each(&block)
121
- end
122
-
123
- module Model
124
- def form_field(field, hint = nil)
125
- show_errors = Ramaze::Request.current.post? ? 1 : 0
126
- FormField.new(self, field, show_errors, hint).to_s
127
- end
128
- end
129
- end
@@ -1,196 +0,0 @@
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
- # Scaffold image models utilizing thumbnailing and Ramaze integration.
5
- # Resizing is done by ImageScience.
6
- #
7
- # Usage:
8
- # class Avatar < Sequel::Model
9
- # IMAGE = {
10
- # # specifies many_to_one, will create relation and foreign key
11
- #
12
- # :owner => :User,
13
- #
14
- #
15
- # # Remove original and thumbnails on Avatar#destroy
16
- #
17
- # :cleanup => true,
18
- #
19
- #
20
- # # Algorithm to use in ImageScience
21
- # #
22
- # # * resize(width, height)
23
- # # Resizes the image to +width+ and +height+ using a cubic-bspline
24
- # # filter.
25
- # #
26
- # # * thumbnail(size)
27
- # # Creates a proportional thumbnail of the image scaled so its
28
- # # longest edge is resized to +size+.
29
- # #
30
- # # * cropped_thumbnail(size)
31
- # # Creates a square thumbnail of the image cropping the longest edge
32
- # # to match the shortest edge, resizes to +size+.
33
- #
34
- # :algorithm => :thumbnail,
35
- #
36
- #
37
- # # Key specifies the filename and accessors, value are arguments to the
38
- # # algorithm
39
- #
40
- # :sizes => {
41
- # :small => 150,
42
- # :medium => 300,
43
- # :large => 600
44
- # }
45
- # }
46
- #
47
- # # Perform the scaffold
48
- # include SequelImage
49
- # end
50
-
51
- module SequelImage
52
- def self.included(model)
53
- args = model::IMAGE
54
- set_foreign_key = args[:foreign_key] || "#{args[:owner]}_id".downcase.to_sym
55
- set_many_to_one = args[:many_to_one] || args[:owner].to_s.downcase.to_sym
56
-
57
- # Define schema
58
- model.set_schema do
59
- primary_key :id
60
-
61
- varchar :original # path to the original image
62
- varchar :mime, :size => 22 # average of /etc/mime.types
63
-
64
- time :created_at
65
- time :updated_at
66
-
67
- foreign_key set_foreign_key
68
- end
69
-
70
- # Define Relations
71
- model.many_to_one set_many_to_one
72
-
73
- # Define Hooks
74
- model.before_create :generate_thumbnails do
75
- generate_thumbnails
76
- self.created_at = Time.now
77
- end
78
-
79
- model.before_save :update_time do
80
- self.updated_at = Time.now
81
- end
82
-
83
- model.before_destroy :cleanup do
84
- cleanup if conf[:cleanup]
85
- end
86
-
87
- # Define singleton methods
88
- model.extend(SingletonMethods)
89
-
90
- # Define instance methods
91
- model.send(:include,
92
- InstanceMethods,
93
- Ramaze::Helper::CGI,
94
- Ramaze::Helper::Link)
95
-
96
- args[:sizes].each do |size, *args|
97
- model.send(:define_method, size){ public_file(size) }
98
- model.send(:define_method, "#{size}_url"){ file(size) }
99
- end
100
- end
101
-
102
- module SingletonMethods
103
- def store(file, uid, hash = {})
104
- image = new(hash)
105
-
106
- type = file[:type]
107
- filename = file[:filename]
108
- tempfile = file[:tempfile]
109
- raise ArgumentError, 'Empty tempfile' if tempfile.size == 0
110
-
111
- ext = Rack::Mime::MIME_TYPES.invert[type]
112
- image.mime = type
113
- target_name = image.next_name(File.basename(filename, File.extname(filename)), ext)
114
- target_path = File.join(image.public_root, image.path, target_name)
115
-
116
- FileUtils.mkdir_p(File.dirname(target_path))
117
- FileUtils.cp(tempfile.path, target_path)
118
-
119
- image.original = target_path
120
- image.save
121
- end
122
- end
123
-
124
- module InstanceMethods
125
- def file(size = nil)
126
- File.join('/', path, filename(size))
127
- end
128
-
129
- def public_file(size)
130
- File.join(public_path, filename(size))
131
- end
132
-
133
- def public_path
134
- File.join(public_root, path)
135
- end
136
-
137
- def path
138
- conf[:path] || conf[:owner].to_s.downcase
139
- end
140
-
141
- def next_name(uid, ext)
142
- uid = uid.to_s.scan(%r![^\\/'".:?&;\s]+!).join('-')
143
- "#{uid}#{ext}"
144
- end
145
-
146
- def basename
147
- File.basename(original, File.extname(original))
148
- end
149
-
150
- def public_root
151
- Ramaze.options.roots.first
152
- end
153
-
154
- def filename(size)
155
- if size
156
- "#{basename}_#{size}.png"
157
- else
158
- "#{basename}.png"
159
- end
160
- end
161
-
162
- def conf
163
- self.class::IMAGE
164
- end
165
-
166
- def cleanup
167
- conf[:sizes].each do |name, args|
168
- out = public_file(name)
169
- Ramaze::Log.debug "Remove Thumbnail: #{out}"
170
- FileUtils.rm_f(out)
171
- end
172
-
173
- Ramaze::Log.debug "Remove original: #{original}"
174
- FileUtils.rm_f(original)
175
- end
176
-
177
- def generate_thumbnails
178
- FileUtils.mkdir_p(public_path)
179
-
180
- sizes, algorithm = conf.values_at(:sizes, :algorithm)
181
-
182
- ImageScience.with_image(original) do |img|
183
- Ramaze::Log.debug "Process original: #{original}"
184
-
185
- sizes.each do |name, args|
186
- out = public_file(name)
187
- Ramaze::Log.debug "Generate Thumbnail: #{out}"
188
-
189
- img.send(algorithm, *args) do |thumb|
190
- thumb.save(out)
191
- end
192
- end
193
- end
194
- end
195
- end
196
- end
@@ -1,98 +0,0 @@
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
- # Pretty DSL to express Sequel relations
5
- #
6
- # Usage:
7
- # SequelRelation.relations do
8
- # the User do
9
- # has_many Article
10
- # has_one Avatar
11
- # end
12
- #
13
- # the Article do
14
- # belongs_to User
15
- # end
16
- #
17
- # the Avatar do
18
- # belongs_to User
19
- # end
20
- # end
21
-
22
- module SequelRelation
23
- def self.relations(&block)
24
- rema = RelationshipManager.new(&block)
25
- rema.finalize
26
- end
27
-
28
- class RelationshipManager
29
- TODO = {}
30
-
31
- def initialize(&block)
32
- instance_eval(&block)
33
- end
34
-
35
- def finalize
36
- TODO.keys.each do |model|
37
- model.create_table unless model.table_exists?
38
- end
39
-
40
- TODO.each do |model, instructions|
41
- instructions.each do |args|
42
- model.send(*args)
43
- end
44
- end
45
-
46
- =begin
47
- # uncomment for debugging
48
-
49
- pp TODO
50
-
51
- TODO.keys.each do |model|
52
- puts "the #{model}"
53
- assoc = model.send(:association_reflections)
54
- assoc.each do |key, reflection|
55
- puts " #{reflection[:type]} => #{key}"
56
- end
57
- end
58
- =end
59
- end
60
-
61
- def the(left_model, &block)
62
- @left = left_model
63
- TODO[@left] = []
64
- instance_eval(&block)
65
- end
66
-
67
- def belongs_to(model)
68
- todo :many_to_one, singular_sym(model), :class => model
69
- end
70
-
71
- def has_many(model)
72
- todo :create_join, model
73
- todo :many_to_many, plural_sym(model), :class => model
74
- end
75
-
76
- def has_one(model)
77
- todo :many_to_one, singular_sym(model), :class => model
78
- end
79
-
80
- def todo(method, *args)
81
- TODO[@left] << [method, *args]
82
- end
83
-
84
- private
85
-
86
- def plural_sym(obj)
87
- basename(obj).pluralize.to_sym
88
- end
89
-
90
- def singular_sym(obj)
91
- basename(obj).to_sym
92
- end
93
-
94
- def basename(obj)
95
- obj.to_s.split('::').last.downcase
96
- end
97
- end
98
- end
@@ -1,96 +0,0 @@
1
- begin
2
- require 'securerandom' # Ruby >= 1.8.7
3
- rescue LoadError
4
- require 'uuidtools'
5
- end
6
-
7
- require 'digest/md5'
8
-
9
- module Ramaze
10
- module Helper
11
- # Authorization using HTTP Digest.
12
- #
13
- # For custom authorization failure handling add an {httpdigest_failure}
14
- # method in your controller.
15
- module HttpDigest
16
-
17
- SESSION_NONCE = 'httpdigest_authentication_nonce'
18
- SESSION_OPAQUE = 'httpdigest_authentication_opaque'
19
- DIGEST_HEADER = %|Digest realm="%s", qop="auth,auth-int", nonce="%s", opaque="%s"|
20
-
21
- # Delete the nonce and opaque from session to log out.
22
- def httpdigest_logout
23
- session.delete(SESSION_NONCE)
24
- session.delete(SESSION_OPAQUE)
25
- end
26
-
27
- def httpdigest_uuid
28
- ::SecureRandom.hex(32)
29
- end
30
-
31
- def httpdigest_failure_internal(uid,realm)
32
- nonce = session[SESSION_NONCE] = httpdigest_uuid
33
- opaque = session[SESSION_OPAQUE][realm][uid] = httpdigest_uuid
34
- response['WWW-Authenticate'] = DIGEST_HEADER % [realm, nonce, opaque]
35
- response['Pragma'] = 'no-cache' # HTTP/1.0
36
- response['Cache-Control'] = 'no-cache' # HTTP/1.1
37
- response['Last-Modified'] = Time.now.httpdate
38
- httpdigest_failure
39
- end
40
-
41
- def httpdigest_failure
42
- respond 'Unauthorized', 401
43
- end
44
-
45
- def httpdigest_http_authorization(uid, realm)
46
- http_authorization = request.env['HTTP_AUTHORIZATION']
47
- return http_authorization if http_authorization
48
-
49
- httpdigest_failure_internal(uid, realm)
50
- end
51
-
52
- def httpdigest_lookup(username, realm)
53
- if block_given?
54
- yield(username)
55
- elsif respond_to?(:httpdigest_lookup_password)
56
- httpdigest_lookup_password(username)
57
- elsif respond_to?(:httpdigest_lookup_plaintext_password)
58
- plain = httpdigest_lookup_plaintext_password(username)
59
- Digest::MD5.hexdigest([username, realm, plain].join(':'))
60
- else
61
- raise "No password lookup handler found"
62
- end
63
- end
64
-
65
- def httpdigest(uid, realm, &block)
66
- session[SESSION_OPAQUE] ||= {}
67
- session[SESSION_OPAQUE][realm] ||= {}
68
-
69
- http_authorization = httpdigest_http_authorization(uid, realm)
70
-
71
- httpdigest_failure_internal(uid, realm) unless session_nonce = session[SESSION_NONCE]
72
- httpdigest_failure_internal(uid, realm) unless session_opaque = session[SESSION_OPAQUE][realm][uid]
73
-
74
- auth_type, auth_raw = http_authorization.split(' ', 2)
75
- httpdigest_failure_internal(uid, realm) unless auth_type == 'Digest'
76
-
77
- authorization = Rack::Auth::Digest::Params.parse(auth_raw)
78
-
79
- digest_response, username, nonce, nc, cnonce, qop, opaque, uri =
80
- authorization.values_at(*%w[response username nonce nc cnonce qop opaque uri])
81
-
82
- httpdigest_failure_internal(uid, realm) unless nonce == session_nonce and opaque == session_opaque
83
-
84
- ha1 = httpdigest_lookup(username, realm, &block)
85
- a2 = [request.request_method,uri]
86
- a2 << Digest::MD5.hexdigest(request.body.read) if qop == "auth-int"
87
- ha2 = Digest::MD5.hexdigest(a2.join(':'))
88
- md5 = Digest::MD5.hexdigest([ha1, nonce, nc, cnonce, qop, ha2].join(':'))
89
-
90
- httpdigest_failure_internal(uid, realm) unless digest_response == md5
91
-
92
- return username
93
- end
94
- end
95
- end
96
- end