furoshiki 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ furoshiki
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ jruby-1.7.4
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ script: "rspec"
3
+ rvm: jruby
4
+ notifications:
5
+ irc: "irc.freenode.org#shoes"
6
+ email:
7
+ recipients:
8
+ - wasnotrice@gmail.com
9
+ - tobias.pfeiffer@student.hpi.uni-potsdam.de
10
+ on_success: change # [always|never|change] # default: change
11
+ on_failure: change # [always|never|change] # default: always
data/Gemfile CHANGED
@@ -1,12 +1,3 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
- gem "rake"
4
- gem "plist"
5
- gem "warbler"
6
-
7
- # Only for packaging Shoes apps (there is no GUI)
8
- gem "shoes"#, :github => "shoes/shoes4"
9
-
10
- group :test, :development do
11
- gem "rspec", "~> 2.12"
12
- end
3
+ gemspec
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = furoshiki
1
+ = furoshiki {<img src="https://travis-ci.org/shoes/furoshiki.png?branch=master" alt="Build Status" />}[https://travis-ci.org/shoes/furoshiki] {<img src="https://codeclimate.com/github/shoes/furoshiki.png" />}[https://codeclimate.com/github/shoes/furoshiki]
2
2
 
3
3
  風呂敷 (Furoshiki) is a simple way to package your Ruby applications for
4
4
  distribution on Windows, Linux, and OSX. A 風呂敷 is "a type of traditional
data/furoshiki.gemspec CHANGED
@@ -18,4 +18,11 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_dependency "warbler"
20
20
  s.add_dependency "plist"
21
+ # only for packaging shoes apps
22
+ s.add_dependency 'shoes'
23
+ s.add_dependency 'rubyzip', '< 1.0.0'
24
+
25
+ s.add_development_dependency 'rake'
26
+ s.add_development_dependency 'rspec'
27
+
21
28
  end
@@ -1,3 +1,7 @@
1
1
  module Furoshiki
2
+ # Exception raised when there was a problem downloading a resource
2
3
  class DownloadError < StandardError; end
4
+
5
+ # Exception raised when a configuration is invalid
6
+ class ConfigurationError < StandardError; end
3
7
  end
@@ -72,12 +72,14 @@ module Furoshiki
72
72
  file = dummy_file.new(options)
73
73
  dir = pathname.parent
74
74
  end
75
- new YAML.load(file.read), dir
75
+ config = YAML.load(file.read)
76
+ config[:working_dir] = dir
77
+ new(config)
76
78
  end
77
79
 
78
80
  # @param [Hash] config user options
79
81
  # @param [String] working_dir directory in which do packaging work
80
- def initialize(config = {}, working_dir = Dir.pwd)
82
+ def initialize(config = {})
81
83
  defaults = {
82
84
  name: 'Shoes App',
83
85
  version: '0.0.0',
@@ -92,38 +94,65 @@ module Furoshiki
92
94
  dmg: {
93
95
  ds_store: 'path/to/default/.DS_Store',
94
96
  background: 'path/to/default/background.png'
95
- }
97
+ },
98
+ working_dir: Dir.pwd
96
99
  }
97
100
 
98
101
  # Overwrite defaults with supplied config
99
102
  @config = config.inject(defaults) { |c, (k, v)| set_symbol_key c, k, v }
100
103
 
101
104
  # Ensure that we always have what we need
102
- @config[:shortname] ||= @config[:name].downcase.gsub(/\W+/, '')
103
105
  [:ignore, :gems].each { |k| @config[k] = Array(@config[k]) }
104
106
  @config[:gems] << 'shoes'
107
+ @config[:working_dir] = Pathname.new(@config[:working_dir])
105
108
 
106
- # Define reader for each key
109
+ # Define reader for each key (#shortname defined below)
107
110
  metaclass = class << self; self; end
108
- @config.keys.each do |k|
111
+ @config.keys.reject {|k| k == :shortname}.each do |k|
109
112
  metaclass.send(:define_method, k) do
