hobo 0.6.2 → 0.6.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.
- data/bin/hobo +21 -22
- data/hobo_files/plugin/CHANGES.txt +429 -4
- data/hobo_files/plugin/Rakefile +2 -2
- data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +6 -5
- data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +2 -2
- data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +20 -15
- data/hobo_files/plugin/generators/hobo_model/templates/model.rb +1 -0
- data/hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb +2 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_base.css +1 -2
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.css +4 -3
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +94 -12
- data/hobo_files/plugin/generators/hobo_rapid/templates/lowpro.js +5 -183
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +1 -1
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +23 -1
- data/hobo_files/plugin/generators/hobo_user_controller/templates/controller.rb +2 -0
- data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +3 -1
- data/hobo_files/plugin/init.rb +18 -7
- data/hobo_files/plugin/lib/active_record/has_many_association.rb +2 -2
- data/hobo_files/plugin/lib/extensions.rb +56 -12
- data/hobo_files/plugin/lib/hobo.rb +25 -88
- data/hobo_files/plugin/lib/hobo/composite_model.rb +2 -0
- data/hobo_files/plugin/lib/hobo/controller.rb +40 -20
- data/hobo_files/plugin/lib/hobo/dryml.rb +122 -106
- data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +2 -1
- data/hobo_files/plugin/lib/hobo/dryml/part_context.rb +3 -2
- data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +19 -3
- data/hobo_files/plugin/lib/hobo/dryml/template.rb +40 -25
- data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +41 -20
- data/hobo_files/plugin/lib/hobo/email_address.rb +4 -1
- data/hobo_files/plugin/lib/hobo/enum_string.rb +50 -0
- data/hobo_files/plugin/lib/hobo/field_declaration_dsl.rb +36 -0
- data/hobo_files/plugin/lib/hobo/field_spec.rb +4 -7
- data/hobo_files/plugin/lib/hobo/hobo_helper.rb +47 -44
- data/hobo_files/plugin/lib/hobo/html_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/markdown_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/model.rb +158 -89
- data/hobo_files/plugin/lib/hobo/model_controller.rb +422 -376
- data/hobo_files/plugin/lib/hobo/model_queries.rb +1 -1
- data/hobo_files/plugin/lib/hobo/model_router.rb +174 -0
- data/hobo_files/plugin/lib/hobo/password_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/percentage.rb +14 -0
- data/hobo_files/plugin/lib/hobo/plugins.rb +4 -4
- data/hobo_files/plugin/lib/hobo/rapid_helper.rb +10 -2
- data/hobo_files/plugin/lib/hobo/text.rb +3 -3
- data/hobo_files/plugin/lib/hobo/textile_string.rb +2 -0
- data/hobo_files/plugin/lib/hobo/undefined.rb +3 -2
- data/hobo_files/plugin/lib/hobo/{authenticated_user.rb → user.rb} +10 -3
- data/hobo_files/plugin/lib/hobo/user_controller.rb +27 -23
- data/hobo_files/plugin/tags/core.dryml +8 -2
- data/hobo_files/plugin/tags/rapid.dryml +52 -40
- data/hobo_files/plugin/tags/rapid_document_tags.dryml +15 -11
- data/hobo_files/plugin/tags/rapid_editing.dryml +41 -9
- data/hobo_files/plugin/tags/rapid_forms.dryml +136 -36
- data/hobo_files/plugin/tags/rapid_navigation.dryml +2 -2
- data/hobo_files/plugin/tags/rapid_pages.dryml +204 -221
- data/hobo_files/plugin/tags/rapid_plus.dryml +8 -6
- data/hobo_files/plugin/tags/rapid_support.dryml +2 -3
- metadata +44 -42
- data/hobo_files/plugin/lib/hobo/define_tags.rb +0 -56
- data/hobo_files/plugin/lib/hobo/http_parameters.rb +0 -225
@@ -5,13 +5,14 @@
|
|
5
5
|
<div class="search">
|
6
6
|
<form param="search_form" method="get" action="">
|
7
7
|
<hidden_fields for_query_string skip="page, search_form"/>
|
8
|
-
Search
|
8
|
+
Search
|
9
|
+
<input class="search_field" type="search" name="search" value="¶ms[:search]"/>
|
10
|
+
<submit label="Go" class="search_button" param="search_submit"/>
|
9
11
|
</form>
|
10
12
|
</div>
|
11
13
|
</div>
|
12
14
|
|
13
|
-
<Table merge_attrs="&attributes & (attrs_for(:Table) + attrs_for(:with_fields))"
|
14
|
-
merge_params>
|
15
|
+
<Table merge_attrs="&attributes & (attrs_for(:Table) + attrs_for(:with_fields))" merge_params>
|
15
16
|
<field_heading_row>
|
16
17
|
<with_field_names merge_attrs="&all_attributes & attrs_for(:with_fields)">
|
17
18
|
<% col = sort_columns[scope.field_path] || scope.field_path
|
@@ -19,8 +20,9 @@
|
|
19
20
|
"-#{col}" : col
|
20
21
|
sort_url = url_for(params.merge(:sort => sort) - [:page]) %>
|
21
22
|
|
22
|
-
<th>
|
23
|
-
<a href="&sort_url"
|
23
|
+
<th param="#{scope.field_name}_heading">
|
24
|
+
<a href="&sort_url" class="column_sort"
|
25
|
+
param="#{scope.field_name}_heading_link"><%= scope.field_name.titleize %></a>
|
24
26
|
<if test="&col == sort_field">
|
25
27
|
<do param="up_arrow" if="&sort_direction == 'desc'">↑</do>
|
26
28
|
<do param="down_arrow" if="&sort_direction == 'asc'">↓</do>
|
@@ -35,7 +37,7 @@
|
|
35
37
|
</else>
|
36
38
|
|
37
39
|
<nav class="page">
|
38
|
-
<page_nav/>
|
40
|
+
<page_nav param/>
|
39
41
|
</nav>
|
40
42
|
</div>
|
41
43
|
</def>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
if skip_associations == "has_many"
|
9
9
|
assocs = this.class.reflections.values.reject {|r| r.macro == :has_many }.every(:name)
|
10
|
-
columns
|
10
|
+
columns + assocs
|
11
11
|
elsif skip_associations
|
12
12
|
columns
|
13
13
|
else
|
@@ -17,7 +17,6 @@
|
|
17
17
|
else
|
18
18
|
comma_split(fields)
|
19
19
|
end
|
20
|
-
|
21
20
|
field_names -= comma_split(skip) if skip
|
22
21
|
field_names = field_names.select {|f| can_view?(this, f)}
|
23
22
|
field_names.each do |field| %><with field="&field"><tagbody/></with><% end
|
@@ -31,7 +30,7 @@
|
|
31
30
|
|
32
31
|
if skip_associations == "has_many"
|
33
32
|
assocs = this.reflections.values.reject {|r| r.macro == :has_many }.every(:name)
|
34
|
-
columns
|
33
|
+
columns + assocs
|
35
34
|
elsif skip_associations
|
36
35
|
columns
|
37
36
|
else
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: hobo
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.6.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.6.3
|
7
|
+
date: 2007-11-13 00:00:00 +00:00
|
8
8
|
summary: The web app builder for Rails
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -32,50 +32,40 @@ files:
|
|
32
32
|
- hobo_files/plugin
|
33
33
|
- hobo_files/plugin/CHANGES.txt
|
34
34
|
- hobo_files/plugin/generators
|
35
|
-
- hobo_files/plugin/init.rb
|
36
|
-
- hobo_files/plugin/lib
|
37
|
-
- hobo_files/plugin/LICENSE.txt
|
38
|
-
- hobo_files/plugin/Rakefile
|
39
|
-
- hobo_files/plugin/README
|
40
|
-
- hobo_files/plugin/tags
|
41
|
-
- hobo_files/plugin/tasks
|
42
|
-
- hobo_files/plugin/uninstall.rb
|
43
35
|
- hobo_files/plugin/generators/hobo
|
44
|
-
- hobo_files/plugin/generators/hobo_front_controller
|
45
|
-
- hobo_files/plugin/generators/hobo_migration
|
46
|
-
- hobo_files/plugin/generators/hobo_model
|
47
|
-
- hobo_files/plugin/generators/hobo_model_controller
|
48
|
-
- hobo_files/plugin/generators/hobo_rapid
|
49
|
-
- hobo_files/plugin/generators/hobo_user_controller
|
50
|
-
- hobo_files/plugin/generators/hobo_user_model
|
51
36
|
- hobo_files/plugin/generators/hobo/hobo_generator.rb
|
52
37
|
- hobo_files/plugin/generators/hobo/templates
|
53
38
|
- hobo_files/plugin/generators/hobo/templates/application.dryml
|
54
39
|
- hobo_files/plugin/generators/hobo/templates/guest.rb
|
40
|
+
- hobo_files/plugin/generators/hobo_front_controller
|
55
41
|
- hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb
|
56
42
|
- hobo_files/plugin/generators/hobo_front_controller/templates
|
57
|
-
- hobo_files/plugin/generators/hobo_front_controller/USAGE
|
58
43
|
- hobo_files/plugin/generators/hobo_front_controller/templates/controller.rb
|
59
44
|
- hobo_files/plugin/generators/hobo_front_controller/templates/functional_test.rb
|
60
45
|
- hobo_files/plugin/generators/hobo_front_controller/templates/helper.rb
|
61
46
|
- hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml
|
62
47
|
- hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml
|
48
|
+
- hobo_files/plugin/generators/hobo_front_controller/USAGE
|
49
|
+
- hobo_files/plugin/generators/hobo_migration
|
63
50
|
- hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb
|
64
51
|
- hobo_files/plugin/generators/hobo_migration/templates
|
65
52
|
- hobo_files/plugin/generators/hobo_migration/templates/migration.rb
|
53
|
+
- hobo_files/plugin/generators/hobo_model
|
66
54
|
- hobo_files/plugin/generators/hobo_model/hobo_model_generator.rb
|
67
55
|
- hobo_files/plugin/generators/hobo_model/templates
|
68
|
-
- hobo_files/plugin/generators/hobo_model/USAGE
|
69
56
|
- hobo_files/plugin/generators/hobo_model/templates/fixtures.yml
|
70
57
|
- hobo_files/plugin/generators/hobo_model/templates/model.rb
|
71
58
|
- hobo_files/plugin/generators/hobo_model/templates/unit_test.rb
|
59
|
+
- hobo_files/plugin/generators/hobo_model/USAGE
|
60
|
+
- hobo_files/plugin/generators/hobo_model_controller
|
72
61
|
- hobo_files/plugin/generators/hobo_model_controller/hobo_model_controller_generator.rb
|
73
62
|
- hobo_files/plugin/generators/hobo_model_controller/templates
|
74
|
-
- hobo_files/plugin/generators/hobo_model_controller/USAGE
|
75
63
|
- hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb
|
76
64
|
- hobo_files/plugin/generators/hobo_model_controller/templates/functional_test.rb
|
77
65
|
- hobo_files/plugin/generators/hobo_model_controller/templates/helper.rb
|
78
66
|
- hobo_files/plugin/generators/hobo_model_controller/templates/view.rhtml
|
67
|
+
- hobo_files/plugin/generators/hobo_model_controller/USAGE
|
68
|
+
- hobo_files/plugin/generators/hobo_rapid
|
79
69
|
- hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb
|
80
70
|
- hobo_files/plugin/generators/hobo_rapid/templates
|
81
71
|
- hobo_files/plugin/generators/hobo_rapid/templates/hobo_base.css
|
@@ -85,9 +75,7 @@ files:
|
|
85
75
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes
|
86
76
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default
|
87
77
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public
|
88
|
-
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views
|
89
78
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images
|
90
|
-
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets
|
91
79
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/banner.gif
|
92
80
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_bodytop.gif
|
93
81
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_01.gif
|
@@ -118,55 +106,68 @@ files:
|
|
118
106
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_left.gif
|
119
107
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_right.gif
|
120
108
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_top.gif
|
109
|
+
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets
|
121
110
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css
|
111
|
+
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views
|
122
112
|
- hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml
|
113
|
+
- hobo_files/plugin/generators/hobo_user_controller
|
123
114
|
- hobo_files/plugin/generators/hobo_user_controller/hobo_user_controller_generator.rb
|
124
115
|
- hobo_files/plugin/generators/hobo_user_controller/templates
|
125
|
-
- hobo_files/plugin/generators/hobo_user_controller/USAGE
|
126
116
|
- hobo_files/plugin/generators/hobo_user_controller/templates/controller.rb
|
127
117
|
- hobo_files/plugin/generators/hobo_user_controller/templates/functional_test.rb
|
128
118
|
- hobo_files/plugin/generators/hobo_user_controller/templates/helper.rb
|
129
119
|
- hobo_files/plugin/generators/hobo_user_controller/templates/view.rhtml
|
120
|
+
- hobo_files/plugin/generators/hobo_user_controller/USAGE
|
121
|
+
- hobo_files/plugin/generators/hobo_user_model
|
130
122
|
- hobo_files/plugin/generators/hobo_user_model/hobo_user_model_generator.rb
|
131
123
|
- hobo_files/plugin/generators/hobo_user_model/templates
|
132
|
-
- hobo_files/plugin/generators/hobo_user_model/USAGE
|
133
124
|
- hobo_files/plugin/generators/hobo_user_model/templates/fixtures.yml
|
134
125
|
- hobo_files/plugin/generators/hobo_user_model/templates/model.rb
|
135
126
|
- hobo_files/plugin/generators/hobo_user_model/templates/unit_test.rb
|
127
|
+
- hobo_files/plugin/generators/hobo_user_model/USAGE
|
128
|
+
- hobo_files/plugin/init.rb
|
129
|
+
- hobo_files/plugin/lib
|
136
130
|
- hobo_files/plugin/lib/action_view_extensions
|
137
|
-
- hobo_files/plugin/lib/active_record
|
138
|
-
- hobo_files/plugin/lib/extensions
|
139
|
-
- hobo_files/plugin/lib/extensions.rb
|
140
|
-
- hobo_files/plugin/lib/hobo
|
141
|
-
- hobo_files/plugin/lib/hobo.rb
|
142
|
-
- hobo_files/plugin/lib/rexml.rb
|
143
131
|
- hobo_files/plugin/lib/action_view_extensions/base.rb
|
132
|
+
- hobo_files/plugin/lib/active_record
|
144
133
|
- hobo_files/plugin/lib/active_record/has_many_association.rb
|
145
134
|
- hobo_files/plugin/lib/active_record/has_many_through_association.rb
|
146
135
|
- hobo_files/plugin/lib/active_record/table_definition.rb
|
136
|
+
- hobo_files/plugin/lib/extensions
|
147
137
|
- hobo_files/plugin/lib/extensions/test_case.rb
|
148
|
-
- hobo_files/plugin/lib/
|
138
|
+
- hobo_files/plugin/lib/extensions.rb
|
139
|
+
- hobo_files/plugin/lib/hobo
|
149
140
|
- hobo_files/plugin/lib/hobo/authentication_support.rb
|
150
141
|
- hobo_files/plugin/lib/hobo/composite_model.rb
|
151
142
|
- hobo_files/plugin/lib/hobo/controller.rb
|
152
|
-
- hobo_files/plugin/lib/hobo/define_tags.rb
|
153
143
|
- hobo_files/plugin/lib/hobo/dryml
|
144
|
+
- hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb
|
145
|
+
- hobo_files/plugin/lib/hobo/dryml/part_context.rb
|
146
|
+
- hobo_files/plugin/lib/hobo/dryml/scoped_variables.rb
|
147
|
+
- hobo_files/plugin/lib/hobo/dryml/tag_module.rb
|
148
|
+
- hobo_files/plugin/lib/hobo/dryml/taglib.rb
|
149
|
+
- hobo_files/plugin/lib/hobo/dryml/template.rb
|
150
|
+
- hobo_files/plugin/lib/hobo/dryml/template_environment.rb
|
151
|
+
- hobo_files/plugin/lib/hobo/dryml/template_handler.rb
|
154
152
|
- hobo_files/plugin/lib/hobo/dryml.rb
|
155
153
|
- hobo_files/plugin/lib/hobo/email_address.rb
|
154
|
+
- hobo_files/plugin/lib/hobo/enum_string.rb
|
155
|
+
- hobo_files/plugin/lib/hobo/field_declaration_dsl.rb
|
156
156
|
- hobo_files/plugin/lib/hobo/field_spec.rb
|
157
157
|
- hobo_files/plugin/lib/hobo/generator.rb
|
158
158
|
- hobo_files/plugin/lib/hobo/guest.rb
|
159
159
|
- hobo_files/plugin/lib/hobo/hobo_helper.rb
|
160
160
|
- hobo_files/plugin/lib/hobo/html_string.rb
|
161
|
-
- hobo_files/plugin/lib/hobo/http_parameters.rb
|
162
161
|
- hobo_files/plugin/lib/hobo/lazy_hash.rb
|
163
162
|
- hobo_files/plugin/lib/hobo/markdown_string.rb
|
164
163
|
- hobo_files/plugin/lib/hobo/migrations.rb
|
165
164
|
- hobo_files/plugin/lib/hobo/model.rb
|
166
165
|
- hobo_files/plugin/lib/hobo/model_controller.rb
|
167
166
|
- hobo_files/plugin/lib/hobo/model_queries.rb
|
167
|
+
- hobo_files/plugin/lib/hobo/model_router.rb
|
168
168
|
- hobo_files/plugin/lib/hobo/model_support.rb
|
169
169
|
- hobo_files/plugin/lib/hobo/password_string.rb
|
170
|
+
- hobo_files/plugin/lib/hobo/percentage.rb
|
170
171
|
- hobo_files/plugin/lib/hobo/plugins.rb
|
171
172
|
- hobo_files/plugin/lib/hobo/predicate_dispatch.rb
|
172
173
|
- hobo_files/plugin/lib/hobo/proc_binding.rb
|
@@ -176,16 +177,15 @@ files:
|
|
176
177
|
- hobo_files/plugin/lib/hobo/textile_string.rb
|
177
178
|
- hobo_files/plugin/lib/hobo/undefined.rb
|
178
179
|
- hobo_files/plugin/lib/hobo/undefined_access_error.rb
|
180
|
+
- hobo_files/plugin/lib/hobo/user.rb
|
179
181
|
- hobo_files/plugin/lib/hobo/user_controller.rb
|
180
182
|
- hobo_files/plugin/lib/hobo/where_fragment.rb
|
181
|
-
- hobo_files/plugin/lib/hobo
|
182
|
-
- hobo_files/plugin/lib/
|
183
|
-
- hobo_files/plugin/
|
184
|
-
- hobo_files/plugin/
|
185
|
-
- hobo_files/plugin/
|
186
|
-
- hobo_files/plugin/
|
187
|
-
- hobo_files/plugin/lib/hobo/dryml/template_environment.rb
|
188
|
-
- hobo_files/plugin/lib/hobo/dryml/template_handler.rb
|
183
|
+
- hobo_files/plugin/lib/hobo.rb
|
184
|
+
- hobo_files/plugin/lib/rexml.rb
|
185
|
+
- hobo_files/plugin/LICENSE.txt
|
186
|
+
- hobo_files/plugin/Rakefile
|
187
|
+
- hobo_files/plugin/README
|
188
|
+
- hobo_files/plugin/tags
|
189
189
|
- hobo_files/plugin/tags/core.dryml
|
190
190
|
- hobo_files/plugin/tags/rapid.dryml
|
191
191
|
- hobo_files/plugin/tags/rapid_document_tags.dryml
|
@@ -195,9 +195,11 @@ files:
|
|
195
195
|
- hobo_files/plugin/tags/rapid_pages.dryml
|
196
196
|
- hobo_files/plugin/tags/rapid_plus.dryml
|
197
197
|
- hobo_files/plugin/tags/rapid_support.dryml
|
198
|
+
- hobo_files/plugin/tasks
|
198
199
|
- hobo_files/plugin/tasks/dump_fixtures.rake
|
199
200
|
- hobo_files/plugin/tasks/environments.rake
|
200
201
|
- hobo_files/plugin/tasks/hobo_tasks.rake
|
202
|
+
- hobo_files/plugin/uninstall.rb
|
201
203
|
- bin/hobo
|
202
204
|
- LICENSE.txt
|
203
205
|
- README.txt
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module Hobo
|
2
|
-
|
3
|
-
module DefineTags
|
4
|
-
|
5
|
-
def self.included(base)
|
6
|
-
base.extend(ClassMethods)
|
7
|
-
base.extend(PredicateDispatch::ClassMethods)
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
|
12
|
-
attr_reader :hobo_tag_blocks
|
13
|
-
|
14
|
-
|
15
|
-
def def_tag(name, *attrs_and_pred, &tagdef_block)
|
16
|
-
pred, attrs = if attrs_and_pred.first.is_a? Proc
|
17
|
-
[attrs_and_pred.first, attrs_and_pred[1..-1]]
|
18
|
-
else
|
19
|
-
[nil, attrs_and_pred]
|
20
|
-
end
|
21
|
-
|
22
|
-
name = name.to_s
|
23
|
-
@hobo_tag_blocks ||= HashWithIndifferentAccess.new
|
24
|
-
@hobo_tag_blocks[name] = tagdef_block
|
25
|
-
@hobo_tag_blocks["#{name}_predicate"] = pred if pred
|
26
|
-
|
27
|
-
safe_name = Dryml.unreserve(name)
|
28
|
-
locals = attrs.map{|a| Hobo::Dryml.unreserve(a)} + %w{options inner_tag_options}
|
29
|
-
|
30
|
-
def_line = if pred
|
31
|
-
"defp :#{safe_name}, @hobo_tag_blocks['#{name}_predicate'] do |options, block|"
|
32
|
-
elsif predicate_method?(safe_name)
|
33
|
-
# be sure not to overwrite the predicate dispatch method
|
34
|
-
"defp :#{safe_name} do |options, block|"
|
35
|
-
else
|
36
|
-
"def #{safe_name}(options={}, &block)"
|
37
|
-
end
|
38
|
-
|
39
|
-
class_eval(<<-END, __FILE__, __LINE__+1)
|
40
|
-
#{def_line}
|
41
|
-
_tag_context(options, block) do |tagbody|
|
42
|
-
locals = _tag_locals(options, #{attrs.inspect})
|
43
|
-
locals_hash = { :tagbody => tagbody };
|
44
|
-
#{locals.inspect}.each_with_index{|a, i| locals_hash[a] = locals[i]}
|
45
|
-
Hobo::ProcBinding.new(self, locals_hash).instance_eval(&#{self.name}.hobo_tag_blocks['#{name}'])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
END
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
@@ -1,225 +0,0 @@
|
|
1
|
-
module Hobo
|
2
|
-
|
3
|
-
module HttpParameters
|
4
|
-
|
5
|
-
class PermissionDeniedError < RuntimeError; end
|
6
|
-
class InvalidError < RuntimeError; end
|
7
|
-
|
8
|
-
def initialize_record(record, params)
|
9
|
-
update_without_tracking(record, params)
|
10
|
-
record.set_creator(current_user)
|
11
|
-
(@to_create ||= []) << record
|
12
|
-
record
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
def update_record(record, params)
|
17
|
-
return if params.blank?
|
18
|
-
|
19
|
-
original = record.duplicate
|
20
|
-
# 'duplicate' can set these, but they can
|
21
|
-
# conflict with the changes so we clear them
|
22
|
-
@this.send(:clear_aggregation_cache)
|
23
|
-
@this.send(:clear_association_cache)
|
24
|
-
|
25
|
-
(@to_update ||= []) << [original, record]
|
26
|
-
|
27
|
-
update_without_tracking(record, params)
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
def update_without_tracking(record, params)
|
32
|
-
params && params.each_pair do |field_name, value|
|
33
|
-
field = if (create = field_name =~ /^\+/)
|
34
|
-
field_name[1..-1].to_sym
|
35
|
-
else
|
36
|
-
field_name.to_sym
|
37
|
-
end
|
38
|
-
refl = record.class.reflections[field]
|
39
|
-
|
40
|
-
if refl._?.macro == :belongs_to
|
41
|
-
if create
|
42
|
-
new_for_belongs_to(record, refl, value)
|
43
|
-
else
|
44
|
-
update_belongs_to(record, refl, value)
|
45
|
-
end
|
46
|
-
|
47
|
-
elsif Hobo.simple_has_many_association?(refl)
|
48
|
-
raise HoboError, "invalid HTTP parameter #{field_name}" if create
|
49
|
-
update_has_many(record, refl, value)
|
50
|
-
|
51
|
-
else
|
52
|
-
raise HoboError, "invalid HTTP parameter #{field_name}" if create
|
53
|
-
update_primitive(record, field, value)
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
def new_for_belongs_to(record, refl, fields)
|
61
|
-
# person[+home][address]=blah Create new home and set address (PUT POST)
|
62
|
-
|
63
|
-
target = refl.klass.new
|
64
|
-
initialize_record(target, fields)
|
65
|
-
record.send("#{refl.name}=", target)
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
def update_belongs_to(record, refl, value)
|
70
|
-
if value.is_a? String
|
71
|
-
# Update belongs_to to reference some existing record
|
72
|
-
|
73
|
-
target = if value.starts_with?('@')
|
74
|
-
# person[home]=@home_12 Reference different existing home (PUT POST)
|
75
|
-
|
76
|
-
Hobo.object_from_dom_id(value[1..-1])
|
77
|
-
elsif refl.klass.id_name?
|
78
|
-
# product[category]=garden Reference existing category with id or name (PUT POST)
|
79
|
-
|
80
|
-
refl.klass.find_by_id_name(value)
|
81
|
-
else
|
82
|
-
raise HoboError, "invalid HTTP parameter" if create
|
83
|
-
end
|
84
|
-
record.send("#{refl.name}=", target)
|
85
|
-
|
86
|
-
else
|
87
|
-
# Update state of current belongs_to target
|
88
|
-
# person[home][address]=blah Update existing home.address (PUT)
|
89
|
-
raise HoboError, "invalid HTTP parameter" unless params[:action] == "update"
|
90
|
-
|
91
|
-
target = record.send(refl.name)
|
92
|
-
raise HoboError, "invalid HTTP parameter" if target.nil?
|
93
|
-
update_record(target, value)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
|
98
|
-
def update_has_many(record, refl, items)
|
99
|
-
new_items, changed_items = items.partition_hash {|k,v| k =~ /^\+/}
|
100
|
-
|
101
|
-
new_items.keys.sort_by{|k|k.to_i}.each do |k|
|
102
|
-
# home[people][+1][name]=blah Create new Person with fkey refing to this home and set name (PUT POST)
|
103
|
-
fields = new_items[k]
|
104
|
-
new_for_has_many(record, refl, fields)
|
105
|
-
end
|
106
|
-
|
107
|
-
changed_items.each_pair do |id, value|
|
108
|
-
# Change to existing record - only valid on PUTs
|
109
|
-
raise HoboError, "invalid HTTP parameter" unless params[:action] == "update"
|
110
|
-
|
111
|
-
target = id =~ /_/ ? Hobo.object_from_dom_id(id) : refl.klass.find(id)
|
112
|
-
# Ensure the target is actually in this has_many
|
113
|
-
raise HoboError, "invalid http parameter" unless target.send(refl.primary_key_name) == record.id
|
114
|
-
|
115
|
-
if value.is_a?(String) && value.downcase == "delete"
|
116
|
-
# home[people][45]=delete Delete Person[45] (PUT)
|
117
|
-
delete_record(target)
|
118
|
-
|
119
|
-
else
|
120
|
-
# home[people][45][name]=blah Update Person[45].name (PUT)
|
121
|
-
raise HoboError, "invalid http parameter" unless value.is_a?(Hash) # field/value pairs
|
122
|
-
update_record(target, value)
|
123
|
-
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
def new_for_has_many(record, refl, value)
|
130
|
-
# home[people][+1][name]=blah Create new Person with fkey refing to this home and set name (PUT POST)
|
131
|
-
|
132
|
-
new_record = record.send(refl.name).new
|
133
|
-
initialize_record(new_record, value)
|
134
|
-
record.send("#{refl.name}").target << new_record
|
135
|
-
end
|
136
|
-
|
137
|
-
|
138
|
-
def delete_record(record)
|
139
|
-
raise HoboError, "invalid HTTP parameter" unless params[:action] == "update"
|
140
|
-
(@to_delete ||= []) << record
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
def update_primitive(record, field, value)
|
145
|
-
# person[name]=fred (POST PUT)
|
146
|
-
field_type = record.class.field_type(field)
|
147
|
-
record.send("#{field}=", param_to_value(field_type, value))
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
def parse_datetime(s)
|
152
|
-
defined?(Chronic) ? Chronic.parse(s) : Time.parse(s)
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
def param_to_value(field_type, value)
|
157
|
-
if field_type.nil?
|
158
|
-
value
|
159
|
-
elsif field_type <= Date
|
160
|
-
if value.is_a? Hash
|
161
|
-
Date.new(*(%w{year month day}.map{|s| value[s].to_i}))
|
162
|
-
elsif value.is_a? String
|
163
|
-
dt = parse_datetime(value)
|
164
|
-
dt && dt.to_date
|
165
|
-
end
|
166
|
-
elsif field_type <= Time
|
167
|
-
if value.is_a? Hash
|
168
|
-
Time.local(*(%w{year month day hour minute}.map{|s| value[s].to_i}))
|
169
|
-
elsif value.is_a? String
|
170
|
-
parse_datetime(value)
|
171
|
-
end
|
172
|
-
elsif field_type <= TrueClass
|
173
|
-
(value.is_a?(String) && value.strip.downcase.in?(['0', 'false']) || value.blank?) ? false : true
|
174
|
-
else
|
175
|
-
# primitive field
|
176
|
-
value
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
|
181
|
-
def check_permissions_and_apply_changes
|
182
|
-
valid = true
|
183
|
-
for old, new in @to_update
|
184
|
-
raise PermissionDeniedError unless Hobo.can_update?(current_user, old, new)
|
185
|
-
new_valid = new.save
|
186
|
-
valid &&= new_valid
|
187
|
-
end if @to_update
|
188
|
-
|
189
|
-
for record in @to_create
|
190
|
-
raise PermissionDeniedError unless Hobo.can_create?(current_user, record)
|
191
|
-
# check if it's new because it might have already been saved as a result of the updates
|
192
|
-
record_valid = record.save if record.new_record?
|
193
|
-
valid &&= record_valid
|
194
|
-
end if @to_create
|
195
|
-
|
196
|
-
for record in @to_delete
|
197
|
-
raise PermissionDeniedError unless Hobo.can_delete?(current_user, record)
|
198
|
-
record.destroy
|
199
|
-
end if @to_delete
|
200
|
-
|
201
|
-
valid
|
202
|
-
ensure
|
203
|
-
@to_update = @to_create = @to_delete = nil
|
204
|
-
end
|
205
|
-
|
206
|
-
|
207
|
-
def secure_change_transaction
|
208
|
-
valid = nil
|
209
|
-
begin
|
210
|
-
ActiveRecord::Base.transaction do
|
211
|
-
yield
|
212
|
-
valid = check_permissions_and_apply_changes
|
213
|
-
raise InvalidError unless valid
|
214
|
-
end
|
215
|
-
rescue PermissionDeniedError
|
216
|
-
return :not_allowed
|
217
|
-
rescue InvalidError
|
218
|
-
return :invalid
|
219
|
-
end
|
220
|
-
:valid
|
221
|
-
end
|
222
|
-
|
223
|
-
end
|
224
|
-
|
225
|
-
end
|