releasy 0.2.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.yardopts +4 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +20 -0
- data/README.md +165 -0
- data/Rakefile +31 -0
- data/bin/7z.sfx +0 -0
- data/bin/releasy +7 -0
- data/lib/releasy.rb +18 -0
- data/lib/releasy/archivers.rb +12 -0
- data/lib/releasy/archivers/archiver.rb +74 -0
- data/lib/releasy/archivers/dmg.rb +18 -0
- data/lib/releasy/archivers/exe.rb +23 -0
- data/lib/releasy/archivers/seven_zip.rb +12 -0
- data/lib/releasy/archivers/tar_archiver.rb +14 -0
- data/lib/releasy/archivers/tar_bzip2.rb +13 -0
- data/lib/releasy/archivers/tar_gzip.rb +13 -0
- data/lib/releasy/archivers/zip.rb +12 -0
- data/lib/releasy/builders.rb +12 -0
- data/lib/releasy/builders/builder.rb +52 -0
- data/lib/releasy/builders/ocra_builder.rb +43 -0
- data/lib/releasy/builders/osx_app.rb +158 -0
- data/lib/releasy/builders/source.rb +27 -0
- data/lib/releasy/builders/windows_builder.rb +65 -0
- data/lib/releasy/builders/windows_folder.rb +47 -0
- data/lib/releasy/builders/windows_folder_from_ruby_dist.rb +150 -0
- data/lib/releasy/builders/windows_installer.rb +117 -0
- data/lib/releasy/builders/windows_standalone.rb +37 -0
- data/lib/releasy/cli.rb +12 -0
- data/lib/releasy/cli/install_sfx.rb +66 -0
- data/lib/releasy/dsl_wrapper.rb +71 -0
- data/lib/releasy/mixins/exec.rb +14 -0
- data/lib/releasy/mixins/has_archivers.rb +37 -0
- data/lib/releasy/mixins/has_gemspecs.rb +42 -0
- data/lib/releasy/mixins/register.rb +47 -0
- data/lib/releasy/project.rb +300 -0
- data/lib/releasy/version.rb +3 -0
- data/lib/releasy/windows_wrapper_maker.rb +90 -0
- data/lib/releasy/windows_wrapper_maker/Gemfile +8 -0
- data/media/releasy.png +0 -0
- data/releasy.gemspec +37 -0
- data/test/releasy/archivers_test.rb +65 -0
- data/test/releasy/builders/data/Info.plist +51 -0
- data/test/releasy/builders/data/Main.rb +12 -0
- data/test/releasy/builders/data/relapse_runner.rb +1 -0
- data/test/releasy/builders/data/set_app_executable.sh +3 -0
- data/test/releasy/builders/helpers/helper.rb +47 -0
- data/test/releasy/builders/ocra_builder_test.rb +37 -0
- data/test/releasy/builders/osx_app_test.rb +107 -0
- data/test/releasy/builders/source_test.rb +43 -0
- data/test/releasy/builders/windows_builder_test.rb +26 -0
- data/test/releasy/builders/windows_folder_from_ruby_dist_test.rb +105 -0
- data/test/releasy/builders/windows_folder_test.rb +56 -0
- data/test/releasy/builders/windows_installer_test.rb +62 -0
- data/test/releasy/builders/windows_standalone_test.rb +58 -0
- data/test/releasy/cli/install_sfx_test.rb +90 -0
- data/test/releasy/dsl_wrapper_test.rb +79 -0
- data/test/releasy/integration/source_test.rb +122 -0
- data/test/releasy/mixins/register_test.rb +52 -0
- data/test/releasy/project_test.rb +198 -0
- data/test/releasy/windows_wrapper_maker_test.rb +61 -0
- data/test/teststrap.rb +52 -0
- data/test/yard_test.rb +61 -0
- data/test_project/Gemfile +9 -0
- data/test_project/LICENSE.txt +1 -0
- data/test_project/README.txt +2 -0
- data/test_project/bin/test_app +3 -0
- data/test_project/lib/test_app.rb +6 -0
- data/test_project/lib/test_app/stuff.rb +1 -0
- data/test_project/test_app.icns +0 -0
- data/test_project/test_app.ico +0 -0
- data/wrappers/put_wrappers_here_for_testing.txt +17 -0
- metadata +236 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'ocra'
|
3
|
+
|
4
|
+
module Releasy
|
5
|
+
# Creates wrappers and executables by wrapping Ocra's functionality.
|
6
|
+
class WindowsWrapperMaker
|
7
|
+
include FileUtils
|
8
|
+
include FileUtils::Verbose
|
9
|
+
|
10
|
+
# Creates an win32 executable file (xxx.exe) that runs via a Ruby executable at bin/ruby(w).exe
|
11
|
+
# Paths given to the executable are relative to the directory that the executable is in.
|
12
|
+
# Assumes that user's source will be put into _./src/_ and that ruby executables will be in _./bin/_
|
13
|
+
#
|
14
|
+
# @param executable_file [String] File to create, which should be a .exe file.
|
15
|
+
# @param ruby_file [String] Path of script to run with the executable.
|
16
|
+
# @option options :rubyopt [String] RUBYOPT environment variable - Options to pass to Ruby ('')
|
17
|
+
# @option options :rubylib [String] RUBYLIB environment variable - Paths, relative to _./src/_, to add to $LOAD_PATH ('').
|
18
|
+
# @option options :gem_path [String] GEM_PATH environment variable - Path, relative to _./_, to load gems from ('vendor').
|
19
|
+
# @option options :windows [Boolean] True for an application that uses windows, false for a console application (false)
|
20
|
+
# @option options :icon [String] Path to Windows icon file (.ico) that the executable should use (nil).
|
21
|
+
def build_executable(executable_file, ruby_file, options = {})
|
22
|
+
options = {
|
23
|
+
:rubyopt => '',
|
24
|
+
:rubylib => '',
|
25
|
+
:gem_path => 'vendor',
|
26
|
+
:windows => false,
|
27
|
+
:icon => nil,
|
28
|
+
}.merge! options
|
29
|
+
|
30
|
+
load_ocra unless defined? Ocra::OcraBuilder
|
31
|
+
set_ocra_options options[:icon]
|
32
|
+
|
33
|
+
Ocra::OcraBuilder.new(executable_file, options[:windows]) do |sb|
|
34
|
+
root = Ocra.Pathname Ocra::TEMPDIR_ROOT
|
35
|
+
|
36
|
+
sb.setenv('RUBYOPT', options[:rubyopt])
|
37
|
+
sb.setenv('RUBYLIB', options[:rubylib])
|
38
|
+
sb.setenv('GEM_PATH', (root / options[:gem_path]).to_native)
|
39
|
+
sb.setenv('BUNDLE_GEMFILE', '')
|
40
|
+
sb.setenv('BUNDLE_BIN_PATH', '')
|
41
|
+
|
42
|
+
ruby_executable = options[:windows] ? "rubyw.exe" : "ruby.exe"
|
43
|
+
exe = root / 'bin' / ruby_executable
|
44
|
+
script = (root / ruby_file).to_native
|
45
|
+
|
46
|
+
sb.postcreateprocess(exe, "#{ruby_executable} \"#{script}\"")
|
47
|
+
end
|
48
|
+
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
def set_ocra_options(icon)
|
54
|
+
options = Ocra.instance_variable_get(:@options)
|
55
|
+
options[:lzma_mode] = false
|
56
|
+
options[:chdir_first] = true
|
57
|
+
options[:icon_filename] = icon
|
58
|
+
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
def load_ocra
|
64
|
+
Object.send(:remove_const, :Ocra) # remove the "class Ocra", so we can load the "module Ocra"
|
65
|
+
spec = Gem.loaded_specs['ocra']
|
66
|
+
|
67
|
+
# If we aren't on Windows, then File::ALT_SEPARATOR won't be defined or will be defined to the local system.
|
68
|
+
# To save breaking the world, change it as we load, not in File itself.
|
69
|
+
ocra_file = spec.bin_file(spec.executable)
|
70
|
+
if Gem.win_platform?
|
71
|
+
load ocra_file
|
72
|
+
else
|
73
|
+
script = File.read(ocra_file)
|
74
|
+
# On non-windows, UTF8 is the standard way to load files, which is not what we want at all since it will complain about "\xFF".
|
75
|
+
script.force_encoding Encoding::ASCII_8BIT if script.respond_to? :force_encoding
|
76
|
+
script.gsub!("File::ALT_SEPARATOR", "'\\\\\\\\'")
|
77
|
+
Object.class_eval script, ocra_file
|
78
|
+
end
|
79
|
+
|
80
|
+
# Need to disable this method so we get the right output.
|
81
|
+
Ocra::OcraBuilder.class_eval do
|
82
|
+
def createinstdir(*args); end
|
83
|
+
end
|
84
|
+
|
85
|
+
Ocra.find_stubs
|
86
|
+
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/media/releasy.png
ADDED
Binary file
|
data/releasy.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
3
|
+
require "releasy/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "releasy"
|
7
|
+
s.version = Releasy::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Bil Bas (Spooner)"]
|
10
|
+
s.email = ["bil.bagpuss@gmail.com"]
|
11
|
+
s.homepage = "http://spooner.github.com/libraries/releasy/"
|
12
|
+
s.summary = %q{Releasy helps to make Ruby application releases simpler}
|
13
|
+
s.description = <<END
|
14
|
+
#{s.summary}, by creating and archiving source folders, Windows folders,
|
15
|
+
standalone executables, installers and OS X app bundles.
|
16
|
+
END
|
17
|
+
|
18
|
+
s.licenses = ["MIT", "GNU LGPL"] # Since I include a file from 7z.
|
19
|
+
s.rubyforge_project = "releasy"
|
20
|
+
|
21
|
+
s.requirements << '7z (optional; used to generate archives)'
|
22
|
+
s.requirements << 'InnoSetup (optional on Windows; used to make Win32 installer)'
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.test_files = Dir["test/**/*_test.rb"]
|
26
|
+
s.executable = "releasy"
|
27
|
+
|
28
|
+
s.add_runtime_dependency('ocra', '~> 1.3.0')
|
29
|
+
s.add_runtime_dependency('rake', '~> 0.9.2.2')
|
30
|
+
s.add_runtime_dependency('cri', '~> 2.1.0')
|
31
|
+
s.add_runtime_dependency('thor', '~> 0.14.6') # Only needed in Ruby 1.8, since it provides HashWithIndifferentAccess.
|
32
|
+
|
33
|
+
s.add_development_dependency('riot', '~> 0.12.5')
|
34
|
+
s.add_development_dependency('rr', '~> 1.0.4')
|
35
|
+
s.add_development_dependency('yard', '~> 0.7.4')
|
36
|
+
s.add_development_dependency('redcarpet', '~> 2.0.1')
|
37
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.expand_path("../teststrap", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
# Test all archivers at once, since they are pretty much identical.
|
4
|
+
[
|
5
|
+
[:dmg, Releasy::Archivers::Dmg, %[GZIP=-9 hdiutil create -fs HFS+ -srcfolder "f" -volname "Test App 0.1" "f.dmg"]],
|
6
|
+
[:exe, Releasy::Archivers::Exe, %[7z a -mmt -bd -t7z -mx9 -sfx7z.sfx "f.exe" "f"]],
|
7
|
+
[:"7z", Releasy::Archivers::SevenZip, %[7z a -mmt -bd -t7z -mx9 "f.7z" "f"]],
|
8
|
+
[:tar_bz2, Releasy::Archivers::TarBzip2, %[7z a -so -mmt -bd -ttar "f.tar" "f" | 7z a -si -bd -tbzip2 -mx9 "f.tar.bz2"]],
|
9
|
+
[:tar_gz, Releasy::Archivers::TarGzip, %[7z a -so -mmt -bd -ttar "f.tar" "f" | 7z a -si -bd -tgzip -mx9 "f.tar.gz"]],
|
10
|
+
[:zip, Releasy::Archivers::Zip, %[7z a -mmt -bd -tzip -mx9 "f.zip" "f"]],
|
11
|
+
].each do |type, archiver, command|
|
12
|
+
extension = "." + type.to_s.tr("_", ".")
|
13
|
+
|
14
|
+
context archiver do
|
15
|
+
setup do
|
16
|
+
project = Releasy::Project.new
|
17
|
+
project.name = "Test App"
|
18
|
+
project.version = "0.1"
|
19
|
+
archiver.new project
|
20
|
+
end
|
21
|
+
teardown { Rake::Task.clear }
|
22
|
+
|
23
|
+
asserts(:type).equals type
|
24
|
+
asserts(:extension).equals extension
|
25
|
+
asserts(:command, "f").equals command
|
26
|
+
asserts(:package, "f").equals "f#{extension}"
|
27
|
+
|
28
|
+
context "setting extension with a . changes package path" do
|
29
|
+
hookup { topic.extension = ".wobble" }
|
30
|
+
|
31
|
+
asserts(:extension).equals ".wobble"
|
32
|
+
asserts(:package, "f").equals "f.wobble"
|
33
|
+
end
|
34
|
+
|
35
|
+
context "setting extension without a . still adds one" do
|
36
|
+
hookup { topic.extension = "wobble" }
|
37
|
+
|
38
|
+
asserts(:extension).equals "wobble"
|
39
|
+
asserts(:package, "f").equals "f.wobble"
|
40
|
+
end
|
41
|
+
|
42
|
+
context "generated tasks" do
|
43
|
+
hookup { topic.send :generate_tasks, "source", "frog" }
|
44
|
+
|
45
|
+
tasks = [
|
46
|
+
[:FileTask, "frog#{extension}", %w[frog]],
|
47
|
+
[:Task, "package:source:#{type}", ["frog#{extension}"]],
|
48
|
+
]
|
49
|
+
|
50
|
+
test_tasks tasks
|
51
|
+
end
|
52
|
+
|
53
|
+
context "class" do
|
54
|
+
setup { topic.class }
|
55
|
+
|
56
|
+
asserts("#{archiver}::TYPE") { topic::TYPE }.equals type
|
57
|
+
|
58
|
+
if type == :exe
|
59
|
+
asserts("#{archiver}::SFX_NAME") { topic::SFX_NAME }.equals "7z.sfx"
|
60
|
+
asserts("#{archiver}::SFX_FILE") { topic::SFX_FILE }.equals File.expand_path("bin/7z.sfx", $original_path)
|
61
|
+
asserts("sfx file included") { File.exists? topic::SFX_FILE }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>BuildMachineOSBuild</key>
|
6
|
+
<string>11C74</string>
|
7
|
+
<key>CFBundleDevelopmentRegion</key>
|
8
|
+
<string>English</string>
|
9
|
+
<key>CFBundleExecutable</key>
|
10
|
+
<string>Test App</string>
|
11
|
+
<key>CFBundleIconFile</key>
|
12
|
+
<string>test_app</string>
|
13
|
+
<key>CFBundleIdentifier</key>
|
14
|
+
<string>org.frog.fish</string>
|
15
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
16
|
+
<string>6.0</string>
|
17
|
+
<key>CFBundlePackageType</key>
|
18
|
+
<string>APPL</string>
|
19
|
+
<key>CFBundleSignature</key>
|
20
|
+
<string>????</string>
|
21
|
+
<key>CFBundleVersion</key>
|
22
|
+
<string>1.0</string>
|
23
|
+
<key>DTCompiler</key>
|
24
|
+
<string>4.0</string>
|
25
|
+
<key>DTPlatformBuild</key>
|
26
|
+
<string>10M2518</string>
|
27
|
+
<key>DTPlatformVersion</key>
|
28
|
+
<string>PG</string>
|
29
|
+
<key>DTSDKBuild</key>
|
30
|
+
<string>8S2167</string>
|
31
|
+
<key>DTSDKName</key>
|
32
|
+
<string>macosx10.4</string>
|
33
|
+
<key>DTXcode</key>
|
34
|
+
<string>0400</string>
|
35
|
+
<key>DTXcodeBuild</key>
|
36
|
+
<string>10M2518</string>
|
37
|
+
<key>LSMinimumSystemVersionByArchitecture</key>
|
38
|
+
<dict>
|
39
|
+
<key>i386</key>
|
40
|
+
<string>10.4.0</string>
|
41
|
+
<key>ppc</key>
|
42
|
+
<string>10.4.0</string>
|
43
|
+
<key>x86_64</key>
|
44
|
+
<string>10.6.0</string>
|
45
|
+
</dict>
|
46
|
+
<key>NSMainNibFile</key>
|
47
|
+
<string>MainMenu</string>
|
48
|
+
<key>NSPrincipalClass</key>
|
49
|
+
<string>NSApplication</string>
|
50
|
+
</dict>
|
51
|
+
</plist>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Dir[File.expand_path("../vendor/gems/*/lib", __FILE__)].each do |lib|
|
2
|
+
$LOAD_PATH.unshift lib
|
3
|
+
end
|
4
|
+
|
5
|
+
OSX_EXECUTABLE_FOLDER = File.expand_path("../../..", __FILE__)
|
6
|
+
|
7
|
+
# Really hacky fudge-fix for something oddly missing in the .app.
|
8
|
+
class Encoding
|
9
|
+
UTF_7 = UTF_16BE = UTF_16LE = UTF_32BE = UTF_32LE = Encoding.list.first
|
10
|
+
end
|
11
|
+
|
12
|
+
load 'application/bin/test_app'
|
@@ -0,0 +1 @@
|
|
1
|
+
load 'bin/test_app'
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path("../../../teststrap", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
def new_project
|
4
|
+
project = Releasy::Project.new
|
5
|
+
project.name = "Test App"
|
6
|
+
project.version = "0.1"
|
7
|
+
project.files = source_files
|
8
|
+
project.exposed_files = %w[README.txt LICENSE.txt]
|
9
|
+
project.add_link "http://spooner.github.com/libraries/releasy/", "Releasy website"
|
10
|
+
project.quiet
|
11
|
+
project.output_path = output_path
|
12
|
+
|
13
|
+
project
|
14
|
+
end
|
15
|
+
|
16
|
+
# Hack to allow test to work using a different gemfile than Releasy's.
|
17
|
+
def clear_bundler_env
|
18
|
+
gemfile, bin_path = ENV['BUNDLE_GEMFILE'], ENV['BUNDLE_BIN_PATH']
|
19
|
+
ENV['BUNDLE_GEMFILE'], ENV['BUNDLE_BIN_PATH'] = '', ''
|
20
|
+
ret_val = yield
|
21
|
+
ENV['BUNDLE_GEMFILE'], ENV['BUNDLE_BIN_PATH'] = gemfile, bin_path
|
22
|
+
ret_val
|
23
|
+
end
|
24
|
+
|
25
|
+
def clear_all_env
|
26
|
+
rubylib, rubyopts = ENV['RUBYLIB'], ENV['RUBYOPTS']
|
27
|
+
ENV['RUBYLIB'], ENV['RUBYOPTS'] = '', ''
|
28
|
+
ret_val = clear_bundler_env { yield }
|
29
|
+
ENV['RUBYLIB'], ENV['RUBYOPTS'] = rubylib, rubyopts
|
30
|
+
ret_val
|
31
|
+
end
|
32
|
+
|
33
|
+
def data_file(file)
|
34
|
+
File.expand_path("test/releasy/builders/data/#{file}", $original_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def gemspecs_to_use
|
38
|
+
# Don't add Releasy since it is may be being run locally and thus not work at all.
|
39
|
+
Gem.loaded_specs.values.find_all {|s| %w[bundler cri ocra thor].include? s.name }
|
40
|
+
end
|
41
|
+
|
42
|
+
def link_file
|
43
|
+
<<END
|
44
|
+
[InternetShortcut]
|
45
|
+
URL=http://spooner.github.com/libraries/releasy/
|
46
|
+
END
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path("helpers/helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
context Releasy::Builders::OcraBuilder do
|
4
|
+
setup do
|
5
|
+
Class.new(Releasy::Builders::OcraBuilder) do
|
6
|
+
const_set :DEFAULT_FOLDER_SUFFIX, ''
|
7
|
+
end.new new_project
|
8
|
+
end
|
9
|
+
|
10
|
+
hookup do
|
11
|
+
topic.send(:setup)
|
12
|
+
end
|
13
|
+
|
14
|
+
asserts_topic.kind_of Releasy::Builders::WindowsBuilder
|
15
|
+
asserts(:ocra_parameters).equals ""
|
16
|
+
asserts(:icon).nil
|
17
|
+
asserts("setting incorrect icon") { topic.icon = "frog.png" }.raises ArgumentError, /icon must be a .ico file/
|
18
|
+
asserts(:ocra_command).raises Releasy::ConfigError, /Unless the executable file extension is .rbw or .rb, then #executable_type must be explicitly :windows or :console/
|
19
|
+
|
20
|
+
context "#icon=" do
|
21
|
+
hookup { topic.icon = "icon.ico" }
|
22
|
+
asserts(:icon).equals "icon.ico"
|
23
|
+
end
|
24
|
+
|
25
|
+
context "#ocra_command" do
|
26
|
+
hookup do
|
27
|
+
topic.exclude_encoding
|
28
|
+
topic.ocra_parameters = "--wobble"
|
29
|
+
topic.project.executable = source_files.first
|
30
|
+
topic.executable_type = :console
|
31
|
+
topic.icon = "icon.ico"
|
32
|
+
end
|
33
|
+
|
34
|
+
helper(:command) { %[ocra "bin/test_app" --console --no-enc --wobble --icon "icon.ico" "lib/test_app.rb" "lib/test_app/stuff.rb" "README.txt" "LICENSE.txt" "Gemfile.lock" "Gemfile"] }
|
35
|
+
asserts(:ocra_command).equals { %[bundle exec #{command}] }
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require File.expand_path("helpers/helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
folder = File.join(output_path, "test_app_0_1_OSX")
|
4
|
+
app_folder = File.join(folder, "Test App.app")
|
5
|
+
|
6
|
+
osx_app_wrapper = Dir.chdir(project_path) { Dir["../wrappers/gosu-mac-wrapper-*.tar.gz"].first }
|
7
|
+
if osx_app_wrapper
|
8
|
+
context Releasy::Builders::OsxApp do
|
9
|
+
setup { Releasy::Builders::OsxApp.new new_project }
|
10
|
+
|
11
|
+
teardown do
|
12
|
+
Dir.chdir $original_path
|
13
|
+
Rake::Task.clear
|
14
|
+
end
|
15
|
+
|
16
|
+
hookup do
|
17
|
+
Dir.chdir project_path
|
18
|
+
end
|
19
|
+
|
20
|
+
asserts(:folder_suffix).equals "OSX"
|
21
|
+
asserts(:icon=, "test_app.ico").raises Releasy::ConfigError, /icon must be a .icns file/
|
22
|
+
denies(:gemspecs).empty
|
23
|
+
|
24
|
+
context "no wrapper" do
|
25
|
+
hookup do
|
26
|
+
topic.url = "org.frog.fish"
|
27
|
+
end
|
28
|
+
asserts(:generate_tasks).raises Releasy::ConfigError, /wrapper not set/
|
29
|
+
end
|
30
|
+
|
31
|
+
context "invalid wrapper" do
|
32
|
+
hookup do
|
33
|
+
topic.url = "org.frog.fish"
|
34
|
+
topic.wrapper = "whatever"
|
35
|
+
end
|
36
|
+
|
37
|
+
asserts(:generate_tasks).raises Releasy::ConfigError, /wrapper not valid/
|
38
|
+
end
|
39
|
+
|
40
|
+
context "no url" do
|
41
|
+
hookup do
|
42
|
+
topic.wrapper = osx_app_wrapper
|
43
|
+
end
|
44
|
+
asserts(:generate_tasks).raises Releasy::ConfigError, /url not set/
|
45
|
+
end
|
46
|
+
|
47
|
+
context "valid" do
|
48
|
+
hookup do
|
49
|
+
topic.url = "org.frog.fish"
|
50
|
+
topic.wrapper = osx_app_wrapper
|
51
|
+
topic.icon = "test_app.icns"
|
52
|
+
topic.gemspecs = gemspecs_to_use
|
53
|
+
topic.send :generate_tasks
|
54
|
+
end
|
55
|
+
|
56
|
+
asserts(:folder_suffix).equals "OSX"
|
57
|
+
asserts(:app_name).equals "Test App.app"
|
58
|
+
asserts(:url).equals "org.frog.fish"
|
59
|
+
asserts(:wrapper).equals osx_app_wrapper
|
60
|
+
asserts("gemspecs correct") { topic.gemspecs == gemspecs_to_use }
|
61
|
+
|
62
|
+
context "tasks" do
|
63
|
+
tasks = [
|
64
|
+
[ :Task, "build:osx:app", [folder] ],
|
65
|
+
[ :FileCreationTask, '..', [] ], # byproduct of using #directory
|
66
|
+
[ :FileCreationTask, output_path, [] ], # byproduct of using #directory
|
67
|
+
[ :FileCreationTask, folder, source_files + [osx_app_wrapper]],
|
68
|
+
]
|
69
|
+
|
70
|
+
test_tasks tasks
|
71
|
+
end
|
72
|
+
|
73
|
+
context "generate" do
|
74
|
+
hookup { Rake::Task["build:osx:app"].invoke }
|
75
|
+
|
76
|
+
asserts("files copied inside app") { source_files.all? {|f| same_contents? "#{app_folder}/Contents/Resources/application/#{f}", f } }
|
77
|
+
asserts("readme copied to folder") { same_contents? "#{folder}/README.txt", "README.txt" }
|
78
|
+
asserts("license copied to folder") { same_contents? "#{folder}/LICENSE.txt", "LICENSE.txt" }
|
79
|
+
|
80
|
+
asserts("executable renamed") { File.exists?("#{app_folder}/Contents/MacOS/Test App") }
|
81
|
+
if Gem.win_platform?
|
82
|
+
asserts("set_app_executable.sh created and with correct line endings") { File.read("#{folder}/set_app_executable.sh") == File.read(data_file("set_app_executable.sh")) }
|
83
|
+
else
|
84
|
+
asserts("app is an executable") { File.executable?("#{app_folder}/Contents/MacOS/Test App") }
|
85
|
+
denies("set_app_executable.sh created") { File.exists? "#{folder}/set_app_executable.sh" }
|
86
|
+
end
|
87
|
+
|
88
|
+
asserts("Gosu icon deleted") { not File.exists? "#{app_folder}/Contents/Resources/Gosu.icns" }
|
89
|
+
asserts("icon is copied to correct location") { File.exists? "#{app_folder}/Contents/Resources/test_app.icns" }
|
90
|
+
asserts("Main.rb is correct") { same_contents? "#{app_folder}/Contents/Resources/Main.rb", data_file("Main.rb") }
|
91
|
+
asserts("Info.plist is correct") { same_contents? "#{app_folder}/Contents/Info.plist", data_file("Info.plist") }
|
92
|
+
|
93
|
+
gemspecs_to_use.each do |gemspec|
|
94
|
+
name = "#{gemspec.name}-#{gemspec.version}"
|
95
|
+
asserts("#{name} gem folder copied") { File.directory? "#{app_folder}/Contents/Resources/vendor/gems/#{name}" }
|
96
|
+
asserts("#{name} spec copied") { File.exists? "#{app_folder}/Contents/Resources/vendor/specifications/#{name}.gemspec" }
|
97
|
+
end
|
98
|
+
|
99
|
+
denies("default chingu gem left in app") { File.exists?("#{app_folder}/Contents/Resources/lib/chingu") }
|
100
|
+
|
101
|
+
if RUBY_PLATFORM =~ /darwin/
|
102
|
+
asserts("program output") { clear_all_env { %x["./#{app_folder}/Contents/MacOS/Test App"] } }.equals "test run!\n"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|