110
113
  @config[k]
111
114
  end
112
115
  end
113
116
 
114
- @working_dir = Pathname.new(working_dir)
117
+ @errors = []
115
118
  end
116
119
 
117
- # @return [Pathname] the current working directory
118
- attr_reader :working_dir
120
+ def shortname
121
+ @config[:shortname] || @config[:name].downcase.gsub(/\W+/, '')
122
+ end
119
123
 
120
124
  def to_hash
121
125
  @config
122
126
  end
123
127
 
128
+ def validate
129
+ unless @config[:run] && working_dir.join(@config[:run]).exist?
130
+ add_missing_file_error(@config[:run], "Run file")
131
+ end
132
+
133
+ if @config[:icons][:osx] && !working_dir.join(@config[:icons][:osx]).exist?
134
+ add_missing_file_error(@config[:icons][:osx], "OS X icon file")
135
+ end
136
+ end
137
+
138
+ def valid?
139
+ validate
140
+ return errors.empty?
141
+ end
142
+
143
+ def errors
144
+ @errors.dup
145
+ end
146
+
147
+ def error_message_list
148
+ @errors.map {|m| " - #{m}"}.join("\n")
149
+ end
150
+
124
151
  def ==(other)
125
152
  super unless other.class == self.class && other.respond_to?(:to_hash)
126
- @config == other.to_hash
153
+ @config == other.to_hash &&
154
+ working_dir == other.working_dir &&
155
+ errors == other.errors
127
156
  end
128
157
 
129
158
  private
@@ -141,6 +170,15 @@ module Furoshiki
141
170
  end
142
171
  config
143
172
  end
173
+
174
+ def add_error(message)
175
+ @errors << message
176
+ end
177
+
178
+ def add_missing_file_error(value, description)
179
+ message = "#{description} configured as '#{value}', but couldn't find file at #{working_dir.join(value.to_s)}"
180
+ add_error(message)
181
+ end
144
182
  end
145
183
  end
146
184
  end
@@ -12,9 +12,16 @@ module Furoshiki
12
12
  class SwtApp
13
13
  include FileUtils
14
14
 
15
+ REMOTE_TEMPLATE_URL = 'https://s3.amazonaws.com/net.wasnotrice.shoes/wrappers/shoes-app-template-0.0.1.zip'
16
+
15
17
  # @param [Shoes::Package::Configuration] config user configuration
16
18
  def initialize(config)
17
19
  @config = config
20
+
21
+ unless config.valid?
22
+ raise Furoshiki::ConfigurationError, "Invalid configuration.\n#{config.error_message_list}"
23
+ end
24
+
18
25
  home = ENV['FUROSHIKI_HOME'] || Dir.home
19
26
  @cache_dir = Pathname.new(home).join('.furoshiki', 'cache')
20
27
  @default_package_dir = working_dir.join('pkg')
@@ -98,7 +105,10 @@ module Furoshiki
98
105
  end
99
106
 
100
107
  def download_following_redirects(remote_url, local_path, redirect_limit = 5)
101
- raise Furoshiki::DownloadError, "Too many redirects" if redirect_limit == 0
108
+ if redirect_limit == 0
109
+ raise Furoshiki::DownloadError,
110
+ "Too many redirects trying to reach #{remote_url}"
111
+ end
102
112
 
103
113
  uri = URI(remote_url)
104
114
  Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
@@ -128,7 +138,8 @@ module Furoshiki
128
138
  end
129
139
 
130
140
  def remote_template_url
131
- "#{downloads_url}/#{template_basename}-#{latest_template_version}#{template_extension}"
141
+ #"#{downloads_url}/#{template_basename}-#{latest_template_version}#{template_extension}"
142
+ REMOTE_TEMPLATE_URL
132
143
  end
133
144
 
134
145
  def move_to_package_dir(path)
@@ -8,6 +8,11 @@ module Furoshiki
8
8
  # @param [Furoshiki::Shoes::Configuration] config user configuration
