erector 0.9.0 → 0.10.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b29fc352efeac52d0d2dfbf8b1be475a80b1e62b
4
+ data.tar.gz: 16d464024312c7186a63ae9d965891f3493e89bb
5
+ SHA512:
6
+ metadata.gz: c1981c778c0f399282a0cab3ad6fdd3d5dd1de0aeb4f9890db0125049d4ffebaba1dd5608b4e4c334d73dbdde382c7651a2eae41bec730444fb1798cf2a6dc64
7
+ data.tar.gz: 5919bae5734c2284d59e96eb194ac10115cc86323fd8249fd4e64ba4d5809ec01db83635d4c890b83b8775d76200fce8262136aeef721681e46672a6b05f9e65
data/Gemfile CHANGED
@@ -3,6 +3,7 @@ source "http://rubygems.org"
3
3
  gem "treetop", ">= 1.2.3"
4
4
 
5
5
  group :development do
6
+ gem "rake", "~>10.0.1"
6
7
  gem "activesupport", "~>3"
7
8
  gem "rspec", "~>2"
8
9
  gem "rubyforge"
@@ -13,7 +14,7 @@ group :development do
13
14
  gem "sass"
14
15
  gem "erubis"
15
16
  gem "rdoc", "~> 3.4"
16
- gem "wrong", ">=0.5.4"
17
+ gem "wrong", ">=0.6.3"
17
18
  end
18
19
 
19
20
  group :rails do
data/README.txt CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  * http://erector.rubyforge.org
4
4
  * mailto:erector@googlegroups.com
5
- * http://github.com/pivotal/erector
5
+ * http://github.com/erector/erector
6
6
  * http://www.pivotaltracker.com/projects/482
7
7
 
8
8
  == DESCRIPTION
data/Rakefile CHANGED
@@ -102,11 +102,13 @@ task :publish => [:web, :docs] do
102
102
  rdoc_dir = "rdoc"
103
103
  rsync_args = '--archive --verbose --delete'
104
104
 
