ruhl 0.11.2 → 0.12.0

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/Rakefile CHANGED
@@ -23,7 +23,7 @@ begin
23
23
  gemspec.email = "andy@stonean.com"
24
24
  gemspec.homepage = "http://github.com/stonean/ruhl"
25
25
  gemspec.authors = ["Andrew Stone"]
26
- gemspec.add_dependency('nokogiri','>=1.3.3')
26
+ gemspec.add_dependency('nokogiri','=1.4.0')
27
27
  gemspec.add_development_dependency('rspec')
28
28
  end
29
29
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.11.2
1
+ 0.12.0
@@ -15,6 +15,7 @@ module Ruhl
15
15
  if @layout || @local_object || @block_object
16
16
  @document = Nokogiri::HTML.fragment(html)
17
17
  else
18
+
18
19
  @document = Nokogiri::HTML(html)
19
20
  end
20
21
  end
@@ -60,14 +61,20 @@ module Ruhl
60
61
  html = current_tag.to_html
61
62
 
62
63
  new_content = call_result.collect do |item|
63
- # Call to_s on the item only if there are no other actions
64
- # and there are no other nested data-ruhls
64
+
65
65
  if actions.length == 0 && current_tag.xpath('.//*[@data-ruhl]').length == 0
66
- current_tag.inner_html = item.to_s
67
- current_tag.to_html
66
+ if item.is_a?(Hash)
67
+ t = current_tag.dup
68
+ apply_hash(t, item)
69
+ t.to_html
70
+ else
71
+ current_tag.inner_html = item.to_s
72
+ current_tag.to_html
73
+ end
68
74
  else
69
75
  Ruhl::Engine.new(html, :local_object => item).render(scope)
70
76
  end
77
+
71
78
  end.to_s
72
79
 
73
80
  current_tag.swap(new_content)
@@ -170,18 +177,22 @@ module Ruhl
170
177
 
171
178
  def process_results
172
179
  if call_result.is_a?(Hash)
173
- call_result.each do |key, value|
174
- if key == :inner_html
175
- current_tag.inner_html = value.to_s
176
- else
177
- current_tag[key.to_s] = value.to_s
178
- end
179
- end
180
- else
180
+ apply_hash(current_tag, call_result)
181
+ else
181
182
  current_tag.inner_html = call_result.to_s
182
183
  end
183
184
  end
184
185
 
186
+ def apply_hash(tag, hash)
187
+ hash.each do |key, value|
188
+ if key == :inner_html
189
+ tag.inner_html = value.to_s
190
+ else
191
+ tag[key.to_s] = value.to_s
192
+ end
193
+ end
194
+ end
195
+
185
196
  def execute_ruby(code)
186
197
  if code == '_render_'
187
198
  _render_
@@ -1,4 +1,5 @@
1
1
  require 'ruhl'
2
+ require 'ruhl/rails/ruhl_presenter'
2
3
 
3
4
  module Ruhl
4
5
  class Plugin < ActionView::TemplateHandler
@@ -0,0 +1,57 @@
1
+ module ActiveRecordPresenter
2
+ def error_messages?
3
+ !presentee.errors.empty?
4
+ end
5
+
6
+ def error_messages
7
+ return if presentee.errors.empty?
8
+ presentee.errors.full_messages
9
+ end
10
+
11
+ # Pass presenter method call to model so you don't have to
12
+ # redefine every model method in the presenter class.
13
+ def method_missing(name, *args)
14
+ if presentee.respond_to?(name)
15
+ presentee.send(name, *args)
16
+ end
17
+ end
18
+
19
+ # Extend scope of respond_to? to model.
20
+ def respond_to?(name)
21
+ if super
22
+ true
23
+ else
24
+ presentee.respond_to?(name)
25
+ end
26
+ end
27
+
28
+ def define_paths(model)
29
+ define_action(model, 'show') # show_path(@user)
30
+ define_action(model, 'update') # update_path(@user)
31
+ define_action(model, 'delete') # delete_path(@user)
32
+ define_action("edit_#{model}", 'edit') # edit_path(@user)
33
+ define_action(model.pluralize, 'index', false) # index_path
34
+ define_action(model.pluralize, 'create', false) # create_path
35
+ define_action("new_#{model}", 'new', false) # new_path
36
+ end
37
+
38
+ private
39
+
40
+ def define_action(model, action, use_presentee = true)
41
+ if use_presentee
42
+ self.class.send(:define_method, "#{action}_path") do
43
+ context.send("#{model}_path", presentee)
44
+ end
45
+ self.class.send(:define_method, "#{action}_url") do
46
+ context.send("#{model}_url", presentee)
47
+ end
48
+ else
49
+ self.class.send(:define_method, "#{action}_path") do
50
+ context.send("#{model}_path")
51
+ end
52
+ self.class.send(:define_method, "#{action}_url") do
53
+ context.send("#{model}_url")
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,24 @@
1
+ require 'ruhl/rails/active_record_presenter'
2
+
3
+ class RuhlPresenter
4
+ include ActiveRecordPresenter
5
+
6
+ attr_reader :presentee, :context
7
+
8
+ def initialize(obj, context)
9
+ @presentee = obj
10
+ @context = context
11
+ define_paths(obj.class.name.underscore.downcase)
12
+ end
13
+
14
+ end
15
+
16
+ module ActionController
17
+ class Base
18
+ def presenter_for(obj)
19
+ eval("#{obj.class.name}Presenter").new(obj,self)
20
+ end
21
+
22
+ helper_method :presenter_for
23
+ end
24
+ end
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruhl}
8
- s.version = "0.11.1"
8
+ s.version = "0.12.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andrew Stone"]
12
- s.date = %q{2009-10-27}
12
+ s.date = %q{2009-11-14}
13
13
  s.description = %q{Make your HTML dynamic with the addition of a data-ruhl attribute.}