9
9
  def initialize(config = nil)
10
10
  @shoes_config = config || Furoshiki::Shoes::Configuration.load
11
+
12
+ unless config.valid?
13
+ raise Furoshiki::ConfigurationError, "Invalid configuration.\n#{config.error_message_list}"
14
+ end
15
+
11
16
  Dir.chdir working_dir do
12
17
  @config = Warbler::Config.new do |config|
13
18
  config.jar_name = @shoes_config.shortname
@@ -1,4 +1,4 @@
1
1
  module Furoshiki
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
4
4
 
data/lib/furoshiki.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  puts "OMG, nothing here!"
2
2
  puts ""
3
- puts "You probably want to `require 'furoshiki/shoes'`.
3
+ puts "You probably want to `require 'furoshiki/shoes'`"
@@ -14,8 +14,10 @@ describe Furoshiki::Shoes::Configuration do
14
14
  its(:icons) { should be_an_instance_of(Hash) }
15
15
  its(:dmg) { should be_an_instance_of(Hash) }
16
16
  its(:run) { should be_nil }
17
+ its(:working_dir) { should eq(Pathname.new(Dir.pwd)) }
18
+ it { should_not be_valid } # no :run
17
19
 
18
- describe "#icon" do
20
+ describe "#icons" do
19
21
  it 'osx is nil' do
20
22
  subject.icons[:osx].should be_nil
21
23
  end
@@ -48,19 +50,22 @@ describe Furoshiki::Shoes::Configuration do
48
50
 
49
51
  context "with options" do
50
52
  include_context 'config'
51
- subject { Furoshiki::Shoes::Configuration.load(config_filename) }
53
+ subject { Furoshiki::Shoes::Configuration.load(@config_filename) }
52
54
 
53
55
  its(:name) { should eq('Sugar Clouds') }
54
56
  its(:shortname) { should eq('sweet-nebulae') }
55
57
  its(:ignore) { should include('pkg') }
58
+ its(:run) { should eq('bin/hello_world') }
56
59
  its(:gems) { should include('rspec') }
57
60
  its(:gems) { should include('shoes') }
58
61
  its(:version) { should eq('0.0.1') }
59
62
  its(:release) { should eq('Mindfully') }
60
63
  its(:icons) { should be_an_instance_of(Hash) }
61
64
  its(:dmg) { should be_an_instance_of(Hash) }
65
+ its(:working_dir) { should eq(@config_filename.dirname) }
66
+ it { should be_valid }
62
67
 
63
- describe "#icon" do
68
+ describe "#icons" do
64
69
  it 'has osx' do
65
70
  subject.icons[:osx].should eq('img/boots.icns')
66
71
  end
@@ -87,6 +92,10 @@ describe Furoshiki::Shoes::Configuration do
87
92
  it "incorporates custom features" do
88
93
  subject.custom.should eq('my custom feature')
89
94
  end
95
+
96
+ it "round-trips" do
97
+ Furoshiki::Shoes::Configuration.new(subject.to_hash).should eq(subject)
98
+ end
90
99
  end
91
100
 
92
101
  context "with name, but without explicit shortname" do
@@ -97,12 +106,45 @@ describe Furoshiki::Shoes::Configuration do
97
106
  its(:shortname) { should eq("sugarclouds") }
98
107
  end
99
108
 
109
+ context "when the file to run doens't exist" do
110
+ let(:options) { {:run => "path/to/non-existent/file"} }
111
+ subject { Furoshiki::Shoes::Configuration.new options }
112
+
113
+ it { should_not be_valid }
114
+ end
115
+
116
+ context "when osx icon is not specified" do
117
+ include_context 'config'
118
+ let(:valid_config) { Furoshiki::Shoes::Configuration.load(@config_filename) }
119
+ let(:options) { valid_config.to_hash.merge(:icons => {}) }
120
+ subject { Furoshiki::Shoes::Configuration.new(options) }
121
+
122
+ it "sets osx icon path to nil" do
123
+ subject.icons[:osx].should be_nil
124
+ end
125
+
126
+ it "is valid" do
127
+ subject.should be_valid
128
+ end
129
+ end
130
+
131
+ context "when osx icon is specified, but doesn't exist" do
132
+ let(:options) { ({:icons => {:osx => "path/to/non-existent/file"}}) }
133
+ subject { Furoshiki::Shoes::Configuration.new options }
134
+
135
+ it "sets osx icon path" do
136
+ subject.icons[:osx].should eq("path/to/non-existent/file")
137
+ end
138
+
139
+ it { should_not be_valid }
140
+ end
141
+
100
142
  context "auto-loading" do
