choctop 0.9.6 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,13 @@
1
+ == 0.10.0 2009-06-11
2
+
3
+ * Extra files supported: +add_file 'project/path/to/file_or_folder_or_bundle', :position => [x, y]+
4
+
5
+ == 0.9.7 2009-05-17
6
+
7
+ * New config option: s.build_type = ENV['BUILD_TYPE'] || 'Release' [kdbdallas]
8
+ * permit SUFeedURL to not be specified (cleanly exit from deploy rake tasks)
9
+ * removed unused 'appcast' rake task
10
+
1
11
  == 0.9.6 2009-02-10
2
12
 
3
13
  * Custom Applications Icons!!!
@@ -38,27 +38,36 @@ features/fixtures/App With Whitespace/main.m
38
38
  features/fixtures/SampleApp/English.lproj/InfoPlist.strings
39
39
  features/fixtures/SampleApp/English.lproj/MainMenu.xib
40
40
  features/fixtures/SampleApp/Info.plist
41
+ features/fixtures/SampleApp/README.txt
41
42
  features/fixtures/SampleApp/SampleApp.xcodeproj/TemplateIcon.icns
42
43
  features/fixtures/SampleApp/SampleApp.xcodeproj/project.pbxproj
43
44
  features/fixtures/SampleApp/SampleApp_Prefix.pch
45
+ features/fixtures/SampleApp/build/Release/README.txt
46
+ features/fixtures/SampleApp/build/Release/dmg/README.txt
44
47
  features/fixtures/SampleApp/main.m
45
48
  features/fixtures/custom_assets/appicon.icns
46
49
  features/initial_generator.feature
47
50
  features/rake_tasks.feature
48
51
  features/sparkle_feed.feature
49
- features/steps/common.rb
50
- features/steps/dmg_steps.rb
51
- features/steps/env.rb
52
- features/steps/file_attribute_steps.rb
53
- features/steps/generator.rb
54
- features/steps/remote.rb
55
- features/steps/xcode_steps.rb
52
+ features/step_definitions/common_steps.rb
53
+ features/step_definitions/dmg_steps.rb
54
+ features/step_definitions/file_attribute_steps.rb
55
+ features/step_definitions/generator_steps.rb
56
+ features/step_definitions/remote_steps.rb
57
+ features/step_definitions/xcode_steps.rb
58
+ features/support/common.rb
59
+ features/support/env.rb
60
+ features/support/matchers.rb
56
61
  lib/choctop.rb
57
62
  lib/choctop/appcast.rb
58
63
  lib/choctop/dmg.rb
59
64
  script/console
60
65
  script/destroy
61
66
  script/generate
67
+ spec/choctop_spec.rb
68
+ spec/spec.opts
69
+ spec/spec_helper.rb
70
+ tasks/rspec.rake
62
71
  website/_layouts/default.html
63
72
  website/_layouts/post.html
64
73
  website/_posts/2009-02-02-first-post.markdown
@@ -52,17 +52,21 @@ to the end:
52
52
  require "choctop"
53
53
 
54
54
  ChocTop.new do |s|
55
- s.host = 'project.com'
56
55
  s.remote_dir = '/path/to/upload/root/of/app'
57
56
 
58
57
  # Optional, showing defaults
59
- s.base_url = "http://#{s.host}"
58
+ s.host = host from Info.plist['SUFeedURL']
59
+ s.base_url = "http://#{s.host}"
60
60
  s.release_notes = "release_notes.html"
61
61
 
62
62
  # Custom DMG
63
63
  s.background_file = "background.jpg"
64
64
  s.app_icon_position = [100, 90]
65
65
  s.applications_icon_position = [400, 90]
66
+ s.applications_icon = "applications.icns"
67
+
68
+ # Extra files
69
+ s.add_file 'path/to/README.txt', :position => [250, 90]
66
70
 
67
71
  # Custom DMG options
68
72
  s.volume_icon = "dmg.icns"
@@ -131,4 +135,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
131
135
  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
132
136
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
133
137
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
134
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
138
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -4,9 +4,8 @@ require "rake"
4
4
  require "choctop"
5
5
 
6
6
  ChocTop.new do |s|