14
14
  s.email = %q{andy@stonean.com}
15
15
  s.extra_rdoc_files = [
@@ -24,9 +24,12 @@ Gem::Specification.new do |s|
24
24
  "lib/ruhl/engine.rb",
25
25
  "lib/ruhl/errors.rb",
26
26
  "lib/ruhl/rails.rb",
27
+ "lib/ruhl/rails/active_record_presenter.rb",
28
+ "lib/ruhl/rails/ruhl_presenter.rb",
27
29
  "lib/ruhl/sinatra.rb",
28
30
  "ruhl.gemspec",
29
31
  "spec/html/basic.html",
32
+ "spec/html/collection_of_hashes.html",
30
33
  "spec/html/collection_of_strings.html",
31
34
  "spec/html/form.html",
32
35
  "spec/html/fragment.html",
@@ -41,6 +44,7 @@ Gem::Specification.new do |s|
41
44
  "spec/html/parameters.html",
42
45
  "spec/html/seo.html",
43
46
  "spec/html/sidebar.html",
47
+ "spec/html/special.html",
44
48
  "spec/html/use.html",
45
49
  "spec/html/use_if.html",
46
50
  "spec/rcov.opts",
@@ -63,14 +67,15 @@ Gem::Specification.new do |s|
63
67
  s.specification_version = 3
64
68
 
65
69
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
66
- s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
70
+ s.add_runtime_dependency(%q<nokogiri>, ["= 1.4.0"])
67
71
  s.add_development_dependency(%q<rspec>, [">= 0"])
68
72
  else
69
- s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
73
+ s.add_dependency(%q<nokogiri>, ["= 1.4.0"])
70
74
  s.add_dependency(%q<rspec>, [">= 0"])
71
75
  end
72
76
  else
73
- s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
77
+ s.add_dependency(%q<nokogiri>, ["= 1.4.0"])
74
78
  s.add_dependency(%q<rspec>, [">= 0"])
75
79
  end
76
80
  end
81
+
@@ -0,0 +1,11 @@
1
+ <html>
2
+ <head>
3
+ <title>Hello World</title>
4
+ </head>
5
+ <body>
6
+ <h1 data-ruhl="generate_h1">I am a templated headline</h1>
7
+ <select id="states">
8
+ <option data-ruhl="_use: state_options">
9
+ </select>
10
+ </body>
11
+ </html>
@@ -327,6 +327,23 @@ describe Ruhl do
327
327
  end
328
328
  end
329
329
 
330
+
331
+
332
+ describe "collection_of_hashes.html" do
333
+ describe "user_list is not empty" do
334
+ before do
335
+ @html = File.read html(:collection_of_hashes)
336
+ @doc = create_doc
337
+ end
338
+
339
+
340
+ it "should have option for each state" do
341
+ options = @doc.xpath('/html/body/select//option')
342
+ options.children.length.should == @co.state_options.length
343
+ end
344
+ end
345
+ end
346
+
330
347
  describe "special.html" do
331
348
  before do
332
349
  @html = File.read html(:special)
@@ -334,9 +351,14 @@ describe Ruhl do
334
351
  end
335
352
 
336
353
  it "will convert entities" do
337
- ps = @doc.xpath("/html/body//p")
338
- ps[0].inner_html.should == "Here is a space&nbsp;and another&nbsp;one."
354
+ ps = @doc.xpath("/html/body/p")
355
+ ps[0].inner_html.should =~ /^Here is a space&nbsp;and another&nbsp;one.$/
339
356
  ps[1].inner_html.should == "RuHL &copy; 2009"
357
+
358
+ # To verify everything is correct, I did it the old fashioned way
359
+ # File.open('test.html',"w") do |f|
360
+ # f << @doc.to_s
361
+ # end
340
362
  end
341
363
  end
342
364
 
@@ -149,6 +149,60 @@ class ContextObject
149
149
  state.new('WY', 'Wyoming')]