101
143
  include_context 'config'
102
144
 
103
145
  context "without a path" do
104
146
  it "looks for 'app.yaml' in current directory" do
105
- Dir.chdir config_filename.parent do
147
+ Dir.chdir @config_filename.parent do
106
148
  config = Furoshiki::Shoes::Configuration.load
107
149
  config.shortname.should eq('sweet-nebulae')
108
150
  end
@@ -125,22 +167,22 @@ describe Furoshiki::Shoes::Configuration do
125
167
  end
126
168
 
127
169
  context "with an 'app.yaml'" do
128
- let(:path) { config_filename }
170
+ let(:path) { @config_filename }
129
171
  it_behaves_like "config with path"
130
172
  end
131
173
 
132
174
  context "with a path to a directory containing an 'app.yaml'" do
133
- let(:path) { config_filename.parent }
175
+ let(:path) { @config_filename.parent }
134
176
  it_behaves_like "config with path"
135
177
  end
136
178
 
137
179
  context "with a path to a file that is siblings with an 'app.yaml'" do
138
- let(:path) { config_filename.parent.join('sibling.rb') }
180
+ let(:path) { @config_filename.parent.join('sibling.rb') }
139
181
  it_behaves_like "config with path"
140
182
  end
141
183
 
142
184
  context "with a path that exists, but no 'app.yaml'" do
143
- let(:path) { config_filename.parent.join('bin/hello_world') }
185
+ let(:path) { @config_filename.parent.join('bin/hello_world') }
144
186
  subject { Furoshiki::Shoes::Configuration.load(path) }
145
187
 
146
188
  its(:name) { should eq('hello_world') }
@@ -2,5 +2,7 @@ require 'yaml'
2
2
  require 'pathname'
3
3
 
4
4
  shared_context 'config' do
5
- let(:config_filename) { Pathname.new(__FILE__).join('../../test_app/app.yaml').cleanpath }
5
+ before :all do
6
+ @config_filename = Pathname.new(__FILE__).join('../../test_app/app.yaml').cleanpath
7
+ end
6
8
  end
@@ -9,13 +9,12 @@ describe Furoshiki::Shoes::SwtApp do
9
9
  include_context 'config'
10
10
  include_context 'package'
11
11
 
12
- let(:app_name) { 'Sugar Clouds.app' }
13
- let(:output_file) { output_dir.join app_name }
14
- let(:config) { Furoshiki::Shoes::Configuration.load config_filename}
15
- let(:launcher) { output_file.join('Contents/MacOS/JavaAppLauncher') }
16
- let(:icon) { output_file.join('Contents/Resources/boots.icns') }
17
- let(:jar) { output_file.join('Contents/Java/sweet-nebulae.jar') }
18
- subject { Furoshiki::Shoes::SwtApp.new config }
12
+ let(:config) {Furoshiki::Shoes::Configuration.load @config_filename }
13
+ subject {Furoshiki::Shoes::SwtApp.new config}
14
+
15
+ let(:launcher) { @output_file.join('Contents/MacOS/JavaAppLauncher') }
16
+ let(:icon) { @output_file.join('Contents/Resources/boots.icns') }
17
+ let(:jar) { @output_file.join('Contents/Java/sweet-nebulae.jar') }
19
18
 
20
19
  # $FUROSHIKI_HOME is set in spec_helper.rb for testing purposes,
