hobo 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/hobo_files/plugin/CHANGES.txt +220 -23
- data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +18 -25
- data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +20 -15
- data/hobo_files/plugin/generators/hobo_model/templates/model.rb +3 -3
- data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +3 -3
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo-rapid.css +1 -2
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo-rapid.js +21 -4
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/images/fieldbg.gif +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/images/spinner.gif +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/application.css +154 -26
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +144 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +1 -1
- data/hobo_files/plugin/generators/hobo_user_controller/templates/controller.rb +1 -1
- data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +8 -11
- data/hobo_files/plugin/init.rb +0 -2
- data/hobo_files/plugin/lib/active_record/has_many_association.rb +0 -9
- data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +0 -10
- data/hobo_files/plugin/lib/hobo.rb +57 -44
- data/hobo_files/plugin/lib/hobo/bundle.rb +222 -0
- data/hobo_files/plugin/lib/hobo/controller.rb +2 -5
- data/hobo_files/plugin/lib/hobo/dryml.rb +8 -7
- data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +10 -21
- data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +107 -80
- data/hobo_files/plugin/lib/hobo/dryml/template.rb +27 -20
- data/hobo_files/plugin/lib/hobo/enum_string.rb +1 -1
- data/hobo_files/plugin/lib/hobo/field_declaration_dsl.rb +7 -0
- data/hobo_files/plugin/lib/hobo/guest.rb +4 -0
- data/hobo_files/plugin/lib/hobo/hobo_helper.rb +37 -9
- data/hobo_files/plugin/lib/hobo/model.rb +79 -17
- data/hobo_files/plugin/lib/hobo/model_controller.rb +59 -60
- data/hobo_files/plugin/lib/hobo/model_router.rb +16 -4
- data/hobo_files/plugin/lib/hobo/rapid_helper.rb +2 -1
- data/hobo_files/plugin/lib/hobo/user.rb +10 -7
- data/hobo_files/plugin/lib/hobo/user_controller.rb +6 -6
- data/hobo_files/plugin/{tags → taglibs}/core.dryml +5 -4
- data/hobo_files/plugin/{tags → taglibs}/rapid.dryml +54 -7
- data/hobo_files/plugin/{tags → taglibs}/rapid_document_tags.dryml +0 -0
- data/hobo_files/plugin/{tags → taglibs}/rapid_editing.dryml +4 -2
- data/hobo_files/plugin/{tags → taglibs}/rapid_forms.dryml +1 -4
- data/hobo_files/plugin/{tags → taglibs}/rapid_navigation.dryml +1 -2
- data/hobo_files/plugin/taglibs/rapid_pages.dryml +411 -0
- data/hobo_files/plugin/{tags → taglibs}/rapid_plus.dryml +0 -0
- data/hobo_files/plugin/{tags → taglibs}/rapid_support.dryml +9 -6
- data/hobo_files/plugin/tasks/fix_dryml.rake +0 -1
- metadata +16 -14
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid_ui.css +0 -167
- data/hobo_files/plugin/lib/hobo/plugins.rb +0 -75
- data/hobo_files/plugin/tags/rapid_pages.dryml +0 -341
@@ -64,7 +64,7 @@ module Hobo::Dryml
|
|
64
64
|
|
65
65
|
def build(local_names, auto_taglibs)
|
66
66
|
|
67
|
-
auto_taglibs.each{|t| import_taglib(t)}
|
67
|
+
auto_taglibs.each { |t| import_taglib(t) }
|
68
68
|
|
69
69
|
@build_instructions.each do |instruction|
|
70
70
|
name = instruction[:name]
|
@@ -82,7 +82,7 @@ module Hobo::Dryml
|
|
82
82
|
@environment.class_eval(method_src, template_path, instruction[:line_num])
|
83
83
|
|
84
84
|
when :include
|
85
|
-
import_taglib(
|
85
|
+
import_taglib(instruction)
|
86
86
|
|
87
87
|
when :module
|
88
88
|
import_module(name.constantize, instruction[:as])
|
@@ -102,24 +102,13 @@ module Hobo::Dryml
|
|
102
102
|
end
|
103
103
|
|
104
104
|
|
105
|
-
def
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
"#{template_dir}/#{path}"
|
113
|
-
end
|
114
|
-
base + ".dryml"
|
115
|
-
end
|
116
|
-
|
117
|
-
|
118
|
-
def import_taglib(src_path, as=nil)
|
119
|
-
path = expand_template_path(src_path)
|
120
|
-
unless template_path == path
|
121
|
-
taglib = Taglib.get(RAILS_ROOT + (path.starts_with?("/") ? path : "/" + path))
|
122
|
-
taglib.import_into(@environment, as)
|
105
|
+
def import_taglib(options)
|
106
|
+
if options[:module]
|
107
|
+
import_module(options[:module].constantize, options[:as])
|
108
|
+
else
|
109
|
+
template_dir = File.dirname(template_path)
|
110
|
+
taglib = Taglib.get(options.merge(:template_dir => template_dir))
|
111
|
+
taglib.import_into(@environment, options[:as])
|
123
112
|
end
|
124
113
|
end
|
125
114
|
|
@@ -133,7 +122,7 @@ module Hobo::Dryml
|
|
133
122
|
def set_theme(name)
|
134
123
|
if Hobo.current_theme.nil? or Hobo.current_theme == name
|
135
124
|
Hobo.current_theme = name
|
136
|
-
import_taglib("taglibs/themes/#{name}/application")
|
125
|
+
import_taglib(:src => "taglibs/themes/#{name}/application")
|
137
126
|
end
|
138
127
|
end
|
139
128
|
end
|
@@ -1,95 +1,122 @@
|
|
1
|
-
module Hobo
|
1
|
+
module Hobo
|
2
|
+
|
3
|
+
module Dryml
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
5
|
+
class Taglib
|
6
|
+
|
7
|
+
@cache = {}
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def get(options)
|
12
|
+
file = taglib_file(options)
|
13
|
+
|
14
|
+
taglib = @cache[options]
|
15
|
+
if taglib
|
16
|
+
taglib.reload
|
17
|
+
else
|
18
|
+
renames = (bundle = options[:bundle] and
|
19
|
+
Bundle.bundles[bundle]._?.renames)
|
20
|
+
|
21
|
+
taglib = Taglib.new(file, renames)
|
22
|
+
@cache[options] = taglib
|
23
|
+
end
|
24
|
+
taglib
|
19
25
|
end
|
20
|
-
taglib
|
21
|
-
end
|
22
|
-
|
23
|
-
def clear_cache
|
24
|
-
@cache = {}
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def initialize(file)
|
30
|
-
@file = file
|
31
|
-
load
|
32
|
-
end
|
33
|
-
|
34
|
-
def reload
|
35
|
-
load if @file.mtime > @last_load_time
|
36
|
-
end
|
37
|
-
|
38
|
-
def load
|
39
|
-
@module = Module.new do
|
40
26
|
|
41
|
-
|
42
|
-
|
27
|
+
def clear_cache
|
28
|
+
@cache = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
43
32
|
|
44
|
-
|
33
|
+
def taglib_file(options)
|
34
|
+
base = if (plugin = options[:plugin])
|
35
|
+
"vendor/plugins/#{plugin}/taglibs"
|
36
|
+
elsif (bundle_name = options[:bundle])
|
37
|
+
bundle = Bundle.bundles[bundle_name]
|
38
|
+
"vendor/plugins/#{bundle.plugin}/taglibs"
|
39
|
+
elsif options[:src] =~ /\//
|
40
|
+
"app/views"
|
41
|
+
else
|
42
|
+
options[:template_dir]
|
43
|
+
end
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
filename = "#{RAILS_ROOT}/#{base}/#{options[:src]}.dryml"
|
46
|
+
raise DrymlException, "No such taglib: #{options.inspect} #{filename}" unless File.exists?(filename)
|
47
|
+
File.new(filename)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(file, renames)
|
53
|
+
@file = file
|
54
|
+
@renames = renames
|
55
|
+
load
|
56
|
+
end
|
57
|
+
|
58
|
+
def reload
|
59
|
+
load if @file.mtime > @last_load_time
|
60
|
+
end
|
61
|
+
|
62
|
+
def load
|
63
|
+
@module = Module.new do
|
64
|
+
|
65
|
+
@tag_attrs = {}
|
66
|
+
@tag_aliases = {}
|
56
67
|
|
57
|
-
|
58
|
-
|
68
|
+
class << self
|
69
|
+
|
70
|
+
def included(base)
|
71
|
+
@tag_aliases.each do |tag, feature|
|
72
|
+
base.send(:alias_method_chain, tag, feature)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def _register_tag_attrs(tag, attrs)
|
77
|
+
@tag_attrs[tag] = attrs
|
78
|
+
end
|
79
|
+
attr_reader :tag_attrs
|
80
|
+
|
81
|
+
def delayed_alias_method_chain(tag, feature)
|
82
|
+
@tag_aliases[tag] = feature
|
83
|
+
end
|
84
|
+
|
59
85
|
end
|
60
86
|
|
61
87
|
end
|
62
|
-
|
88
|
+
@file.rewind
|
89
|
+
template = Template.new(@file.read, @module, @file.path, @renames)
|
90
|
+
template.compile([], [])
|
91
|
+
@last_load_time = @file.mtime
|
63
92
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
93
|
+
|
94
|
+
def import_into(class_or_module, as)
|
95
|
+
if as
|
96
|
+
# Define a method on class_or_module named whatever 'as'
|
97
|
+
# is. The first time the method is called it creates and
|
98
|
+
# returns an object that provides the taglib's tags as
|
99
|
+
# methods. On subsequent calls the object is cached in an
|
100
|
+
# instance variable "@_#{as}_taglib"
|
101
|
+
|
102
|
+
taglib_module = @module
|
103
|
+
ivar = "@_#{as}_taglib"
|
104
|
+
class_or_module.send(:define_method, as) do
|
105
|
+
instance_variable_get(ivar) or begin
|
106
|
+
as_class = Class.new(TemplateEnvironment) { include taglib_module }
|
107
|
+
as_object = as_class.new
|
108
|
+
as_object.copy_instance_variables_from(self)
|
109
|
+
instance_variable_set(ivar, as_object)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
else
|
113
|
+
class_or_module.send(:include, @module)
|
114
|
+
class_or_module.tag_attrs.update(@module.tag_attrs) if @module.respond_to?(:tag_attrs)
|
87
115
|
end
|
88
|
-
else
|
89
|
-
class_or_module.send(:include, @module)
|
90
|
-
class_or_module.tag_attrs.update(@module.tag_attrs) if @module.respond_to?(:tag_attrs)
|
91
116
|
end
|
117
|
+
|
92
118
|
end
|
93
|
-
|
119
|
+
|
94
120
|
end
|
121
|
+
|
95
122
|
end
|
@@ -28,12 +28,11 @@ module Hobo::Dryml
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
def initialize(src, environment, template_path)
|
31
|
+
def initialize(src, environment, template_path, renames={})
|
32
32
|
@src = src
|
33
|
-
|
34
33
|
@environment = environment # a class or a module
|
35
|
-
|
36
34
|
@template_path = template_path.sub(/^#{Regexp.escape(RAILS_ROOT)}/, "")
|
35
|
+
@class_renames = renames
|
37
36
|
|
38
37
|
@builder = Template.build_cache[@template_path] || DRYMLBuilder.new(@template_path)
|
39
38
|
@builder.set_environment(environment)
|
@@ -41,7 +40,7 @@ module Hobo::Dryml
|
|
41
40
|
@last_element = nil
|
42
41
|
end
|
43
42
|
|
44
|
-
attr_reader :tags, :template_path
|
43
|
+
attr_reader :tags, :template_path, :class_renames
|
45
44
|
|
46
45
|
def compile(local_names=[], auto_taglibs=[])
|
47
46
|
now = Time.now
|
@@ -144,7 +143,8 @@ module Hobo::Dryml
|
|
144
143
|
|
145
144
|
when "include"
|
146
145
|
include_element(el)
|
147
|
-
# return
|
146
|
+
# return just the newlines to keep line-number matching - the
|
147
|
+
# include has no presence in the erb source
|
148
148
|
tag_newlines(el)
|
149
149
|
|
150
150
|
when "set-theme"
|
@@ -179,15 +179,11 @@ module Hobo::Dryml
|
|
179
179
|
def include_element(el)
|
180
180
|
require_toplevel(el)
|
181
181
|
require_attribute(el, "as", /^#{DRYML_NAME}$/, true)
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
:as => el.attributes["as"])
|
186
|
-
elsif el.attributes["module"]
|
187
|
-
@builder.add_build_instruction(:module,
|
188
|
-
:name => el.attributes["module"],
|
189
|
-
:as => el.attributes["as"])
|
182
|
+
options = {}
|
183
|
+
%w(src module plugin bundle as).each do |attr|
|
184
|
+
options[attr.to_sym] = el.attributes[attr] if el.attributes[attr]
|
190
185
|
end
|
186
|
+
@builder.add_build_instruction(:include, options)
|
191
187
|
end
|
192
188
|
|
193
189
|
|
@@ -247,9 +243,12 @@ module Hobo::Dryml
|
|
247
243
|
unsafe_name = el.attributes["tag"]
|
248
244
|
name = Hobo::Dryml.unreserve(unsafe_name)
|
249
245
|
if (for_type = el.attributes['for'])
|
250
|
-
type_name =
|
246
|
+
type_name = case for_type
|
247
|
+
when /^[a-z]/
|
251
248
|
# It's a symbolic type name - look up the Ruby type name
|
252
249
|
Hobo.field_types[for_type].name
|
250
|
+
when /^_.*_$/
|
251
|
+
rename_class(for_type)
|
253
252
|
else
|
254
253
|
for_type
|
255
254
|
end.underscore.gsub('/', '__')
|
@@ -420,9 +419,9 @@ module Hobo::Dryml
|
|
420
419
|
# holding a proc
|
421
420
|
param_restore_local_name(name)
|
422
421
|
elsif (call_type = polymorphic_call_type(el))
|
423
|
-
"find_polymorphic_tag(:#{name
|
422
|
+
"find_polymorphic_tag(:#{ruby_name name}, #{call_type})"
|
424
423
|
else
|
425
|
-
":#{name
|
424
|
+
":#{ruby_name name}"
|
426
425
|
end
|
427
426
|
"call_tag_parameter(#{to_call}, #{args})"
|
428
427
|
else
|
@@ -430,9 +429,11 @@ module Hobo::Dryml
|
|
430
429
|
# The tag is a proc available in a local variable
|
431
430
|
"#{param_restore_local_name(name)}.call(#{attributes}, #{parameters})"
|
432
431
|
elsif (call_type = polymorphic_call_type(el))
|
433
|
-
"send(find_polymorphic_tag(:#{name
|
432
|
+
"send(find_polymorphic_tag(:#{ruby_name name}, #{call_type}), #{attributes}, #{parameters})"
|
433
|
+
elsif attributes == "{}" && parameters == "{}"
|
434
|
+
"#{ruby_name name}.to_s"
|
434
435
|
else
|
435
|
-
"#{name
|
436
|
+
"#{ruby_name name}(#{attributes}, #{parameters})"
|
436
437
|
end
|
437
438
|
end
|
438
439
|
|
@@ -524,7 +525,7 @@ module Hobo::Dryml
|
|
524
525
|
|
525
526
|
|
526
527
|
def param_restore_local_name(name)
|
527
|
-
"_#{name
|
528
|
+
"_#{ruby_name name}_restore"
|
528
529
|
end
|
529
530
|
|
530
531
|
|
@@ -549,7 +550,7 @@ module Hobo::Dryml
|
|
549
550
|
|
550
551
|
|
551
552
|
def param_content_local_name(name)
|
552
|
-
"_#{name
|
553
|
+
"_#{ruby_name name}__default_content"
|
553
554
|
end
|
554
555
|
|
555
556
|
|
@@ -767,6 +768,12 @@ module Hobo::Dryml
|
|
767
768
|
@gensym_counter += 1
|
768
769
|
"#{name}_#{@gensym_counter}"
|
769
770
|
end
|
771
|
+
|
772
|
+
def rename_class(name)
|
773
|
+
name = name[1..-2]
|
774
|
+
name = class_renames[name] while class_renames.has_key?(name)
|
775
|
+
name
|
776
|
+
end
|
770
777
|
|
771
778
|
end
|
772
779
|
|
@@ -16,6 +16,13 @@ module Hobo
|
|
16
16
|
def field(name, *args)
|
17
17
|
type = args.shift
|
18
18
|
options = args.extract_options!
|
19
|
+
|
20
|
+
@model.name_attribute = name.to_sym if options.delete(:name)
|
21
|
+
@model.primary_content_attribute = name.to_sym if options.delete(:description)
|
22
|
+
@model.creator_attribute = name.to_sym if options.delete(:creator)
|
23
|
+
|
24
|
+
@model.send(:login_attribute=, name.to_sym, options.delete(:validate)) if @model < User && options.delete(:login)
|
25
|
+
|
19
26
|
@model.send(:set_field_type, name => type) unless
|
20
27
|
type.in?(@model.connection.native_database_types.keys - [:text])
|
21
28
|
@model.field_specs[name] = FieldSpec.new(@model, name, type, options)
|
@@ -54,8 +54,8 @@ module Hobo
|
|
54
54
|
# TODO - what if you want if_available as a query param?
|
55
55
|
if_available = params.delete(:if_available)
|
56
56
|
return nil if if_available &&
|
57
|
-
((action.nil? && obj.respond_to?(:typed_id) && !linkable?(obj.class, :show, subsite)) ||
|
58
|
-
(action.nil? && obj.is_a?(Class) && !linkable?(obj,
|
57
|
+
((action.nil? && obj.respond_to?(:typed_id) && !linkable?(obj.class, :show, :subsite => subsite)) ||
|
58
|
+
(action.nil? && obj.is_a?(Class) && !linkable?(obj, :index, :subsite => subsite)))
|
59
59
|
|
60
60
|
base = subsite.blank? ? base_url : "/#{subsite}#{base_url}"
|
61
61
|
|
@@ -195,7 +195,11 @@ module Hobo
|
|
195
195
|
|
196
196
|
def can_edit?(*args)
|
197
197
|
if args.empty?
|
198
|
-
this_parent && this_field
|
198
|
+
if this_parent && this_field
|
199
|
+
can_edit?(this_parent, this_field)
|
200
|
+
else
|
201
|
+
can_edit?(this, nil)
|
202
|
+
end
|
199
203
|
else
|
200
204
|
object, field = args.length == 2 ? args : [this, args.first]
|
201
205
|
|
@@ -300,10 +304,11 @@ module Hobo
|
|
300
304
|
end
|
301
305
|
|
302
306
|
|
303
|
-
def
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
+
def new_for_current_user(model_or_assoc=nil)
|
308
|
+
model_or_assoc ||= this
|
309
|
+
record = model_or_assoc.new
|
310
|
+
record.set_creator(current_user)
|
311
|
+
record
|
307
312
|
end
|
308
313
|
|
309
314
|
|
@@ -356,11 +361,34 @@ module Hobo
|
|
356
361
|
end
|
357
362
|
end
|
358
363
|
|
359
|
-
def linkable?(
|
360
|
-
|
364
|
+
def linkable?(*args)
|
365
|
+
options = args.extract_options!
|
366
|
+
target = args.empty? || args.first.is_a?(Symbol) ? this : args.shift
|
367
|
+
action = args.first
|
368
|
+
|
369
|
+
if target.is_a?(Class)
|
370
|
+
klass = target
|
371
|
+
action ||= :index
|
372
|
+
elsif target.respond_to?(:member_class)
|
373
|
+
klass = target.member_class
|
374
|
+
action ||= :show
|
375
|
+
else
|
376
|
+
klass = target.class
|
377
|
+
action ||= :show
|
378
|
+
end
|
379
|
+
|
380
|
+
Hobo::ModelRouter.linkable?(subsite, klass, action.to_sym)
|
361
381
|
end
|
362
382
|
|
363
383
|
|
384
|
+
# Convenience helper for the default app
|
385
|
+
|
386
|
+
def front_models
|
387
|
+
Hobo.models.select {|m| linkable?(m) && !(m < Hobo::User)}
|
388
|
+
end
|
389
|
+
|
390
|
+
|
391
|
+
|
364
392
|
# debugging support
|
365
393
|
|
366
394
|
def abort_with(*args)
|