7
- # Remote upload target
8
- s.host = '<%= urlname %>.com'
9
- # s.base_url = "http://#{s.host}"
7
+ # Remote upload target (set host if not same as Info.plist['SUFeedURL'])
8
+ # s.host = '<%= urlname %>.com'
10
9
  s.remote_dir = '/path/to/upload/root/of/app'
11
10
 
12
11
  # Custom DMG
@@ -6,8 +6,8 @@ Feature: Development processes of newgem itself (rake tasks)
6
6
 
7
7
  Scenario: Generate RubyGem
8
8
  Given this project is active project folder
9
- And 'pkg' folder is deleted
10
- When task 'rake gem' is invoked
11
- Then folder 'pkg' is created
12
- And file with name matching 'pkg/*.gem' is created else you should run "rake manifest" to fix this
13
- And gem spec key 'rdoc_options' contains /--mainREADME.rdoc/
9
+ And "pkg" folder is deleted
10
+ When I invoke task "rake gem"
11
+ Then folder "pkg" is created
12
+ And file with name matching "pkg/*.gem" is created else you should run "rake manifest" to fix this
13
+ And gem spec key "rdoc_options" contains /--mainREADME.rdoc/
@@ -4,36 +4,42 @@ Feature: Can build a customised DMG image from application build
4
4
  I want a rake task to generate a DMG based on custom settings
5
5
 
6
6
  Scenario: Build a DMG with default custom DMG config
7
- Given a Cocoa app with choctop installed called 'SampleApp'
8
- When task 'rake dmg' is invoked
9
- Then file 'appcast/build/SampleApp-0.1.0.dmg' is created
10
- When dmg 'appcast/build/SampleApp-0.1.0.dmg' is mounted as 'SampleApp'
11
- Then folder 'SampleApp.app' in mounted volume is created
12
- And file 'Applications' in mounted volume is created
13
- And file '.background/background.jpg' in mounted volume is created
14
- And file '.background/background.jpg' in mounted volume is invisible
15
- And file '.VolumeIcon.icns' in mounted volume is created
7
+ Given a Cocoa app with choctop installed called "SampleApp"
8
+ When I invoke task "rake dmg"
9
+ Then file "appcast/build/SampleApp-0.1.0.dmg" is created
10
+ When dmg "appcast/build/SampleApp-0.1.0.dmg" is mounted as "SampleApp"
11
+ Then folder "SampleApp.app" in mounted volume is created
12
+ And file "Applications" in mounted volume is created
13
+ And file ".background/background.jpg" in mounted volume is created
14
+ And file ".background/background.jpg" in mounted volume is invisible
15
+ And file ".VolumeIcon.icns" in mounted volume is created
16
16
 
17
17
  Scenario: Build a DMG with a whitespace name
18
- Given a Cocoa app with choctop installed called 'App With Whitespace'
19
- When task 'rake dmg' is invoked
20
- Then file 'appcast/build/App With Whitespace-1.0.dmg' is created
21
- When dmg 'appcast/build/App With Whitespace-1.0.dmg' is mounted as 'App With Whitespace'
22
- Then folder 'App With Whitespace.app' in mounted volume is created
23
- And file 'Applications' in mounted volume is created
24
- And file '.background/background.jpg' in mounted volume is created
25
- And file '.background/background.jpg' in mounted volume is invisible
26
- And file '.VolumeIcon.icns' in mounted volume is created
18
+ Given a Cocoa app with choctop installed called "App With Whitespace"
19
+ When I invoke task "rake dmg"
20
+ Then file "appcast/build/App With Whitespace-1.0.dmg" is created
21
+ When dmg "appcast/build/App With Whitespace-1.0.dmg" is mounted as "App With Whitespace"
22
+ Then folder "App With Whitespace.app" in mounted volume is created
23
+ And file "Applications" in mounted volume is created
24
+ And file ".background/background.jpg" in mounted volume is created
25
+ And file ".background/background.jpg" in mounted volume is invisible
26
+ And file ".VolumeIcon.icns" in mounted volume is created
27
27
 
28
28
  Scenario: Build a DMG with custom Applications symlink icon
29
- Given a Cocoa app with choctop installed called 'SampleApp'
29
+ Given a Cocoa app with choctop installed called "SampleApp"
30
30
  And is configured for custom Applications icon