21
20
  # but should default to $HOME
@@ -25,6 +24,7 @@ describe Furoshiki::Shoes::SwtApp do
25
24
  ENV['FUROSHIKI_HOME'] = nil
26
25
  end
27
26
 
27
+
28
28
  its(:cache_dir) { should eq(Pathname.new(Dir.home).join('.furoshiki', 'cache')) }
29
29
 
30
30
  after do
@@ -37,28 +37,33 @@ describe Furoshiki::Shoes::SwtApp do
37
37
  its(:cache_dir) { should eq(cache_dir) }
38
38
 
39
39
  it "sets package dir to {pwd}/pkg" do
40
- Dir.chdir app_dir do
41
- subject.default_package_dir.should eq(app_dir.join 'pkg')
40
+ Dir.chdir @app_dir do
41
+ subject.default_package_dir.should eq(@app_dir.join 'pkg')
42
42
  end
43
43
  end
44
44
 
45
45
  its(:template_path) { should eq(cache_dir.join('shoes-app-template.zip')) }
46
- its(:remote_template_url) { should eq('http://shoesrb.com/downloads/shoes-app-template-0.0.1.zip') }
46
+ its(:remote_template_url) { should eq(Furoshiki::Shoes::SwtApp::REMOTE_TEMPLATE_URL) }
47
47
  end
48
48
 
49
49
  context "when creating a .app" do
50
50
  before :all do
51
- output_dir.rmtree if output_dir.exist?
52
- output_dir.mkpath
53
- Dir.chdir app_dir do
54
- subject.package
51
+ @output_dir.rmtree if @output_dir.exist?
52
+ @output_dir.mkpath
53
+ app_name = 'Sugar Clouds.app'
54
+ @output_file = @output_dir.join app_name
55
+ config = Furoshiki::Shoes::Configuration.load @config_filename
56
+ @subject = Furoshiki::Shoes::SwtApp.new config
57
+ Dir.chdir @app_dir do
58
+ @subject.package
55
59
  end
56
60
  end
61
+ subject { @subject }
57
62
 
58
63
  its(:template_path) { should exist }
59
64
 
60
65
  it "creates a .app" do
61
- output_file.should exist
66
+ @output_file.should exist
62
67
  end
63
68
 
64
69
  it "includes launcher" do
@@ -73,7 +78,7 @@ describe Furoshiki::Shoes::SwtApp do
73
78
  end
74
79
 
75
80
  it "deletes generic icon" do
76
- icon.parent.join('GenericApp.icns').should_not exist
81
+ icon.parent.join('GenericApp.icns').should_not exist
77
82
  end
78
83
 
79
84
  it "injects icon" do
@@ -85,14 +90,14 @@ describe Furoshiki::Shoes::SwtApp do
85
90
  end
86
91
 
87
92
  it "removes any extraneous jars" do
88
- jar_dir_contents = output_file.join("Contents/Java").children
93
+ jar_dir_contents = @output_file.join("Contents/Java").children
89
94
  jar_dir_contents.reject {|f| f == jar }.should be_empty
90
95
  end
91
96
 
92
97
  describe "Info.plist" do
93
98
  require 'plist'
94
99
  before :all do
95
- @plist = Plist.parse_xml(output_file.join 'Contents/Info.plist')
100
+ @plist = Plist.parse_xml(@output_file.join 'Contents/Info.plist')
96
101
  end
97
102
 
98
103
  it "sets identifier" do
@@ -116,4 +121,13 @@ describe Furoshiki::Shoes::SwtApp do
116
121
  end
117
122
  end
118
123
  end
124
+
125
+ describe "with an invalid configuration" do
126
+ let(:config) { Furoshiki::Shoes::Configuration.new }
127
+ subject { Furoshiki::Shoes::SwtApp.new config }
128
+
129
+ it "fails to initialize" do
130
+ lambda { subject }.should raise_error(Furoshiki::ConfigurationError)
131
+ end
132
+ end
119
133
  end
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require_relative 'spec_helper'
2
3
  require 'pathname'
