hobo 0.5.3 → 0.6
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.
- data/bin/hobo +18 -4
- data/hobo_files/plugin/CHANGES.txt +511 -0
- data/hobo_files/plugin/README +8 -3
- data/hobo_files/plugin/Rakefile +81 -0
- data/hobo_files/plugin/generators/hobo/hobo_generator.rb +4 -4
- data/hobo_files/plugin/generators/hobo/templates/guest.rb +1 -1
- data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +1 -1
- data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +16 -22
- data/hobo_files/plugin/generators/hobo_front_controller/templates/login.dryml +4 -6
- data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +6 -5
- data/hobo_files/plugin/generators/hobo_front_controller/templates/signup.dryml +4 -6
- data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +237 -0
- data/hobo_files/plugin/generators/hobo_migration/templates/migration.rb +9 -0
- data/hobo_files/plugin/generators/hobo_model/USAGE +2 -3
- data/hobo_files/plugin/generators/hobo_model/hobo_model_generator.rb +1 -14
- data/hobo_files/plugin/generators/hobo_model/templates/fixtures.yml +1 -6
- data/hobo_files/plugin/generators/hobo_model/templates/model.rb +10 -4
- data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +7 -6
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_base.css +68 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.css +93 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +11 -6
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/plus.png +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +24 -14
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +28 -44
- data/hobo_files/plugin/generators/hobo_user_model/USAGE +2 -12
- data/hobo_files/plugin/generators/hobo_user_model/hobo_user_model_generator.rb +1 -14
- data/hobo_files/plugin/generators/hobo_user_model/templates/fixtures.yml +0 -6
- data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +8 -1
- data/hobo_files/plugin/init.rb +6 -2
- data/hobo_files/plugin/lib/active_record/has_many_association.rb +23 -12
- data/hobo_files/plugin/lib/extensions.rb +134 -40
- data/hobo_files/plugin/lib/extensions/test_case.rb +0 -1
- data/hobo_files/plugin/lib/hobo.rb +77 -46
- data/hobo_files/plugin/lib/hobo/authenticated_user.rb +24 -2
- data/hobo_files/plugin/lib/hobo/authentication_support.rb +2 -1
- data/hobo_files/plugin/lib/hobo/controller.rb +35 -12
- data/hobo_files/plugin/lib/hobo/define_tags.rb +4 -4
- data/hobo_files/plugin/lib/hobo/dryml.rb +33 -51
- data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +47 -34
- data/hobo_files/plugin/lib/hobo/dryml/scoped_variables.rb +37 -0
- data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +27 -5
- data/hobo_files/plugin/lib/hobo/dryml/template.rb +545 -302
- data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +305 -135
- data/hobo_files/plugin/lib/hobo/email_address.rb +5 -0
- data/hobo_files/plugin/lib/hobo/field_spec.rb +66 -0
- data/hobo_files/plugin/lib/hobo/hobo_helper.rb +325 -0
- data/hobo_files/plugin/lib/hobo/html_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/lazy_hash.rb +13 -1
- data/hobo_files/plugin/lib/hobo/markdown_string.rb +3 -1
- data/hobo_files/plugin/lib/hobo/model.rb +185 -66
- data/hobo_files/plugin/lib/hobo/model_controller.rb +56 -49
- data/hobo_files/plugin/lib/hobo/password_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/plugins.rb +75 -0
- data/hobo_files/plugin/lib/hobo/rapid_helper.rb +98 -0
- data/hobo_files/plugin/lib/hobo/static_tags +0 -3
- data/hobo_files/plugin/lib/hobo/textile_string.rb +11 -1
- data/hobo_files/plugin/lib/hobo/undefined.rb +1 -1
- data/hobo_files/plugin/lib/rexml.rb +166 -75
- data/hobo_files/plugin/spec/fixtures/users.yml +9 -0
- data/hobo_files/plugin/spec/spec.opts +6 -0
- data/hobo_files/plugin/spec/spec_helper.rb +28 -0
- data/hobo_files/plugin/spec/unit/hobo/dryml/template_spec.rb +650 -0
- data/hobo_files/plugin/tags/core.dryml +58 -4
- data/hobo_files/plugin/tags/rapid.dryml +289 -135
- data/hobo_files/plugin/tags/rapid_document_tags.dryml +49 -0
- data/hobo_files/plugin/tags/rapid_editing.dryml +92 -69
- data/hobo_files/plugin/tags/rapid_forms.dryml +242 -0
- data/hobo_files/plugin/tags/rapid_navigation.dryml +65 -65
- data/hobo_files/plugin/tags/rapid_pages.dryml +197 -124
- data/hobo_files/plugin/tags/rapid_support.dryml +23 -0
- metadata +29 -22
- data/hobo_files/plugin/generators/hobo_model/templates/migration.rb +0 -13
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/default_mapping.rb +0 -11
- data/hobo_files/plugin/generators/hobo_user_model/templates/migration.rb +0 -15
- data/hobo_files/plugin/lib/hobo/HtmlString +0 -3
- data/hobo_files/plugin/lib/hobo/controller_helpers.rb +0 -135
- data/hobo_files/plugin/lib/hobo/core.rb +0 -475
- data/hobo_files/plugin/lib/hobo/rapid.rb +0 -447
- data/hobo_files/plugin/test/hobo_dryml_template_test.rb +0 -7
- data/hobo_files/plugin/test/hobo_test.rb +0 -7
|
@@ -4,23 +4,13 @@ Description:
|
|
|
4
4
|
The generator takes a model name as its argument. The model name may be given in CamelCase or under_score and
|
|
5
5
|
should not be suffixed with 'Model'.
|
|
6
6
|
|
|
7
|
-
As additional parameters, the generator will take attribute pairs described by name and type. These attributes will
|
|
8
|
-
be used to prepopulate the migration to create the table for the model and give you a set of predefined fixture.
|
|
9
|
-
You don't have to think up all attributes up front, but it's a good idea of adding just the baseline of what's
|
|
10
|
-
needed to start really working with the resource.
|
|
11
|
-
|
|
12
7
|
The generator creates a model class in app/models, a test suite in test/unit, test fixtures in
|
|
13
|
-
test/fixtures/singular_name.yml
|
|
8
|
+
test/fixtures/singular_name.yml.
|
|
14
9
|
|
|
15
10
|
Examples:
|
|
16
|
-
./script/generate
|
|
11
|
+
./script/generate hobo_model account
|
|
17
12
|
|
|
18
13
|
This will create an Account model:
|
|
19
14
|
Model: app/models/account.rb
|
|
20
15
|
Test: test/unit/account_test.rb
|
|
21
16
|
Fixtures: test/fixtures/accounts.yml
|
|
22
|
-
Migration: db/migrate/XXX_add_accounts.rb
|
|
23
|
-
|
|
24
|
-
./script/generate model post title:string created_on:date body:text published:boolean
|
|
25
|
-
|
|
26
|
-
Creates post model with predefined attributes.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
class HoboUserModelGenerator < Rails::Generator::NamedBase
|
|
2
|
-
default_options :skip_migration => false
|
|
3
2
|
|
|
4
3
|
def manifest
|
|
5
4
|
record do |m|
|
|
@@ -15,24 +14,12 @@ class HoboUserModelGenerator < Rails::Generator::NamedBase
|
|
|
15
14
|
m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
|
16
15
|
m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
|
|
17
16
|
m.template 'fixtures.yml', File.join('test/fixtures', class_path, "#{table_name}.yml")
|
|
18
|
-
|
|
19
|
-
unless options[:skip_migration]
|
|
20
|
-
m.migration_template 'migration.rb', 'db/migrate', :assigns => {
|
|
21
|
-
:migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}"
|
|
22
|
-
}, :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
|
|
23
|
-
end
|
|
24
17
|
end
|
|
25
18
|
end
|
|
26
19
|
|
|
27
20
|
protected
|
|
28
21
|
def banner
|
|
29
|
-
"Usage: #{$0}
|
|
22
|
+
"Usage: #{$0} #{spec.name} ModelName"
|
|
30
23
|
end
|
|
31
24
|
|
|
32
|
-
def add_options!(opt)
|
|
33
|
-
opt.separator ''
|
|
34
|
-
opt.separator 'Options:'
|
|
35
|
-
opt.on("--skip-migration",
|
|
36
|
-
"Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
|
|
37
|
-
end
|
|
38
25
|
end
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
|
2
2
|
one:
|
|
3
3
|
id: 1
|
|
4
|
-
<% for attribute in attributes -%>
|
|
5
|
-
<%= attribute.name %>: <%= attribute.default %>
|
|
6
|
-
<% end -%>
|
|
7
4
|
two:
|
|
8
5
|
id: 2
|
|
9
|
-
<% for attribute in attributes -%>
|
|
10
|
-
<%= attribute.name %>: <%= attribute.default %>
|
|
11
|
-
<% end -%>
|
|
@@ -3,14 +3,21 @@ class <%= class_name %> < ActiveRecord::Base
|
|
|
3
3
|
hobo_model
|
|
4
4
|
|
|
5
5
|
include Hobo::AuthenticatedUser
|
|
6
|
+
|
|
7
|
+
fields do
|
|
8
|
+
username :string
|
|
9
|
+
timestamps
|
|
10
|
+
end
|
|
6
11
|
|
|
7
12
|
set_login_attr :username
|
|
8
13
|
|
|
9
|
-
alias_attribute :
|
|
14
|
+
alias_attribute :to_s, :username
|
|
10
15
|
|
|
11
16
|
# --- Hobo Permissions --- #
|
|
12
17
|
|
|
13
18
|
def super_user?
|
|
19
|
+
# Return true to make this user exempt from permission restrictions
|
|
20
|
+
# e.g.
|
|
14
21
|
# login == 'admin'
|
|
15
22
|
end
|
|
16
23
|
|
data/hobo_files/plugin/init.rb
CHANGED
|
@@ -15,6 +15,8 @@ require 'hobo/dryml/taglib'
|
|
|
15
15
|
require 'hobo/dryml/template_environment'
|
|
16
16
|
require 'hobo/dryml/template_handler'
|
|
17
17
|
|
|
18
|
+
require 'hobo/plugins'
|
|
19
|
+
|
|
18
20
|
require 'extensions/test_case' if RAILS_ENV == "test"
|
|
19
21
|
|
|
20
22
|
|
|
@@ -33,8 +35,10 @@ class ActionController::Base
|
|
|
33
35
|
|
|
34
36
|
end
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
class ActiveRecord::Base
|
|
39
|
+
def self.hobo_model
|
|
40
|
+
include Hobo::Model
|
|
41
|
+
end
|
|
38
42
|
end
|
|
39
43
|
|
|
40
44
|
# Default settings
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
module ActiveRecord::Associations
|
|
2
2
|
|
|
3
3
|
class HasManyAssociation
|
|
4
|
+
|
|
5
|
+
def hobo_has_many?
|
|
6
|
+
Hobo::Model.in?(@owner.class.included_modules)
|
|
7
|
+
end
|
|
4
8
|
|
|
5
|
-
def
|
|
6
|
-
res =
|
|
7
|
-
if
|
|
8
|
-
refl = @owner.class.reverse_reflection(@reflection.name)
|
|
9
|
-
if refl
|
|
10
|
-
bta = ActiveRecord::Associations::BelongsToAssociation.new(res, refl)
|
|
11
|
-
bta.replace(@owner)
|
|
12
|
-
res.instance_variable_set("@#{refl.name}", bta)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
9
|
+
def build_with_reverse_reflection(*args)
|
|
10
|
+
res = build_without_reverse_reflection(*args)
|
|
11
|
+
set_reverse_association(res) if hobo_has_many?
|
|
15
12
|
res
|
|
16
13
|
end
|
|
14
|
+
alias_method_chain :build, :reverse_reflection
|
|
17
15
|
|
|
18
16
|
|
|
19
|
-
def
|
|
17
|
+
def new(attributes = {})
|
|
20
18
|
record = @reflection.klass.new(attributes)
|
|
21
|
-
|
|
19
|
+
if hobo_has_many?
|
|
20
|
+
set_belongs_to_association_for(record)
|
|
21
|
+
set_reverse_association(record)
|
|
22
|
+
end
|
|
22
23
|
record
|
|
23
24
|
end
|
|
24
25
|
|
|
@@ -48,6 +49,16 @@ module ActiveRecord::Associations
|
|
|
48
49
|
end
|
|
49
50
|
alias_method_chain :find, :block
|
|
50
51
|
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def set_reverse_association(object)
|
|
55
|
+
if @owner.new_record? && (refl = @owner.class.reverse_reflection(@reflection.name))
|
|
56
|
+
bta = ActiveRecord::Associations::BelongsToAssociation.new(object, refl)
|
|
57
|
+
bta.replace(@owner)
|
|
58
|
+
object.instance_variable_set("@#{refl.name}", bta)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
51
62
|
end
|
|
52
63
|
|
|
53
64
|
end
|
|
@@ -1,43 +1,3 @@
|
|
|
1
|
-
module Kernel
|
|
2
|
-
|
|
3
|
-
def extract_options_from_args!(args) #:nodoc:
|
|
4
|
-
args.last.is_a?(Hash) ? args.pop : {}
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
class Object
|
|
10
|
-
|
|
11
|
-
def in?(array)
|
|
12
|
-
array.include?(self)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def not_in?(array)
|
|
16
|
-
not array.include?(self)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
alias_method :is_a_without_multiple_args?, :is_a?
|
|
20
|
-
def is_a?(*args)
|
|
21
|
-
args.any? {|a| is_a_without_multiple_args?(a) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# metaid
|
|
25
|
-
def metaclass; class << self; self; end; end
|
|
26
|
-
def meta_eval &blk; metaclass.instance_eval &blk; end
|
|
27
|
-
|
|
28
|
-
# Adds methods to a metaclass
|
|
29
|
-
def meta_def name, &blk
|
|
30
|
-
meta_eval { define_method name, &blk }
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Defines an instance method within a class
|
|
34
|
-
def class_def name, &blk
|
|
35
|
-
class_eval { define_method name, &blk }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
|
|
41
1
|
class Module
|
|
42
2
|
|
|
43
3
|
def inheriting_attr_accessor(*names)
|
|
@@ -86,10 +46,70 @@ class Module
|
|
|
86
46
|
EOS
|
|
87
47
|
end
|
|
88
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
|
+
end
|
|
79
|
+
|
|
80
|
+
class Object
|
|
81
|
+
|
|
82
|
+
def in?(array)
|
|
83
|
+
array.include?(self)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def not_in?(array)
|
|
87
|
+
not array.include?(self)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
alias_method :is_a_without_multiple_args?, :is_a?
|
|
91
|
+
def is_a?(*args)
|
|
92
|
+
args.any? {|a| is_a_without_multiple_args?(a) }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# metaid
|
|
96
|
+
def metaclass; class << self; self; end; end
|
|
97
|
+
def meta_eval &blk; metaclass.instance_eval &blk; end
|
|
98
|
+
|
|
99
|
+
# Adds methods to a metaclass
|
|
100
|
+
def meta_def name, &blk
|
|
101
|
+
meta_eval { define_method name, &blk }
|
|
102
|
+
end
|
|
89
103
|
|
|
104
|
+
# Defines an instance method within a class
|
|
105
|
+
def class_def name, &blk
|
|
106
|
+
class_eval { define_method name, &blk }
|
|
107
|
+
end
|
|
90
108
|
|
|
91
109
|
end
|
|
92
110
|
|
|
111
|
+
|
|
112
|
+
|
|
93
113
|
module Enumerable
|
|
94
114
|
|
|
95
115
|
def omap(method = nil, &b)
|
|
@@ -149,6 +169,24 @@ module Enumerable
|
|
|
149
169
|
each_with_index {|x, i| res << yield(x, i)}
|
|
150
170
|
res
|
|
151
171
|
end
|
|
172
|
+
|
|
173
|
+
def build_hash
|
|
174
|
+
res = {}
|
|
175
|
+
each do |x|
|
|
176
|
+
k, v = yield x
|
|
177
|
+
res[k] = v
|
|
178
|
+
end
|
|
179
|
+
res
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def map_hash
|
|
183
|
+
res = {}
|
|
184
|
+
each do |x|
|
|
185
|
+
v = yield x
|
|
186
|
+
res[x] = v
|
|
187
|
+
end
|
|
188
|
+
res
|
|
189
|
+
end
|
|
152
190
|
|
|
153
191
|
end
|
|
154
192
|
|
|
@@ -202,8 +240,57 @@ class Hash
|
|
|
202
240
|
[yes, no]
|
|
203
241
|
end
|
|
204
242
|
|
|
243
|
+
def -(keys)
|
|
244
|
+
res = {}
|
|
245
|
+
each_pair {|k, v| res[k] = v unless k.in?(keys)}
|
|
246
|
+
res
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def &(keys)
|
|
250
|
+
res = {}
|
|
251
|
+
keys.each {|k| res[k] = self[k] if has_key?(k)}
|
|
252
|
+
res
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class HashWithIndifferentAccess
|
|
259
|
+
|
|
260
|
+
def -(keys)
|
|
261
|
+
res = {}
|
|
262
|
+
keys = keys.map {|k| k.is_a?(Symbol) ? k.to_s : k }
|
|
263
|
+
each_pair { |k, v| res[k] = v unless k.in?(keys) }
|
|
264
|
+
res
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def &(keys)
|
|
268
|
+
res = {}
|
|
269
|
+
keys.each do |k|
|
|
270
|
+
k = k.to_s if k.is_a?(Symbol)
|
|
271
|
+
res[k] = self[k] if has_key?(k)
|
|
272
|
+
end
|
|
273
|
+
res
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def partition_hash(keys=nil)
|
|
277
|
+
keys = keys.map {|k| k.is_a?(Symbol) ? k.to_s : k }
|
|
278
|
+
yes = {}
|
|
279
|
+
no = {}
|
|
280
|
+
each do |k,v|
|
|
281
|
+
if block_given? ? yield(k,v) : keys.include?(k)
|
|
282
|
+
yes[k] = v
|
|
283
|
+
else
|
|
284
|
+
no[k] = v
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
[yes, no]
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
|
|
205
291
|
end
|
|
206
292
|
|
|
293
|
+
|
|
207
294
|
class <<ActiveRecord::Base
|
|
208
295
|
alias_method :[], :find
|
|
209
296
|
end
|
|
@@ -243,3 +330,10 @@ module PP::ObjectMixin
|
|
|
243
330
|
|
|
244
331
|
end
|
|
245
332
|
|
|
333
|
+
class Proc
|
|
334
|
+
|
|
335
|
+
def call_with_block(*args, &b)
|
|
336
|
+
call(*args + [b])
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
end
|
|
@@ -5,11 +5,20 @@ module Hobo
|
|
|
5
5
|
class RawJs < String; end
|
|
6
6
|
|
|
7
7
|
@models = []
|
|
8
|
-
|
|
8
|
+
@field_types = HashWithIndifferentAccess.new
|
|
9
|
+
|
|
9
10
|
class << self
|
|
10
11
|
|
|
11
|
-
attr_accessor :current_theme
|
|
12
|
+
attr_accessor :current_theme, :field_types
|
|
12
13
|
attr_writer :developer_features
|
|
14
|
+
|
|
15
|
+
def symbolic_type_name(type)
|
|
16
|
+
field_types.index(type)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def type_name(type)
|
|
20
|
+
symbolic_type_name(type) || type.name.underscore.gsub("/", "__")
|
|
21
|
+
end
|
|
13
22
|
|
|
14
23
|
def developer_features?
|
|
15
24
|
@developer_features
|
|
@@ -19,8 +28,8 @@ module Hobo
|
|
|
19
28
|
def raw_js(s)
|
|
20
29
|
RawJs.new(s)
|
|
21
30
|
end
|
|
22
|
-
|
|
23
|
-
|
|
31
|
+
|
|
32
|
+
|
|
24
33
|
def user_model=(model)
|
|
25
34
|
@user_model = model && model.name
|
|
26
35
|
end
|
|
@@ -39,7 +48,7 @@ module Hobo
|
|
|
39
48
|
def models
|
|
40
49
|
unless @models_loaded
|
|
41
50
|
Dir.entries("#{RAILS_ROOT}/app/models/").map do |f|
|
|
42
|
-
f =~
|
|
51
|
+
f =~ /^[a-zA-Z_][a-zA-Z0-9_]*\.rb$/ and f.sub(/.rb$/, '').camelize.constantize
|
|
43
52
|
end
|
|
44
53
|
@models_loaded = true
|
|
45
54
|
end
|
|
@@ -124,12 +133,15 @@ module Hobo
|
|
|
124
133
|
end
|
|
125
134
|
|
|
126
135
|
def add_routes(map)
|
|
136
|
+
ActiveRecord::Base.connection.reconnect! unless ActiveRecord::Base.connection.active?
|
|
127
137
|
require "#{RAILS_ROOT}/app/controllers/application" unless Object.const_defined? :ApplicationController
|
|
128
|
-
|
|
138
|
+
require "#{RAILS_ROOT}/app/assemble.rb" if File.exists? "#{RAILS_ROOT}/app/assemble.rb"
|
|
139
|
+
|
|
129
140
|
for model in Hobo.models
|
|
130
141
|
controller_name = "#{model.name.pluralize}Controller"
|
|
131
|
-
controller = controller_name.constantize if
|
|
142
|
+
controller = controller_name.constantize if (Object.const_defined? controller_name) ||
|
|
132
143
|
File.exists?("#{RAILS_ROOT}/app/controllers/#{controller_name.underscore}.rb")
|
|
144
|
+
|
|
133
145
|
if controller
|
|
134
146
|
web_name = model.name.underscore.pluralize.downcase
|
|
135
147
|
|
|
@@ -156,7 +168,7 @@ module Hobo
|
|
|
156
168
|
|
|
157
169
|
for view in controller.show_actions
|
|
158
170
|
map.named_route("#{web_name.singularize}_#{view}",
|
|
159
|
-
"#{web_name}/:id
|
|
171
|
+
"#{web_name}/:id/#{view}",
|
|
160
172
|
:controller => web_name,
|
|
161
173
|
:action => view.to_s,
|
|
162
174
|
:conditions => { :method => :get })
|
|
@@ -210,10 +222,10 @@ module Hobo
|
|
|
210
222
|
def can_create?(person, object)
|
|
211
223
|
if object.is_a?(Class) and object < ActiveRecord::Base
|
|
212
224
|
object = object.new
|
|
213
|
-
object.
|
|
225
|
+
object.set_creator(person)
|
|
214
226
|
elsif Hobo.simple_has_many_association?(object)
|
|
215
|
-
object = object.
|
|
216
|
-
object.
|
|
227
|
+
object = object.new
|
|
228
|
+
object.set_creator(person)
|
|
217
229
|
end
|
|
218
230
|
check_permission(:create, person, object)
|
|
219
231
|
end
|
|
@@ -225,34 +237,49 @@ module Hobo
|
|
|
225
237
|
|
|
226
238
|
|
|
227
239
|
def can_edit?(person, object, field)
|
|
228
|
-
setter = "#{field}="
|
|
240
|
+
setter = "#{field.to_s.sub /\?$/, ''}="
|
|
229
241
|
return false unless can_view?(person, object, field) and object.respond_to?(setter)
|
|
230
242
|
|
|
231
243
|
refl = object.class.reflections[field.to_sym] if object.is_a?(ActiveRecord::Base)
|
|
232
244
|
|
|
233
245
|
# has_many and polymorphic associations are not editable (for now)
|
|
234
|
-
return false if refl and (refl.macro == :has_many or refl.options[:polymorphic])
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
246
|
+
return false if refl and (refl.macro == :has_many or refl.options[:polymorphic] or refl.macro == :has_one)
|
|
247
|
+
|
|
248
|
+
if object.respond_to?(:editable_by?)
|
|
249
|
+
check_permission(:edit, person, object, field.to_sym)
|
|
250
|
+
else
|
|
251
|
+
# Fake an edit test by setting the field in question to
|
|
252
|
+
# Hobo::Undefined and then testing for update permission
|
|
253
|
+
|
|
254
|
+
current = object.send(field)
|
|
255
|
+
new = object.duplicate
|
|
256
|
+
|
|
257
|
+
begin
|
|
258
|
+
# Setting the undefined value can sometimes result in an
|
|
259
|
+
# UndefinedAccessError. In that case we have no choice but
|
|
260
|
+
# return false.
|
|
261
|
+
new.send(setter, if current == true
|
|
262
|
+
false
|
|
263
|
+
elsif current == false
|
|
264
|
+
true
|
|
265
|
+
elsif refl and refl.macro == :belongs_to
|
|
266
|
+
Hobo::Undefined.new(refl.klass)
|
|
267
|
+
else
|
|
268
|
+
Hobo::Undefined.new
|
|
269
|
+
end)
|
|
270
|
+
rescue Hobo::UndefinedAccessError
|
|
271
|
+
raise HoboError, "#{object.class.name} does not support undefined assignements, define editable_by(user, field)"
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
begin
|
|
275
|
+
if object.new_record?
|
|
276
|
+
check_permission(:create, person, new)
|
|
277
|
+
else
|
|
278
|
+
check_permission(:update, person, object, new)
|
|
279
|
+
end
|
|
280
|
+
rescue Hobo::UndefinedAccessError
|
|
281
|
+
false
|
|
253
282
|
end
|
|
254
|
-
rescue Hobo::UndefinedAccessError
|
|
255
|
-
false
|
|
256
283
|
end
|
|
257
284
|
end
|
|
258
285
|
|
|
@@ -264,12 +291,12 @@ module Hobo
|
|
|
264
291
|
|
|
265
292
|
# can_view? has special behaviour if it's passed a class or an
|
|
266
293
|
# association-proxy -- it instantiates the class, or creates a new
|
|
267
|
-
# instance "in" the association
|
|
268
|
-
#
|
|
269
|
-
#
|
|
270
|
-
#
|
|
271
|
-
#
|
|
272
|
-
#
|
|
294
|
+
# instance "in" the association, and tests the permission of this
|
|
295
|
+
# object. This means the permission methods in models can't rely
|
|
296
|
+
# on the instance being properly initialised. But it's important
|
|
297
|
+
# that it works like this because, in the case of an association
|
|
298
|
+
# proxy, we don't want to loose the information that the object
|
|
299
|
+
# belongs_to the proxy owner.
|
|
273
300
|
def can_view?(person, object, field=nil)
|
|
274
301
|
if field
|
|
275
302
|
field = field.to_sym if field.is_a? String
|
|
@@ -278,12 +305,8 @@ module Hobo
|
|
|
278
305
|
# Special support for classes (can view instances?)
|
|
279
306
|
if object.is_a?(Class) and object < ActiveRecord::Base
|
|
280
307
|
object = object.new
|
|
281
|
-
elsif
|
|
282
|
-
|
|
283
|
-
object = object.new_without_appending
|
|
284
|
-
elsif object.respond_to?(:member_class)
|
|
285
|
-
object = object.member_class.new
|
|
286
|
-
end
|
|
308
|
+
elsif Hobo.simple_has_many_association?(object)
|
|
309
|
+
object = object.new
|
|
287
310
|
end
|
|
288
311
|
end
|
|
289
312
|
viewable = check_permission(:view, person, object, field)
|
|
@@ -309,10 +332,16 @@ module Hobo
|
|
|
309
332
|
|
|
310
333
|
def static_tags
|
|
311
334
|
@static_tags ||= begin
|
|
312
|
-
path =
|
|
335
|
+
path = if FileTest.exists?("#{RAILS_ROOT}/config/dryml_static_tags.txt")
|
|
336
|
+
"#{RAILS_ROOT}/config/dryml_static_tags.txt"
|
|
337
|
+
else
|
|
338
|
+
File.join(File.dirname(__FILE__), "hobo/static_tags")
|
|
339
|
+
end
|
|
313
340
|
File.readlines(path).omap{chop}
|
|
314
341
|
end
|
|
315
342
|
end
|
|
343
|
+
|
|
344
|
+
attr_writer :static_tags
|
|
316
345
|
|
|
317
346
|
|
|
318
347
|
private
|
|
@@ -327,6 +356,7 @@ module Hobo
|
|
|
327
356
|
when :create; :creatable_by?
|
|
328
357
|
when :update; :updatable_by?
|
|
329
358
|
when :delete; :deletable_by?
|
|
359
|
+
when :edit; :editable_by?
|
|
330
360
|
when :view; :viewable_by?
|
|
331
361
|
end
|
|
332
362
|
p = if object.respond_to?(obj_method)
|
|
@@ -349,5 +379,6 @@ module Hobo
|
|
|
349
379
|
end
|
|
350
380
|
|
|
351
381
|
end
|
|
382
|
+
|
|
352
383
|
|
|
353
384
|
end
|