31
- When task 'rake dmg' is invoked
32
- And dmg 'appcast/build/SampleApp-0.1.0.dmg' is mounted as 'SampleApp'
33
- Then file 'Applications' in mounted volume is created
34
- And file 'Applications' in mounted volume has GetFileInfo type '"fdrp"'
35
- And file 'Applications' in mounted volume has GetFileInfo alias '1'
36
- And file 'Applications' in mounted volume has GetFileInfo custom icon '1'
37
- And file 'Applications' in mounted volume is aliased to '/Applications'
38
-
39
-
31
+ When I invoke task "rake dmg"
32
+ And dmg "appcast/build/SampleApp-0.1.0.dmg" is mounted as "SampleApp"
33
+ Then file "Applications" in mounted volume is created
34
+ And file "Applications" in mounted volume has GetFileInfo type ""fdrp""
35
+ And file "Applications" in mounted volume has GetFileInfo alias "1"
36
+ And file "Applications" in mounted volume has GetFileInfo custom icon "1"
37
+ And file "Applications" in mounted volume is aliased to "/Applications"
38
+
39
+ Scenario: Build a DMG with extra included file such as README in the project folder
40
+ Given a Cocoa app with choctop installed called "SampleApp"
41
+ And is configured for an asset file "README.txt" to be included in dmg
42
+ When I invoke task "rake dmg"
43
+ And dmg "appcast/build/SampleApp-0.1.0.dmg" is mounted as "SampleApp"
44
+ And file "README.txt" in mounted volume is created
45
+ And file "SampleApp.app.dSYM" in mounted volume is not created
@@ -0,0 +1 @@
1
+ This is the README for the SampleApp
@@ -0,0 +1 @@
1
+ This is the README for the SampleApp
@@ -0,0 +1 @@
1
+ This is the README for the SampleApp
@@ -5,20 +5,20 @@ Feature: Setup a Cocoa app with choctop
5
5
 
6
6
  Scenario: Install choctop into an app that has no existing Rakefile
7
7
  Given a Cocoa app that does not have an existing Rakefile
8
- When I run local executable 'install_choctop' with arguments '.'
8
+ When I run local executable "install_choctop" with arguments "."
9
9
  And Rakefile wired to use development code instead of installed RubyGem
10
- Then file 'Rakefile' is created
11
- And output does match /rake build/
12
- And output does match /rake upload/
10
+ Then file "Rakefile" is created
11
+ And I should see /rake build/
12
+ And I should see /rake upload/
13
13
 
14
- Scenario: Run 'install_choctop' without arguments shows an error
14
+ Scenario: Run "install_choctop" without arguments shows an error
15
15
  Given a Cocoa app that does not have an existing Rakefile
16
- When I run local executable 'install_choctop' with arguments ''
17
- Then output does match /USAGE: install_choctop path\/to\/CocoaApp/
16
+ When I run local executable "install_choctop" with arguments ""
17
+ Then I should see /USAGE: install_choctop path/to/CocoaApp/
18
18
 
19
19
  Scenario: Install choctop and generate a release_notes file
20
20
  Given a Cocoa app that does not have an existing Rakefile
21
- When I run local executable 'install_choctop' with arguments '.'
22
- Then file 'release_notes.txt' is created
23
- And contents of file 'release_notes.txt' does match /Initial release/
21
+ When I run local executable "install_choctop" with arguments "."
22
+ Then file "release_notes.txt" is created
23
+ And file "release_notes.txt" contents does match /Initial release/
24
24
 
@@ -4,27 +4,27 @@ Feature: Rake tasks are available to build and deploy Cocoa apps with Sparkle
4
4
  I want rake tasks to build and deploy my Cocoa app
5
5
 
6
6
  Scenario: rake task to build Release of app
7
- Given a Cocoa app with choctop installed called 'SampleApp'
8
- When task 'rake build' is invoked
9
- Then folder 'build/Release/SampleApp.app' is created
7
+ Given a Cocoa app with choctop installed called "SampleApp"
8
+ When I invoke task "rake build"
9
+ Then folder "build/Release/SampleApp.app" is created
10
10
 
