interfacelift 0.0.1 → 0.1.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/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  pkg/*
2
2
  interfacelift.gemspec
3
+ coverage/*
3
4
 
@@ -0,0 +1,57 @@
1
+ = WARNING! THIS GEM IS UNDER HEAVY DEVELOPMENT AND SHOULD BE USED WITH CAUTION!!!11
2
+
3
+ = InterfaceLift
4
+ * http://github.com/michel/interfaceLift
5
+
6
+ == DESCRIPTION
7
+
8
+ Are you a programmer? Do you hate doing GUI related stuff? Or just want your app to look good without much effort?
9
+ Well interfacelift might be the gem your looking for!
10
+
11
+ Interface lift is a handy gem for installing themes in rails apps.
12
+ You can install themes with just one single command:
13
+
14
+ interfacelift install bright_admin --repo git://github.com/michel/bright_admin.git
15
+
16
+ == FEATURES
17
+
18
+ - Needs MOAR features..
19
+
20
+ == SYNOPSIS
21
+
22
+ rails my_app
23
+ cd my_app
24
+ interfacelift install bright_admin --repo git://github.com/michel/bright_admin.git
25
+
26
+ == INSTALL
27
+
28
+ sudo gem install interfacelift --source http://gemcutter.org
29
+
30
+ == LICENSE:
31
+
32
+ (The MIT License)
33
+
34
+ Copyright (c) 2009 Michel de Graaf (michel@re-invention.nl), http://re-invention.nl
35
+ Copyright (c) 2009 Jeroen van Schagen (jeroen.v.schagen@gmail.com)
36
+
37
+ Permission is hereby granted, free of charge, to any person obtaining
38
+ a copy of this software and associated documentation files (the
39
+ 'Software'), to deal in the Software without restriction, including
40
+ without limitation the rights to use, copy, modify, merge, publish,
41
+ distribute, sublicense, and/or sell copies of the Software, and to
42
+ permit persons to whom the Software is furnished to do so, subject to
43
+ the following conditions:
44
+
45
+ The above copyright notice and this permission notice shall be
46
+ included in all copies or substantial portions of the Software.
47
+
48
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
49
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
50
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
51
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
52
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
53
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
54
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
55
+
56
+
57
+
data/Rakefile CHANGED
@@ -1,16 +1,19 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
+
3
4
 
4
5
  begin
5
6
  require 'jeweler'
6
7
  Jeweler::Tasks.new do |gem|
7
8
  gem.name = "interfacelift"
8
9
  gem.summary = %Q{Installs templates in rails applications}
9
- gem.description = %Q{Collection of cool layouts to use in your rails apps.}
10
+ gem.description = %Q{Installs themes and other layout/interface related resources}
10
11
  gem.email = "michel@re-invention.nl"
11
12
  gem.homepage = "http://github.com/michel/interfacelift"
12
- gem.authors = ["Michel de Graaf"]
13
- gem.add_development_dependency "thoughtbot-shoulda"
13
+ gem.authors = ["Michel de Graaf","Jeroen van Schagen"]
14
+ gem.add_dependency "commander"
15
+ gem.add_dependency "git"
16
+ gem.add_development_dependency "thoughtbot-shoulda"
14
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
18
  end
16
19
  Jeweler::GemcutterTasks.new
@@ -25,21 +28,15 @@ Spec::Rake::SpecTask.new('spec') do |t|
25
28
  t.spec_opts = ['--options', "\"spec/spec.opts\""]
26
29
  end
27
30
 
28
-
29
- begin
30
- require 'rcov/rcovtask'
31
- Rcov::RcovTask.new do |test|
32
- test.libs << 'test'
33
- test.pattern = 'test/**/*_test.rb'
34
- test.verbose = true
35
- end
36
- rescue LoadError
37
- task :rcov do
38
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
39
- end
31
+ desc "Run all specs with RCov"
32
+ Spec::Rake::SpecTask.new('specs_with_rcov') do |t|
33
+ t.spec_files = FileList['spec/*_spec.rb']
34
+ t.rcov = true
35
+ t.spec_opts = ['--options', "\"spec/spec.opts\""]
36
+ t.rcov_opts = ['--exclude', 'spec']
40
37
  end
