install_theme 0.7.2 → 0.8.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/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
|