install_theme 0.7.0 → 0.7.1
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 +1 -1
- data/lib/install_theme.rb +12 -3
- data/lib/install_theme/cli.rb +16 -9
- data/spec/expected/rails/bloganje/app/views/layouts/application.html.erb +1 -0
- data/spec/expected/rails/bloganje/app/views/layouts/application.html.haml +1 -0
- data/spec/expected/rails/the-hobbit-website-template/app/views/layouts/application.html.erb +1 -0
- data/spec/install_theme_cli_spec.rb +5 -1
- data/spec/install_theme_spec.rb +20 -41
- data/spec/spec_helper.rb +44 -10
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
=== 0.7.1 / 2009-10-08
|
2
|
+
|
3
|
+
Major:
|
4
|
+
* CLI has a --layout/-l flag to set the layout file name (still defaults to application[.html.erb])
|
5
|
+
* CLI has a --defaults_file flag to select an alternate YAML file containing defaults for the theme.
|
6
|
+
* Layout files have 'javascript_include_tag :all' added to the <head> section
|
7
|
+
|
8
|
+
Minor:
|
9
|
+
* refactor before(:all) blocks into common helper setup_app_with_theme
|
10
|
+
* reorder the CLI help Usage message to show new order of arguments
|
11
|
+
* reordering the CLI flags in the help display
|
12
|
+
* removed the unfinished sentence about Dr Nic
|
13
|
+
|
1
14
|
=== 0.7.0 / 2009-10-07
|
2
15
|
|
3
16
|
Major:
|
data/README.rdoc
CHANGED
data/lib/install_theme.rb
CHANGED
@@ -10,9 +10,10 @@ require 'sass/css'
|
|
10
10
|
require 'haml/exec'
|
11
11
|
|
12
12
|
class InstallTheme
|
13
|
-
VERSION = "0.7.
|
13
|
+
VERSION = "0.7.1"
|
14
14
|
|
15
15
|
attr_reader :template_root, :rails_root, :index_path, :template_type
|
16
|
+
attr_reader :layout_name
|
16
17
|
attr_reader :stylesheet_dir, :javascript_dir, :image_dir
|
17
18
|
attr_reader :defaults_file
|
18
19
|
attr_reader :content_path, :partials
|
@@ -27,6 +28,9 @@ class InstallTheme
|
|
27
28
|
@stylesheet_dir = options[:stylesheet_dir] || detect_stylesheet_dir
|
28
29
|
@javascript_dir = options[:javascript_dir] || detect_javascript_dir
|
29
30
|
@image_dir = options[:image_dir] || detect_image_dir
|
31
|
+
@layout_name = options[:layout] || "application"
|
32
|
+
@layout_name.gsub!(/\..*/, '') # allow application.html.erb to be passed in, but clean it up to 'application'
|
33
|
+
|
30
34
|
@stdout = options[:stdout] || $stdout
|
31
35
|
|
32
36
|
load_template_defaults unless options[:ignore_defaults]
|
@@ -42,7 +46,7 @@ class InstallTheme
|
|
42
46
|
def apply_to_target(options = {})
|
43
47
|
@stdout = options[:stdout] || @stdout || $stdout
|
44
48
|
@original_named_yields = {}
|
45
|
-
convert_file_to_layout(index_path,
|
49
|
+
convert_file_to_layout(index_path, "app/views/layouts/#{layout_name}.html.erb")
|
46
50
|
convert_to_haml('app/views/layouts/application.html.erb') if haml?
|
47
51
|
prepare_sample_controller_and_view
|
48
52
|
prepare_layout_partials
|
@@ -113,7 +117,12 @@ class InstallTheme
|
|
113
117
|
contents.gsub!(%r{(["'])/?#{stylesheet_dir}}, '\1/stylesheets') unless stylesheet_dir.blank?
|
114
118
|
contents.gsub!(%r{(["'])/?#{javascript_dir}}, '\1/javascripts') unless javascript_dir.blank?
|
115
119
|
|
116
|
-
contents.sub!(%r{\s*</head>},
|
120
|
+
contents.sub!(%r{\s*</head>}, <<-EOS.gsub(/^ /, '').gsub(/\n$/, ''))
|
121
|
+
|
122
|
+
<%= javascript_include_tag :all %>
|
123
|
+
<%= yield(:head) %>
|
124
|
+
</head>
|
125
|
+
EOS
|
117
126
|
|
118
127
|
doc = Hpricot(contents)
|
119
128
|
doc.search(content_path).each do |elm|
|
data/lib/install_theme/cli.rb
CHANGED
@@ -8,11 +8,23 @@ class InstallTheme
|
|
8
8
|
opts.banner = <<-BANNER.gsub(/^ /,'')
|
9
9
|
Use any HTML template as a theme generator for your Rails app.
|
10
10
|
|
11
|
-
Usage: #{File.basename($0)} path/to/
|
11
|
+
Usage: #{File.basename($0)} path/to/rails_app path/to/template content_path [options]
|
12
12
|
|
13
13
|
Options are:
|
14
14
|
BANNER
|
15
15
|
opts.separator ""
|
16
|
+
opts.on("-p", "--partial KEY_AND_PATH", String,
|
17
|
+
"Replace the inner HTML of an element with <%= yield :key %>",
|
18
|
+
"Example using CSS path: --partial header:#header",
|
19
|
+
"Example using XPath: --partial \"header://div[@id='header']\"") do |arg|
|
20
|
+
options[:partials] ||= {}
|
21
|
+
key, css_path = arg.split(/\s*:\s*/)[0..1]
|
22
|
+
options[:partials][key.strip] = css_path.strip
|
23
|
+
end
|
24
|
+
opts.on("-l", "--layout application", String,
|
25
|
+
"Set the layout file name.",
|
26
|
+
"Layout files are stored in app/views/layouts and will be suffixed by .html.erb or .html.haml",
|
27
|
+
"Default: application") { |arg| options[:layout] = arg }
|
16
28
|
opts.on("--erb",
|
17
29
|
"Generate ERb templates.",
|
18
30
|
"Default: auto-detect") { |arg| options[:template_type] = 'erb' }
|
@@ -22,14 +34,9 @@ class InstallTheme
|
|
22
34
|
opts.on("--index_path index.html", String,
|
23
35
|
"HTML page to use for application layout.",
|
24
36
|
"Default: index.html") { |arg| options[:index_path] = arg }
|
25
|
-
opts.on("
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"Example using XPath: --partial \"header://div[@id='header']\"") do |arg|
|
29
|
-
options[:partials] ||= {}
|
30
|
-
key, css_path = arg.split(/\s*:\s*/)[0..1]
|
31
|
-
options[:partials][key.strip] = css_path.strip
|
32
|
-
end
|
37
|
+
opts.on("--defaults_file install_theme.yml", String,
|
38
|
+
"Select an alternate YAML file containing defaults for the theme.",
|
39
|
+
"Default: install_theme.yml") { |arg| options[:defaults_file] = arg }
|
33
40
|
opts.on("-h", "--help",
|
34
41
|
"Show this help message.") { |arg| stdout.puts opts; exit }
|
35
42
|
opts.on("-v", "--version",
|
@@ -10,7 +10,9 @@ describe InstallTheme::CLI, "execute" do
|
|
10
10
|
:content_path => "#content_box",
|
11
11
|
:index_path => "root.html",
|
12
12
|
:template_type => "haml",
|
13
|
-
:partials => { "header" => '#header h2', "sidebar" => '#sidebar' }
|
13
|
+
:partials => { "header" => '#header h2', "sidebar" => '#sidebar' },
|
14
|
+
:defaults_file => "install_theme.yml",
|
15
|
+
:layout => "iphone"
|
14
16
|
).
|
15
17
|
and_return(theme)
|
16
18
|
theme.should_receive(:valid?).and_return(true)
|
@@ -21,6 +23,8 @@ describe InstallTheme::CLI, "execute" do
|
|
21
23
|
--haml
|
22
24
|
--partial header:#header\ h2
|
23
25
|
-p sidebar:#sidebar
|
26
|
+
--defaults_file install_theme.yml
|
27
|
+
--layout iphone
|
24
28
|
])
|
25
29
|
end
|
26
30
|
end
|
data/spec/install_theme_spec.rb
CHANGED
@@ -1,21 +1,10 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
2
|
|
3
3
|
describe InstallTheme do
|
4
|
+
include SetupThemeHelpers
|
5
|
+
|
4
6
|
context "bloganje theme to ERb using CSS path" do
|
5
|
-
before(:all)
|
6
|
-
setup_base_rails
|
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
|
7
|
+
before(:all) { setup_bloganje }
|
19
8
|
it { @theme.stylesheet_dir.should == "css" }
|
20
9
|
it { @theme.image_dir.should == "img" }
|
21
10
|
it { @theme.should be_erb }
|
@@ -53,20 +42,7 @@ describe InstallTheme do
|
|
53
42
|
end
|
54
43
|
|
55
44
|
context "the-hobbit-website-template theme to ERb using xpath" do
|
56
|
-
before(:all)
|
57
|
-
setup_base_rails
|
58
|
-
@template_root = File.dirname(__FILE__) + "/fixtures/the-hobbit-website-template"
|
59
|
-
FileUtils.rm_rf(File.join(@template_root, "install_theme.yml"))
|
60
|
-
@stdout = stdout do |stdout|
|
61
|
-
@theme = InstallTheme.new(:template_root => @template_root,
|
62
|
-
:rails_root => @target_application,
|
63
|
-
:partials => { "menu" => "//div[@class='navigation']", "subtitle" => "//div[@class='header']/p" },
|
64
|
-
:content_path => "//div[@class='content']",
|
65
|
-
:stdout => stdout)
|
66
|
-
@theme.apply_to_target(:generator => {:collision => :force, :quiet => true})
|
67
|
-
end
|
68
|
-
@expected_application = File.dirname(__FILE__) + "/expected/rails/the-hobbit-website-template"
|
69
|
-
end
|
45
|
+
before(:all) { setup_hobbit }
|
70
46
|
it { @theme.stylesheet_dir.should == "" }
|
71
47
|
it { @theme.image_dir.should == "img" }
|
72
48
|
it { @theme.should be_valid }
|
@@ -95,18 +71,7 @@ describe InstallTheme do
|
|
95
71
|
|
96
72
|
context "use install_theme.yml for defaults" do
|
97
73
|
before(:all) do
|
98
|
-
|
99
|
-
@template_root = File.dirname(__FILE__) + "/fixtures/bloganje"
|
100
|
-
FileUtils.chdir(@template_root) do
|
101
|
-
FileUtils.cp_r("expected_install_theme.yml", "install_theme.yml")
|
102
|
-
end
|
103
|
-
@stdout = stdout do |stdout|
|
104
|
-
@theme = InstallTheme.new(:template_root => @template_root,
|
105
|
-
:rails_root => @target_application,
|
106
|
-
:stdout => stdout)
|
107
|
-
@theme.apply_to_target(:stdout => stdout, :generator => {:collision => :force, :quiet => true})
|
108
|
-
end
|
109
|
-
@expected_application = File.dirname(__FILE__) + "/expected/rails/bloganje"
|
74
|
+
setup_app_with_theme('bloganje', :setup_defaults => true)
|
110
75
|
end
|
111
76
|
it { File.should be_exist(File.join(@template_root, "install_theme.yml")) }
|
112
77
|
it { @theme.content_path.should == "#content" }
|
@@ -127,7 +92,7 @@ describe InstallTheme do
|
|
127
92
|
end
|
128
93
|
end
|
129
94
|
|
130
|
-
context "
|
95
|
+
context "alternate layout file name" do
|
131
96
|
before(:all) do
|
132
97
|
setup_base_rails
|
133
98
|
@template_root = File.dirname(__FILE__) + "/fixtures/bloganje"
|
@@ -143,5 +108,19 @@ describe InstallTheme do
|
|
143
108
|
it { @theme.content_path.should be_nil }
|
144
109
|
it { @theme.should_not be_valid }
|
145
110
|
end
|
111
|
+
|
112
|
+
context "invalid if no content_path explicitly or via defaults file" do
|
113
|
+
before(:all) { setup_bloganje(:layout => "special") }
|
114
|
+
%w[app/views/layouts/special.html.erb].each do |matching_file|
|
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
|
123
|
+
end
|
124
|
+
|
146
125
|
end
|
147
126
|
|
data/spec/spec_helper.rb
CHANGED
@@ -37,16 +37,6 @@ def clean_file(orig_file, scope)
|
|
37
37
|
file
|
38
38
|
end
|
39
39
|
|
40
|
-
def setup_base_rails(options = {})
|
41
|
-
tmp_path = File.dirname(__FILE__) + "/tmp"
|
42
|
-
FileUtils.rm_rf(tmp_path)
|
43
|
-
FileUtils.mkdir_p(tmp_path )
|
44
|
-
@target_application = File.join(tmp_path, "my_app")
|
45
|
-
FileUtils.cp_r(File.dirname(__FILE__) + "/expected/rails/base_app", @target_application)
|
46
|
-
`haml --rails #{@target_application}` if options[:haml]
|
47
|
-
@target_application
|
48
|
-
end
|
49
|
-
|
50
40
|
def stdout(&block)
|
51
41
|
stdout_io = StringIO.new
|
52
42
|
yield stdout_io
|
@@ -54,3 +44,47 @@ def stdout(&block)
|
|
54
44
|
stdout_io.read
|
55
45
|
end
|
56
46
|
|
47
|
+
module SetupThemeHelpers
|
48
|
+
def setup_app_with_theme(theme, theme_options = {})
|
49
|
+
setup_base_rails
|
50
|
+
@template_root = File.join(File.dirname(__FILE__), "fixtures", theme)
|
51
|
+
FileUtils.chdir(@template_root) do
|
52
|
+
if theme_options.delete(:setup_defaults)
|
53
|
+
FileUtils.cp_r("expected_install_theme.yml", "install_theme.yml")
|
54
|
+
else
|
55
|
+
FileUtils.rm_rf("install_theme.yml")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
@stdout = stdout do |stdout|
|
59
|
+
@theme = InstallTheme.new({:template_root => @template_root,
|
60
|
+
:rails_root => @target_application,
|
61
|
+
:stdout => stdout}.merge(theme_options))
|
62
|
+
@theme.apply_to_target(:stdout => stdout, :generator => {:collision => :force, :quiet => true})
|
63
|
+
end
|
64
|
+
@expected_application = File.join(File.dirname(__FILE__), "expected/rails", theme)
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup_bloganje(theme_options = {})
|
68
|
+
setup_app_with_theme('bloganje',
|
69
|
+
{:content_path => "#content", :partials => { "header" => '#header h2', "sidebar" => '#sidebar' }}.
|
70
|
+
merge(theme_options))
|
71
|
+
end
|
72
|
+
|
73
|
+
def setup_hobbit(theme_options = {})
|
74
|
+
setup_app_with_theme('the-hobbit-website-template',
|
75
|
+
{ :content_path => "//div[@class='content']",
|
76
|
+
:partials => { "menu" => "//div[@class='navigation']", "subtitle" => "//div[@class='header']/p" }}.
|
77
|
+
merge(theme_options))
|
78
|
+
end
|
79
|
+
|
80
|
+
def setup_base_rails(options = {})
|
81
|
+
tmp_path = File.dirname(__FILE__) + "/tmp"
|
82
|
+
FileUtils.rm_rf(tmp_path)
|
83
|
+
FileUtils.mkdir_p(tmp_path )
|
84
|
+
@target_application = File.join(tmp_path, "my_app")
|
85
|
+
FileUtils.cp_r(File.dirname(__FILE__) + "/expected/rails/base_app", @target_application)
|
86
|
+
`haml --rails #{@target_application}` if options[:haml]
|
87
|
+
@target_application
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
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.7.
|
4
|
+
version: 0.7.1
|
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-08 00:00:00 +10:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|