41
38
 
42
-
39
+
43
40
 
44
41
  task :test => :check_dependencies
45
42
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -12,12 +12,27 @@ program :description, 'Installs layouts in rails apps'
12
12
  command :install do |c|
13
13
  c.syntax = 'install theme path'
14
14
  c.description = 'installs theme in rails app'
15
+ c.option '--repo git://repo.git', String, 'Fetch the theme from a git repo'
15
16
  c.action do |args, options|
16
17
  if args.size < 1
17
- puts "You need to give the theme name and the path to the rails app"
18
+ puts "You need to give the theme name."
18
19
  else
19
20
  begin
20
- installer = InterfaceLift::Installer.new(args[1].nil? ? "." : args[1] ,args[0])
21
+ theme = args[0]
22
+ path = args[1].nil? ? "." : args[1]
23
+ catalog = InterfaceLift::Catalog.new
24
+
25
+ raise "You need to provide the git repo of #{theme}, using the --repo flag" if options.repo.nil?
26
+
27
+ if catalog.theme_exists?(theme)
28
+ puts "Fetching updates for #{theme}..."
29
+ catalog.update_theme(theme)
30
+ else
31
+ puts "Fetching theme #{theme}..."
32
+ catalog.add_theme(theme,options.repo)
33
+ end
34
+
35
+ installer = InterfaceLift::Installer.new(path,theme)
21
36
  installer.install!
22
37
  rescue Exception => e
23
38
  puts e
@@ -0,0 +1,6 @@
1
+ - Create a better API for installing themes (see rails template DSL).
2
+ - Adding code to a file.
3
+ - Optional theme settings.
4
+
5
+ - Fetch themes from a webservice or remote GIT repo.
6
+ - Better install control, ask to overwrite files.
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'git'
3
+
4
+ module InterfaceLift
5
+ class Catalog
6
+ attr_reader :catalog_path
7
+
8
+ def initialize(catalog_path = nil)
9
+ @catalog_path = catalog_path.nil? ? ::InterfaceLift::DEFAULT_CATALOG_PATH : catalog_path
10
+ create_catalog_path!
11
+ end
12
+
13
+ # Retrieve themes from specified catalog path
14
+ def themes
15
+ themes = []
16
+ Dir.glob("#{@catalog_path}/*").each do |item|
17
+ themes << item if File.directory? item
18
+ end
19
+ themes.map { |path| path.split("/").last }
20
+ end
21
+
22
+ # Does the given theme exist in the working path
23
+ def theme_exists?(theme)
24
+ themes.include?(theme) && git_repo?(theme)
25
+ end
26
+
27
+ # Is the argumented theme a git repository?
28
+ def git_repo?(theme)
29
+ begin
30
+ g = Git.open("#{catalog_path}/#{theme}")
31
+ rescue ArgumentError => e
32
+ # If the path does not exist it will return an ArgumentError
33
+ return false
34
+ end
35
+ g.index.readable?
36
+ end
37
+
38
+ # Retrieve the latest version of argumented theme from git repository
39
+ def update_theme(theme)
40
+ return false unless git_repo?(theme)
41
+ g = Git.open("#{catalog_path}/#{theme}")
42
+ !g.pull.match(/^Updating/).nil?
43
+ end
44
+
45
+ # Remove theme from catalog
46
+ def remove_theme(theme)
47
+ FileUtils.rm_rf("#{@catalog_path}/#{theme}")
48
+ end
49
+
50
+ # Download a theme from git repository
51
+ # returns true when sucessfull
52
+ # raises exception when it fails
53
+ def add_theme(theme, repo)
54
+ remove_theme(theme)
55
+ !Git.clone(repo, "#{@catalog_path}/#{theme}").repo.path.nil?
56
+ end
57
+
58
+ #create catalog path when it does not exist
59
+ def create_catalog_path!
60
+ FileUtils.mkdir_p(@catalog_path) unless File.exists?(@catalog_path)
61
+ end
62
+
63
+ end
64
+ end
65
+
66
+
67
+ # test = InterfaceLift::Catalog.new
68
+ # test.add_theme "bright_admin", "git://github.com/michel/bright_admin.git"
@@ -0,0 +1,5 @@
1
+ module InterfaceLift
2
+ class Fetcher
3
+ # Lololol moet nog
4
+ end
5
+ end
@@ -1,14 +1,12 @@
1
1
  module InterfaceLift
