ymdp_generator 0.0.1

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,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeff Coleman
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ = ymdp_generator
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Jeff Coleman. See LICENSE for details.
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "ymdp_generator"
8
+ gem.summary = %Q{Generates new views and assets for YMDP applications.}
9
+ gem.description = %Q{Generates new views, JavaScripts, stylesheets and translation assets for Yahoo! Mail Development Platform applications.}
10
+ gem.email = "progressions@gmail.com"
11
+ gem.homepage = "http://github.com/progressions/ymdp_generator"
12
+ gem.authors = ["Jeff Coleman"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.6"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ spec.spec_opts = ['-c']
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.rcov = true
32
+ end
33
+
34
+ task :spec => :check_dependencies
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "ymdp_generator #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,54 @@
1
+ module YMDP
2
+ module FileSupport
3
+ def confirm_overwrite(path)
4
+ if File.exists?(path)
5
+ $stdout.puts "File exists: #{File.expand_path(path)}"
6
+ $stdout.print " overwrite? (y/n)"
7
+ answer = $stdin.gets
8
+
9
+ answer =~ /^y/i
10
+ else
11
+ true
12
+ end
13
+ end
14
+
15
+ # friendlier display of paths
16
+ def display_path(path)
17
+ path = File.expand_path(path)
18
+ path.gsub(BASE_PATH, "")
19
+ end
20
+
21
+ # saves the output string to the filename given
22
+ #
23
+ def save_to_file(output, filename)
24
+ unless File.exists?(filename)
25
+ File.open(filename, "w") do |w|
26
+ w.write(output)
27
+ end
28
+ end
29
+ end
30
+
31
+ # given a path and line number, returns the line and two lines previous
32
+ #
33
+ def get_line_from_file(path, line_number)
34
+ line_number = line_number.to_i
35
+ output = ""
36
+ lines = []
37
+
38
+ File.open(path) do |f|
39
+ lines = f.readlines
40
+ end
41
+
42
+ output += "\n"
43
+
44
+ 3.times do |i|
45
+ line = lines[line_number-(3-i)]
46
+ output += line if line
47
+ end
48
+
49
+ output += "\n"
50
+
51
+ output
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,226 @@
1
+ require 'support/file'
2
+ require 'erb'
3
+
4
+ # Generates new files for a new view.
5
+ #
6
+ # See YMDP::Generator::Base for more.
7
+ #
8
+ module YMDP
9
+ module Generator
10
+ # Pieces of code which will be added to existing files by the Modifications class.
11
+ #
12
+ module Snippets
13
+ # Creates a method which will launch the new view from within any other view.
14
+ #
15
+ def launcher_method(view)
16
+ view = view.downcase
17
+ class_name = view.capitalize
18
+ <<-OUTPUT
19
+
20
+ Launcher.launch#{class_name} = function() {
21
+ Launcher.launchTab("#{view}", "#{class_name}");
22
+ };
23
+ OUTPUT
24
+ end
25
+ end
26
+
27
+ module Templates
28
+ # Basic processing of templates (ERB by default).
29
+ #
30
+ class Base
31
+ include YMDP::FileSupport
32
+
33
+ attr_accessor :view, :template_path, :application_path
34
+
35
+ # View name should be a single word that's valid as a filename.
36
+ #
37
+ def initialize(view, params={})
38
+ @view = view
39
+ @template_path = params[:template_path]
40
+ @application_path = params[:application_path]
41
+
42
+ raise ArgumentError.new("template_path is required") unless @template_path
43
+ raise ArgumentError.new("application_path is required") unless @application_path
44
+ end
45
+
46
+ # Write the template to its destination_path after it has been processed.
47
+ #
48
+ def generate
49
+ write_processed_template
50
+ end
51
+
52
+ # PROCESSING
53
+
54
+ # Process this template. By default templates are processed with ERB.
55
+ #
56
+ # Override this in a child to change this behavior.
57
+ #
58
+ # _content_ should be a string, which contains the unprocessed source code
59
+ # of the file.
60
+ #
61
+ def process_template(content)
62
+ ERB.new(content, 0, "%<>").result(binding)
63
+ end
64
+
65
+ # Return the content of this file after it has been processed.
66
+ #
67
+ # Read the unprocessed content from the source_path and pass it to
68
+ # process_template and return the result.
69
+ #
70
+ def processed_template
71
+ unprocessed_content = ""
72
+ File.open(source_path) do |f|
73
+ unprocessed_content = f.read
74
+ end
75
+ process_template(unprocessed_content)
76
+ end
77
+
78
+ # FILE I/O
79
+
80
+ # Write the result of processed_template to the destination path.
81
+ #
82
+ def write_processed_template
83
+ if confirm_overwrite(destination_path)
84
+ append_to_file(destination_path, processed_template)
85
+ end
86
+ end
87
+
88
+ # Append the content to a file and log that it's happening.
89
+ #
90
+ def append_to_file(file, content)
91
+ File.open(file, "a") do |f|
92
+ $stdout.puts " #{display_path(file)} writing . . ."
93
+ f.puts content
94
+ end
95
+ end
96
+
97
+ # PATH HELPERS
98
+
99
+ # Generate the destination path for this file from its destination directory
100
+ # and its filename.
101
+ #
102
+ def destination_path
103
+ "#{destination_dir}/#{destination_filename}"
104
+ end
105
+
106
+ # Generate the source path from the template directory and the source filename.
107
+ #
108
+ def source_path
109
+ "#{template_path}/#{source_filename}"
110
+ end
111
+
112
+ # The source filename for the blank template file.
113
+ #
114
+ def source_filename
115
+ raise "Define in child"
116
+ end
117
+
118
+ # The destination filename based on the view name of this object.
119
+ #
120
+ def destination_filename
121
+ raise "Define in child"
122
+ end
123
+
124
+ # The destination directory based on the application_path and type of this object.
125
+ #
126
+ def destination_dir
127
+ raise "Define in child"
128
+ end
129
+ end
130
+
131
+ # A View is an HTML file, located at "#{BASE_PATH}/app/views/_view_.html.haml".
132
+ #
133
+ # The source template for new view files is located at "generator/templates/view.html.haml".
134
+ #
135
+ # ERB is also supported, but is not recommended.
136
+ #
137
+ class View < Base
138
+ def source_filename
139
+ "view.html.haml"
140
+ end
141
+
142
+ def destination_filename
143
+ "#{view}.html.haml"
144
+ end
145
+
146
+ def destination_dir
147
+ "#{application_path}/views"
148
+ end
149
+ end
150
+
151
+ # JavaScripts are located at "#{BASE_PATH}/app/javascripts/_view_.js".
152
+ #
153
+ # The source templates are found at "generator/templates/javascript.js"
154
+ #
155
+ class JavaScript < Base
156
+ def source_filename
157
+ "javascript.js"
158
+ end
159
+
160
+ def destination_filename
161
+ "#{view}.js"
162
+ end
163
+
164
+ def destination_dir
165
+ "#{application_path}/javascripts"
166
+ end
167
+ end
168
+
169
+ # Stylesheets are located at "#{BASE_PATH}/app/stylesheets/_view_.css".
170
+ #
171
+ # The source templates are found at "generator/templates/stylesheet.css"
172
+ #
173
+ class Stylesheet < Base
174
+ def source_filename
175
+ "stylesheet.css"
176
+ end
177
+
178
+ def destination_filename
179
+ "#{view}.css"
180
+ end
181
+
182
+ def destination_dir
183
+ "#{application_path}/stylesheets"
184
+ end
185
+ end
186
+
187
+ # JavaScripts are located at "#{BASE_PATH}/app/assets/yrb/en-US/new_view_en-US.pres".
188
+ #
189
+ # The source templates are found at "generator/templates/translation.pres"
190
+ #
191
+ class Translation < Base
192
+ def source_filename
193
+ "translation.pres"
194
+ end
195
+
196
+ def destination_filename
197
+ "new_#{view}_en-US.pres"
198
+ end
199
+
200
+ def destination_dir
201
+ "#{application_path}/assets/yrb/en-US"
202
+ end
203
+ end
204
+
205
+ # Modifications cover anything that needs to be done to existing files when a
206
+ # new view is added.
207
+ #
208
+ class Modifications < Base
209
+ include Snippets
210
+
211
+ def generate
212
+ content = launcher_method(view)
213
+ append_to_file(destination_path, content)
214
+ end
215
+
216
+ def destination_filename
217
+ "launcher.js"
218
+ end
219
+
220
+ def destination_dir
221
+ "#{application_path}/javascripts"
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,61 @@
1
+ require 'view'
2
+
3
+ # Generates a new view, with all the associated files relating to that view.
4
+ #
5
+ # Creates the following files:
6
+ #
7
+ # 1. View, at "#{BASE_PATH}/app/assets/views/_view_.html.haml"
8
+ #
9
+ # A Haml file with a single line of boilerplate copy.
10
+ #
11
+ # 2. JavaScript file, at "#{BASE_PATH}/app/javascripts/_view_.js"
12
+ #
13
+ # A complete set of the basic JavaScript functions needed to execute a page.
14
+ #
15
+ # 3. Stylesheet, at "#{BASE_PATH}/app/stylesheets/_view_.css"
16
+ #
17
+ # A blank CSS file.
18
+ #
19
+ # 4. Translation keys, at "#{BASE_PATH}/app/assets/yrb/en-US/new_view_en-US.pres"
20
+ #
21
+ # A new translation file, with a heading and a subhead key.
22
+ #
23
+ # 5. Modification
24
+ #
25
+ # Currently the only modification to any existing files is the creation of a 'launcher' method
26
+ # in "#{BASE_PATH}/app/javascripts/launcher.js"
27
+ #
28
+ # 6. Translation of new keys into all languages.
29
+ #
30
+ # Translates the new keys into all languages and creates associated ".pres" files in the
31
+ # correct subdirectories.
32
+ #
33
+ module YMDP
34
+ module Generator
35
+ # Parses the command as the first parameter and generates the appropriate files.
36
+ #
37
+ class Base
38
+ attr_accessor :template_path, :application_path
39
+
40
+ def initialize(params={})
41
+ @template_path = params[:template_path]
42
+ @application_path = params[:application_path]
43
+ end
44
+
45
+ def generate(view)
46
+ $stdout.puts "Create a new view: #{view}"
47
+
48
+ p = {
49
+ :template_path => template_path,
50
+ :application_path => application_path
51
+ }
52
+
53
+ YMDP::Generator::Templates::View.new(view, p).generate
54
+ YMDP::Generator::Templates::JavaScript.new(view, p).generate
55
+ YMDP::Generator::Templates::Stylesheet.new(view, p).generate
56
+ YMDP::Generator::Templates::Translation.new(view, p).generate
57
+ YMDP::Generator::Templates::Modifications.new(view, p).generate
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ BASE_PATH = File.dirname(__FILE__)
5
+
6
+ require 'ymdp_generator'
7
+ require 'spec'
8
+ require 'spec/autorun'
9
+
10
+ Spec::Runner.configure do |config|
11
+
12
+ end
@@ -0,0 +1,499 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Generate" do
4
+ before(:each) do
5
+ # stub screen I/O
6
+ $stdout.stub!(:puts)
7
+ $stdout.stub!(:print)
8
+
9
+ @template_path = "templates"
10
+ @application_path = "app"
11
+ @p = {
12
+ :template_path => @template_path,
13
+ :application_path => @application_path
14
+ }
15
+ end
16
+
17
+ describe "Base" do
18
+ before(:each) do
19
+ @generator = mock('generator', :generate => true)
20
+ YMDP::Generator::Templates::View.stub!(:new).and_return(@generator)
21
+ YMDP::Generator::Templates::JavaScript.stub!(:new).and_return(@generator)
22
+ YMDP::Generator::Templates::Stylesheet.stub!(:new).and_return(@generator)
23
+ YMDP::Generator::Templates::Translation.stub!(:new).and_return(@generator)
24
+ YMDP::Generator::Templates::Modifications.stub!(:new).and_return(@generator)
25
+ end
26
+
27
+ describe "new view" do
28
+ before(:each) do
29
+ @base = YMDP::Generator::Base.new(@p)
30
+ end
31
+
32
+ describe "instantiation" do
33
+ it "should create a new instance" do
34
+ @base.should_not be_nil
35
+ end
36
+
37
+ it "should set template_path" do
38
+ @base.template_path.should == @template_path
39
+ end
40
+ end
41
+
42
+ it "should generate a new view" do
43
+ YMDP::Generator::Templates::View.should_receive(:new).with("funk", @p)
44
+ @base.generate("funk")
45
+ end
46
+
47
+ it "should generate a new JavaScript" do
48
+ YMDP::Generator::Templates::JavaScript.should_receive(:new).with("funk", @p)
49
+ @base.generate("funk")
50
+ end
51
+
52
+ it "should generate a new stylesheet" do
53
+ YMDP::Generator::Templates::Stylesheet.should_receive(:new).with("funk", @p)
54
+ @base.generate("funk")
55
+ end
56
+
57
+ it "should generate a new translation" do
58
+ YMDP::Generator::Templates::Translation.should_receive(:new).with("funk", @p)
59
+ @base.generate("funk")
60
+ end
61
+
62
+ it "should generate a new set of modifications" do
63
+ YMDP::Generator::Templates::Modifications.should_receive(:new).with("funk", @p)
64
+ @base.generate("funk")
65
+ end
66
+ end
67
+ end
68
+
69
+ def stub_file_io(unprocessed_file)
70
+ # stub file I/O
71
+ @file ||= mock('file').as_null_object
72
+ @file.stub!(:read).and_return(unprocessed_file)
73
+
74
+ File.stub!(:exists?).and_return(false)
75
+ File.stub!(:open).and_yield(@file)
76
+ end
77
+
78
+ def stub_erb(processed_file)
79
+ # stub ERB
80
+ @erb ||= mock('erb').as_null_object
81
+ @erb.stub!(:result).and_return(processed_file)
82
+ ERB.stub!(:new).and_return(@erb)
83
+ end
84
+
85
+ describe "subclasses" do
86
+ before(:each) do
87
+ @view = "funk"
88
+ end
89
+
90
+ describe "View" do
91
+ before(:each) do
92
+ @view_regex = /app\/views\/#{@view}\.html\.haml/
93
+
94
+ # before and after
95
+ @unprocessed_file = "This is the <%= @view %> view."
96
+ @processed_file = "This is the #{@view} view."
97
+
98
+ @source_filename = "#{@template_path}/view.html.haml"
99
+
100
+ stub_file_io(@unprocessed_file)
101
+ stub_erb(@processed_file)
102
+
103
+ @generator = YMDP::Generator::Templates::View.new(@view, @p)
104
+ end
105
+
106
+ describe "instantiation" do
107
+ it "should make a new instance" do
108
+ @generator.should_not be_nil
109
+ end
110
+
111
+ it "should set view" do
112
+ @generator.view.should == @view
113
+ end
114
+
115
+ it "should set template_path" do
116
+ @generator.template_path.should == @template_path
117
+ end
118
+
119
+ it "should raise error without template_path" do
120
+ lambda {
121
+ YMDP::Generator::Templates::View.new(@view, :destination_dir => "destination")
122
+ }.should raise_error(ArgumentError)
123
+ end
124
+
125
+ it "should raise error without destination_dir" do
126
+ lambda {
127
+ YMDP::Generator::Templates::View.new(@view, :template_path => "templates")
128
+ }.should raise_error(ArgumentError)
129
+ end
130
+ end
131
+
132
+ describe "generation" do
133
+ it "should read the source file" do
134
+ File.should_receive(:open).with(@source_filename)
135
+ @generator.generate
136
+ end
137
+
138
+ describe "file exists" do
139
+ before(:each) do
140
+ $stdin.stub!(:gets).and_return("y")
141
+ File.stub!(:exists?).with(@view_regex).and_return(true)
142
+ end
143
+
144
+ it "should confirm the file exists" do
145
+ File.should_receive(:exists?).with(@view_regex).and_return(false)
146
+ @generator.generate
147
+ end
148
+
149
+ it "should prompt to overwrite if the file exists" do
150
+ $stdout.should_receive(:print).with(/overwrite\?/)
151
+ @generator.generate
152
+ end
153
+
154
+ it "should overwrite if the answer is no" do
155
+ File.should_receive(:open).with(@view_regex, "a")
156
+ @generator.generate
157
+ end
158
+
159
+ it "should not overwrite if the answer is no" do
160
+ $stdin.stub!(:gets).and_return("n")
161
+ File.should_not_receive(:open).with(@view_regex, "a")
162
+ @generator.generate
163
+ end
164
+ end
165
+
166
+ describe "processing" do
167
+ it "should instantiate ERB" do
168
+ ERB.should_receive(:new).with(@unprocessed_file, anything, anything).and_return(@erb)
169
+ @generator.generate
170
+ end
171
+
172
+ it "should get result from ERB" do
173
+ @erb.should_receive(:result)
174
+ @generator.generate
175
+ end
176
+
177
+ it "should write the processed result" do
178
+ @file.should_receive(:puts).with(@processed_file)
179
+ @generator.generate
180
+ end
181
+ end
182
+
183
+ it "should write the file" do
184
+ File.should_receive(:open).with(@view_regex, "a")
185
+ @generator.generate
186
+ end
187
+ end
188
+ end
189
+
190
+ describe "JavaScript" do
191
+ before(:each) do
192
+ @view_regex = /app\/javascripts\/#{@view}\.js/
193
+
194
+ # before and after
195
+ @unprocessed_file = "This is the <%= @view %> JavaScript."
196
+ @processed_file = "This is the #{@view} JavaScript."
197
+
198
+ @source_filename = "#{@template_path}/javascript.js"
199
+
200
+ stub_file_io(@unprocessed_file)
201
+ stub_erb(@processed_file)
202
+
203
+ @generator = YMDP::Generator::Templates::JavaScript.new(@view, @p)
204
+ end
205
+
206
+ describe "instantiation" do
207
+ it "should make a new instance" do
208
+ @generator.should_not be_nil
209
+ end
210
+
211
+ it "should set view" do
212
+ @generator.view.should == @view
213
+ end
214
+
215
+ it "should set template_path" do
216
+ @generator.template_path.should == @template_path
217
+ end
218
+ end
219
+
220
+ describe "generation" do
221
+ it "should read the source file" do
222
+ File.should_receive(:open).with(@source_filename)
223
+ @generator.generate
224
+ end
225
+
226
+ describe "file exists" do
227
+ before(:each) do
228
+ $stdin.stub!(:gets).and_return("y")
229
+ File.stub!(:exists?).with(@view_regex).and_return(true)
230
+ end
231
+
232
+ it "should confirm the file exists" do
233
+ File.should_receive(:exists?).with(@view_regex).and_return(false)
234
+ @generator.generate
235
+ end
236
+
237
+ it "should prompt to overwrite if the file exists" do
238
+ $stdout.should_receive(:print).with(/overwrite\?/)
239
+ @generator.generate
240
+ end
241
+
242
+ it "should overwrite if the answer is no" do
243
+ File.should_receive(:open).with(@view_regex, "a")
244
+ @generator.generate
245
+ end
246
+
247
+ it "should not overwrite if the answer is no" do
248
+ $stdin.stub!(:gets).and_return("n")
249
+ File.should_not_receive(:open).with(@view_regex, "a")
250
+ @generator.generate
251
+ end
252
+ end
253
+
254
+ describe "processing" do
255
+ it "should instantiate ERB" do
256
+ ERB.should_receive(:new).with(@unprocessed_file, anything, anything).and_return(@erb)
257
+ @generator.generate
258
+ end
259
+
260
+ it "should get result from ERB" do
261
+ @erb.should_receive(:result)
262
+ @generator.generate
263
+ end
264
+
265
+ it "should write the processed result" do
266
+ @file.should_receive(:puts).with(@processed_file)
267
+ @generator.generate
268
+ end
269
+ end
270
+
271
+ it "should write the file" do
272
+ File.should_receive(:open).with(@view_regex, "a")
273
+ @generator.generate
274
+ end
275
+ end
276
+ end
277
+
278
+ describe "Stylesheet" do
279
+ before(:each) do
280
+ @view_regex = /app\/stylesheets\/#{@view}\.css/
281
+
282
+ # before and after
283
+ @unprocessed_file = "This is the <%= @view %> stylesheet."
284
+ @processed_file = "This is the #{@view} stylesheet."
285
+
286
+ @source_filename = "#{@template_path}/stylesheet.css"
287
+
288
+ stub_file_io(@unprocessed_file)
289
+ stub_erb(@processed_file)
290
+
291
+ @generator = YMDP::Generator::Templates::Stylesheet.new(@view, @p)
292
+ end
293
+
294
+ describe "instantiation" do
295
+ it "should make a new instance" do
296
+ @generator.should_not be_nil
297
+ end
298
+
299
+ it "should set view" do
300
+ @generator.view.should == @view
301
+ end
302
+
303
+ it "should set template_path" do
304
+ @generator.template_path.should == @template_path
305
+ end
306
+ end
307
+
308
+ describe "generation" do
309
+ it "should read the source file" do
310
+ File.should_receive(:open).with(@source_filename)
311
+ @generator.generate
312
+ end
313
+
314
+ describe "file exists" do
315
+ before(:each) do
316
+ $stdin.stub!(:gets).and_return("y")
317
+ File.stub!(:exists?).with(@view_regex).and_return(true)
318
+ end
319
+
320
+ it "should confirm the file exists" do
321
+ File.should_receive(:exists?).with(@view_regex).and_return(false)
322
+ @generator.generate
323
+ end
324
+
325
+ it "should prompt to overwrite if the file exists" do
326
+ $stdout.should_receive(:print).with(/overwrite\?/)
327
+ @generator.generate
328
+ end
329
+
330
+ it "should overwrite if the answer is no" do
331
+ File.should_receive(:open).with(@view_regex, "a")
332
+ @generator.generate
333
+ end
334
+
335
+ it "should not overwrite if the answer is no" do
336
+ $stdin.stub!(:gets).and_return("n")
337
+ File.should_not_receive(:open).with(@view_regex, "a")
338
+ @generator.generate
339
+ end
340
+ end
341
+
342
+ describe "processing" do
343
+ it "should instantiate ERB" do
344
+ ERB.should_receive(:new).with(@unprocessed_file, anything, anything).and_return(@erb)
345
+ @generator.generate
346
+ end
347
+
348
+ it "should get result from ERB" do
349
+ @erb.should_receive(:result)
350
+ @generator.generate
351
+ end
352
+
353
+ it "should write the processed result" do
354
+ @file.should_receive(:puts).with(@processed_file)
355
+ @generator.generate
356
+ end
357
+ end
358
+
359
+ it "should write the file" do
360
+ File.should_receive(:open).with(@view_regex, "a")
361
+ @generator.generate
362
+ end
363
+ end
364
+ end
365
+
366
+ describe "Translation" do
367
+ before(:each) do
368
+ @view_regex = /app\/assets\/yrb\/en-US\/new_#{@view}_en-US\.pres/
369
+
370
+ # before and after
371
+ @unprocessed_file = "This is the <%= @view %> translation."
372
+ @processed_file = "This is the #{@view} translation."
373
+
374
+ @source_filename = "#{@template_path}/translation.pres"
375
+
376
+ stub_file_io(@unprocessed_file)
377
+ stub_erb(@processed_file)
378
+
379
+ @generator = YMDP::Generator::Templates::Translation.new(@view, @p)
380
+ end
381
+
382
+ describe "instantiation" do
383
+ it "should make a new instance" do
384
+ @generator.should_not be_nil
385
+ end
386
+
387
+ it "should set view" do
388
+ @generator.view.should == @view
389
+ end
390
+
391
+ it "should set template_path" do
392
+ @generator.template_path.should == @template_path
393
+ end
394
+ end
395
+
396
+ describe "generation" do
397
+ it "should read the source file" do
398
+ File.should_receive(:open).with(@source_filename)
399
+ @generator.generate
400
+ end
401
+
402
+ describe "file exists" do
403
+ before(:each) do
404
+ $stdin.stub!(:gets).and_return("y")
405
+ File.stub!(:exists?).with(@view_regex).and_return(true)
406
+ end
407
+
408
+ it "should confirm the file exists" do
409
+ File.should_receive(:exists?).with(@view_regex).and_return(false)
410
+ @generator.generate
411
+ end
412
+
413
+ it "should prompt to overwrite if the file exists" do
414
+ $stdout.should_receive(:print).with(/overwrite\?/)
415
+ @generator.generate
416
+ end
417
+
418
+ it "should overwrite if the answer is no" do
419
+ File.should_receive(:open).with(@view_regex, "a")
420
+ @generator.generate
421
+ end
422
+
423
+ it "should not overwrite if the answer is no" do
424
+ $stdin.stub!(:gets).and_return("n")
425
+ File.should_not_receive(:open).with(@view_regex, "a")
426
+ @generator.generate
427
+ end
428
+ end
429
+
430
+ describe "processing" do
431
+ it "should instantiate ERB" do
432
+ ERB.should_receive(:new).with(@unprocessed_file, anything, anything).and_return(@erb)
433
+ @generator.generate
434
+ end
435
+
436
+ it "should get result from ERB" do
437
+ @erb.should_receive(:result)
438
+ @generator.generate
439
+ end
440
+
441
+ it "should write the processed result" do
442
+ @file.should_receive(:puts).with(@processed_file)
443
+ @generator.generate
444
+ end
445
+ end
446
+
447
+ it "should write the file" do
448
+ File.should_receive(:open).with(@view_regex, "a")
449
+ @generator.generate
450
+ end
451
+ end
452
+ end
453
+
454
+ describe "Modifications" do
455
+ before(:each) do
456
+ @view_regex = /app\/javascripts\/#{@view}\.js/
457
+
458
+ # before and after
459
+ @unprocessed_file = "This is the <%= @view %> JavaScript."
460
+ @processed_file = "Launcher.launch#{@view.capitalize}"
461
+
462
+ @source_filename = "app/javascripts/launcher.js"
463
+
464
+ stub_file_io(@unprocessed_file)
465
+ stub_erb(@processed_file)
466
+
467
+ @generator = YMDP::Generator::Templates::Modifications.new(@view, @p)
468
+ end
469
+
470
+ describe "instantiation" do
471
+ it "should make a new instance" do
472
+ @generator.should_not be_nil
473
+ end
474
+
475
+ it "should set view" do
476
+ @generator.view.should == @view
477
+ end
478
+
479
+ it "should set template_path" do
480
+ @generator.template_path.should == @template_path
481
+ end
482
+ end
483
+
484
+ describe "generation" do
485
+ it "should read the source file" do
486
+ File.should_receive(:open).with(/#{@source_filename}$/, "a")
487
+ @generator.generate
488
+ end
489
+
490
+ describe "processing" do
491
+ it "should write the processed result" do
492
+ @file.should_receive(:puts).with(/#{@processed_file}/)
493
+ @generator.generate
494
+ end
495
+ end
496
+ end
497
+ end
498
+ end
499
+ end
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ymdp_generator}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeff Coleman"]
12
+ s.date = %q{2010-01-14}
13
+ s.description = %q{Generates new views, JavaScripts, stylesheets and translation assets for Yahoo! Mail Development Platform applications.}
14
+ s.email = %q{progressions@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/support/file.rb",
27
+ "lib/view.rb",
28
+ "lib/ymdp_generator.rb",
29
+ "spec/spec.opts",
30
+ "spec/spec_helper.rb",
31
+ "spec/ymdp_generator_spec.rb",
32
+ "ymdp_generator.gemspec"
33
+ ]
34
+ s.homepage = %q{http://github.com/progressions/ymdp_generator}
35
+ s.rdoc_options = ["--charset=UTF-8"]
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = %q{1.3.5}
38
+ s.summary = %q{Generates new views and assets for YMDP applications.}
39
+ s.test_files = [
40
+ "spec/spec_helper.rb",
41
+ "spec/ymdp_generator_spec.rb"
42
+ ]
43
+
44
+ if s.respond_to? :specification_version then
45
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
49
+ s.add_development_dependency(%q<rspec>, [">= 1.2.6"])
50
+ else
51
+ s.add_dependency(%q<rspec>, [">= 1.2.6"])
52
+ end
53
+ else
54
+ s.add_dependency(%q<rspec>, [">= 1.2.6"])
55
+ end
56
+ end
57
+
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ymdp_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jeff Coleman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-14 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.6
24
+ version:
25
+ description: Generates new views, JavaScripts, stylesheets and translation assets for Yahoo! Mail Development Platform applications.
26
+ email: progressions@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - LICENSE
33
+ - README.rdoc
34
+ files:
35
+ - .document
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - VERSION
41
+ - lib/support/file.rb
42
+ - lib/view.rb
43
+ - lib/ymdp_generator.rb
44
+ - spec/spec.opts
45
+ - spec/spec_helper.rb
46
+ - spec/ymdp_generator_spec.rb
47
+ - ymdp_generator.gemspec
48
+ has_rdoc: true
49
+ homepage: http://github.com/progressions/ymdp_generator
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.3.5
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Generates new views and assets for YMDP applications.
76
+ test_files:
77
+ - spec/spec_helper.rb
78
+ - spec/ymdp_generator_spec.rb