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