2
2
  class Installer
3
3
  attr_reader :path, :theme, :theme_path
4
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
5
- SHARED = "#{APP_ROOT}/lib/templates/shared"
6
4
 
7
5
 
8
- def initialize(path,theme)
6
+ def initialize(path,theme,catalog_path=InterfaceLift::DEFAULT_CATALOG_PATH)
9
7
  @path = path
10
- @theme = theme
11
- @theme_path = "#{APP_ROOT}/lib/templates/#{theme}"
8
+ @theme = theme
9
+ @theme_path = "#{catalog_path}/#{theme}"
12
10
 
13
11
  raise "Given path does not contain a rails app." unless File.directory? "#{@path}/public"
14
12
  raise "Theme #{@theme} is not available." unless File.directory? @theme_path
@@ -19,7 +17,6 @@ module InterfaceLift
19
17
  install_stylesheets
20
18
  install_layouts
21
19
  install_javascript
22
- install_shared
23
20
  theme_install
24
21
  end
25
22
 
@@ -67,13 +64,6 @@ module InterfaceLift
67
64
  end
68
65
  FileUtils.cp_r "#{@theme_path}/public/javascripts","#{path}/public"
69
66
  end
70
-
71
- def install_shared
72
- return nil unless File.directory? "#{SHARED}/icons"
73
- Dir.glob("#{SHARED}/icons/*").each do |file|
74
- puts "Installing icons/#{file.split("/").last}"
75
- end
76
- FileUtils.cp_r "#{SHARED}/icons","#{path}/public/images/"
77
- end
67
+
78
68
  end
79
69
  end
@@ -1,6 +1,9 @@
1
1
  module InterfaceLift
2
2
  VERSION = "0.0.1"
3
+ DEFAULT_CATALOG_PATH = "#{ENV["HOME"]}/.interfacelift"
3
4
  end
4
5
  $LOAD_PATH << File.expand_path(File.dirname(__FILE__))
6
+ require "catalog"
7
+ require "fetcher"
5
8
  require "installer"
6
9
  require "theme_manager"