3
4
  require 'furoshiki/shoes/swt_jar'
@@ -10,17 +11,18 @@ describe Furoshiki::Shoes::SwtJar do
10
11
 
11
12
  context "when creating a .jar" do
12
13
  before :all do
13
- output_dir.rmtree if output_dir.exist?
14
- output_dir.mkpath
15
- Dir.chdir app_dir do
16
- @jar_path = subject.package(output_dir)
14
+ @output_dir.rmtree if @output_dir.exist?
15
+ @output_dir.mkpath
16
+ config = Furoshiki::Shoes::Configuration.load(@config_filename)
17
+ @subject = Furoshiki::Shoes::SwtJar.new(config)
18
+ Dir.chdir @app_dir do
19
+ @jar_path = @subject.package(@output_dir)
17
20
  end
18
21
  end
19
22
 
20
23
  let(:jar_name) { 'sweet-nebulae.jar' }
21
- let(:output_file) { Pathname.new(output_dir.join jar_name) }
22
- let(:config) { Furoshiki::Shoes::Configuration.load(config_filename) }
23
- subject { Furoshiki::Shoes::SwtJar.new(config) }
24
+ let(:output_file) { Pathname.new(@output_dir.join jar_name) }
25
+ subject { @subject }
24
26
 
25
27
  it "creates a .jar" do
26
28
  output_file.should exist
@@ -39,7 +41,16 @@ describe Furoshiki::Shoes::SwtJar do
39
41
  jar.entries.should_not include("dir_to_ignore/file_to_ignore")
40
42
  end
41
43
 
42
- its(:default_dir) { should eq(output_dir) }
44
+ its(:default_dir) { should eq(@output_dir) }
43
45
  its(:filename) { should eq(jar_name) }
44
46
  end
47
+
48
+ describe "with an invalid configuration" do
49
+ let(:config) { Furoshiki::Shoes::Configuration.new }
50
+ subject { Furoshiki::Shoes::SwtJar.new(config) }
51
+
52
+ it "fails to initialize" do
53
+ lambda { subject }.should raise_error(Furoshiki::ConfigurationError)
54
+ end
55
+ end
45
56
  end
@@ -1,21 +1,23 @@
1
1
  include ZipHelpers
2
2
 
3
3
  shared_context 'package' do
4
- let(:app_dir) { spec_dir.join 'shoes/test_app' }
5
- let(:output_dir) { app_dir.join 'pkg' }
4
+ before :all do
5
+ @app_dir = spec_dir.join 'shoes/test_app'
6
+ @output_dir = @app_dir.join 'pkg'
7
+ end
6
8
  end
7
9
 
8
10
  shared_context 'zip' do
9
11
  include_context 'package'
10
- let(:output_file) { output_dir.join 'zip_directory_spec.zip' }
12
+ let(:output_file) { @output_dir.join 'zip_directory_spec.zip' }
11
13
  let(:zip) { Zip::ZipFile.open output_file }
12
14
 
13
15
  before :all do
14
- output_dir.mkpath
15
- subject.write
16
+ @output_dir.mkpath
17
+ @output_file = @output_dir.join 'zip_directory_spec.zip'
16
18
  end
17
19
 
18
20
  after :all do
19
- FileUtils.rm_rf output_dir
21
+ FileUtils.rm_rf @output_dir
20
22
  end
21
23
  end
@@ -3,22 +3,27 @@ require 'fileutils'
3
3
  require 'furoshiki/zip'
4
4
 
5
5
  describe Furoshiki::Zip::DirectoryContents do
6
- subject { Furoshiki::Zip::DirectoryContents.new input_dir, output_file }
7
6
 
8
7
  context "output file" do
9
8
  include_context 'zip'
10
9
 
10
+ before :all do
11
+ zip_directory_contents = Furoshiki::Zip::DirectoryContents.new input_dir, @output_file
12
+ zip_directory_contents.write
13
+ @zip = Zip::ZipFile.open @output_file
14
+ end
15
+
11
16
  it "exists" do
