hobo 1.0.3 → 1.1.0.pre0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +0 -66
- data/README +3 -0
- data/Rakefile +7 -7
- data/doctest/model.rdoctest +0 -2
- data/doctest/multi_model_forms.rdoctest +0 -2
- data/doctest/scopes.rdoctest +13 -21
- data/lib/active_record/association_collection.rb +7 -16
- data/lib/hobo.rb +10 -65
- data/lib/hobo/accessible_associations.rb +1 -5
- data/lib/hobo/authentication_support.rb +1 -1
- data/lib/hobo/controller.rb +5 -5
- data/lib/hobo/hobo_helper.rb +0 -84
- data/lib/hobo/lifecycles/lifecycle.rb +37 -31
- data/lib/hobo/lifecycles/transition.rb +1 -2
- data/lib/hobo/model.rb +13 -21
- data/lib/hobo/model_controller.rb +8 -8
- data/lib/hobo/rapid_helper.rb +12 -1
- data/lib/hobo/scopes/automatic_scopes.rb +26 -13
- data/lib/hobo/scopes/named_scope_extensions.rb +16 -28
- data/lib/hobo/user_controller.rb +1 -0
- data/lib/hobo/view_hints.rb +1 -5
- data/rails_generators/hobo/templates/initializer.rb +1 -1
- data/rails_generators/hobo_front_controller/templates/summary.dryml +4 -2
- data/rails_generators/hobo_model/hobo_model_generator.rb +12 -0
- data/rails_generators/hobo_model/templates/model.rb +9 -2
- data/rails_generators/hobo_rapid/templates/hobo-rapid.js +98 -23
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +1 -1
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +3 -1
- data/{dryml_generators → rapid_generators}/rapid/cards.dryml.erb +0 -0
- data/{dryml_generators → rapid_generators}/rapid/forms.dryml.erb +0 -0
- data/{dryml_generators → rapid_generators}/rapid/pages.dryml.erb +1 -1
- data/taglibs/rapid.dryml +2 -0
- data/taglibs/rapid_core.dryml +10 -9
- data/taglibs/rapid_forms.dryml +70 -35
- data/taglibs/rapid_lifecycles.dryml +17 -4
- data/taglibs/rapid_plus.dryml +3 -3
- data/taglibs/rapid_summary.dryml +11 -0
- data/taglibs/rapid_user_pages.dryml +39 -28
- data/tasks/hobo_tasks.rake +1 -1
- metadata +45 -61
- data/hobo.gemspec +0 -226
- data/lib/hobo/dryml.rb +0 -188
- data/lib/hobo/dryml/dryml_builder.rb +0 -140
- data/lib/hobo/dryml/dryml_doc.rb +0 -159
- data/lib/hobo/dryml/dryml_generator.rb +0 -263
- data/lib/hobo/dryml/dryml_support_controller.rb +0 -13
- data/lib/hobo/dryml/parser.rb +0 -3
- data/lib/hobo/dryml/parser/attribute.rb +0 -41
- data/lib/hobo/dryml/parser/base_parser.rb +0 -254
- data/lib/hobo/dryml/parser/document.rb +0 -57
- data/lib/hobo/dryml/parser/element.rb +0 -27
- data/lib/hobo/dryml/parser/elements.rb +0 -45
- data/lib/hobo/dryml/parser/source.rb +0 -58
- data/lib/hobo/dryml/parser/text.rb +0 -13
- data/lib/hobo/dryml/parser/tree_parser.rb +0 -67
- data/lib/hobo/dryml/part_context.rb +0 -137
- data/lib/hobo/dryml/scoped_variables.rb +0 -42
- data/lib/hobo/dryml/tag_parameters.rb +0 -36
- data/lib/hobo/dryml/taglib.rb +0 -123
- data/lib/hobo/dryml/template.rb +0 -1019
- data/lib/hobo/dryml/template_environment.rb +0 -613
- data/lib/hobo/dryml/template_handler.rb +0 -187
- data/lib/hobo/static_tags +0 -98
- data/taglibs/core.dryml +0 -104
@@ -1,187 +0,0 @@
|
|
1
|
-
module Hobo::Dryml
|
2
|
-
|
3
|
-
class TemplateHandler < ActionView::TemplateHandler
|
4
|
-
|
5
|
-
def compile(*args)
|
6
|
-
# Ignore - we handle compilation ourselves
|
7
|
-
end
|
8
|
-
|
9
|
-
# Pre Rails 2.2
|
10
|
-
def render(template)
|
11
|
-
renderer = Hobo::Dryml.page_renderer_for_template(@view, template.locals.keys, template)
|
12
|
-
this = @view.instance_variable_set("@this", @view.controller.send(:dryml_context) || template.locals[:this])
|
13
|
-
s = renderer.render_page(this, template.locals)
|
14
|
-
# Important to strip whitespace, or the browser hangs around for ages (FF2)
|
15
|
-
s.strip
|
16
|
-
end
|
17
|
-
|
18
|
-
def render_for_rails22(template, view, local_assigns)
|
19
|
-
renderer = Hobo::Dryml.page_renderer_for_template(view, local_assigns.keys, template)
|
20
|
-
this = view.controller.send(:dryml_context) || local_assigns[:this]
|
21
|
-
@view._?.instance_variable_set("@this", this)
|
22
|
-
s = renderer.render_page(this, local_assigns)
|
23
|
-
|
24
|
-
# Important to strip whitespace, or the browser hangs around for ages (FF2)
|
25
|
-
s.strip
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
module ActionController
|
33
|
-
|
34
|
-
class Base
|
35
|
-
|
36
|
-
def dryml_context
|
37
|
-
@this
|
38
|
-
end
|
39
|
-
|
40
|
-
def dryml_fallback_tag(tag_name)
|
41
|
-
@dryml_fallback_tag = tag_name
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def call_dryml_tag(tag, options={})
|
46
|
-
@template.send(:_evaluate_assigns_and_ivars)
|
47
|
-
|
48
|
-
# TODO: Figure out what this bit is all about :-)
|
49
|
-
if options[:with]
|
50
|
-
@this = options[:with] unless options[:field]
|
51
|
-
else
|
52
|
-
options[:with] = dryml_context
|
53
|
-
end
|
54
|
-
|
55
|
-
Hobo::Dryml.render_tag(@template, tag, options)
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
# TODO: This is namespace polution, should be called render_dryml_tag
|
60
|
-
def render_tag(tag, attributes={}, options={})
|
61
|
-
text = call_dryml_tag(tag, attributes)
|
62
|
-
text && render({:text => text, :layout => false }.merge(options))
|
63
|
-
end
|
64
|
-
|
65
|
-
# DRYML fallback tags -- monkey patch this method to attempt to render a tag if there's no template
|
66
|
-
def render_for_file_with_dryml(template, status = nil, layout = nil, locals = {})
|
67
|
-
# in rails 2.2, "template" is actually "template_path"
|
68
|
-
|
69
|
-
# if we're passed a MissingTemplateWrapper, see if there's a
|
70
|
-
# dryml tag that will render the page
|
71
|
-
if template.respond_to? :original_template_path
|
72
|
-
# this is the Rails 2.3 path
|
73
|
-
tag_name = @dryml_fallback_tag || "#{File.basename(template.original_template_path).dasherize}-page"
|
74
|
-
|
75
|
-
text = call_dryml_tag(tag_name)
|
76
|
-
if text
|
77
|
-
return render_for_text(text, status)
|
78
|
-
else
|
79
|
-
template.raise_wrapped_exception
|
80
|
-
end
|
81
|
-
else
|
82
|
-
begin
|
83
|
-
result = render_for_file_without_dryml(template, status, layout, locals)
|
84
|
-
rescue ActionView::MissingTemplate => ex
|
85
|
-
# this is the Rails 2.2 path
|
86
|
-
tag_name = @dryml_fallback_tag || "#{File.basename(template).dasherize}-page"
|
87
|
-
|
88
|
-
text = call_dryml_tag(tag_name)
|
89
|
-
if text
|
90
|
-
return render_for_text(text, status)
|
91
|
-
else
|
92
|
-
raise ex
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
alias_method_chain :render_for_file, :dryml
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
class ActionView::Template
|
103
|
-
|
104
|
-
def render_with_dryml(view, local_assigns = {})
|
105
|
-
if handler == Hobo::Dryml::TemplateHandler
|
106
|
-
render_dryml(view, local_assigns)
|
107
|
-
else
|
108
|
-
render_without_dryml(view, local_assigns)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
alias_method_chain :render, :dryml
|
112
|
-
|
113
|
-
# We've had to copy a bunch of logic from Renderable#render, because we need to prevent Rails
|
114
|
-
# from trying to compile our template. DRYML templates are each compiled as a class, not just a method,
|
115
|
-
# so the support for compiling templates that Rails provides is innadequate.
|
116
|
-
def render_dryml(view, local_assigns = {})
|
117
|
-
if view.instance_variable_defined?(:@_render_stack)
|
118
|
-
# Rails 2.2
|
119
|
-
stack = view.instance_variable_get(:@_render_stack)
|
120
|
-
stack.push(self)
|
121
|
-
|
122
|
-
# This is only used for TestResponse to set rendered_template
|
123
|
-
unless is_a?(ActionView::InlineTemplate) || view.instance_variable_get(:@_first_render)
|
124
|
-
view.instance_variable_set(:@_first_render, self)
|
125
|
-
end
|
126
|
-
|
127
|
-
view.send(:_evaluate_assigns_and_ivars)
|
128
|
-
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
129
|
-
|
130
|
-
result = Hobo::Dryml::TemplateHandler.new.render_for_rails22(self, view, local_assigns)
|
131
|
-
|
132
|
-
stack.pop
|
133
|
-
result
|
134
|
-
else
|
135
|
-
# Rails 2.3
|
136
|
-
compile(local_assigns)
|
137
|
-
|
138
|
-
view.with_template self do
|
139
|
-
view.send(:_evaluate_assigns_and_ivars)
|
140
|
-
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
141
|
-
|
142
|
-
Hobo::Dryml::TemplateHandler.new.render_for_rails22(self, view, local_assigns)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
# this is only used in Rails 2.3
|
150
|
-
class MissingTemplateWrapper
|
151
|
-
attr_reader :original_template_path
|
152
|
-
|
153
|
-
def initialize(exception, path)
|
154
|
-
@exception = exception
|
155
|
-
@original_template_path = path
|
156
|
-
end
|
157
|
-
|
158
|
-
def method_missing(*args)
|
159
|
-
raise @exception
|
160
|
-
end
|
161
|
-
|
162
|
-
def render
|
163
|
-
raise @exception
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
|
168
|
-
module ActionView
|
169
|
-
class PathSet < Array
|
170
|
-
# this is only used by Rails 2.3
|
171
|
-
def find_template_with_dryml(original_template_path, format = nil, html_fallback = true)
|
172
|
-
begin
|
173
|
-
find_template_without_dryml(original_template_path, format, html_fallback)
|
174
|
-
rescue ActionView::MissingTemplate => ex
|
175
|
-
# instead of throwing the exception right away, hand back a
|
176
|
-
# time bomb instead. It'll blow if mishandled...
|
177
|
-
return MissingTemplateWrapper.new(ex, original_template_path)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
if method_defined? "find_template"
|
182
|
-
# only rails 2.3 has this function
|
183
|
-
alias_method_chain :find_template, :dryml
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
data/lib/hobo/static_tags
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
abbr
|
2
|
-
acronym
|
3
|
-
address
|
4
|
-
applet
|
5
|
-
article
|
6
|
-
audio
|
7
|
-
b
|
8
|
-
basefont
|
9
|
-
bdo
|
10
|
-
big
|
11
|
-
blockquote
|
12
|
-
body
|
13
|
-
button
|
14
|
-
canvas
|
15
|
-
caption
|
16
|
-
center
|
17
|
-
cite
|
18
|
-
code
|
19
|
-
colgroup
|
20
|
-
command
|
21
|
-
datagrid
|
22
|
-
datalist
|
23
|
-
dd
|
24
|
-
del
|
25
|
-
details
|
26
|
-
dfn
|
27
|
-
dialog
|
28
|
-
dir
|
29
|
-
div
|
30
|
-
dl
|
31
|
-
dt
|
32
|
-
em
|
33
|
-
embed
|
34
|
-
fieldset
|
35
|
-
figure
|
36
|
-
font
|
37
|
-
frameset
|
38
|
-
h1
|
39
|
-
h2
|
40
|
-
h3
|
41
|
-
h4
|
42
|
-
h5
|
43
|
-
h6
|
44
|
-
head
|
45
|
-
hgroup
|
46
|
-
i
|
47
|
-
iframe
|
48
|
-
ins
|
49
|
-
isindex
|
50
|
-
kbd
|
51
|
-
label
|
52
|
-
legend
|
53
|
-
li
|
54
|
-
map
|
55
|
-
mark
|
56
|
-
menu
|
57
|
-
meter
|
58
|
-
nav
|
59
|
-
noframes
|
60
|
-
noscript
|
61
|
-
object
|
62
|
-
ol
|
63
|
-
optgroup
|
64
|
-
option
|
65
|
-
output
|
66
|
-
p
|
67
|
-
pre
|
68
|
-
progress
|
69
|
-
q
|
70
|
-
rp
|
71
|
-
rt
|
72
|
-
ruby
|
73
|
-
s
|
74
|
-
samp
|
75
|
-
script
|
76
|
-
select
|
77
|
-
small
|
78
|
-
source
|
79
|
-
span
|
80
|
-
strike
|
81
|
-
strong
|
82
|
-
style
|
83
|
-
sub
|
84
|
-
sup
|
85
|
-
tbody
|
86
|
-
td
|
87
|
-
textarea
|
88
|
-
tfoot
|
89
|
-
th
|
90
|
-
thead
|
91
|
-
time
|
92
|
-
title
|
93
|
-
tr
|
94
|
-
tt
|
95
|
-
u
|
96
|
-
ul
|
97
|
-
var
|
98
|
-
video
|
data/taglibs/core.dryml
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
<!-- Core DRYML tags. These are included implicitly and are always available. Contains mainly control-flow tags. -->
|
2
|
-
|
3
|
-
<!-- Call the tag given by the `tag` attribute. This lets you call tags dynamically based on some runtime value.
|
4
|
-
It's the DRYML equivalent of Ruby's `send` method.
|
5
|
-
-->
|
6
|
-
<def tag="call-tag" attrs="tag">
|
7
|
-
<%= send(tag.gsub('-', '_'), attributes, parameters) %>
|
8
|
-
</def>
|
9
|
-
|
10
|
-
|
11
|
-
<!-- Wrap the body in the tag specified by the `tag` attribute, iff `when` is true.
|
12
|
-
|
13
|
-
Using regular DRYML conditional logic it is rather akward to conditionally wrap some tag in another tag. This tag makes it easy to do that.
|
14
|
-
|
15
|
-
### Usage
|
16
|
-
|
17
|
-
For example, you might want to wrap an `<img>` tag in an `<a>` tag but only under certain conditions. Say the current context has an `href` attribute that may or may not be nil. We want to wrap the img in `<a>` if `href` is not nil:
|
18
|
-
|
19
|
-
<wrap when="&this.href.present?" tag="a" href="&this.href"><img src="&this.img_filename"/></wrap>
|
20
|
-
{: .dryml}
|
21
|
-
-->
|
22
|
-
<def tag="wrap" attrs="tag, when, parameter">
|
23
|
-
<% parameter ||= :default %>
|
24
|
-
<%= when_ ? send(tag, attributes, { parameter.to_sym => parameters[:default] }) : parameters.default %>
|
25
|
-
</def>
|
26
|
-
|
27
|
-
|
28
|
-
<!-- DRYML version of `render(:partial => 'my_partial')`
|
29
|
-
|
30
|
-
### Usage
|
31
|
-
|
32
|
-
<partial name="my-partial" locals="&{:x => 10, :y => 20}"/>
|
33
|
-
-->
|
34
|
-
<def tag="partial" attrs="name, locals"><%=
|
35
|
-
locals ||= {}
|
36
|
-
render(:partial => name, :locals => locals.merge(:this => this))
|
37
|
-
%></def>
|
38
|
-
|
39
|
-
|
40
|
-
<!-- Repeat a section of mark-up. The context should be a collection (anything that responds to `each`). The content of the call to `<repeat>` will be repeated for each item in the collection, and the context will be set to each item in turn.
|
41
|
-
|
42
|
-
### Attributes
|
43
|
-
|
44
|
-
- join: The value of this attribute, if given, will be inserted between each of the items (e.g. `join=", "` is very common).
|
45
|
-
-->
|
46
|
-
<def tag="repeat" attrs="join"><if><%=
|
47
|
-
raise ArgumentError, "Cannot <repeat> on #{this.inspect}" unless this.respond_to? :each
|
48
|
-
context_map do
|
49
|
-
parameters.default
|
50
|
-
end.join(join)
|
51
|
-
%></if></def>
|
52
|
-
|
53
|
-
|
54
|
-
<!-- The 'do nothing' tag. Used to add parameters or change context without adding any markup -->
|
55
|
-
<def tag="do"><%= parameters.default %></def>
|
56
|
-
|
57
|
-
<!-- Alias of `do` -->
|
58
|
-
<def tag="with" alias-of="do"/>
|
59
|
-
|
60
|
-
<!-- DRYML's 'if' test
|
61
|
-
|
62
|
-
### Usage
|
63
|
-
|
64
|
-
<if test="¤t_user.administrtator?">Logged in as administrator</if>
|
65
|
-
<else>Logged in as normal user</else>
|
66
|
-
|
67
|
-
**IMPORTANT NOTE**: `<if>` tests for non-blank vs. blank (as defined by ActiveSuport), not true vs. false.
|
68
|
-
|
69
|
-
If you do not give the `test` attribute, uses the current context instead. This allows a nice trick like this:
|
70
|
-
|
71
|
-
<if:comments>...</if>
|
72
|
-
|
73
|
-
This has the double effect of changing the context to the `this.comments`, and only evaluating the body if there are comments (because an empty
|
74
|
-
collection is considered blank)
|
75
|
-
-->
|
76
|
-
<def tag="if" attrs="test"><%=
|
77
|
-
test = all_attributes.fetch(:test, this)
|
78
|
-
res = (cond = !test.blank?) ? parameters.default : ""
|
79
|
-
Hobo::Dryml.last_if = cond
|
80
|
-
res
|
81
|
-
%></def>
|
82
|
-
|
83
|
-
<!-- General purpose `else` clause.
|
84
|
-
|
85
|
-
`<else>` works with various tags such as `<if>` and `<repeat>` (the else clause will be output if the collection was empty). It simply outputs its content if `Hobo::Dryml.last_if` is false. This is pretty much a crazy hack which violates many good principles of language design, but it's very useful : )
|
86
|
-
-->
|
87
|
-
<def tag="else"><%= parameters.default unless Hobo::Dryml.last_if %></def>
|
88
|
-
|
89
|
-
|
90
|
-
<!-- Same behaviour as `<if>`, except the test is negated. -->
|
91
|
-
<def tag="unless" attrs="test"><%=
|
92
|
-
test = all_attributes.fetch(:test, this)
|
93
|
-
res = (cond = test.blank?) ? parameters.default : ""
|
94
|
-
Hobo::Dryml.last_if = cond
|
95
|
-
res
|
96
|
-
%></def>
|
97
|
-
|
98
|
-
|
99
|
-
<!-- nodoc. -->
|
100
|
-
<def tag="fake-field-context" attrs="fake-field, context"><%=
|
101
|
-
res = ""
|
102
|
-
new_field_context(fake_field, context) { res << parameters.default }
|
103
|
-
res
|
104
|
-
%></def>
|