ey_resin 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/ey_resin.rb +10 -0
- data/lib/ey_resin/archive.rb +44 -0
- data/lib/ey_resin/expand.rb +78 -0
- data/lib/ey_resin/manifest.rb +41 -0
- data/lib/ey_resin/paths.rb +47 -0
- data/lib/ey_resin/version.rb +5 -0
- data/spec/fixtures/resin-archive-integration-testing-arch-32.tgz +0 -0
- data/spec/fixtures/resin-archive-integration-testing-arch-64.tgz +0 -0
- data/spec/integration/resin_expand_spec.rb +58 -0
- data/spec/models/archive_spec.rb +23 -0
- data/spec/models/manifest_spec.rb +59 -0
- data/spec/models/paths_spec.rb +28 -0
- data/spec/models/resin_expand_spec.rb +25 -0
- data/spec/spec_helper.rb +48 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 84fe23ef483433dd5b233293eef404a5202ae816
|
4
|
+
data.tar.gz: dfe159d4a2dea2f7c54713485e71c3bfdce1d895
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f7ae095793771c8a13e168bcac12df61f7af4b0bffbab9dd499df807ae9acf030c196967635529d9cd9d854cbefaf71d17c6b0c7785c363c81110538ee5a3574
|
7
|
+
data.tar.gz: 29472b4207055e1a69a28e1fa3f2093ab61b3f1ff74358104c84de9c40382b5e31a49693b6f35e80cd6786a47e01c6cb02be502a93551fbd9060678c0d6a3fa1
|
data/lib/ey_resin.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
3
|
+
module EY
|
4
|
+
module Resin
|
5
|
+
class Archive
|
6
|
+
def initialize(resin_sha, bits)
|
7
|
+
self.resin_sha = resin_sha.to_s
|
8
|
+
self.arch_bits = bits.to_s
|
9
|
+
|
10
|
+
if resin_sha.empty? || arch_bits.empty?
|
11
|
+
raise ArgumentError, "Resin::Archive must be initialized with a non-blank resin_sha and arch_bits"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def version
|
16
|
+
"archive-#{resin_sha}-arch-#{arch_bits}".gsub(/[^#{Addressable::URI::CharacterClasses::UNRESERVED}]/, '').downcase
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
%|EY::Resin::Archive(version: #{version.inspect})|
|
21
|
+
end
|
22
|
+
|
23
|
+
def filename
|
24
|
+
"resin-#{version}.tgz"
|
25
|
+
end
|
26
|
+
|
27
|
+
def uri
|
28
|
+
Addressable::URI.new(
|
29
|
+
:scheme => "https",
|
30
|
+
:host => "ey-cloud.s3.amazonaws.com",
|
31
|
+
:path => filename
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def check
|
36
|
+
system("curl -s -I #{uri} | grep '200 OK' 1>/dev/null")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_accessor :resin_sha, :arch_bits
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'ey_resin/paths'
|
2
|
+
require 'sous_chef'
|
3
|
+
|
4
|
+
module EY
|
5
|
+
module Resin
|
6
|
+
class Expand
|
7
|
+
def initialize(resin_archive)
|
8
|
+
self.resin_archive = resin_archive
|
9
|
+
self.recipe = build_recipe
|
10
|
+
|
11
|
+
recipe.node = {
|
12
|
+
:version => resin_archive.version,
|
13
|
+
:uri => resin_archive.uri,
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def check
|
18
|
+
resin_archive.check || fail("Resin archive #{resin_archive.uri} not curl-able!")
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_script
|
22
|
+
recipe.to_script
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
attr_accessor :resin_archive, :recipe
|
28
|
+
|
29
|
+
def build_recipe
|
30
|
+
SousChef::Recipe.new do
|
31
|
+
halt_on_failed_command
|
32
|
+
|
33
|
+
uri = node[:uri]
|
34
|
+
version = node[:version]
|
35
|
+
root = EY::Resin.archive_root
|
36
|
+
bin_dir = EY::Resin.bin_dir
|
37
|
+
version_file = EY::Resin.version_file
|
38
|
+
dummy_auto_gem_file = EY::Resin.dummy_auto_gem_file
|
39
|
+
|
40
|
+
directory "ensure the archive destination directory exists" do
|
41
|
+
path root
|
42
|
+
end
|
43
|
+
|
44
|
+
execute "download and unpack the resin archive into it if needed" do
|
45
|
+
only_if %{[[ ! -s #{version_file} ]] || [[ "#{version}" != `cat #{version_file}` ]]}
|
46
|
+
raise "Almost rm -rf'd /" if root.to_s == ''
|
47
|
+
command "rm -rf #{root}/*"
|
48
|
+
command "curl -L --connect-timeout 10 --max-time 120 --retry 3 --retry-max-time 20 #{uri} | tar xz -C #{root}"
|
49
|
+
end
|
50
|
+
|
51
|
+
file "save the version file for future deploys" do
|
52
|
+
path version_file
|
53
|
+
content version
|
54
|
+
mode 0644
|
55
|
+
end
|
56
|
+
|
57
|
+
file "/etc/env.d/93ey-resin" do
|
58
|
+
echo "Setting up ey-resin env"
|
59
|
+
content <<-EOS
|
60
|
+
PATH="#{bin_dir}"
|
61
|
+
ROOTPATH="#{bin_dir}"
|
62
|
+
EOS
|
63
|
+
end
|
64
|
+
|
65
|
+
file "set up legacy support auto_gem" do
|
66
|
+
path dummy_auto_gem_file
|
67
|
+
content "# a placeholder for legacy resin 1.8/1.9 support so we can keep RUBYOPT='-rauto_gem'"
|
68
|
+
mode 0644
|
69
|
+
end
|
70
|
+
|
71
|
+
execute "rebuild the environment" do
|
72
|
+
command "env-update"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'multi_json'
|
3
|
+
require 'jexp'
|
4
|
+
|
5
|
+
module EY
|
6
|
+
module Resin
|
7
|
+
class Manifest < Struct.new(:ruby_version, :ruby_pl, :ruby_url, :rubygems_version, :rubygems_url, :gems, :bundle)
|
8
|
+
include JEXP::Resource
|
9
|
+
|
10
|
+
def self.parse(serialized_data)
|
11
|
+
if serialized_data.nil?
|
12
|
+
raise ArgumentError, "Resin::Manifest unable to parse: nil"
|
13
|
+
end
|
14
|
+
new(MultiJson.decode(serialized_data))
|
15
|
+
rescue MultiJson::DecodeError => e
|
16
|
+
raise ArgumentError, "Resin::Manifest unable to parse: #{serialized_data.inspect}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def dump
|
20
|
+
MultiJson.encode(to_hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
def ==(other)
|
24
|
+
other.respond_to?(:dump) && dump == other.dump
|
25
|
+
end
|
26
|
+
|
27
|
+
def compute_sha
|
28
|
+
raw = [ruby_version, ruby_pl, ruby_url, rubygems_version, rubygems_url]
|
29
|
+
# This should reall sort by gem name to be consistent, but we're currently unsure about changing the hashing algorithm.
|
30
|
+
if bundle
|
31
|
+
raw << File.read(bundle).gsub(/\s+/, '')
|
32
|
+
else
|
33
|
+
gems.each do |(name,version)|
|
34
|
+
raw << "#{name}-#{version}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
Digest::SHA1.hexdigest(raw.join("|"))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module EY
|
4
|
+
module Resin
|
5
|
+
module Paths
|
6
|
+
ARCHIVE_ROOT = Pathname.new("/usr/local/ey_resin")
|
7
|
+
|
8
|
+
def archive_root
|
9
|
+
ARCHIVE_ROOT
|
10
|
+
end
|
11
|
+
|
12
|
+
def version_file
|
13
|
+
archive_root.join('resin_archive_version.txt')
|
14
|
+
end
|
15
|
+
|
16
|
+
def bin(name)
|
17
|
+
archive_root.join('bin', name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def bin_dir
|
21
|
+
archive_root.join('bin')
|
22
|
+
end
|
23
|
+
|
24
|
+
def ruby_dir
|
25
|
+
archive_root.join('ruby')
|
26
|
+
end
|
27
|
+
|
28
|
+
def ruby_bin_dir
|
29
|
+
archive_root.join('ruby', 'bin')
|
30
|
+
end
|
31
|
+
|
32
|
+
def ruby_binary
|
33
|
+
archive_root.join('ruby', 'bin', 'ruby')
|
34
|
+
end
|
35
|
+
|
36
|
+
def gem_binary
|
37
|
+
archive_root.join('ruby', 'bin', 'gem')
|
38
|
+
end
|
39
|
+
|
40
|
+
def dummy_auto_gem_file
|
41
|
+
# XXX where is the best place to put it?
|
42
|
+
# this path is in the resin load path $:
|
43
|
+
ruby_dir.join("lib","ruby", "site_ruby", "auto_gem.rb")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dracul/test'
|
3
|
+
|
4
|
+
describe EY::Resin::Expand do
|
5
|
+
pending do
|
6
|
+
@instance = Dracul::Test.monsoon.new_instance
|
7
|
+
@resin_archive = EY::Resin::Archive.new("integration-testing", @instance.flavor.architecture.bits)
|
8
|
+
@expand_script = described_class.new(@resin_archive).to_script
|
9
|
+
@instance.script!(@expand_script)
|
10
|
+
end
|
11
|
+
|
12
|
+
pending do
|
13
|
+
Dracul::Test.monsoon.kill_instance(@instance)
|
14
|
+
end
|
15
|
+
|
16
|
+
shared_examples_for "an expanded archive with version file" do
|
17
|
+
pending "unpacks the archive" do
|
18
|
+
@instance.ssh("test -d #{EY::Resin.archive_root}").should be_success
|
19
|
+
@instance.ssh("test -d #{EY::Resin.ruby_dir}").should be_success
|
20
|
+
@instance.ssh("test -s #{EY::Resin.ruby_binary}").should be_success
|
21
|
+
end
|
22
|
+
|
23
|
+
pending "writes the version file" do
|
24
|
+
@instance.ssh(%|[[ "#{@resin_archive.version}" == `cat #{EY::Resin.version_file}` ]]|).should be_success
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "fresh install" do
|
29
|
+
it_should_behave_like "an expanded archive with version file"
|
30
|
+
|
31
|
+
pending "doesn't unpack twice when deployed twice" do
|
32
|
+
lambda { @instance.script!(@expand_script) }.
|
33
|
+
should_not change { @instance.ssh("stat -c '%Y' #{EY::Resin.version_file} #{EY::Resin.archive_root}/ruby").stdout }
|
34
|
+
end
|
35
|
+
|
36
|
+
pending "adds Archive.root bin/ to the PATH" do
|
37
|
+
@instance.ssh("echo $PATH | grep #{EY::Resin.archive_root}").should be_success
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "changing versions" do
|
42
|
+
pending do
|
43
|
+
@instance.ssh("echo old_version >> #{EY::Resin.version_file}")
|
44
|
+
@instance.ssh("echo delete me >> #{EY::Resin.ruby_dir}/delete_me")
|
45
|
+
@instance.ssh("echo delete me >> #{EY::Resin.bin_dir}/delete_me")
|
46
|
+
|
47
|
+
@instance.script!(@expand_script)
|
48
|
+
end
|
49
|
+
|
50
|
+
it_should_behave_like "an expanded archive with version file"
|
51
|
+
|
52
|
+
pending "removes the old archive" do
|
53
|
+
@instance.ssh("! test -s #{EY::Resin.ruby_dir}/delete_me").should be_success
|
54
|
+
@instance.ssh("! test -s #{EY::Resin.bin_dir}/delete_me").should be_success
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EY::Resin::Archive do
|
4
|
+
subject { EY::Resin::Archive.new('sha',32) }
|
5
|
+
|
6
|
+
|
7
|
+
it "generates a url for the archive" do
|
8
|
+
subject.uri.to_s.should == "https://ey-cloud.s3.amazonaws.com/resin-archive-sha-arch-32.tgz"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "generates a version string" do
|
12
|
+
subject.version.should == 'archive-sha-arch-32'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "checks for resin archive" do
|
16
|
+
subject.check.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "finds a resin archive on check" do
|
20
|
+
rc = EY::Resin::Archive.new('43883338dd595d022c795aa03613dab0664fcd42', 32) # arbitrary archive I know existed at the time
|
21
|
+
rc.check.should be_true
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ResinManifest" do
|
4
|
+
before do
|
5
|
+
@data = {
|
6
|
+
:ruby_version => '1.9.2',
|
7
|
+
:ruby_pl => '123',
|
8
|
+
:ruby_url => 'http://ruby',
|
9
|
+
:rubygems_version => '1.2.3',
|
10
|
+
:rubygems_url => 'http://rubygems',
|
11
|
+
:gems => [
|
12
|
+
['outoforder', '1.2.3'],
|
13
|
+
['ey_enzyme', '7.8.9'],
|
14
|
+
],
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { EY::Resin::Manifest.new(@data) }
|
19
|
+
|
20
|
+
it "loads options from config" do
|
21
|
+
subject.ruby_version.should == @data[:ruby_version]
|
22
|
+
subject.ruby_pl.should == @data[:ruby_pl]
|
23
|
+
subject.ruby_url.should == @data[:ruby_url]
|
24
|
+
subject.rubygems_version.should == @data[:rubygems_version]
|
25
|
+
subject.rubygems_url.should == @data[:rubygems_url]
|
26
|
+
subject.gems.should == @data[:gems]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "computes the same resin sha from the config every time" do
|
30
|
+
subject.compute_sha.should == Digest::SHA1.hexdigest('1.9.2|123|http://ruby|1.2.3|http://rubygems|outoforder-1.2.3|ey_enzyme-7.8.9')
|
31
|
+
end
|
32
|
+
|
33
|
+
it "refuses to parse nil" do
|
34
|
+
lambda { EY::Resin::Manifest.parse(nil) }.should raise_error(ArgumentError, "Resin::Manifest unable to parse: nil")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "refuses to parse bad json" do
|
38
|
+
lambda { EY::Resin::Manifest.parse('||') }.should raise_error(ArgumentError, 'Resin::Manifest unable to parse: "||"')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can parse the data it dumps" do
|
42
|
+
EY::Resin::Manifest.parse(subject.dump).should == subject
|
43
|
+
end
|
44
|
+
|
45
|
+
context "with a bundle file" do
|
46
|
+
before do
|
47
|
+
@bundle = File.expand_path('../../Gemfile', File.dirname(__FILE__))
|
48
|
+
@data.delete(:gems)
|
49
|
+
@data[:bundle] = @bundle
|
50
|
+
end
|
51
|
+
|
52
|
+
subject { EY::Resin::Manifest.new(@data) }
|
53
|
+
|
54
|
+
it 'generates the sha using the content of the file' do
|
55
|
+
bundle_content = File.read(@bundle).gsub(/\s+/, '')
|
56
|
+
subject.compute_sha.should == Digest::SHA1.hexdigest("1.9.2|123|http://ruby|1.2.3|http://rubygems|#{bundle_content}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EY::Resin do
|
4
|
+
it "contains the archive root" do
|
5
|
+
EY::Resin.archive_root.should == Pathname.new('/usr/local/ey_resin')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "contains the archive root" do
|
9
|
+
EY::Resin.version_file.should == EY::Resin.archive_root.join("resin_archive_version.txt")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "knows where the ruby binary is" do
|
13
|
+
EY::Resin.ruby_binary.should == EY::Resin.archive_root.join("ruby/bin/ruby")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "knows where the gem binary is" do
|
17
|
+
EY::Resin.gem_binary.should == EY::Resin.archive_root.join("ruby/bin/gem")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "knows where the bin dir is" do
|
21
|
+
EY::Resin.bin_dir.should == EY::Resin.archive_root.join("bin")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "knows where the hax auto_gem file is" do
|
25
|
+
EY::Resin.dummy_auto_gem_file.should == EY::Resin.ruby_dir.join("lib","ruby", "site_ruby", "auto_gem.rb")
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EY::Resin::Expand do
|
4
|
+
describe ".to_script" do
|
5
|
+
let(:resin_archive) { EY::Resin::Archive.new('hello-sha',64) }
|
6
|
+
subject { described_class.new(resin_archive).to_script }
|
7
|
+
|
8
|
+
it "outputs a script" do
|
9
|
+
subject.should_not be_empty
|
10
|
+
end
|
11
|
+
|
12
|
+
it "curls the url" do
|
13
|
+
subject.should match(/curl .*#{resin_archive.uri}/)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "expands the tarball" do
|
17
|
+
subject.should match(/tar xz -C #{EY::Resin.archive_root}/)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a dummy auto_gem file" do
|
21
|
+
subject.should match(/#{EY::Resin.dummy_auto_gem_file}/)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'ey_resin'
|
4
|
+
require 'ey_slater/test'
|
5
|
+
require 'rspec'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.include(EY::Slater::Test)
|
9
|
+
|
10
|
+
def command_should_succeed(instance, command)
|
11
|
+
result = instance.ssh(command)
|
12
|
+
return if result.success?
|
13
|
+
|
14
|
+
fail <<-MESSAGE
|
15
|
+
Command expected to succeed on #{instance.public_hostname}:
|
16
|
+
|
17
|
+
#{command}
|
18
|
+
|
19
|
+
But failed with exit status $? = #{result.exit_code}.
|
20
|
+
|
21
|
+
stdout:
|
22
|
+
|
23
|
+
#{result.stdout}
|
24
|
+
|
25
|
+
stderr:
|
26
|
+
|
27
|
+
#{result.stderr}
|
28
|
+
MESSAGE
|
29
|
+
end
|
30
|
+
|
31
|
+
def command_should_output(instance, command, expected)
|
32
|
+
actual = instance.ssh("#{command} 2>&1").stdout
|
33
|
+
if expected.nil?
|
34
|
+
actual.should be_nil
|
35
|
+
else
|
36
|
+
actual.should_not be_nil
|
37
|
+
if expected.is_a?(Regexp)
|
38
|
+
actual.strip.should =~ expected
|
39
|
+
else
|
40
|
+
actual.strip.should == expected
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def fixture_path(name)
|
46
|
+
File.expand_path("../fixtures/#{name}", __FILE__)
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ey_resin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Engine Yard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2011-08-10 00:00:00 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: sous_chef
|
16
|
+
prerelease: false
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.2
|
22
|
+
type: :runtime
|
23
|
+
version_requirements: *id001
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: addressable
|
26
|
+
prerelease: false
|
27
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- &id003
|
30
|
+
- ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id002
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: multi_json
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- *id003
|
41
|
+
type: :runtime
|
42
|
+
version_requirements: *id004
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rspec
|
45
|
+
prerelease: false
|
46
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ~>
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.0.0
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id005
|
53
|
+
description: ey resin
|
54
|
+
email:
|
55
|
+
- gems@engineyard.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- lib/ey_resin/archive.rb
|
64
|
+
- lib/ey_resin/expand.rb
|
65
|
+
- lib/ey_resin/manifest.rb
|
66
|
+
- lib/ey_resin/paths.rb
|
67
|
+
- lib/ey_resin/version.rb
|
68
|
+
- lib/ey_resin.rb
|
69
|
+
- spec/fixtures/resin-archive-integration-testing-arch-32.tgz
|
70
|
+
- spec/fixtures/resin-archive-integration-testing-arch-64.tgz
|
71
|
+
- spec/integration/resin_expand_spec.rb
|
72
|
+
- spec/models/archive_spec.rb
|
73
|
+
- spec/models/manifest_spec.rb
|
74
|
+
- spec/models/paths_spec.rb
|
75
|
+
- spec/models/resin_expand_spec.rb
|
76
|
+
- spec/spec_helper.rb
|
77
|
+
homepage: http://github.com/engineyard/ey_resin
|
78
|
+
licenses: []
|
79
|
+
|
80
|
+
metadata: {}
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- *id003
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.3.1
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.0.14
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: ey resin
|
102
|
+
test_files:
|
103
|
+
- spec/fixtures/resin-archive-integration-testing-arch-32.tgz
|
104
|
+
- spec/fixtures/resin-archive-integration-testing-arch-64.tgz
|
105
|
+
- spec/integration/resin_expand_spec.rb
|
106
|
+
- spec/models/archive_spec.rb
|
107
|
+
- spec/models/manifest_spec.rb
|
108
|
+
- spec/models/paths_spec.rb
|
109
|
+
- spec/models/resin_expand_spec.rb
|
110
|
+
- spec/spec_helper.rb
|