12
- output_file.should exist
17
+ @output_file.should exist
13
18
  end
14
19
 
15
20
  it "does not include input directory without parents" do
16
- zip.entries.map(&:name).should_not include(add_trailing_slash input_dir.basename)
21
+ @zip.entries.map(&:name).should_not include(add_trailing_slash input_dir.basename)
17
22
  end
18
23
 
19
24
  relative_input_paths(input_dir).each do |path|
20
25
  it "includes all children of input directory" do
21
- zip.entries.map(&:name).should include(path)
26
+ @zip.entries.map(&:name).should include(path)
22
27
  end
23
28
  end
24
29
  end
@@ -8,23 +8,29 @@ describe Furoshiki::Zip::Directory do
8
8
  context "output file" do
9
9
  include_context 'zip'
10
10
 
11
+ before :all do
12
+ zip_directory = Furoshiki::Zip::Directory.new input_dir, @output_file
13
+ zip_directory.write
14
+ @zip = Zip::ZipFile.open @output_file
15
+ end
16
+
11
17
  it "exists" do
12
- output_file.should exist
18
+ @output_file.should exist
13
19
  end
14
20
 
15
21
  it "includes input directory without parents" do
16
- zip.entries.map(&:name).should include(add_trailing_slash input_dir.basename)
22
+ @zip.entries.map(&:name).should include(add_trailing_slash input_dir.basename)
17
23
  end
18
24
 
19
25
  relative_input_paths(input_dir.parent).each do |path|
20
26
  it "includes all children of input directory" do
21
- zip.entries.map(&:name).should include(path)
27
+ @zip.entries.map(&:name).should include(path)
22
28
  end
23
29
  end
24
30
 
25
31
  it "doesn't include extra files" do
26
32
  number_of_files = Dir.glob("#{input_dir}/**/*").push(input_dir).length
27
- zip.entries.length.should eq(number_of_files)
33
+ @zip.entries.length.should eq(number_of_files)
28
34
  end
29
35
  end
30
36
  end
metadata CHANGED
@@ -1,45 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: furoshiki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease:
5
+ version: 0.1.1
5
6
  platform: ruby
6
7
  authors:
7
8
  - Steve Klabnik
8
- autorequire:
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-03-12 00:00:00.000000000 Z
12
+ date: 2013-09-27 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: warbler
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ none: false
15
22
  requirement: !ruby/object:Gem::Requirement
16
23
  requirements:
17
24
  - - '>='
18
25
  - !ruby/object:Gem::Version
19
26
  version: '0'
20
- type: :runtime
27
+ none: false
21
28
  prerelease: false
29
+ type: :runtime
30
+ - !ruby/object:Gem::Dependency
31
+ name: plist
22
32
  version_requirements: !ruby/object:Gem::Requirement
23
33
  requirements:
24
34
  - - '>='
25
35
  - !ruby/object:Gem::Version
26
36
  version: '0'
37
+ none: false
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ none: false
44
+ prerelease: false
45
+ type: :runtime
27
46
  - !ruby/object:Gem::Dependency
28
- name: plist
47
+ name: shoes
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ none: false
29
54
  requirement: !ruby/object:Gem::Requirement
30
55
  requirements:
31
56
  - - '>='
32
57
  - !ruby/object:Gem::Version
33
58
  version: '0'
59
+ none: false
60
+ prerelease: false
34
61
  type: :runtime
62
+ - !ruby/object:Gem::Dependency
63
+ name: rubyzip
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - <
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0
69
+ none: false
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - <
73
+ - !ruby/object:Gem::Version
74
+ version: 1.0.0
75
+ none: false
35
76
  prerelease: false
77
+ type: :runtime
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
36
80
  version_requirements: !ruby/object:Gem::Requirement
37
81
  requirements:
38
82
  - - '>='
39
83
  - !ruby/object:Gem::Version