11
11
  Scenario: rake task to create dmg file of build
12
- Given a Cocoa app with choctop installed called 'SampleApp'
13
- When task 'rake dmg' is invoked
14
- Then file 'appcast/build/SampleApp-0.1.0.dmg' is created
12
+ Given a Cocoa app with choctop installed called "SampleApp"
13
+ When I invoke task "rake dmg"
14
+ Then file "appcast/build/SampleApp-0.1.0.dmg" is created
15
15
 
16
16
  Scenario: rake task to upload the appcast file to the server
17
- Given a Cocoa app with choctop installed called 'SampleApp'
18
- And task 'rake dmg feed' is invoked
17
+ Given a Cocoa app with choctop installed called "SampleApp"
18
+ And I invoke task "rake dmg feed"
19
19
  And ChocTop config is configured for local rsync
20
- When task 'rake upload' is invoked
21
- Then remote file 'my_feed.xml' is created
22
- Then remote file 'SampleApp-0.1.0.dmg' is created
23
- Then remote file 'index.php' is created
20
+ When I invoke task "rake upload"
21
+ Then remote file "my_feed.xml" is created
22
+ Then remote file "SampleApp-0.1.0.dmg" is created
23
+ Then remote file "index.php" is created
24
24
 
25
25
  Scenario: change the version number in the Info.plist
26
- Given a Cocoa app with choctop installed called 'SampleApp'
27
- When task 'rake version:set VERSION="1.2.3"' is invoked
28
- Then current xcode project version is '1.2.3'
26
+ Given a Cocoa app with choctop installed called "SampleApp"
27
+ When I invoke task "rake version:set VERSION="1.2.3""
28
+ Then current xcode project version is "1.2.3"
29
29
 
30
30
 
@@ -4,35 +4,35 @@ Feature: Generate an XML file for Sparkle to use for updates
4
4
  I want to generate an XML file for the Sparkle framework
5
5
 
6
6
  Scenario: rake task to create/update the appcast file
7
- Given a Cocoa app with choctop installed called 'SampleApp'
7
+ Given a Cocoa app with choctop installed called "SampleApp"
8
8
  And ChocTop config is configured for remote Sparkle
9
- When task 'rake dmg feed' is invoked
10
- Then file 'appcast/build/my_feed.xml' is created
11
- And contents of file 'appcast/build/my_feed.xml' does match /<channel>/
12
- And contents of file 'appcast/build/my_feed.xml' does match /</channel>/
13
- And contents of file 'appcast/build/my_feed.xml' does match /<pubDate>/
14
- And contents of file 'appcast/build/my_feed.xml' does match /<item>/
15
- And contents of file 'appcast/build/my_feed.xml' does match /<title>SampleApp 0.1.0</title>/
16
- And contents of file 'appcast/build/my_feed.xml' does match /href="http://mocra.com/sample_app/my_feed.xml"/
17
- And contents of file 'appcast/build/my_feed.xml' does match /<sparkle:releaseNotesLink>http://mocra.com/sample_app/release_notes.html</sparkle:releaseNotesLink>/
18
- And file 'appcast/build/index.php' is created
19
- And contents of file 'appcast/build/index.php' does match /Location/
20
- And contents of file 'appcast/build/index.php' does match /SampleApp-0.1.0.dmg/
21
- And file 'appcast/build/release_notes.html' is created
22
- And contents of file 'appcast/build/release_notes.html' does match /0.1.0/
23
- And contents of file 'appcast/build/release_notes.html' does match /<h2>Initial release</h2>/
24
- And contents of file 'appcast/build/release_notes.html' does match /<p>Yay! First release.</p>/
25
- And contents of file 'appcast/build/release_notes.html' does match /<html>/
9
+ When I invoke task "rake dmg feed"
10
+ Then file "appcast/build/my_feed.xml" is created
11
+ And file "appcast/build/my_feed.xml" contents does match /<channel>/
12
+ And file "appcast/build/my_feed.xml" contents does match /</channel>/
13
+ And file "appcast/build/my_feed.xml" contents does match /<pubDate>/
14
+ And file "appcast/build/my_feed.xml" contents does match /<item>/
15
+ And file "appcast/build/my_feed.xml" contents does match /<title>SampleApp 0.1.0</title>/
16
+ And file "appcast/build/my_feed.xml" contents does match /href="http://mocra.com/sample_app/my_feed.xml"/
17
+ And file "appcast/build/my_feed.xml" contents does match /<sparkle:releaseNotesLink>http://mocra.com/sample_app/release_notes.html</sparkle:releaseNotesLink>/
18
+ And file "appcast/build/index.php" is created
19
+ And file "appcast/build/index.php" contents does match /Location/
20
+ And file "appcast/build/index.php" contents does match /SampleApp-0.1.0.dmg/
21
+ And file "appcast/build/release_notes.html" is created
22
+ And file "appcast/build/release_notes.html" contents does match /0.1.0/
23
+ And file "appcast/build/release_notes.html" contents does match /<h2>Initial release</h2>/
24
+ And file "appcast/build/release_notes.html" contents does match /<p>Yay! First release.</p>/
25
+ And file "appcast/build/release_notes.html" contents does match /<html>/
26
26
 
