hobo 0.7.2 → 0.7.3

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 (77) hide show
  1. data/bin/hobo +24 -7
  2. data/hobo_files/plugin/CHANGES.txt +501 -0
  3. data/hobo_files/plugin/generators/hobo/hobo_generator.rb +8 -6
  4. data/hobo_files/plugin/generators/hobo/templates/application.dryml +3 -0
  5. data/hobo_files/plugin/generators/hobo/templates/dryml-support.js +132 -0
  6. data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +4 -5
  7. data/hobo_files/plugin/generators/hobo_model_resource/hobo_model_resource_generator.rb +75 -0
  8. data/hobo_files/plugin/generators/hobo_model_resource/templates/controller.rb +7 -0
  9. data/hobo_files/plugin/generators/hobo_model_resource/templates/functional_test.rb +8 -0
  10. data/hobo_files/plugin/generators/hobo_model_resource/templates/helper.rb +2 -0
  11. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo-rapid.js +30 -11
  12. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/application.css +149 -92
  13. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +0 -48
  14. data/hobo_files/plugin/init.rb +45 -13
  15. data/hobo_files/plugin/lib/action_view_extensions/base.rb +4 -3
  16. data/hobo_files/plugin/lib/active_record/association_proxy.rb +18 -0
  17. data/hobo_files/plugin/lib/active_record/association_reflection.rb +5 -0
  18. data/hobo_files/plugin/lib/active_record/has_many_association.rb +7 -11
  19. data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +8 -0
  20. data/hobo_files/plugin/lib/extensions/test_case.rb +1 -1
  21. data/hobo_files/plugin/lib/hobo.rb +38 -60
  22. data/hobo_files/plugin/lib/hobo/authentication_support.rb +1 -1
  23. data/hobo_files/plugin/lib/hobo/bundle.rb +131 -34
  24. data/hobo_files/plugin/lib/hobo/composite_model.rb +1 -1
  25. data/hobo_files/plugin/lib/hobo/controller.rb +7 -8
  26. data/hobo_files/plugin/lib/hobo/dev_controller.rb +21 -0
  27. data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +14 -8
  28. data/hobo_files/plugin/lib/hobo/dryml/dryml_support_controller.rb +13 -0
  29. data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +6 -7
  30. data/hobo_files/plugin/lib/hobo/dryml/template.rb +207 -73
  31. data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +67 -55
  32. data/hobo_files/plugin/lib/hobo/dryml/template_handler.rb +53 -3
  33. data/hobo_files/plugin/lib/hobo/hobo_helper.rb +75 -107
  34. data/hobo_files/plugin/lib/hobo/model.rb +236 -429
  35. data/hobo_files/plugin/lib/hobo/model_controller.rb +277 -437
  36. data/hobo_files/plugin/lib/hobo/model_router.rb +62 -29
  37. data/hobo_files/plugin/lib/hobo/rapid_helper.rb +48 -9
  38. data/hobo_files/plugin/lib/hobo/scopes.rb +98 -0
  39. data/hobo_files/plugin/lib/hobo/scopes/association_proxy_extensions.rb +31 -0
  40. data/hobo_files/plugin/lib/hobo/scopes/automatic_scopes.rb +282 -0
  41. data/hobo_files/plugin/lib/hobo/scopes/defined_scope_proxy_extender.rb +88 -0
  42. data/hobo_files/plugin/lib/hobo/scopes/scope_reflection.rb +18 -0
  43. data/hobo_files/plugin/lib/hobo/scopes/scoped_proxy.rb +59 -0
  44. data/hobo_files/plugin/lib/hobo/undefined.rb +2 -0
  45. data/hobo_files/plugin/lib/hobo/user.rb +31 -14
  46. data/hobo_files/plugin/lib/hobo/user_controller.rb +41 -27
  47. data/hobo_files/plugin/taglibs/core.dryml +9 -11
  48. data/hobo_files/plugin/taglibs/rapid.dryml +51 -108
  49. data/hobo_files/plugin/taglibs/rapid_editing.dryml +25 -25
  50. data/hobo_files/plugin/taglibs/rapid_forms.dryml +111 -79
  51. data/hobo_files/plugin/taglibs/rapid_generics.dryml +74 -0
  52. data/hobo_files/plugin/taglibs/rapid_navigation.dryml +23 -21
  53. data/hobo_files/plugin/taglibs/rapid_pages.dryml +83 -169
  54. data/hobo_files/plugin/taglibs/rapid_plus.dryml +16 -2
  55. data/hobo_files/plugin/taglibs/rapid_support.dryml +3 -3
  56. data/hobo_files/plugin/taglibs/rapid_user_pages.dryml +104 -0
  57. metadata +60 -55
  58. data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +0 -276
  59. data/hobo_files/plugin/generators/hobo_migration/templates/migration.rb +0 -9
  60. data/hobo_files/plugin/lib/active_record/table_definition.rb +0 -34
  61. data/hobo_files/plugin/lib/extensions.rb +0 -375
  62. data/hobo_files/plugin/lib/hobo/email_address.rb +0 -12
  63. data/hobo_files/plugin/lib/hobo/enum_string.rb +0 -50
  64. data/hobo_files/plugin/lib/hobo/field_declaration_dsl.rb +0 -43
  65. data/hobo_files/plugin/lib/hobo/field_spec.rb +0 -68
  66. data/hobo_files/plugin/lib/hobo/html_string.rb +0 -7
  67. data/hobo_files/plugin/lib/hobo/lazy_hash.rb +0 -40
  68. data/hobo_files/plugin/lib/hobo/markdown_string.rb +0 -11
  69. data/hobo_files/plugin/lib/hobo/migrations.rb +0 -12
  70. data/hobo_files/plugin/lib/hobo/model_queries.rb +0 -117
  71. data/hobo_files/plugin/lib/hobo/password_string.rb +0 -7
  72. data/hobo_files/plugin/lib/hobo/percentage.rb +0 -14
  73. data/hobo_files/plugin/lib/hobo/predicate_dispatch.rb +0 -78
  74. data/hobo_files/plugin/lib/hobo/proc_binding.rb +0 -32
  75. data/hobo_files/plugin/lib/hobo/text.rb +0 -3
  76. data/hobo_files/plugin/lib/hobo/textile_string.rb +0 -25
  77. data/hobo_files/plugin/lib/hobo/where_fragment.rb +0 -28