@@ -0,0 +1,148 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: InterfaceLift</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">InterfaceLift</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/catalog_rb.html">
59
+ lib/catalog.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/lib/fetcher_rb.html">
63
+ lib/fetcher.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/lib/installer_rb.html">
67
+ lib/installer.rb
68
+ </a>
69
+ <br />
70
+ <a href="../files/lib/interfacelift_rb.html">
71
+ lib/interfacelift.rb
72
+ </a>
73
+ <br />
74
+ <a href="../files/lib/theme_manager_rb.html">
75
+ lib/theme_manager.rb
76
+ </a>
77
+ <br />
78
+ </td>
79
+ </tr>
80
+
81
+ </table>
82
+ </div>
83
+ <!-- banner header -->
84
+
85
+ <div id="bodyContent">
86
+
87
+
88
+
89
+ <div id="contextContent">
90
+
91
+
92
+
93
+ </div>
94
+
95
+
96
+ </div>
97
+
98
+
99
+ <!-- if includes -->
100
+
101
+ <div id="section">
102
+
103
+ <div id="class-list">
104
+ <h3 class="section-bar">Classes and Modules</h3>
105
+
106
+ Class <a href="InterfaceLift/Catalog.html" class="link">InterfaceLift::Catalog</a><br />
107
+ Class <a href="InterfaceLift/Fetcher.html" class="link">InterfaceLift::Fetcher</a><br />
108
+ Class <a href="InterfaceLift/Installer.html" class="link">InterfaceLift::Installer</a><br />
109
+ Class <a href="InterfaceLift/ThemeManager.html" class="link">InterfaceLift::ThemeManager</a><br />
110
+
111
+ </div>
112
+
113
+ <div id="constants-list">
114
+ <h3 class="section-bar">Constants</h3>
115
+
116
+ <div class="name-list">
117
+ <table summary="Constants">
118
+ <tr class="top-aligned-row context-row">
119
+ <td class="context-item-name">VERSION</td>
120
+ <td>=</td>
121
+ <td class="context-item-value">&quot;0.0.1&quot;</td>
122
+ </tr>
123
+ <tr class="top-aligned-row context-row">
124
+ <td class="context-item-name">DEFAULT_CATELOG_PATH</td>
125
+ <td>=</td>
126
+ <td class="context-item-value">&quot;~/.interfacelift&quot;</td>
127
+ </tr>
128
+ </table>
129
+ </div>
130
+ </div>
131
+
132
+
133
+
134
+
135
+
136
+
137
+ <!-- if method_list -->
138
+
139
+
140
+ </div>
141
+
142
+
143
+ <div id="validator-badges">
144
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
145
+ </div>
146
+
147
+ </body>
148
+ </html>
@@ -0,0 +1,250 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: InterfaceLift::Catalog</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">InterfaceLift::Catalog</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/catalog_rb.html">
59
+ lib/catalog.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ Object
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+ <div id="method-list">
86
+ <h3 class="section-bar">Methods</h3>
87
+
88
+ <div class="name-list">
89
+ <a href="#M000004">git_repo?</a>&nbsp;&nbsp;
90
+ <a href="#M000001">new</a>&nbsp;&nbsp;
91
+ <a href="#M000003">theme_exists?</a>&nbsp;&nbsp;
92
+ <a href="#M000002">themes</a>&nbsp;&nbsp;
93
+ </div>
94
+ </div>
95
+
96
+ </div>
97
+
98
+
99
+ <!-- if includes -->
100
+
101
+ <div id="section">
102
+
103
+
104
+
105
+
106
+
107
+ <div id="attribute-list">
108
+ <h3 class="section-bar">Attributes</h3>
109
+
110
+ <div class="name-list">
111
+ <table>
112
+ <tr class="top-aligned-row context-row">
113
+ <td class="context-item-name">catalog_path</td>
114
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
115
+ <td class="context-item-desc"></td>
116
+ </tr>
117
+ </table>
118
+ </div>
119
+ </div>
120
+
121
+
122
+
123
+ <!-- if method_list -->
124
+ <div id="methods">
125
+ <h3 class="section-bar">Public Class methods</h3>
126
+
127
+ <div id="method-M000001" class="method-detail">
128
+ <a name="M000001"></a>
129
+
130
+ <div class="method-heading">
131
+ <a href="#M000001" class="method-signature">
132
+ <span class="method-name">new</span><span class="method-args">(catalog_path = nil)</span>
133
+ </a>
134
+ </div>
135
+
136
+ <div class="method-description">
137
+ <p><a class="source-toggle" href="#"
138
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
139
+ <div class="method-source-code" id="M000001-source">
140
+ <pre>
141
+ <span class="ruby-comment cmt"># File lib/catalog.rb, line 8</span>
142
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">catalog_path</span> = <span class="ruby-keyword kw">nil</span>)
143
+ <span class="ruby-ivar">@catalog_path</span> = <span class="ruby-identifier">catalog_path</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-value">? </span><span class="ruby-constant">DEFAULT_CATELOG_PATH</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">catalog_path</span>
144
+ <span class="ruby-keyword kw">end</span>
145
+ </pre>
146
+ </div>
147
+ </div>
148
+ </div>
149
+
150
+ <h3 class="section-bar">Public Instance methods</h3>
151
+
152
+ <div id="method-M000004" class="method-detail">
153
+ <a name="M000004"></a>
154
+
155
+ <div class="method-heading">
156
+ <a href="#M000004" class="method-signature">
157
+ <span class="method-name">git_repo?</span><span class="method-args">(theme)</span>
158
+ </a>
159
+ </div>
160
+
161
+ <div class="method-description">
162
+ <p><a class="source-toggle" href="#"
163
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
164
+ <div class="method-source-code" id="M000004-source">
165
+ <pre>
166
+ <span class="ruby-comment cmt"># File lib/catalog.rb, line 26</span>
167
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">git_repo?</span>(<span class="ruby-identifier">theme</span>)
168
+ <span class="ruby-keyword kw">begin</span>
169
+ <span class="ruby-identifier">g</span> = <span class="ruby-constant">Git</span>.<span class="ruby-identifier">open</span>(<span class="ruby-node">&quot;#{catalog_path}/#{theme}&quot;</span>)
170
+ <span class="ruby-comment cmt"># If the path does not exist it will return an ArgumentError</span>
171
+ <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ArgumentError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
172
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
173
+ <span class="ruby-keyword kw">end</span>
174
+ <span class="ruby-identifier">g</span>.<span class="ruby-identifier">index</span>.<span class="ruby-identifier">readable?</span>
175
+ <span class="ruby-keyword kw">end</span>
176
+ </pre>
177
+ </div>
178
+ </div>
179
+ </div>
180
+
181
+ <div id="method-M000003" class="method-detail">
182
+ <a name="M000003"></a>
183
+
184
+ <div class="method-heading">
185
+ <a href="#M000003" class="method-signature">
186
+ <span class="method-name">theme_exists?</span><span class="method-args">(theme)</span>
187
+ </a>
188
+ </div>
189
+
190
+ <div class="method-description">
191
+ <p>
192
+ Does the given theme exist in the working path
193
+ </p>
194
+ <p><a class="source-toggle" href="#"
195
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
196
+ <div class="method-source-code" id="M000003-source">
197
+ <pre>
198
+ <span class="ruby-comment cmt"># File lib/catalog.rb, line 22</span>
199
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">theme_exists?</span>(<span class="ruby-identifier">theme</span>)
200
+ <span class="ruby-identifier">themes</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">theme</span>)
201
+ <span class="ruby-keyword kw">end</span>
202
+ </pre>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+ <div id="method-M000002" class="method-detail">
208
+ <a name="M000002"></a>
209
+
210
+ <div class="method-heading">
211
+ <a href="#M000002" class="method-signature">
212
+ <span class="method-name">themes</span><span class="method-args">()</span>
213
+ </a>
214
+ </div>
215
+
216
+ <div class="method-description">
217
+ <p>
218
+ Retrieve <a href="Catalog.html#M000002">themes</a> from specified catalog
219
+ path
220
+ </p>
221
+ <p><a class="source-toggle" href="#"
222
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
223
+ <div class="method-source-code" id="M000002-source">
224
+ <pre>
225
+ <span class="ruby-comment cmt"># File lib/catalog.rb, line 13</span>
226
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">themes</span>
227
+ <span class="ruby-identifier">themes</span> = []
228
+ <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">glob</span>(<span class="ruby-node">&quot;#{@catalog_path}/*&quot;</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span>
229
+ <span class="ruby-identifier">themes</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">item</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span> <span class="ruby-identifier">item</span>
230
+ <span class="ruby-keyword kw">end</span>
231
+ <span class="ruby-identifier">themes</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">path</span><span class="ruby-operator">|</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;/&quot;</span>).<span class="ruby-identifier">last</span> }
232
+ <span class="ruby-keyword kw">end</span>
233
+ </pre>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+
239
+ </div>
240
+
241
+
242
+ </div>
243
+
244
+
245
+ <div id="validator-badges">
246
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
247
+ </div>
248
+
249
+ </body>
250
+ </html>