105
- puts "== Publishing web site to RubyForge"
106
- sh %{rsync #{rsync_args} --exclude=#{rdoc_dir} #{local_dir}/ #{host}:#{remote_dir}}
107
-
108
- puts "== Publishing rdoc to RubyForge"
109
- sh %{rsync #{rsync_args} #{rdoc_dir}/ #{host}:#{remote_dir}/rdoc}
105
+ # TODO: publish site to gh-pages
106
+ # puts "== Publishing web site to RubyForge"
107
+ # sh %{rsync #{rsync_args} --exclude=#{rdoc_dir} #{local_dir}/ #{host}:#{remote_dir}}
108
+ #
109
+ # TODO: publish docs to gh-pages
110
+ # puts "== Publishing rdoc to RubyForge"
111
+ # sh %{rsync #{rsync_args} #{rdoc_dir}/ #{host}:#{remote_dir}/rdoc}
110
112
  end
111
113
 
112
114
 
@@ -158,27 +160,37 @@ namespace :spec do
158
160
  spec.pattern = 'spec/erect/*_spec.rb'
159
161
  end
160
162
 
161
-
162
- desc "Run specs for erector's Rails integration."
163
- RSpec::Core::RakeTask.new(:rails) do |spec|
163
+ desc "Run specs for erector's Rails 3 integration."
164
+ RSpec::Core::RakeTask.new(:integration_rails3) do |spec|
164
165
  spec.pattern = 'spec/rails_root/spec/*_spec.rb'
165
166
  end
166
167
 
167
- desc "Run specs for erector's Rails integration under Rails 2."
168
+ desc "Run specs for erector's Rails 2 integration."
169
+ RSpec::Core::RakeTask.new(:integration_rails2) do |spec|
170
+ spec.pattern = 'spec/rails2/rails_app/spec/*_spec.rb'
171
+ end
172
+
173
+ def prepare_gemfile gemfile
174
+ Bundler.with_clean_env { sh "bundle check --gemfile #{gemfile} || bundle install --gemfile #{gemfile}" }
175
+ end
176
+
177
+ desc "Run specs for erector's Rails integration under Rails 2. - prepare with 'bundle install --gemfile Gemfile-rails2"
168
178
  task :rails2 do
169
- rails_app = "#{here}/spec/rails2/rails_app"
170
- gemfile = "#{rails_app}/Gemfile"
171
- Dir.chdir(rails_app) do
172
- # Bundler.with_clean_env do
173
- sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake rails2"
174
- # end
175
- end
179
+ gemfile = "#{here}/Gemfile-rails2"
180
+ sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake spec:core spec:integration_rails2"
176
181
  end
177
182
 
178
183
  desc "Run all specs under Rails 3.1 - prepare with 'bundle install --gemfile Gemfile-rails31'"
179
184
  task :rails31 do
180
185
  gemfile = "#{here}/Gemfile-rails31"
181
- sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake spec:core spec:erect spec:rails"
186
+ sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake spec:core spec:erect spec:integration_rails3"
187
+ end
188
+
189
+ desc "Run all specs under latest Rails - prepare with 'bundle install --gemfile Gemfile-rails'"
190
+ task :rails do
191
+ gemfile = "#{here}/Gemfile-rails"
192
+ prepare_gemfile gemfile
193
+ sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake spec:core spec:erect spec:integration_rails3"
182
194
  end
183
195
 
184
196
  desc "Run specs for the Erector web site."
@@ -189,4 +201,4 @@ namespace :spec do
189
201
  end
190
202
 
191
203
  desc "Run most specs"
192
- task :spec => ['spec:core', 'spec:erect', 'spec:rails', 'spec:rails2', 'spec:web']
204
+ task :spec => ['spec:rails', 'spec:rails2', 'spec:web']
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 9
3
+ :minor: 10
4
4
  :patch: 0
@@ -33,6 +33,16 @@ module Erector
33
33
  @@prettyprint_default = enabled
34
34
  end
35
35
 
36
+ @@hyphenize_underscores = false
37
+
38
+ def self.hyphenize_underscores
39
+ @@hyphenize_underscores
40
+ end
41
+
42
+ def self.hyphenize_underscores=(enabled)
43
+ @@hyphenize_underscores = enabled
44
+ end
45
+
36
46
  def self.inline(*args, &block)
37
47
  Class.new(self) do
38
48
  include Erector::Inline
@@ -77,25 +77,25 @@ module Erector
77
77
  tag 'param', :self_closing
78
78
 
79
79
  tag 'a', :inline
80
- tag 'abbr'
81
- tag 'acronym'
80
+ tag 'abbr', :inline
81
+ tag 'acronym', :inline
82
82
  tag 'address'
83
83
  tag 'article'
84
84
  tag 'aside'
85
85
  tag 'audio'
86
86
 
87
87
  tag 'b', :inline
88
- tag 'bdo'
89
- tag 'big'
88
+ tag 'bdo', :inline
89
+ tag 'big', :inline
90
90
  tag 'blockquote'
91
91
  tag 'body'
92
92
  tag 'button', :inline
93
93
 
94
94
  tag 'canvas'
95
- tag 'caption'
95
+ tag 'caption', :inline
96
96
  tag 'center'
97
- tag 'cite'
98
- tag 'code'
97
+ tag 'cite', :inline
98
+ tag 'code', :inline
99
99
  tag 'colgroup'
100
100
  tag 'command'
101
101
 
@@ -103,13 +103,13 @@ module Erector
103
103
  tag 'dd'
104
104
  tag 'del'
105
105
  tag 'details'
106
- tag 'dfn'
106
+ tag 'dfn', :inline
107
107
  tag 'dialog'
108
108
  tag 'div'
109
109
  tag 'dl'
110
- tag 'dt'
110
+ tag 'dt', :inline
111
111
 
112
- tag 'em'
112
+ tag 'em', :inline
113
113
 
114
114
  tag 'fieldset'
115
115
  tag 'figure'
@@ -132,9 +132,9 @@ module Erector
132
132
  tag 'iframe'
133
133
  tag 'ins'
134
134
  tag 'keygen'
135
- tag 'kbd'
136
- tag 'label'
137
- tag 'legend'
135
+ tag 'kbd', :inline
136
+ tag 'label', :inline
137
+ tag 'legend', :inline
138
138
  tag 'li'
139
139
 
140
140
  tag 'map'
@@ -154,13 +154,13 @@ module Erector
154
154
  tag 'pre'
155
155
  tag 'progress'
156
156
 
157
- tag 'q'
157
+ tag 'q', :inline
158
158
  tag 'ruby'
159
159
  tag 'rt'
160
160
  tag 'rp'
161
161
  tag 's'
162
162
 
163
- tag 'samp'
163
+ tag 'samp', :inline
164
164
  tag 'script'
165
165
  tag 'section'
166
166
  tag 'select', :inline
@@ -169,10 +169,10 @@ module Erector
169
169
  tag 'span', :inline
170
170
  tag 'strike'
171
171
 
172
- tag 'strong'
172
+ tag 'strong', :inline
173
173
  tag 'style'
174
- tag 'sub'
175
- tag 'sup'
174
+ tag 'sub', :inline
175
+ tag 'sup', :inline
176
176
 
177
177
  tag 'table'
178
178
  tag 'tbody'
@@ -185,12 +185,12 @@ module Erector
185
185
  tag 'time'
186
186
  tag 'title'
187
187
  tag 'tr'
188
- tag 'tt'
188
+ tag 'tt', :inline
189
189
 
190
190
  tag 'u'
191
191
  tag 'ul'
192
192
 
193
- tag 'var'
193
+ tag 'var', :inline
194
194
  tag 'video'
195
195
 
196
196
 
@@ -65,6 +65,14 @@ module Erector
65
65
  def needs?(name)
66
66
  needed_variables.empty? || needed_variables.include?(name)
67
67
  end
68
+
69
+ def ignore_extra_assigns
70
+ @ignore_extra_assigns ||= false
71
+ end
72
+
73
+ def ignore_extra_assigns=(new_value)
74
+ @ignore_extra_assigns = (new_value ? :true : :false)
75
+ end
68
76
  end
69
77
 
70
78
  def initialize(assigns = {})
@@ -75,7 +83,7 @@ module Erector
75
83
  # set variables with default values
76
84
  self.class.needed_defaults.each do |name, value|
77
85
  unless assigned.include?(name)
78
- value = [NilClass, FalseClass, TrueClass, Fixnum, Float].include?(value.class) ? value : value.dup
86
+ value = [NilClass, FalseClass, TrueClass, Fixnum, Float, Symbol].include?(value.class) ? value : value.dup
79
87
  instance_variable_set("@#{name}", value)
80
88
  assigned << name
81
89
  end
@@ -87,7 +95,7 @@ module Erector
87
95
  end
88
96
 
89
97
  excess = assigned - self.class.needed_variables
90
- unless self.class.needed_variables.empty? || excess.empty?
98
+ unless self.class.needed_variables.empty? || excess.empty? || self.class.ignore_extra_assigns
91
99
  raise ArgumentError, "Excess parameter#{excess.size == 1 ? '' : 's'} for #{self.class.name}: #{excess.join(', ')}"
92
100
  end
93
101
  end
@@ -84,6 +84,10 @@ module Erector
84
84
 
85
85
  def method_missing(method_name, *args, &block)
86
86
  method_name = method_name.to_s
87
+ if Erector::Widget.hyphenize_underscores
88
+ method_name = method_name.gsub(/_/, "-")
89
+ end
90
+
87
91
  if method_name =~ /\!$/
88
92
  id_str = method_name[0...-1]
89
93
  raise ArgumentError, "setting id #{id_str} but id #{@attributes["id"]} already present" if @attributes["id"]
@@ -120,6 +120,16 @@ module Erector
120
120
  rawtext(captured)
121
121
  end
122
122
 
123
+ # Rails content_for is output if and only if no block given
124
+ def content_for(*args,&block)
125
+ if block
126
+ helpers.content_for(*args,&block)
127
+ else
128
+ rawtext(helpers.content_for(*args))
129
+ ''
130
+ end
131
+ end
132
+
123
133
  # Delegate to non-markup producing helpers via method_missing,
124
134
  # returning their result directly.
125
135
  def method_missing(name, *args, &block)
@@ -8,6 +8,10 @@ module Erector
8
8
  # Current support is barebones. Please offer suggestions (or better
9
9
  # yet, patches) for whether and how to support, e.g., caching,
10
10
  # loading from files, precompilation, etc.
11
+ #
12
+ # It seems to me that SASS/SCSS should be part of the Page widget, which
13
+ # would allow all the little style snippets to be compiled together
14
+ # and appear in the document HEAD.
11
15
  module Sass
12
16
  def sass(arg, options = {})
13
17
  require "sass"
@@ -20,7 +24,7 @@ module Erector
20
24
  end
21
25
  style raw(::Sass.compile(sass_text, options))
22
26
  end
23
-
27
+
24
28
  def scss(arg, options = {})
25
29
  sass arg, {:syntax => :scss}.merge(options)
26
30
  end
@@ -1,15 +1,11 @@
1
- begin
2
- require "active_support/inflector"
3
-
4
- module Erector
1
+ module Erector
5
2
  module Widgets #:nodoc:
6
-
7
-
8
- # The Table widget provides the ability to render a table from a
3
+ # The Table widget provides the ability to render a table from a
9
4
  # list of objects (one for each row).
10
5
  #
11
6
  # Because the default for the column titles utilizes the ActiveSupport
12
- # Inflector#titleize method, this widget requires active_support to be loaded.
7
+ # Inflector#titleize method, this widget requires active_support to be loaded
8
+ # (or some other gem that adds `titleize` to String).
13
9
  #
14
10
  # class UsersTable < Erector::Widgets::Table
15
11
  # column :first_name
@@ -26,7 +22,7 @@ begin
26
22
  # that the user sees) and a block which renders the cell given
27
23
  # a row object. If the block is not specified, the cell contains
28
24
  # the result of calling a method whose name is id.
29
- #
25
+ #
30
26
  # The name can be a string or a proc.
31
27
  def column(id, name=id.to_s.titleize, &cell_proc)
32
28
  cell_proc ||= proc {|object| text object.__send__(id)}
@@ -98,7 +94,4 @@ begin
98
94
  end
99
95
  end
100
96
  end
101
- end
102
- rescue LoadError => e
103
- $stderr.puts "Erector::Widgets::Table requires active_support"
104
97
  end
@@ -42,9 +42,9 @@ unless Dir.respond_to?(:mktmpdir)
42
42
  end
43
43
  end
44
44
 
45
- # Note: this is *not* inside the rails_root since we're not testing
45
+ # Note: this is *not* inside the rails_root since we're not testing
46
46
  # Erector inside a rails app. We're testing that we can use the command-line
47
- # converter tool on a newly generated scaffold app (like we brag about in the
47
+ # converter tool on a newly generated scaffold app (like we brag about in the
48
48
  # user guide).
49
49
  #
50
50
  describe "the 'erector' command" do
@@ -87,7 +87,7 @@ describe "the 'erector' command" do
87
87
  run "BUNDLE_GEMFILE=./Gemfile bundle exec #{erector_dir}/bin/erector ./app/views/posts"
88
88
 
89
89
  FileUtils.rm_f("app/views/posts/*.erb")
90
- run "BUNDLE_GEMFILE=./Gemfile bundle exec rake --trace db:migrate"
90
+ run "BUNDLE_GEMFILE=./Gemfile bundle exec rake db:migrate"
91
91
 
92
92
  # run "script/server" # todo: launch in background; use mechanize or something to crawl it; then kill it
93
93
  # perhaps use open4?
@@ -212,7 +212,7 @@ describe Erector::Convenience do
212
212
  it "accepts extra attributes" do
213
213
  erector do
214
214
  url "http://example.com", :onclick=>"alert('foo')"
215
- end.should == "<a href=\"http://example.com\" onclick=\"alert('foo')\">http://example.com</a>"
215
+ end.should == "<a href=\"http://example.com\" onclick=\"alert(&#39;foo&#39;)\">http://example.com</a>"
216
216
  end
217
217
 
218
218
  end
@@ -3,9 +3,9 @@ require File.expand_path("#{here}/../spec_helper")
3
3
 
4
4
  describe "Hello World example from README" do
5
5
  it "works" do
6
- Dir.chdir(here) do
6
+ Dir.chdir('/tmp') do
7
7
  clear_bundler_env
8
- html = sys "ruby hello_from_readme.rb"
8
+ html = `ruby #{File.join(here,'hello_from_readme.rb')} 2>&1`
9
9
  html.should == "<html><head><title>Welcome page</title></head><body><p>Hello, world</p></body></html>\n"
10
10
  end
11
11
  end
@@ -77,6 +77,40 @@ describe Erector::HTML do
77
77
  end
78
78
  end
79
79
 
80
+ context "with underscored attributes" do
81
+ context "without hyphenize_underscores" do
82
+ it "keeps class names as underscored" do
83
+ erector do
84
+ empty_element('foo').max_thingie
85
+ end.should == '<foo class="max_thingie" />'
86
+ end
87
+
88
+ it "also keeps classes specified as attributes as underscored" do
89
+ erector do
90
+ empty_element('foo', :class => "max_thingie")
91
+ end.should == '<foo class="max_thingie" />'
92
+ end
93
+ end
94
+
95
+ context "with hyphenize_underscores" do
96
+ before do
97
+ Erector::Widget.hyphenize_underscores = true
98
+ end
99
+
100
+ it "turns underscores in class names into hyphens" do
101
+ erector do
102
+ empty_element('foo').max_thingie
103
+ end.should == '<foo class="max-thingie" />'
104
+ end
105
+
106
+ it "lets you pick underscores or hyphens when specifying a class as an attribute" do
107
+ erector do
108
+ empty_element('foo', :class => "max_thingie")
109
+ end.should == '<foo class="max_thingie" />'
110
+ end
111
+ end
112
+ end
113
+
80
114
  context "with inner tags" do
81
115
  it "returns nested tags" do
82
116
  erector do
@@ -394,7 +428,7 @@ describe Erector::HTML do
394
428
 
395
429
  describe 'escaping' do
396
430
  plain = 'if (x < y && x > z) alert("don\'t stop");'
397
- escaped = "if (x &lt; y &amp;&amp; x &gt; z) alert(&quot;don't stop&quot;);"
431
+ escaped = "if (x &lt; y &amp;&amp; x &gt; z) alert(&quot;don&#39;t stop&quot;);"
398
432
 
399
433
  describe "#text" do
400
434
  it "does HTML escape its param" do