install_theme 0.7.2 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/README.rdoc +18 -1
- data/lib/install_theme.rb +61 -29
- data/lib/install_theme/cli.rb +13 -6
- data/spec/expected/rails/bloganje/app/views/layouts/_sidebar.html.erb +4 -2
- data/spec/expected/rails/bloganje/app/views/layouts/_sidebar.html.haml +64 -63
- data/spec/expected/rails/bloganje/app/views/layouts/application.html.erb +1 -1
- data/spec/expected/rails/bloganje/app/views/layouts/application.html.haml +1 -2
- data/spec/expected/rails/the-hobbit-website-template/app/views/layouts/application.html.erb +1 -1
- data/spec/install_theme_cli_spec.rb +2 -0
- data/spec/install_theme_haml_spec.rb +9 -28
- data/spec/install_theme_spec.rb +24 -65
- data/spec/spec_helper.rb +24 -9
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
=== 0.8.0 / 2009-10-12
|
2
|
+
|
3
|
+
Major:
|
4
|
+
* Paths (xpath/css path) can specify to replace the internals of a DOM (as it did before) or the entire DOM node itself. Previously --partial "header:#header h2" would have replace the inner HTML of the DOM, but now it replaces the DOM node itself. To replace the inner HTML, use --partial "header:#header h2:text" (css path) or --partial "header://div[@id='header']/h2/text()"
|
5
|
+
* CLI option --action/-a added - the extracted content_path contents can be stored in a Rails action template file
|
6
|
+
|
7
|
+
Minor:
|
8
|
+
* convert layouts to haml regardless of their name
|
9
|
+
* Updated CLI Usage help
|
10
|
+
|
11
|
+
Internal:
|
12
|
+
* Minimized spec suite by extracting a common file diff test into macro method
|
13
|
+
|
1
14
|
=== 0.7.2 / 2009-10-10
|
2
15
|
|
3
16
|
* CLI shows a useful error message when --partial argument is incorrectly formatted
|
data/README.rdoc
CHANGED
@@ -24,12 +24,29 @@ Simple case:
|
|
24
24
|
Replace some DOM content with <%= yield :some_label %> with --partial:
|
25
25
|
|
26
26
|
install_theme path/to/rails_app path/to/template #content_box \
|
27
|
-
--partial "header:#header h2" \
|
27
|
+
--partial "header:#header h2 text()" \
|
28
28
|
--partial sidebar:#sidebar"
|
29
29
|
|
30
30
|
NOTE: The order of the first two arguments has been reversed since the original
|
31
31
|
public release. This is in preparation for path/to/template to be optional.
|
32
32
|
|
33
|
+
NOTE: The default behaviour of the css/xpath selectors has/is changing. Originally it
|
34
|
+
replaced the internal content of the selected DOM node. Now, the default is to
|
35
|
+
replace the entire DOM node. To replace the internal content of the DOM node use
|
36
|
+
`/text()` (for xpath) or `:text` (for CSS paths) at the end of the selector.
|
37
|
+
|
38
|
+
For example, for CSS paths:
|
39
|
+
|
40
|
+
--partial ".header h2:text" # replaces contents of the h2 element
|
41
|
+
--partial ".header h2" # replaces the h2 element itself
|
42
|
+
|
43
|
+
For Xpaths:
|
44
|
+
|
45
|
+
--partial "//div[@id='header']/h2/text()" # replaces contents of the h2 element
|
46
|
+
--partial "//div[@id='header']/h2" # replaces the h2 element itself
|
47
|
+
|
48
|
+
The same goes for the content_path argument of the executable.
|
49
|
+
|
33
50
|
Similarly, in 0.7.0 the content_path argument is optional after the first time
|
34
51
|
you install a specific theme (see 'Theme Reuse' section).
|
35
52
|
|
data/lib/install_theme.rb
CHANGED
@@ -3,17 +3,13 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
3
3
|
|
4
4
|
require 'rubigen'
|
5
5
|
require 'rubigen/scripts/generate'
|
6
|
-
require '
|
7
|
-
require 'haml/html'
|
8
|
-
require 'sass'
|
9
|
-
require 'sass/css'
|
10
|
-
require 'haml/exec'
|
6
|
+
require 'nokogiri'
|
11
7
|
|
12
8
|
class InstallTheme
|
13
|
-
VERSION = "0.
|
9
|
+
VERSION = "0.8.0"
|
14
10
|
|
15
11
|
attr_reader :template_root, :rails_root, :index_path, :template_type
|
16
|
-
attr_reader :layout_name
|
12
|
+
attr_reader :layout_name, :action
|
17
13
|
attr_reader :stylesheet_dir, :javascript_dir, :image_dir
|
18
14
|
attr_reader :defaults_file
|
19
15
|
attr_reader :content_path, :partials
|
@@ -30,6 +26,7 @@ class InstallTheme
|
|
30
26
|
@image_dir = options[:image_dir] || detect_image_dir
|
31
27
|
@layout_name = options[:layout] || "application"
|
32
28
|
@layout_name.gsub!(/\..*/, '') # allow application.html.erb to be passed in, but clean it up to 'application'
|
29
|
+
@action = options[:action]
|
33
30
|
|
34
31
|
@stdout = options[:stdout] || $stdout
|
35
32
|
|
@@ -44,10 +41,12 @@ class InstallTheme
|
|
44
41
|
end
|
45
42
|
|
46
43
|
def apply_to_target(options = {})
|
44
|
+
require_haml if haml?
|
47
45
|
@stdout = options[:stdout] || @stdout || $stdout
|
48
46
|
@original_named_yields = {}
|
49
47
|
convert_file_to_layout(index_path, "app/views/layouts/#{layout_name}.html.erb")
|
50
|
-
convert_to_haml(
|
48
|
+
convert_to_haml("app/views/layouts/#{layout_name}.html.erb") if haml?
|
49
|
+
prepare_action
|
51
50
|
prepare_sample_controller_and_view
|
52
51
|
prepare_layout_partials
|
53
52
|
prepare_assets
|
@@ -125,22 +124,33 @@ class InstallTheme
|
|
125
124
|
EOS
|
126
125
|
|
127
126
|
doc = Hpricot(contents)
|
128
|
-
doc
|
129
|
-
@original_body_content = elm.inner_html.strip
|
130
|
-
elm.inner_html = "<%= yield %>"
|
131
|
-
end
|
127
|
+
@original_body_content = replace_by_path(doc, content_path, "<%= yield %>")
|
132
128
|
partials.to_a.each do |name, css_path|
|
133
|
-
|
134
|
-
|
135
|
-
elm.inner_html = "<%= yield(:#{name}) || render_or_default('#{name}') %>"
|
136
|
-
end
|
129
|
+
original_named_yields[name] =
|
130
|
+
replace_by_path(doc, css_path, "<%= yield(:#{name}) || render_or_default('#{name}') %>")
|
137
131
|
end
|
138
132
|
contents = doc.to_html
|
139
|
-
|
140
133
|
f << contents
|
141
134
|
end
|
142
135
|
end
|
143
136
|
|
137
|
+
# see replace_by_path_spec.rb for examples
|
138
|
+
def replace_by_path(doc, path, replacement)
|
139
|
+
result = ""
|
140
|
+
return "" unless path && path.strip.match(/^(.*?)(|\s*:text|\s*\/?text\(\))$/)
|
141
|
+
outer_path, is_text = $1, !$2.blank?
|
142
|
+
if node = doc.search(outer_path).first
|
143
|
+
if is_text
|
144
|
+
result = node.inner_html
|
145
|
+
node.inner_html = replacement
|
146
|
+
else
|
147
|
+
result = node.to_html
|
148
|
+
node.parent.replace_child(node, Hpricot::Text.new(replacement))
|
149
|
+
end
|
150
|
+
end
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
144
154
|
def convert_to_haml(path)
|
145
155
|
from_path = File.join(template_temp_path, path)
|
146
156
|
haml_path = from_path.gsub(/erb$/, "haml")
|
@@ -197,6 +207,17 @@ class InstallTheme
|
|
197
207
|
convert_to_haml('app/views/original_template/index.html.erb') if haml?
|
198
208
|
end
|
199
209
|
|
210
|
+
def prepare_action
|
211
|
+
return unless action
|
212
|
+
action_path = "app/views/#{action}.html.erb"
|
213
|
+
target_path = File.join(template_temp_path, action_path)
|
214
|
+
FileUtils.mkdir_p(File.dirname(target_path))
|
215
|
+
File.open(target_path, "w") do |f|
|
216
|
+
f << original_body_content
|
217
|
+
end
|
218
|
+
convert_to_haml(action_path) if haml?
|
219
|
+
end
|
220
|
+
|
200
221
|
def prepare_layout_partials
|
201
222
|
original_named_yields.to_a.each do |key, original_contents|
|
202
223
|
partial_file = "app/views/layouts/_#{key}.html.erb"
|
@@ -243,20 +264,22 @@ class InstallTheme
|
|
243
264
|
end
|
244
265
|
|
245
266
|
# converts +from+ HTML into +to+ HAML
|
246
|
-
# +from+ can either be file name, HTML content (String) or an
|
267
|
+
# +from+ can either be file name, HTML content (String) or an Nokogiri::XML::Node
|
247
268
|
# +to+ can either be a file name or an IO object with a #write method
|
248
269
|
def html2haml(from, to)
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
270
|
+
Open3.popen3("html2haml #{from} #{to}") { |stdin, stdout, stderr| stdout.read }
|
271
|
+
# TODO - the following is failing for some reason
|
272
|
+
# converter = Haml::Exec::HTML2Haml.new([])
|
273
|
+
# from = File.read(from) if File.exist?(from)
|
274
|
+
# to = File.open(to, "w") unless to.respond_to?(:write)
|
275
|
+
# converter.instance_variable_set("@options", { :input => from, :output => to })
|
276
|
+
# converter.instance_variable_set("@module_opts", { :rhtml => true })
|
277
|
+
# begin
|
278
|
+
# converter.send(:process_result)
|
279
|
+
# rescue Exception => e
|
280
|
+
# stdout.puts "Failed to convert #{File.basename(from)} to haml"
|
281
|
+
# end
|
282
|
+
# to.close if to.respond_to?(:close)
|
260
283
|
end
|
261
284
|
|
262
285
|
def css2sass(from, to)
|
@@ -363,4 +386,13 @@ class InstallTheme
|
|
363
386
|
def tmp_dir
|
364
387
|
ENV['TMPDIR'] || '/tmp'
|
365
388
|
end
|
389
|
+
|
390
|
+
def require_haml
|
391
|
+
require 'haml'
|
392
|
+
require 'haml/html'
|
393
|
+
require 'sass'
|
394
|
+
require 'sass/css'
|
395
|
+
require 'haml/exec'
|
396
|
+
require 'open3'
|
397
|
+
end
|
366
398
|
end
|
data/lib/install_theme/cli.rb
CHANGED
@@ -10,13 +10,18 @@ class InstallTheme
|
|
10
10
|
|
11
11
|
Usage: #{File.basename($0)} path/to/rails_app path/to/template content_path [options]
|
12
12
|
|
13
|
+
Examples of paths (CSS or XPath):
|
14
|
+
* #header h2 - replaces the entire h2 element
|
15
|
+
* #header h2:text - replaces the inner HTML of the h2 element
|
16
|
+
* //div[@class='header']/h2 - replaces the entire h2 element
|
17
|
+
* //div[@class='header']/h2/text() - replaces the inner HTML of the h2 element
|
18
|
+
|
13
19
|
Options are:
|
14
20
|
BANNER
|
15
21
|
opts.separator ""
|
16
22
|
opts.on("-p", "--partial KEY_AND_PATH", String,
|
17
23
|
"Replace the inner HTML of an element with <%= yield :key %>",
|
18
|
-
"
|
19
|
-
"Example using XPath: --partial \"header://div[@id='header']\"") do |arg|
|
24
|
+
"See path examples above.") do |arg|
|
20
25
|
options[:partials] ||= {}
|
21
26
|
key, path = arg.split(/\s*:\s*/)[0..1]
|
22
27
|
if key && path
|
@@ -30,12 +35,14 @@ class InstallTheme
|
|
30
35
|
"Set the layout file name.",
|
31
36
|
"Layout files are stored in app/views/layouts and will be suffixed by .html.erb or .html.haml",
|
32
37
|
"Default: application") { |arg| options[:layout] = arg }
|
38
|
+
opts.on("-a", "--action posts/show", String,
|
39
|
+
"Store content extracted from content_path into Rails action.",
|
40
|
+
"Example, '-a posts/show' will create app/views/posts/show.html.erb file.",
|
41
|
+
"Default: none") { |arg| options[:action] = arg }
|
33
42
|
opts.on("--erb",
|
34
|
-
"Generate ERb templates."
|
35
|
-
"Default: auto-detect") { |arg| options[:template_type] = 'erb' }
|
43
|
+
"Generate ERb templates. Default: Yes, unless it's not.") { |arg| options[:template_type] = 'erb' }
|
36
44
|
opts.on("--haml",
|
37
|
-
"Generate HAML templates."
|
38
|
-
"Default: auto-detect") { |arg| options[:template_type] = 'haml' }
|
45
|
+
"Generate HAML templates. Default: Auto-detect") { |arg| options[:template_type] = 'haml' }
|
39
46
|
opts.on("--index_path index.html", String,
|
40
47
|
"HTML page to use for application layout.",
|
41
48
|
"Default: index.html") { |arg| options[:index_path] = arg }
|
@@ -1,4 +1,5 @@
|
|
1
|
-
<
|
1
|
+
<div id="sidebar">
|
2
|
+
<ul>
|
2
3
|
<li><h3><a href="#" class="house">Dashboard</a></h3>
|
3
4
|
<ul>
|
4
5
|
<li><a href="#" class="report">Sales Report</a></li>
|
@@ -29,4 +30,5 @@
|
|
29
30
|
<li><a href="#" class="online">Users online</a></li>
|
30
31
|
</ul>
|
31
32
|
</li>
|
32
|
-
</ul>
|
33
|
+
</ul>
|
34
|
+
</div>
|
@@ -1,63 +1,64 @@
|
|
1
|
-
|
2
|
-
%
|
3
|
-
%
|
4
|
-
%
|
5
|
-
|
6
|
-
|
7
|
-
%
|
8
|
-
%
|
9
|
-
|
10
|
-
|
11
|
-
%
|
12
|
-
|
13
|
-
|
14
|
-
%
|
15
|
-
|
16
|
-
|
17
|
-
%
|
18
|
-
%
|
19
|
-
|
20
|
-
|
21
|
-
%
|
22
|
-
%
|
23
|
-
|
24
|
-
|
25
|
-
%
|
26
|
-
|
27
|
-
|
28
|
-
%
|
29
|
-
|
30
|
-
|
31
|
-
%
|
32
|
-
%
|
33
|
-
|
34
|
-
|
35
|
-
%
|
36
|
-
%
|
37
|
-
|
38
|
-
|
39
|
-
%
|
40
|
-
|
41
|
-
|
42
|
-
%
|
43
|
-
|
44
|
-
|
45
|
-
%
|
46
|
-
|
47
|
-
|
48
|
-
%
|
49
|
-
%
|
50
|
-
|
51
|
-
|
52
|
-
%
|
53
|
-
%
|
54
|
-
|
55
|
-
|
56
|
-
%
|
57
|
-
|
58
|
-
|
59
|
-
%
|
60
|
-
|
61
|
-
|
62
|
-
%
|
63
|
-
|
1
|
+
#sidebar
|
2
|
+
%ul
|
3
|
+
%li
|
4
|
+
%h3
|
5
|
+
%a.house{ :href => "#" }
|
6
|
+
Dashboard
|
7
|
+
%ul
|
8
|
+
%li
|
9
|
+
%a.report{ :href => "#" }
|
10
|
+
Sales Report
|
11
|
+
%li
|
12
|
+
%a.report_seo{ :href => "#" }
|
13
|
+
SEO Report
|
14
|
+
%li
|
15
|
+
%a.search{ :href => "#" }
|
16
|
+
Search
|
17
|
+
%li
|
18
|
+
%h3
|
19
|
+
%a.folder_table{ :href => "#" }
|
20
|
+
Orders
|
21
|
+
%ul
|
22
|
+
%li
|
23
|
+
%a.addorder{ :href => "#" }
|
24
|
+
New order
|
25
|
+
%li
|
26
|
+
%a.shipping{ :href => "#" }
|
27
|
+
Shipments
|
28
|
+
%li
|
29
|
+
%a.invoices{ :href => "#" }
|
30
|
+
Invoices
|
31
|
+
%li
|
32
|
+
%h3
|
33
|
+
%a.manage{ :href => "#" }
|
34
|
+
Manage
|
35
|
+
%ul
|
36
|
+
%li
|
37
|
+
%a.manage_page{ :href => "#" }
|
38
|
+
Pages
|
39
|
+
%li
|
40
|
+
%a.cart{ :href => "#" }
|
41
|
+
Products
|
42
|
+
%li
|
43
|
+
%a.folder{ :href => "#" }
|
44
|
+
Product categories
|
45
|
+
%li
|
46
|
+
%a.promotions{ :href => "#" }
|
47
|
+
Promotions
|
48
|
+
%li
|
49
|
+
%h3
|
50
|
+
%a.user{ :href => "#" }
|
51
|
+
Users
|
52
|
+
%ul
|
53
|
+
%li
|
54
|
+
%a.useradd{ :href => "#" }
|
55
|
+
Add user
|
56
|
+
%li
|
57
|
+
%a.group{ :href => "#" }
|
58
|
+
User groups
|
59
|
+
%li
|
60
|
+
%a.search{ :href => "#" }
|
61
|
+
Find user
|
62
|
+
%li
|
63
|
+
%a.online{ :href => "#" }
|
64
|
+
Users online
|
@@ -44,7 +44,7 @@
|
|
44
44
|
</div>
|
45
45
|
<div id="wrapper">
|
46
46
|
<div id="content"><%= yield %></div>
|
47
|
-
|
47
|
+
<%= yield(:sidebar) || render_or_default('sidebar') %>
|
48
48
|
</div>
|
49
49
|
<div id="footer">
|
50
50
|
<div id="credits">
|
@@ -12,6 +12,7 @@ describe InstallTheme::CLI, "execute" do
|
|
12
12
|
:template_type => "haml",
|
13
13
|
:partials => { "header" => '#header h2', "sidebar" => '#sidebar' },
|
14
14
|
:defaults_file => "install_theme.yml",
|
15
|
+
:action => "posts/show",
|
15
16
|
:layout => "iphone"
|
16
17
|
).
|
17
18
|
and_return(theme)
|
@@ -25,6 +26,7 @@ describe InstallTheme::CLI, "execute" do
|
|
25
26
|
-p sidebar:#sidebar
|
26
27
|
--defaults_file install_theme.yml
|
27
28
|
--layout iphone
|
29
|
+
--action posts/show
|
28
30
|
])
|
29
31
|
end
|
30
32
|
end
|
@@ -1,38 +1,19 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
2
|
|
3
3
|
describe InstallTheme do
|
4
|
+
include SetupThemeHelpers
|
5
|
+
extend FileDiffMatcher
|
6
|
+
|
4
7
|
context "bloganje theme to haml" do
|
5
|
-
before(:all)
|
6
|
-
setup_base_rails :haml => true
|
7
|
-
@template_root = File.dirname(__FILE__) + "/fixtures/bloganje"
|
8
|
-
FileUtils.rm_rf(File.join(@template_root, "install_theme.yml"))
|
9
|
-
@stdout = stdout do |stdout|
|
10
|
-
@theme = InstallTheme.new(:template_root => @template_root,
|
11
|
-
:rails_root => @target_application,
|
12
|
-
:content_path => "#content",
|
13
|
-
:partials => { "header" => '#header h2', "sidebar" => '#sidebar' },
|
14
|
-
:stdout => stdout)
|
15
|
-
@theme.apply_to_target(:stdout => stdout, :generator => {:collision => :force, :quiet => true})
|
16
|
-
end
|
17
|
-
@expected_application = File.dirname(__FILE__) + "/expected/rails/bloganje"
|
18
|
-
end
|
8
|
+
before(:all) { setup_bloganje :rails => {:haml => true} }
|
19
9
|
it { @theme.should be_haml }
|
20
10
|
it { @theme.should be_valid }
|
21
11
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
it do
|
28
|
-
expected = clean_file File.join(@expected_application, matching_file), 'expected'
|
29
|
-
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
30
|
-
diff = `diff #{expected} #{actual} 2> /dev/null`
|
31
|
-
rputs diff unless diff.strip.empty?
|
32
|
-
diff.strip.should == ""
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
12
|
+
it_should_have_matching_file "app/views/layouts/application.html.haml"
|
13
|
+
it_should_have_matching_file "app/views/layouts/_header.html.haml"
|
14
|
+
it_should_have_matching_file "app/views/layouts/_sidebar.html.haml"
|
15
|
+
it_should_have_matching_file "app/helpers/template_helper.rb"
|
16
|
+
it_should_have_matching_file "public/stylesheets/sass/style.sass"
|
36
17
|
|
37
18
|
it { File.should be_exist(File.join(@target_application, "app/views/original_template/index.html.haml")) }
|
38
19
|
context "sample template /original_template/index.html.haml" do
|
data/spec/install_theme_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
2
|
|
3
3
|
describe InstallTheme do
|
4
4
|
include SetupThemeHelpers
|
5
|
+
extend FileDiffMatcher
|
5
6
|
|
6
7
|
context "bloganje theme to ERb using CSS path" do
|
7
8
|
before(:all) { setup_bloganje }
|
@@ -10,20 +11,14 @@ describe InstallTheme do
|
|
10
11
|
it { @theme.should be_erb }
|
11
12
|
it { @theme.should be_valid }
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
22
|
-
diff = `diff #{expected} #{actual} 2> /dev/null`
|
23
|
-
rputs diff unless diff.strip.empty?
|
24
|
-
diff.strip.should == ""
|
25
|
-
end
|
26
|
-
end
|
14
|
+
it_should_have_matching_file "app/views/layouts/application.html.erb"
|
15
|
+
it_should_have_matching_file "app/views/layouts/_header.html.erb"
|
16
|
+
it_should_have_matching_file "app/views/layouts/_sidebar.html.erb"
|
17
|
+
it_should_have_matching_file "app/views/posts/show.html.erb"
|
18
|
+
it_should_have_matching_file "app/helpers/template_helper.rb"
|
19
|
+
it_should_have_matching_file "public/stylesheets/style.css"
|
20
|
+
it_should_have_matching_file "public/stylesheets/theme.css"
|
21
|
+
|
27
22
|
context "sample template /templates/index.html.erb" do
|
28
23
|
subject do
|
29
24
|
File.read(File.join(@target_application, 'app/views/original_template/index.html.erb'))
|
@@ -47,19 +42,10 @@ describe InstallTheme do
|
|
47
42
|
it { @theme.image_dir.should == "img" }
|
48
43
|
it { @theme.should be_valid }
|
49
44
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
it { File.should be_exist(File.join(@expected_application, matching_file)) }
|
55
|
-
it do
|
56
|
-
expected = clean_file File.join(@expected_application, matching_file), 'expected'
|
57
|
-
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
58
|
-
diff = `diff #{expected} #{actual} 2> /dev/null`
|
59
|
-
rputs diff unless diff.strip.empty?
|
60
|
-
diff.strip.should == ""
|
61
|
-
end
|
62
|
-
end
|
45
|
+
it_should_have_matching_file "app/views/layouts/application.html.erb"
|
46
|
+
it_should_have_matching_file "app/helpers/template_helper.rb"
|
47
|
+
it_should_have_matching_file "public/stylesheets/default.css"
|
48
|
+
|
63
49
|
it "should create install_theme.yml containing the partial information" do
|
64
50
|
expected = clean_file File.join(@template_root, "expected_install_theme.yml"), 'expected'
|
65
51
|
actual = clean_file File.join(@template_root, "install_theme.yml"), 'actual'
|
@@ -74,52 +60,25 @@ describe InstallTheme do
|
|
74
60
|
setup_app_with_theme('bloganje', :setup_defaults => true)
|
75
61
|
end
|
76
62
|
it { File.should be_exist(File.join(@template_root, "install_theme.yml")) }
|
77
|
-
it { @theme.content_path.should == "#content" }
|
63
|
+
it { @theme.content_path.should == "#content:text" }
|
78
64
|
it { @theme.should be_valid }
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
it "should having matching file #{matching_file}" do
|
86
|
-
expected = clean_file File.join(@expected_application, matching_file), 'expected'
|
87
|
-
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
88
|
-
diff = `diff #{expected} #{actual} 2> /dev/null`
|
89
|
-
rputs diff unless diff.strip.empty?
|
90
|
-
diff.strip.should == ""
|
91
|
-
end
|
92
|
-
end
|
65
|
+
it_should_have_matching_file "app/views/layouts/application.html.erb"
|
66
|
+
it_should_have_matching_file "app/views/layouts/_header.html.erb"
|
67
|
+
it_should_have_matching_file "app/views/layouts/_sidebar.html.erb"
|
68
|
+
it_should_have_matching_file "app/helpers/template_helper.rb"
|
69
|
+
it_should_have_matching_file "public/stylesheets/style.css"
|
70
|
+
it_should_have_matching_file "public/stylesheets/theme.css"
|
93
71
|
end
|
94
72
|
|
95
|
-
context "
|
96
|
-
before(:all)
|
97
|
-
setup_base_rails
|
98
|
-
@template_root = File.dirname(__FILE__) + "/fixtures/bloganje"
|
99
|
-
FileUtils.rm_rf(File.join(@template_root, "install_theme.yml"))
|
100
|
-
@stdout = stdout do |stdout|
|
101
|
-
@theme = InstallTheme.new(:template_root => @template_root,
|
102
|
-
:rails_root => @target_application,
|
103
|
-
:stdout => stdout)
|
104
|
-
@theme.apply_to_target(:stdout => stdout, :generator => {:collision => :force, :quiet => true})
|
105
|
-
end
|
106
|
-
@expected_application = File.dirname(__FILE__) + "/expected/rails/bloganje"
|
107
|
-
end
|
73
|
+
context "invalid if no content_path explicitly or via defaults file" do
|
74
|
+
before(:all) { setup_bloganje(:content_path => nil) }
|
108
75
|
it { @theme.content_path.should be_nil }
|
109
76
|
it { @theme.should_not be_valid }
|
110
77
|
end
|
111
78
|
|
112
|
-
context "
|
79
|
+
context "alternate layout file name" do
|
113
80
|
before(:all) { setup_bloganje(:layout => "special") }
|
114
|
-
|
115
|
-
it "should having matching file #{matching_file}" do
|
116
|
-
expected = clean_file File.join(@expected_application, matching_file), 'expected'
|
117
|
-
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
118
|
-
diff = `diff #{expected} #{actual} 2> /dev/null`
|
119
|
-
rputs diff unless diff.strip.empty?
|
120
|
-
diff.strip.should == ""
|
121
|
-
end
|
122
|
-
end
|
81
|
+
it_should_have_matching_file "app/views/layouts/special.html.erb"
|
123
82
|
end
|
124
83
|
|
125
84
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'spec'
|
3
|
+
require 'hpricot'
|
3
4
|
|
4
5
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
5
6
|
require 'install_theme'
|
@@ -44,9 +45,21 @@ def stdout(&block)
|
|
44
45
|
stdout_io.read
|
45
46
|
end
|
46
47
|
|
48
|
+
module FileDiffMatcher
|
49
|
+
def it_should_have_matching_file(matching_file)
|
50
|
+
it "should having matching file #{matching_file}" do
|
51
|
+
expected = clean_file File.join(@expected_application, matching_file), 'expected'
|
52
|
+
actual = clean_file File.join(@target_application, matching_file), 'actual'
|
53
|
+
diff = `diff #{expected} #{actual} 2> /dev/null`
|
54
|
+
rputs diff unless diff.strip.empty?
|
55
|
+
diff.strip.should == ""
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
47
60
|
module SetupThemeHelpers
|
48
61
|
def setup_app_with_theme(theme, theme_options = {})
|
49
|
-
setup_base_rails
|
62
|
+
setup_base_rails(theme_options.delete(:rails) || {})
|
50
63
|
@template_root = File.join(File.dirname(__FILE__), "fixtures", theme)
|
51
64
|
FileUtils.chdir(@template_root) do
|
52
65
|
if theme_options.delete(:setup_defaults)
|
@@ -65,19 +78,21 @@ module SetupThemeHelpers
|
|
65
78
|
end
|
66
79
|
|
67
80
|
def setup_bloganje(theme_options = {})
|
68
|
-
setup_app_with_theme('bloganje',
|
69
|
-
|
70
|
-
|
81
|
+
setup_app_with_theme('bloganje', {
|
82
|
+
:content_path => "#content:text",
|
83
|
+
:partials => { "header" => '#header h2 text()', "sidebar" => '#sidebar' },
|
84
|
+
:action => "posts/show"
|
85
|
+
}.merge(theme_options))
|
71
86
|
end
|
72
87
|
|
73
88
|
def setup_hobbit(theme_options = {})
|
74
|
-
setup_app_with_theme('the-hobbit-website-template',
|
75
|
-
|
76
|
-
|
77
|
-
|
89
|
+
setup_app_with_theme('the-hobbit-website-template', {
|
90
|
+
:content_path => "//div[@class='content']/text()",
|
91
|
+
:partials => { "menu" => "//div[@class='navigation']/text()", "subtitle" => "//div[@class='header']/p" }
|
92
|
+
}.merge(theme_options))
|
78
93
|
end
|
79
94
|
|
80
|
-
def setup_base_rails(options
|
95
|
+
def setup_base_rails(options)
|
81
96
|
tmp_path = File.dirname(__FILE__) + "/tmp"
|
82
97
|
FileUtils.rm_rf(tmp_path)
|
83
98
|
FileUtils.mkdir_p(tmp_path )
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: install_theme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Nic Williams
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-12 00:00:00 +10:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|