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
|
@@ -1,39 +1,67 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
1
|
+
# Extensions to XML Parsing
|
|
2
|
+
#
|
|
3
|
+
# 1. Hobo needs to process XML as transparently as possibe. In the
|
|
4
|
+
# case of tags that are not defined (i.e. html tags), they should pass
|
|
5
|
+
# through just as they were in the dryml source. Recontructing the
|
|
6
|
+
# tags from the DOM is not good enough. The extensions to REXML in
|
|
7
|
+
# here allow Hobo to use the original start tag source in the output.
|
|
8
|
+
#
|
|
9
|
+
# 2. some fixes/extras to allow error messages with line numbers.
|
|
10
|
+
#
|
|
11
|
+
# 3. Attributes without a RHS are allowed. They are returned as having
|
|
12
|
+
# a value of +true+ (the Ruby value, not the string 'true')
|
|
13
|
+
#
|
|
14
|
+
# 1 and 2 are achieved by adding two instance variables to Element
|
|
15
|
+
# nodes : @start_tag_source and @source_offset
|
|
16
|
+
#
|
|
17
|
+
# So cool that Ruby allows us to redefine a method. Such a shame the method
|
|
18
|
+
# we needed to change happened to be 200 lines long :-(
|
|
7
19
|
|
|
8
|
-
|
|
9
|
-
# @start_tag_source and @source_offset
|
|
20
|
+
require 'rexml/document'
|
|
10
21
|
|
|
11
|
-
# So cool that Ruby allows us to redfine a method. Such a shame the method
|
|
12
|
-
# happened to be 200 lines long :-(
|
|
13
22
|
|
|
14
|
-
require 'rexml/document'
|
|
15
23
|
|
|
16
24
|
module REXML
|
|
17
25
|
module Parsers
|
|
26
|
+
|
|
27
|
+
class TreeParser
|
|
28
|
+
def initialize( source, build_context = Document.new )
|
|
29
|
+
@build_context = build_context
|
|
30
|
+
@parser = Parsers::BaseParser.new(source)
|
|
31
|
+
@parser.dryml_mode = build_context.context[:dryml_mode]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
18
35
|
class BaseParser
|
|
36
|
+
|
|
37
|
+
DRYML_ATTRIBUTE_PATTERN = /\s*(#{NAME_STR})(?:\s*=\s*(["'])(.*?)\2)?/um
|
|
38
|
+
|
|
39
|
+
DRYML_TAG_MATCH = /^<((?>#{NAME_STR}))\s*((?>\s+#{NAME_STR}(?:\s*=\s*(["']).*?\3)?)*)\s*(\/)?>/um
|
|
40
|
+
|
|
41
|
+
attr_writer :dryml_mode
|
|
42
|
+
def dryml_mode?
|
|
43
|
+
@dryml_mode
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
19
47
|
def pull
|
|
20
48
|
if @closed
|
|
21
49
|
x, @closed = @closed, nil
|
|
22
|
-
return [ :end_element, x ]
|
|
50
|
+
return [ :end_element, x, false ]
|
|
23
51
|
end
|
|
24
52
|
return [ :end_document ] if empty?
|
|
25
53
|
return @stack.shift if @stack.size > 0
|
|
26
54
|
@source.read if @source.buffer.size<2
|
|
27
55
|
if @document_status == nil
|
|
28
|
-
@source.consume(
|
|
29
|
-
word = @source.match(
|
|
56
|
+
@source.consume(/^\s*/um)
|
|
57
|
+
word = @source.match(/(<[^>]*)>/um)
|
|
30
58
|
word = word[1] unless word.nil?
|
|
31
59
|
case word
|
|
32
60
|
when COMMENT_START
|
|
33
|
-
return [ :comment, @source.match(
|
|
61
|
+
return [ :comment, @source.match(COMMENT_PATTERN, true)[1] ]
|
|
34
62
|
when XMLDECL_START
|
|
35
|
-
results = @source.match(
|
|
36
|
-
version = VERSION.match(
|
|
63
|
+
results = @source.match(XMLDECL_PATTERN, true)[1]
|
|
64
|
+
version = VERSION.match(results)
|
|
37
65
|
version = version[1] unless version.nil?
|
|
38
66
|
encoding = ENCODING.match(results)
|
|
39
67
|
encoding = encoding[1] unless encoding.nil?
|
|
@@ -44,7 +72,7 @@ module REXML
|
|
|
44
72
|
when INSTRUCTION_START
|
|
45
73
|
return [ :processing_instruction, *@source.match(INSTRUCTION_PATTERN, true)[1,2] ]
|
|
46
74
|
when DOCTYPE_START
|
|
47
|
-
md = @source.match(
|
|
75
|
+
md = @source.match(DOCTYPE_PATTERN, true)
|
|
48
76
|
identity = md[1]
|
|
49
77
|
close = md[2]
|
|
50
78
|
identity =~ IDENTITY
|
|
@@ -73,14 +101,14 @@ module REXML
|
|
|
73
101
|
md = @source.match(/\s*(.*?>)/um)
|
|
74
102
|
case md[1]
|
|
75
103
|
when SYSTEMENTITY
|
|
76
|
-
match = @source.match(
|
|
104
|
+
match = @source.match(SYSTEMENTITY, true)[1]
|
|
77
105
|
return [ :externalentity, match ]
|
|
78
106
|
|
|
79
107
|
when ELEMENTDECL_START
|
|
80
|
-
return [ :elementdecl, @source.match(
|
|
108
|
+
return [ :elementdecl, @source.match(ELEMENTDECL_PATTERN, true)[1] ]
|
|
81
109
|
|
|
82
110
|
when ENTITY_START
|
|
83
|
-
match = @source.match(
|
|
111
|
+
match = @source.match(ENTITYDECL, true).to_a.compact
|
|
84
112
|
match[0] = :entitydecl
|
|
85
113
|
ref = false
|
|
86
114
|
if match[1] == '%'
|
|
@@ -106,13 +134,13 @@ module REXML
|
|
|
106
134
|
match << '%' if ref
|
|
107
135
|
return match
|
|
108
136
|
when ATTLISTDECL_START
|
|
109
|
-
md = @source.match(
|
|
110
|
-
raise REXML::ParseException.new(
|
|
137
|
+
md = @source.match(ATTLISTDECL_PATTERN, true)
|
|
138
|
+
raise REXML::ParseException.new("Bad ATTLIST declaration!", @source) if md.nil?
|
|
111
139
|
element = md[1]
|
|
112
140
|
contents = md[0]
|
|
113
141
|
|
|
114
142
|
pairs = {}
|
|
115
|
-
values = md[0].scan(
|
|
143
|
+
values = md[0].scan(ATTDEF_RE)
|
|
116
144
|
values.each do |attdef|
|
|
117
145
|
unless attdef[3] == "#IMPLIED"
|
|
118
146
|
attdef.compact!
|
|
@@ -124,17 +152,17 @@ module REXML
|
|
|
124
152
|
return [ :attlistdecl, element, pairs, contents ]
|
|
125
153
|
when NOTATIONDECL_START
|
|
126
154
|
md = nil
|
|
127
|
-
if @source.match(
|
|
128
|
-
md = @source.match(
|
|
129
|
-
elsif @source.match(
|
|
130
|
-
md = @source.match(
|
|
155
|
+
if @source.match(PUBLIC)
|
|
156
|
+
md = @source.match(PUBLIC, true)
|
|
157
|
+
elsif @source.match(SYSTEM)
|
|
158
|
+
md = @source.match(SYSTEM, true)
|
|
131
159
|
else
|
|
132
|
-
raise REXML::ParseException.new(
|
|
160
|
+
raise REXML::ParseException.new("error parsing notation: no matching pattern", @source)
|
|
133
161
|
end
|
|
134
162
|
return [ :notationdecl, md[1], md[2], md[3] ]
|
|
135
163
|
when CDATA_END
|
|
136
164
|
@document_status = :after_doctype
|
|
137
|
-
@source.match(
|
|
165
|
+
@source.match(CDATA_END, true)
|
|
138
166
|
return [ :end_doctype ]
|
|
139
167
|
end
|
|
140
168
|
end
|
|
@@ -142,36 +170,42 @@ module REXML
|
|
|
142
170
|
if @source.buffer[0] == ?<
|
|
143
171
|
if @source.buffer[1] == ?/
|
|
144
172
|
last_tag, line_no = @tags.pop
|
|
145
|
-
#md = @source.match_to_consume(
|
|
146
|
-
md = @source.match(
|
|
173
|
+
#md = @source.match_to_consume('>', CLOSE_MATCH)
|
|
174
|
+
md = @source.match(CLOSE_MATCH, true)
|
|
175
|
+
|
|
176
|
+
valid_end_tag = if dryml_mode?
|
|
177
|
+
last_tag =~ /^#{Regexp.escape(md[1])}(:.*)?/
|
|
178
|
+
else
|
|
179
|
+
last_tag == md[1]
|
|
180
|
+
end
|
|
147
181
|
raise REXML::ParseException.new("Missing end tag for "+
|
|
148
182
|
"'#{last_tag}' (line #{line_no}) (got \"#{md[1]}\")",
|
|
149
|
-
|
|
150
|
-
return [ :end_element, last_tag ]
|
|
183
|
+
@source) unless valid_end_tag
|
|
184
|
+
return [ :end_element, last_tag, true ]
|
|
151
185
|
elsif @source.buffer[1] == ?!
|
|
152
186
|
md = @source.match(/\A(\s*[^>]*>)/um)
|
|
153
187
|
raise REXML::ParseException.new("Malformed node", @source) unless md
|
|
154
188
|
if md[0][2] == ?-
|
|
155
|
-
md = @source.match(
|
|
189
|
+
md = @source.match(COMMENT_PATTERN, true)
|
|
156
190
|
return [ :comment, md[1] ] if md
|
|
157
191
|
else
|
|
158
|
-
md = @source.match(
|
|
192
|
+
md = @source.match(CDATA_PATTERN, true)
|
|
159
193
|
return [ :cdata, md[1] ] if md
|
|
160
194
|
end
|
|
161
|
-
raise REXML::ParseException.new(
|
|
195
|
+
raise REXML::ParseException.new("Declarations can only occur "+
|
|
162
196
|
"in the doctype declaration.", @source)
|
|
163
197
|
elsif @source.buffer[1] == ??
|
|
164
|
-
md = @source.match(
|
|
198
|
+
md = @source.match(INSTRUCTION_PATTERN, true)
|
|
165
199
|
return [ :processing_instruction, md[1], md[2] ] if md
|
|
166
|
-
raise REXML::ParseException.new(
|
|
200
|
+
raise REXML::ParseException.new("Bad instruction declaration",
|
|
167
201
|
@source)
|
|
168
202
|
else
|
|
169
203
|
# Get the next tag
|
|
170
|
-
md = @source.match(TAG_MATCH, true)
|
|
204
|
+
md = @source.match(dryml_mode? ? DRYML_TAG_MATCH : TAG_MATCH, true)
|
|
171
205
|
raise REXML::ParseException.new("malformed XML: missing tag start", @source) unless md
|
|
172
206
|
attrs = []
|
|
173
207
|
if md[2].size > 0
|
|
174
|
-
attrs = md[2].scan( ATTRIBUTE_PATTERN
|
|
208
|
+
attrs = md[2].scan(dryml_mode? ? DRYML_ATTRIBUTE_PATTERN : ATTRIBUTE_PATTERN)
|
|
175
209
|
raise REXML::ParseException.new("error parsing attributes: [#{attrs.join ', '}], excess = \"#$'\"",
|
|
176
210
|
@source) if $' and $'.strip.size > 0
|
|
177
211
|
end
|
|
@@ -183,25 +217,24 @@ module REXML
|
|
|
183
217
|
@tags.push([md[1], cl && cl[2]])
|
|
184
218
|
end
|
|
185
219
|
attributes = {}
|
|
186
|
-
attrs.each { |a,b,c| attributes[a] = c }
|
|
220
|
+
attrs.each { |a,b,c| attributes[a] = (c || true) }
|
|
187
221
|
return [ :start_element, md[1], attributes, md[0],
|
|
188
222
|
@source.respond_to?(:last_match_offset) && @source.last_match_offset ]
|
|
189
223
|
end
|
|
190
224
|
else
|
|
191
|
-
md = @source.match(
|
|
225
|
+
md = @source.match(TEXT_PATTERN, true)
|
|
192
226
|
if md[0].length == 0
|
|
193
|
-
@source.match(
|
|
227
|
+
@source.match(/(\s+)/, true)
|
|
194
228
|
end
|
|
195
229
|
#return [ :text, "" ] if md[0].length == 0
|
|
196
|
-
# unnormalized = Text::unnormalize(
|
|
197
|
-
# return PullEvent.new(
|
|
230
|
+
# unnormalized = Text::unnormalize(md[1], self)
|
|
231
|
+
# return PullEvent.new(:text, md[1], unnormalized)
|
|
198
232
|
return [ :text, md[1] ]
|
|
199
233
|
end
|
|
200
234
|
rescue REXML::ParseException
|
|
201
235
|
raise
|
|
202
236
|
rescue Exception, NameError => error
|
|
203
|
-
raise REXML::ParseException.new(
|
|
204
|
-
@source, self, (error ? error : $!) )
|
|
237
|
+
raise REXML::ParseException.new("Exception parsing", @source, self, (error ? error : $!))
|
|
205
238
|
end
|
|
206
239
|
return [ :dummy ]
|
|
207
240
|
end
|
|
@@ -221,70 +254,127 @@ module REXML
|
|
|
221
254
|
when :start_element
|
|
222
255
|
tag_stack.push(event[1])
|
|
223
256
|
# find the observers for namespaces
|
|
224
|
-
@build_context = @build_context.add_element(
|
|
225
|
-
@build_context.
|
|
226
|
-
@build_context.
|
|
257
|
+
@build_context = @build_context.add_element(event[1], event[2])
|
|
258
|
+
@build_context.start_tag_source = event[3]
|
|
259
|
+
@build_context.source_offset = event[4]
|
|
227
260
|
when :end_element
|
|
228
261
|
tag_stack.pop
|
|
262
|
+
@build_context.has_end_tag = event[2]
|
|
229
263
|
@build_context = @build_context.parent
|
|
230
264
|
when :text
|
|
231
265
|
if not in_doctype
|
|
232
266
|
if @build_context[-1].instance_of? Text
|
|
233
267
|
@build_context[-1] << event[1]
|
|
234
268
|
else
|
|
235
|
-
@build_context.add(
|
|
236
|
-
Text.new(
|
|
237
|
-
|
|
269
|
+
@build_context.add(
|
|
270
|
+
Text.new(event[1], @build_context.whitespace, nil, true)
|
|
271
|
+
) unless (
|
|
238
272
|
event[1].strip.size==0 and
|
|
239
273
|
@build_context.ignore_whitespace_nodes
|
|
240
|
-
|
|
274
|
+
)
|
|
241
275
|
end
|
|
242
276
|
end
|
|
243
277
|
when :comment
|
|
244
|
-
c = Comment.new(
|
|
245
|
-
@build_context.add(
|
|
278
|
+
c = Comment.new(event[1])
|
|
279
|
+
@build_context.add(c)
|
|
246
280
|
when :cdata
|
|
247
|
-
c = CData.new(
|
|
248
|
-
@build_context.add(
|
|
281
|
+
c = CData.new(event[1])
|
|
282
|
+
@build_context.add(c)
|
|
249
283
|
when :processing_instruction
|
|
250
|
-
@build_context.add(
|
|
284
|
+
@build_context.add(Instruction.new(event[1], event[2]))
|
|
251
285
|
when :end_doctype
|
|
252
286
|
in_doctype = false
|
|
253
287
|
entities.each { |k,v| entities[k] = @build_context.entities[k].value }
|
|
254
288
|
@build_context = @build_context.parent
|
|
255
289
|
when :start_doctype
|
|
256
|
-
doctype = DocType.new(
|
|
290
|
+
doctype = DocType.new(event[1..-1], @build_context)
|
|
257
291
|
@build_context = doctype
|
|
258
292
|
entities = {}
|
|
259
293
|
in_doctype = true
|
|
260
294
|
when :attlistdecl
|
|
261
|
-
n = AttlistDecl.new(
|
|
262
|
-
@build_context.add(
|
|
295
|
+
n = AttlistDecl.new(event[1..-1])
|
|
296
|
+
@build_context.add(n)
|
|
263
297
|
when :externalentity
|
|
264
|
-
n = ExternalEntity.new(
|
|
265
|
-
@build_context.add(
|
|
298
|
+
n = ExternalEntity.new(event[1])
|
|
299
|
+
@build_context.add(n)
|
|
266
300
|
when :elementdecl
|
|
267
|
-
n = ElementDecl.new(
|
|
301
|
+
n = ElementDecl.new(event[1])
|
|
268
302
|
@build_context.add(n)
|
|
269
303
|
when :entitydecl
|
|
270
304
|
entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/
|
|
271
305
|
@build_context.add(Entity.new(event))
|
|
272
306
|
when :notationdecl
|
|
273
|
-
n = NotationDecl.new(
|
|
274
|
-
@build_context.add(
|
|
307
|
+
n = NotationDecl.new(*event[1..-1])
|
|
308
|
+
@build_context.add(n)
|
|
275
309
|
when :xmldecl
|
|
276
|
-
x = XMLDecl.new(
|
|
277
|
-
@build_context.add(
|
|
310
|
+
x = XMLDecl.new(event[1], event[2], event[3])
|
|
311
|
+
@build_context.add(x)
|
|
278
312
|
end
|
|
279
313
|
end
|
|
280
314
|
rescue REXML::Validation::ValidationException
|
|
281
315
|
raise
|
|
282
316
|
rescue
|
|
283
|
-
raise ParseException.new(
|
|
317
|
+
raise ParseException.new($!.message, @parser.source, @parser, $!)
|
|
284
318
|
end
|
|
285
319
|
end
|
|
286
320
|
end
|
|
287
321
|
end
|
|
322
|
+
|
|
323
|
+
class Document
|
|
324
|
+
|
|
325
|
+
attr_accessor :default_attribute_value
|
|
326
|
+
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
class Element
|
|
330
|
+
|
|
331
|
+
def dryml_name
|
|
332
|
+
expanded_name.sub(/:.*/, "")
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
attr_accessor :start_tag_source, :source_offset
|
|
336
|
+
|
|
337
|
+
attr_writer :has_end_tag
|
|
338
|
+
def has_end_tag?
|
|
339
|
+
@has_end_tag
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
class Attribute
|
|
345
|
+
|
|
346
|
+
def initialize_with_dryml(first, second=nil, parent=nil)
|
|
347
|
+
initialize_without_dryml(first, second, parent)
|
|
348
|
+
if first.is_a?(String) && second == true
|
|
349
|
+
@value = true
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
alias_method_chain :initialize, :dryml
|
|
353
|
+
|
|
354
|
+
def value_with_dryml
|
|
355
|
+
if has_rhs?
|
|
356
|
+
value_without_dryml
|
|
357
|
+
else
|
|
358
|
+
element.document.default_attribute_value
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
alias_method_chain :value, :dryml
|
|
362
|
+
|
|
363
|
+
def to_string_with_dryml
|
|
364
|
+
if has_rhs?
|
|
365
|
+
to_string_without_dryml
|
|
366
|
+
else
|
|
367
|
+
@expanded_name
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
alias_method_chain :to_string, :dryml
|
|
371
|
+
|
|
372
|
+
def has_rhs?
|
|
373
|
+
@value != true
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
end
|
|
377
|
+
|
|
288
378
|
end
|
|
289
379
|
|
|
290
380
|
module Hobo::Dryml
|
|
@@ -322,8 +412,8 @@ module Hobo::Dryml
|
|
|
322
412
|
rv
|
|
323
413
|
end
|
|
324
414
|
|
|
325
|
-
def consume(
|
|
326
|
-
md = remember_match(pattern.match(
|
|
415
|
+
def consume(pattern)
|
|
416
|
+
md = remember_match(pattern.match(@buffer))
|
|
327
417
|
if md
|
|
328
418
|
advance_buffer(md)
|
|
329
419
|
@buffer
|
|
@@ -337,9 +427,10 @@ module Hobo::Dryml
|
|
|
337
427
|
end
|
|
338
428
|
|
|
339
429
|
def current_line
|
|
340
|
-
pos = last_match_offset
|
|
341
|
-
[0, 0, @orig[0..pos].count("\n") + 1]
|
|
430
|
+
pos = last_match_offset || 0
|
|
431
|
+
[0, 0, @orig[0..pos].count("\n") + 1]
|
|
342
432
|
end
|
|
343
433
|
|
|
344
434
|
end
|
|
435
|
+
|
|
345
436
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'mysql'
|
|
2
|
+
require File.dirname(__FILE__) + '/rails_root/config/environment.rb'
|
|
3
|
+
|
|
4
|
+
# Run the migrations
|
|
5
|
+
ActiveRecord::Migrator.migrate("#{RAILS_ROOT}/db/migrate")
|
|
6
|
+
|
|
7
|
+
require 'spec/rails'
|
|
8
|
+
|
|
9
|
+
Spec::Runner.configure do |config|
|
|
10
|
+
config.use_transactional_fixtures = true
|
|
11
|
+
config.use_instantiated_fixtures = false
|
|
12
|
+
config.fixture_path = File.dirname(__FILE__) + "/fixtures/"
|
|
13
|
+
config.before(:each, :behaviour_type => :controller) do
|
|
14
|
+
raise_controller_errors
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# You can declare fixtures for each behaviour like this:
|
|
18
|
+
# describe "...." do
|
|
19
|
+
# fixtures :table_a, :table_b
|
|
20
|
+
#
|
|
21
|
+
# Alternatively, if you prefer to declare them only once, you can
|
|
22
|
+
# do so here, like so ...
|
|
23
|
+
#
|
|
24
|
+
# config.global_fixtures = :table_a, :table_b
|
|
25
|
+
#
|
|
26
|
+
# If you declare global fixtures, be aware that they will be declared
|
|
27
|
+
# for all of your examples, even those that don't use them.
|
|
28
|
+
end
|