@@ -1,9 +0,0 @@
1
- class <%= migration_name %> < ActiveRecord::Migration
2
- def self.up
3
- <%= up %>
4
- end
5
-
6
- def self.down
7
- <%= down %>
8
- end
9
- end
@@ -1,34 +0,0 @@
1
- module ActiveRecord::ConnectionAdapters
2
-
3
- class TableDefinition
4
-
5
- def fkey(*args)
6
- options = take_options!(args)
7
- args.each {|col| column("#{col}_id".to_sym, :integer, options)}
8
- end
9
-
10
- def auto_dates
11
- column :created_at, :datetime
12
- column :updated_at, :datetime
13
- end
14
-
15
- def method_missing(name, *args)
16
- if name.in? [:integer, :float, :decimal, :datetime, :date, :timestamp,
17
- :time, :text, :string, :binary, :boolean ]
18
- options = take_options!(args)
19
- args.each {|col| column(col, name, options)}
20
- else
21
- super
22
- end
23
- end
24
-
25
-
26
- private
27
-
28
- def take_options!(args)
29
- args.last.is_a?(Hash) ? args.pop : {}
30
- end
31
-
32
- end
33
-
34
- end
@@ -1,375 +0,0 @@
1
- class Module
2
-
3
- def inheriting_attr_accessor(*names)
4
- for name in names
5
- class_eval %{
6
- def #{name}
7
- if defined? @#{name}
8
- @#{name}
9
- elsif superclass.respond_to?('#{name}')
10
- superclass.#{name}
11
- end
12
- end
13
- }
14
- end
15
- end
16
-
17
- # Custom alias_method_chain that won't cause inifinite recursion if
18
- # called twice.
19
- # Calling alias_method_chain on alias_method_chain
20
- # was just way to confusing, so I copied it :-/
21
- def alias_method_chain(target, feature)
22
- # Strip out punctuation on predicates or bang methods since
23
- # e.g. target?_without_feature is not a valid method name.
24
- aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
25
- yield(aliased_target, punctuation) if block_given?
26
- without = "#{aliased_target}_without_#{feature}#{punctuation}"
27
- unless instance_methods.include?(without)
28
- alias_method without, target
29
- alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
30
- end
31
- end
32
-
33
-
34
- # Fix delegate so it doesn't go bang if 'to' is nil
35
- def delegate(*methods)
36
- options = methods.pop
37
- unless options.is_a?(Hash) && to = options[:to]
38
- raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
39
- end
40
-
41
- methods.each do |method|
42
- module_eval(<<-EOS, "(__DELEGATION__)", 1)
43
- def #{method}(*args, &block)
44
- (_to = #{to}) && _to.__send__(#{method.inspect}, *args, &block)
45
- end
46
- EOS
47
- end
48
- end
49
-
50
- private
51
-
52
- def bool_attr_accessor(*args)
53
- options = extract_options_from_args!(args)
54
- (args + options.keys).each {|n| class_eval "def #{n}=(x); @#{n} = x; end" }
55
-
56
- args.each {|n| class_eval "def #{n}?; !!@#{n}; end" }
57
-
58
- options.keys.each do |n|
59
- class_eval %(def #{n}?
60
- if @#{n}.nil? && !instance_variables.include?("@\#{@#{n}}")
61
- @#{n} = #{options[n].inspect}
62
- else
63
- @#{n}
64
- end
65
- end)
66
- set_field_type(n => TrueClass) if respond_to?(:set_field_type)
67
- end
68
- end
69
-
70
- end
71
-
72
- module Kernel
73
-
74
- def extract_options_from_args!(args) #:nodoc:
75
- args.last.is_a?(Hash) ? args.pop : {}
76
- end
77
-
78
- def it() It.new end
79
- alias its it
80
-
81
- end
82
-
83
-
84
- class It
85
-
86
- undef_method(*(instance_methods - %w*__id__ __send__*))
87
-
88
- def initialize
89
- @methods = []
90
- end
91
-
92
- def method_missing(*args, &block)
93
- @methods << [args, block] unless args == [:respond_to?, :to_proc]
94
- self
95
- end
96
-
97
- def to_proc
98
- lambda do |obj|
99
- @methods.inject(obj) do |current,(args,block)|
100
- current.send(*args, &block)
101
- end
102
- end
103
- end
104
- end
105
-
106
-
107
- class Object
108
-
109
- def in?(array)
110
- array.include?(self)
111
- end
112
-
113
- def not_in?(array)
114
- not array.include?(self)
115
- end
116
-
117
- alias_method :is_a_without_multiple_args?, :is_a?
118
- def is_a?(*args)
119
- args.any? {|a| is_a_without_multiple_args?(a) }
120
- end
121
-
122
- # metaid
123
- def metaclass; class << self; self; end; end
124
- def meta_eval &blk; metaclass.instance_eval &blk; end
125
-
126
- # Adds methods to a metaclass
127
- def meta_def name, &blk
128
- meta_eval { define_method name, &blk }
129
- end
130
-
131
- # Defines an instance method within a class
132
- def class_def name, &blk
133
- class_eval { define_method name, &blk }
134
- end
135
-
136
- def _?()
137
- self
138
- end
139
-
140
- end
141
-
142
-
143
- class NilClass
144
- def _?()
145
- SafeNil.instance
146
- end
147
- end
148
-
149
-
150
- class SafeNil
151
- include Singleton
152
-
153
- def method_missing(method, *args, &b)
154
- return nil unless nil.respond_to? method
155
- nil.send(method, *args, &b) rescue nil
156
- end
157
- end
158
-
159
- alias DelegateClass_without_safe_nil DelegateClass
160
- def DelegateClass(klass)
161
- c = DelegateClass_without_safe_nil(klass)
162
- c.class_eval do
163
- def _?
164
- self
165
- end
166
- end
167
- c
168
- end
169
-
170
-
171
-
172
- class TrueClass
173
-
174
- def implies(x)
175
- x
176
- end
177
-
178
- end
179
-
180
- class FalseClass
181
-
182
- def implies(x)
183
- true
184
- end
185
-
186
- end
187
-
188
-
189
- module Enumerable
190
-
191
- def search(not_found=nil)
192
- each do |x|
193
- val = yield(x)
194
- return val if val
195
- end
196
- not_found
197
- end
198
-
199
- def every(method, *args)
200
- map { |x| x.send(method, *args) }
201
- end
202
-
203
- def map_with_index
204
- res = []
205
- each_with_index {|x, i| res << yield(x, i)}
206
- res
207
- end
208
-
209
- def build_hash
210
- res = {}
211
- each do |x|
212
- k, v = yield x
213
- res[k] = v
214
- end
215
- res
216
- end
217
-
218
- def map_hash
219
- res = {}
220
- each do |x|
221
- v = yield x
222
- res[x] = v
223
- end
224
- res
225
- end
226
-
227
- end
228
-
229
- class Hash
230
-
231
- def self.build(array)
232
- array.inject({}) do |res, x|
233
- k, v = yield x
234
- res[k] = v
235
- res
236
- end
237
- end
238
-
239
- def select_hash(new_keys=nil)
240
- res = {}
241
- if block_given?
242
- each {|k,v| res[k] = v if yield(k,v) }
243
- else
244
- new_keys.each {|k| res[k] = self[k] if self.has_key?(k)}
245
- end
246
- res
247
- end
248
-
249
- def map_hash(&b)
250
- res = {}
251
- each {|k,v| res[k] = b.arity == 1 ? yield(v) : yield(k, v) }
252
- res
253
- end
254
-
255
- #alias_method :hobo_original_reject, :reject
256
- def rejectX(keys=nil, &b)
257
- if b
258
- hobo_original_reject(&b)
259
- else
260
- res = {}.update(self) # can't use dup because it breaks with symbols
261
- keys.each {|k| res.delete(k)}
262
- res
263
- end
264
- end
265
-
266
- def partition_hash(keys=nil)
267
- yes = {}
268
- no = {}
269
- each do |k,v|
270
- if block_given? ? yield(k,v) : keys.include?(k)
271
- yes[k] = v
272
- else
273
- no[k] = v
274
- end
275
- end
276
- [yes, no]
277
- end
278
-
279
- def -(keys)
280
- res = {}
281
- each_pair {|k, v| res[k] = v unless k.in?(keys)}
282
- res
283
- end
284
-
285
- def &(keys)
286
- res = {}
287
- keys.each {|k| res[k] = self[k] if has_key?(k)}
288
- res
289
- end
290
-
291
- end
292
-
293
-
294
- class HashWithIndifferentAccess
295
-
296
- def -(keys)
297
- res = HashWithIndifferentAccess.new
298
- keys = keys.map {|k| k.is_a?(Symbol) ? k.to_s : k }
299
- each_pair { |k, v| res[k] = v unless k.in?(keys) }
300
- res
301
- end
302
-
303
- def &(keys)
304
- res = HashWithIndifferentAccess.new
305
- keys.each do |k|
306
- k = k.to_s if k.is_a?(Symbol)
307
- res[k] = self[k] if has_key?(k)
308
- end
309
- res
310
- end
311
-
312
- def partition_hash(keys=nil)
313
- keys = keys._?.map {|k| k.is_a?(Symbol) ? k.to_s : k }
314
- yes = HashWithIndifferentAccess.new
315
- no = HashWithIndifferentAccess.new
316
- each do |k,v|
317
- if block_given? ? yield(k,v) : keys.include?(k)
318
- yes[k] = v
319
- else
320
- no[k] = v
321
- end
322
- end
323
- [yes, no]
324
- end
325
-
326
-
327
- end
328
-
329
-
330
- class <<ActiveRecord::Base
331
- alias_method :[], :find
332
- end
333
-
334
-
335
- # --- Fix Chronic - can't parse '12th Jan' --- #
336
- begin
337
- require 'chronic'
338
-
339
- module Chronic
340
-
341
- class << self
342
- def parse_with_hobo_fix(s)
343
- parse_without_hobo_fix(if s =~ /^\s*\d+\s*(st|nd|rd|th)\s+[a-zA-Z]+(\s+\d+)?\s*$/
344
- s.sub(/\s*\d+(st|nd|rd|th)/) {|s| s[0..-3]}
345
- else
346
- s
347
- end)
348
- end
349
- alias_method_chain :parse, :hobo_fix
350
- end
351
- end
352
- rescue MissingSourceFile; end
353
-
354
-
355
-
356
- # --- Fix pp dumps - these break sometimes without this --- #
357
- require 'pp'
358
- module PP::ObjectMixin
359
-
360
- alias_method :orig_pretty_print, :pretty_print
361
- def pretty_print(q)
362
- orig_pretty_print(q)
363
- rescue
364
- "[#PP-ERROR#]"
365
- end
366
-
367
- end
368
-
369
- class Proc
370
-
371
- def call_with_block(*args, &b)
372
- call(*args + [b])
373
- end
374
-
375
- end
@@ -1,12 +0,0 @@
1
- class Hobo::EmailAddress < String
2
-
3
- COLUMN_TYPE = :string
4
-
5
- def validate
6
- "is not a valid email address" unless
7
- self.blank? || self =~ /^\s*([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\s*$/i
8
- end
9
-
10
- end
11
-
12
- Hobo.field_types[:email_address] = Hobo::EmailAddress
@@ -1,50 +0,0 @@
1
- module Hobo
2
-
3
- class EnumString < String
4
-
5
- module Helper
6
-
7
- def enum_string(*values)
8
- EnumString.for(*values)
9
- end
10
-
11
- end
12
-
13
- class << self
14
-
15
- def with_values(*values)
16
- @values = values.every(:to_s)
17
- end
18
-
19
- attr_accessor :values
20
-
21
- def for(*values)
22
- values = values.every(:to_s)
23
- c = Class.new(EnumString) do
24
- values.each do |v|
25
- define_method("#{v.underscore}?") { self == v }
26
- meta_def("#{v.underscore}") { v }
27
- end
28
- end
29
- c.with_values(*values)
30
- c
31
- end
32
-
33
- def inspect
34
- name.blank? ? "#<EnumString #{(values || []) * ' '}>" : name
35
- end
36
- alias_method :to_s, :inspect
37
-
38
- end
39
-
40
- COLUMN_TYPE = :string
41
-
42
- def validate
43
- "must be one of #{self.class.values * ', '}" unless self.in?(self.class.values)
44
- end
45
-
46
- end
47
-
48
- end
49
-
50
- Hobo::FieldDeclarationsDsl.send(:include, Hobo::EnumString::Helper)