27
27
  Scenario: generate default release notes if no release_notes.txt
28
- Given a Cocoa app with choctop installed called 'SampleApp'
28
+ Given a Cocoa app with choctop installed called "SampleApp"
29
29
  And ChocTop config is configured for remote Sparkle
30
- And file 'release_notes.txt' is deleted
31
- When task 'rake dmg feed' is invoked
32
- Then file 'appcast/build/release_notes.html' is created
33
- And contents of file 'appcast/build/release_notes.html' does match /0.1.0/
34
- And contents of file 'appcast/build/release_notes.html' does match /<h2>Another awesome release!</h2>/
35
- And contents of file 'appcast/build/release_notes.html' does match /<html>/
30
+ And "release_notes.txt" file is deleted
31
+ When I invoke task "rake dmg feed"
32
+ Then file "appcast/build/release_notes.html" is created
33
+ And file "appcast/build/release_notes.html" contents does match /0.1.0/
34
+ And file "appcast/build/release_notes.html" contents does match /<h2>Initial release</h2>/
35
+ And file "appcast/build/release_notes.html" contents does match /<html>/
36
36
 
37
37
 
38
38
 
@@ -0,0 +1,177 @@
1
+ Given /^a safe folder/ do
2
+ FileUtils.rm_rf @tmp_root = File.dirname(__FILE__) + "/../../tmp"
3
+ FileUtils.mkdir_p @tmp_root
4
+ FileUtils.mkdir_p @home_path = File.expand_path(File.join(@tmp_root, "home"))
5
+ @lib_path = File.expand_path(File.dirname(__FILE__) + '/../../lib')
6
+ Given %Q{env variable $HOME set to "#{@home_path}"}
7
+ end
8
+
9
+ Given /^this project is active project folder/ do
10
+ Given "a safe folder"
11
+ @active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
12
+ end
13
+
14
+ Given /^env variable \$([\w_]+) set to "(.*)"/ do |env_var, value|
15
+ ENV[env_var] = value
16
+ end
17
+
18
+ Given /"(.*)" (folder|file) is deleted/ do |type, file|
19
+ in_project_folder { FileUtils.rm_rf file }
20
+ end
21
+
22
+ When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
23
+ @stdout = StringIO.new
24
+ in_project_folder do
25
+ if Object.const_defined?("APP_ROOT")
26
+ APP_ROOT.replace(FileUtils.pwd)
27
+ else
28
+ APP_ROOT = FileUtils.pwd
29
+ end
30
+ run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
31
+ end
32
+ File.open(File.join(@tmp_root, "generator.out"), "w") do |f|
33
+ @stdout.rewind
34
+ f << @stdout.read
35
+ end
36
+ end
37
+
38
+ When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
39
+ @stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
40
+ in_project_folder do
41
+ system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
42
+ end
43
+ end
44
+
45
+ When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
46
+ @stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
47
+ in_project_folder do
48
+ system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
49
+ end
50
+ end
51
+
52
+ When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
53
+ @stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
54
+ executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
55
+ in_project_folder do
56
+ system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
57
+ end
58
+ end
59
+
60
+ When /^I invoke task "rake (.*)"/ do |task|
61
+ @stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
62
+ in_project_folder do
63
+ system "rake #{task} --trace > #{@stdout} 2> #{@stdout}"
64
+ end
65
+ end
66
+
67
+ Then /^folder "(.*)" (is|is not) created/ do |folder, is|
68
+ in_project_folder do
69
+ File.exists?(folder).should(is == 'is' ? be_true : be_false)
70
+ end
71
+ end
72
+
73
+ Then /^file "(.*)" (is|is not) created/ do |file, is|
74
+ in_project_folder do
75
+ File.exists?(file).should(is == 'is' ? be_true : be_false)
76
+ end
77
+ end
78
+
79
+ Then /^file with name matching "(.*)" is created/ do |pattern|
80
+ in_project_folder do
81
+ Dir[pattern].should_not be_empty
82
+ end
83
+ end
84
+
85
+ Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
86
+ in_project_folder do
87
+ actual_output = File.read(file)
88
+ (does == 'does') ?
89
+ actual_output.should(match(/#{regex}/)) :
90
+ actual_output.should_not(match(/#{regex}/))
91
+ end
92
+ end
93
+
94
+ Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
95
+ File.exists?(gem_file).should be_true
96
+ File.exists?(project_file).should be_true
97
+ gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
98
+ project_file_contents = File.read(File.join(@active_project_folder, project_file))
99
+ project_file_contents.should == gem_file_contents
100
+ end
101
+
102
+ Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
103
+ actual_output = File.read(@stdout)
104
+ does_invoke == "does" ?
105
+ actual_output.should(match(/dependency\s+#{generator}/)) :
106
+ actual_output.should_not(match(/dependency\s+#{generator}/))
107
+ end
108
+
109
+ Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
110
+ actual_output = File.read(@stdout)
111
+ actual_output.should match(/#{opt1}/)
112
+ actual_output.should match(/#{opt2}/)
113
+ end
114
+
115
+ Then /^I should see$/ do |text|
116
+ actual_output = File.read(@stdout)
117
+ actual_output.should contain(text)
118
+ end
119
+
120
+ Then %r{^I should see /(.*)/$} do |text|
121
+ actual_output = File.read(@stdout)
122
+ actual_output.should contain(text)
123
+ end
124
+
125
+ Then /^I should not see$/ do |text|
126
+ actual_output = File.read(@stdout)
127
+ actual_output.should_not contain(text)
128
+ end
129
+
130
+ Then /^I should see exactly$/ do |text|
131
+ actual_output = File.read(@stdout)
132
+ actual_output.should == text
133
+ end
134
+
135
+ Then /^I should see all (\d+) tests pass/ do |expected_test_count|
136
+ expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
137
+ actual_output = File.read(@stdout)
138
+ actual_output.should match(expected)
139
+ end
140
+
141
+ Then /^I should see all (\d+) examples pass/ do |expected_test_count|
142
+ expected = %r{^#{expected_test_count} examples?, 0 failures}
143
+ actual_output = File.read(@stdout)
144
+ actual_output.should match(expected)
145
+ end
146
+
147
+ Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
148
+ in_project_folder do
149
+ yaml = eval yaml
150
+ YAML.load(File.read(file)).should == yaml
151
+ end
152
+ end
153
+
154
+ Then /^Rakefile can display tasks successfully/ do
155
+ @stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
156
+ in_project_folder do
157
+ system "rake -T > #{@stdout} 2> #{@stdout}"
158
+ end
159
+ actual_output = File.read(@stdout)
160
+ actual_output.should match(/^rake\s+\w+\s+#\s.*/)
161
+ end
162
+
163
+ Then /^task "rake (.*)" is executed successfully/ do |task|
164
+ @stdout.should_not be_nil
165
+ actual_output = File.read(@stdout)
166
+ actual_output.should_not match(/^Don't know how to build task '#{task}'/)
167
+ actual_output.should_not match(/Error/i)
168
+ end
169
+
170
+ Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
171
+ in_project_folder do
172
+ gem_file = Dir["pkg/*.gem"].first
173
+ gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
174
+ spec_value = gem_spec.send(key.to_sym)
175
+ spec_value.to_s.should match(/#{regex}/)
176
+ end
177
+ end