40
84
  version: '0'
41
- description: Create .app, .exe, and $LINUX_PACKAGE versions of your application, with
42
- its own embedded Ruby.
85
+ none: false
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ none: false
92
+ prerelease: false
93
+ type: :development
94
+ - !ruby/object:Gem::Dependency
95
+ name: rspec
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ none: false
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ none: false
108
+ prerelease: false
109
+ type: :development
110
+ description: Create .app, .exe, and $LINUX_PACKAGE versions of your application, with its own embedded Ruby.
43
111
  email: steve@steveklabnik.com
44
112
  executables: []
45
113
  extensions: []
@@ -47,6 +115,9 @@ extra_rdoc_files: []
47
115
  files:
48
116
  - .gitignore
49
117
  - .rspec
118
+ - .ruby-gemset
119
+ - .ruby-version
120
+ - .travis.yml
50
121
  - Gemfile
51
122
  - LICENSE
52
123
  - README.rdoc
@@ -87,8 +158,7 @@ files:
87
158
  - vendor/appbundler-1.0.jar
88
159
  homepage: http://github.com/steveklabnik/furoshiki
89
160
  licenses: []
90
- metadata: {}
91
- post_install_message:
161
+ post_install_message:
92
162
  rdoc_options: []
93
163
  require_paths:
94
164
  - lib
@@ -97,35 +167,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
167
  - - '>='
98
168
  - !ruby/object:Gem::Version
99
169
  version: '0'
170
+ segments:
171
+ - 0
172
+ hash: 2
173
+ none: false
100
174
  required_rubygems_version: !ruby/object:Gem::Requirement
101
175
  requirements:
102
176
  - - '>='
103
177
  - !ruby/object:Gem::Version
104
178
  version: '0'
179
+ segments:
180
+ - 0
181
+ hash: 2
182
+ none: false
105
183
  requirements: []
106
- rubyforge_project:
107
- rubygems_version: 2.0.0
108
- signing_key:
109
- specification_version: 4
184
+ rubyforge_project:
185
+ rubygems_version: 1.8.24
186
+ signing_key:
187
+ specification_version: 3
110
188
  summary: Package and distribute applications with Ruby.
111
- test_files:
112
- - spec/shoes/configuration_spec.rb
113
- - spec/shoes/spec_helper.rb
114
- - spec/shoes/support/shared_config.rb
115
- - spec/shoes/swt_app_spec.rb
116
- - spec/shoes/swt_jar_spec.rb
117
- - spec/shoes/test_app/app.yaml
118
- - spec/shoes/test_app/bin/hello_world
119
- - spec/shoes/test_app/dir_to_ignore/file_to_ignore.txt
120
- - spec/shoes/test_app/img/boots.icns
121
- - spec/shoes/test_app/img/boots.ico
122
- - spec/shoes/test_app/img/boots_512x512x32.png
123
- - spec/shoes/test_app/sibling.rb
124
- - spec/spec_helper.rb
125
- - spec/support/shared_zip.rb
126
- - spec/support/zip/a/a.rb
127
- - spec/support/zip/a/b/b.png
128
- - spec/support/zip/a/b/c/c.rb
129
- - spec/zip/directory_contents_spec.rb
130
- - spec/zip/directory_spec.rb
131
- has_rdoc:
189
+ test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: de386c74229b401a317c15d3c8ddb5e2b0af9ab4
4
- data.tar.gz: 9c590ec9777006a102a182f6ee5586b5c2ce5c3b
5
- SHA512:
6
- metadata.gz: 0e8b5ab686470eb569929192edae4584c911edc8deac8c545d15780034b562e2d9a01fc6e37fa8d6863df07a895cb624cf0bc01ffa491aa58d68ea7cebce973e
7
- data.tar.gz: 96eda86a72af8d7888eabc82863b748eca4aa673f6a51c3865522b6d6afb8295509f9d795f37d07cdf5202b6f7bc8adef80920aebeb3569c41991ec84d5ee0b3