150
150
  end
151
151
 
152
+ def state_options
153
+ [ {:value => 'AL', :inner_html => 'Alabama'},
154
+ {:value => 'AK', :inner_html => 'Alaska'},
155
+ {:value => 'AZ', :inner_html => 'Arizona'},
156
+ {:value => 'AR', :inner_html => 'Arkansas'},
157
+ {:value => 'CA', :inner_html => 'California'},
158
+ {:value => 'CO', :inner_html => 'Colorado'},
159
+ {:value => 'CT', :inner_html => 'Connecticut'},
160
+ {:value => 'DE', :inner_html => 'Delaware'},
161
+ {:value => 'FL', :inner_html => 'Florida'},
162
+ {:value => 'GA', :inner_html => 'Georgia'},
163
+ {:value => 'HI', :inner_html => 'Hawaii'},
164
+ {:value => 'ID', :inner_html => 'Idaho'},
165
+ {:value => 'IL', :inner_html => 'Illinois'},
166
+ {:value => 'IN', :inner_html => 'Indiana'},
167
+ {:value => 'IA', :inner_html => 'Iowa'},
168
+ {:value => 'KS', :inner_html => 'Kansas'},
169
+ {:value => 'KY', :inner_html => 'Kentucky'},
170
+ {:value => 'LA', :inner_html => 'Louisiana'},
171
+ {:value => 'ME', :inner_html => 'Maine'},
172
+ {:value => 'MD', :inner_html => 'Maryland'},
173
+ {:value => 'MA', :inner_html => 'Massachusetts'},
174
+ {:value => 'MI', :inner_html => 'Michigan'},
175
+ {:value => 'MN', :inner_html => 'Minnesota'},
176
+ {:value => 'MS', :inner_html => 'Mississippi'},
177
+ {:value => 'MO', :inner_html => 'Missouri'},
178
+ {:value => 'MT', :inner_html => 'Montana'},
179
+ {:value => 'NE', :inner_html => 'Nebraska'},
180
+ {:value => 'NV', :inner_html => 'Nevada'},
181
+ {:value => 'NH', :inner_html => 'New Hampshire'},
182
+ {:value => 'NJ', :inner_html => 'New Jersey'},
183
+ {:value => 'NM', :inner_html => 'New Mexico'},
184
+ {:value => 'NY', :inner_html => 'New York'},
185
+ {:value => 'NC', :inner_html => 'North Carolina'},
186
+ {:value => 'ND', :inner_html => 'North Dakota'},
187
+ {:value => 'OH', :inner_html => 'Ohio'},
188
+ {:value => 'OK', :inner_html => 'Oklahoma'},
189
+ {:value => 'OR', :inner_html => 'Oregon'},
190
+ {:value => 'PA', :inner_html => 'Pennsylvania'},
191
+ {:value => 'RI', :inner_html => 'Rhode Island'},
192
+ {:value => 'SC', :inner_html => 'South Carolina'},
193
+ {:value => 'SD', :inner_html => 'South Dakota'},
194
+ {:value => 'TN', :inner_html => 'Tennessee'},
195
+ {:value => 'TX', :inner_html => 'Texas'},
196
+ {:value => 'UT', :inner_html => 'Utah'},
197
+ {:value => 'VT', :inner_html => 'Vermont'},
198
+ {:value => 'VA', :inner_html => 'Virginia'},
199
+ {:value => 'WA', :inner_html => 'Washington'},
200
+ {:value => 'WV', :inner_html => 'West Virginia'},
201
+ {:value => 'WI', :inner_html => 'Wisconsin'},
202
+ {:value => 'WY', :inner_html => 'Wyoming'}]
203
+ end
204
+
205
+
152
206
  end
153
207
 
154
208
  def points_of_interest
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruhl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Stone
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-06 00:00:00 -05:00
12
+ date: 2009-11-14 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -18,9 +18,9 @@ dependencies:
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - ">="
21
+ - - "="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.3.3
23
+ version: 1.4.0
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
@@ -49,9 +49,12 @@ files:
49
49
  - lib/ruhl/engine.rb
50
50
  - lib/ruhl/errors.rb
51
51
  - lib/ruhl/rails.rb
52
+ - lib/ruhl/rails/active_record_presenter.rb
53
+ - lib/ruhl/rails/ruhl_presenter.rb
52
54
  - lib/ruhl/sinatra.rb
53
55
  - ruhl.gemspec
54
56
  - spec/html/basic.html
57
+ - spec/html/collection_of_hashes.html
55
58
  - spec/html/collection_of_strings.html
56
59
  - spec/html/form.html
57
60
  - spec/html/fragment.html