bindeps 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bindeps.rb +64 -33
- data/lib/bindeps/version.rb +1 -1
- data/lib/unpacker.rb +23 -24
- data/test/data/bin/fakelibbin +9 -0
- data/test/data/fakelibbin.tgz +0 -0
- data/test/data/fakelibbin.yaml +18 -0
- data/test/data/lib/fakelib +1 -0
- data/test/helper.rb +2 -1
- data/test/test_bindeps.rb +42 -7
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b3ffdc990f2ecff30e081c0a569c8a940a77479
|
4
|
+
data.tar.gz: 041feed4e988c6b939ae895b3628ea6db5893018
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1ff2005808a9af7e46a22c46b01a87e6aed112ccf26b3516748f5a56f746543f0a0b6af73448d4e5d689c9c6b62539c10bef9ba3d2778db1658bca7b4c2ec2d
|
7
|
+
data.tar.gz: 5de0ad5c19d453e8a3a2614440f15a6e196d4115b4f3e90684200618ef9d825745f89d7a18fa7ee94ea241390e9fcd6ffc34f29235d055639722860909890ff8
|
data/lib/bindeps.rb
CHANGED
@@ -3,6 +3,7 @@ require "unpacker"
|
|
3
3
|
require "fixwhich"
|
4
4
|
require "tmpdir"
|
5
5
|
require "yaml"
|
6
|
+
require "fileutils"
|
6
7
|
|
7
8
|
module Bindeps
|
8
9
|
|
@@ -13,16 +14,19 @@ module Bindeps
|
|
13
14
|
if dependencies.is_a? String
|
14
15
|
dependencies = YAML.load_file dependencies
|
15
16
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
Dir.mktmpdir do |tmpdir|
|
18
|
+
Dir.chdir(tmpdir) do
|
19
|
+
dependencies.each_pair do |name, config|
|
20
|
+
unpack = config.key?('unpack') ? config['unpack'] : true;
|
21
|
+
libraries = config.key?('libraries') ? config['libraries'] : []
|
22
|
+
d = Dependency.new(name,
|
23
|
+
config['binaries'],
|
24
|
+
config['version'],
|
25
|
+
config['url'],
|
26
|
+
unpack,
|
27
|
+
libraries)
|
28
|
+
d.install_missing
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -33,17 +37,20 @@ module Bindeps
|
|
33
37
|
if dependencies.is_a? String
|
34
38
|
dependencies = YAML.load_file dependencies
|
35
39
|
end
|
36
|
-
tmpdir = Dir.mktmpdir
|
37
40
|
missing = []
|
38
|
-
Dir.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
Dir.mktmpdir do |tmpdir|
|
42
|
+
Dir.chdir(tmpdir) do
|
43
|
+
dependencies.each_pair do |name, config|
|
44
|
+
unpack = config.key?('unpack') ? config['unpack'] : true;
|
45
|
+
libraries = config.key?('libraries') ? config['libraries'] : []
|
46
|
+
d = Dependency.new(name,
|
47
|
+
config['binaries'],
|
48
|
+
config['version'],
|
49
|
+
config['url'],
|
50
|
+
unpack,
|
51
|
+
libraries)
|
52
|
+
missing << d unless d.all_installed?
|
53
|
+
end
|
47
54
|
end
|
48
55
|
end
|
49
56
|
missing
|
@@ -51,17 +58,19 @@ module Bindeps
|
|
51
58
|
|
52
59
|
class Dependency
|
53
60
|
|
54
|
-
attr_reader :name, :version, :binaries
|
61
|
+
attr_reader :name, :version, :binaries, :libraries
|
55
62
|
|
56
63
|
include Which
|
57
64
|
|
58
|
-
def initialize(name, binaries, versionconfig, urlconfig,
|
65
|
+
def initialize(name, binaries, versionconfig, urlconfig,
|
66
|
+
unpack, libraries=[])
|
59
67
|
@name = name
|
60
68
|
unless binaries.is_a? Array
|
61
69
|
raise ArgumentError,
|
62
70
|
"binaries must be an array"
|
63
71
|
end
|
64
72
|
@binaries = binaries
|
73
|
+
@libraries = libraries
|
65
74
|
@version = versionconfig['number']
|
66
75
|
@version_cmd = versionconfig['command']
|
67
76
|
@url = choose_url urlconfig
|
@@ -70,7 +79,7 @@ module Bindeps
|
|
70
79
|
|
71
80
|
def install_missing
|
72
81
|
unless all_installed?
|
73
|
-
puts "Installing #{@name}..."
|
82
|
+
puts "Installing #{@name} (#{@version})..."
|
74
83
|
download
|
75
84
|
unpack
|
76
85
|
end
|
@@ -85,11 +94,13 @@ module Bindeps
|
|
85
94
|
return sys[os]
|
86
95
|
else
|
87
96
|
raise UnsupportedSystemError,
|
88
|
-
"bindeps config for #{@name} #{arch} doesn't
|
97
|
+
"bindeps config for #{@name} #{arch} doesn't " +
|
98
|
+
"contain an entry for #{os}"
|
89
99
|
end
|
90
100
|
else
|
91
101
|
raise UnsupportedSystemError,
|
92
|
-
"bindeps config for #{@name} doesn't contain an
|
102
|
+
"bindeps config for #{@name} doesn't contain an " +
|
103
|
+
"entry for #{arch}"
|
93
104
|
end
|
94
105
|
end
|
95
106
|
|
@@ -120,14 +131,16 @@ module Bindeps
|
|
120
131
|
Unpacker.unpack(archive) do |dir|
|
121
132
|
Dir.chdir dir do
|
122
133
|
Dir['**/*'].each do |extracted|
|
123
|
-
|
124
|
-
|
134
|
+
file = File.basename(extracted)
|
135
|
+
if @binaries.include?(file) || @libraries.include?(file)
|
136
|
+
dir = File.dirname extracted
|
137
|
+
install(extracted, dir) unless File.directory?(extracted)
|
125
138
|
end
|
126
139
|
end
|
127
140
|
end
|
128
141
|
end
|
129
142
|
else
|
130
|
-
install(@binaries.first)
|
143
|
+
install(@binaries.first, 'bin')
|
131
144
|
end
|
132
145
|
end
|
133
146
|
|
@@ -142,19 +155,37 @@ module Bindeps
|
|
142
155
|
|
143
156
|
def installed? bin
|
144
157
|
path = which(bin)
|
145
|
-
if path
|
158
|
+
if path.length > 0
|
146
159
|
ret = `#{@version_cmd} 2>&1`.split("\n").map{ |l| l.strip }.join('|')
|
147
160
|
if ret && (/#{@version}/ =~ ret)
|
148
161
|
return path
|
149
162
|
end
|
163
|
+
else
|
164
|
+
if Dir.exist?("#{ENV['HOME']}/.local/bin")
|
165
|
+
ENV['PATH'] = ENV['PATH'] + ":#{ENV['HOME']}/.local/bin"
|
166
|
+
path = which(bin)
|
167
|
+
if path.length > 0
|
168
|
+
return path
|
169
|
+
end
|
170
|
+
end
|
150
171
|
end
|
151
172
|
false
|
152
173
|
end
|
153
174
|
|
154
|
-
def install
|
155
|
-
|
156
|
-
|
157
|
-
|
175
|
+
def install(src, destprefix)
|
176
|
+
gem_home = ENV['GEM_HOME']
|
177
|
+
home = ENV['HOME']
|
178
|
+
basedir = File.join(home, '.local')
|
179
|
+
if gem_home.nil?
|
180
|
+
ENV['PATH'] = ENV['PATH'] + ":#{File.join(basedir, 'bin')}"
|
181
|
+
else
|
182
|
+
basedir = ENV['GEM_HOME']
|
183
|
+
end
|
184
|
+
FileUtils.mkdir_p File.join(basedir, 'bin')
|
185
|
+
FileUtils.mkdir_p File.join(basedir, 'lib')
|
186
|
+
destprefix = 'bin' if destprefix == '.'
|
187
|
+
install_location = File.join(basedir, destprefix, File.basename(src))
|
188
|
+
FileUtils.install(src, install_location, :mode => 0775)
|
158
189
|
end
|
159
190
|
|
160
191
|
end
|
data/lib/bindeps/version.rb
CHANGED
data/lib/unpacker.rb
CHANGED
@@ -34,8 +34,6 @@ module Unpacker
|
|
34
34
|
def self.unpack(file, tmpdir = "/tmp", &block)
|
35
35
|
Dir.mktmpdir 'unpacker' do |dir|
|
36
36
|
cmd = case file
|
37
|
-
when /rar$/
|
38
|
-
"unrar x -y #{file} #{dir}"
|
39
37
|
when /(tar|tgz|tar\.gz)$/
|
40
38
|
"tar xzf #{file} --directory #{dir}"
|
41
39
|
when /(tar\.bz|tbz|tar\.bz2)$/
|
@@ -58,31 +56,12 @@ module Unpacker
|
|
58
56
|
end
|
59
57
|
|
60
58
|
def self.archive?(file_name)
|
61
|
-
supported =
|
59
|
+
supported = Unpacker.supported_archives
|
62
60
|
ext = File.extname(file_name).sub('.', '')
|
63
61
|
return true if ext==""
|
64
|
-
if !which('unrar').empty?
|
65
|
-
supported << "rar"
|
66
|
-
end
|
67
|
-
if !which('tar').empty?
|
68
|
-
%w[tar tgz tgz tar.gz tar.bz tar.bz2 tbz].each do |ext|
|
69
|
-
supported << ext
|
70
|
-
end
|
71
|
-
end
|
72
|
-
if !which('unzip').empty?
|
73
|
-
supported << "zip"
|
74
|
-
end
|
75
|
-
if !which('gunzip').empty?
|
76
|
-
supported << "gz"
|
77
|
-
end
|
78
|
-
if !which('bunzip2').empty?
|
79
|
-
supported << "bz2"
|
80
|
-
end
|
81
62
|
support = supported.include? ext
|
82
63
|
if !support
|
83
64
|
help = case file_name
|
84
|
-
when /rar$/
|
85
|
-
"Please install unrar"
|
86
65
|
when /(tar|tgz|tar\.gz|tar\.bz|tbz|tar\.bz2)$/
|
87
66
|
"Please install tar"
|
88
67
|
when /zip$/
|
@@ -102,8 +81,6 @@ module Unpacker
|
|
102
81
|
|
103
82
|
def self.valid?(file_path, file_name = file_path)
|
104
83
|
cmd = case file_name
|
105
|
-
when /rar$/
|
106
|
-
"unrar t #{file_path}"
|
107
84
|
when /(tar|tar\.bz|tbz)$/
|
108
85
|
"tar tf #{file_path}"
|
109
86
|
when /zip$/
|
@@ -123,4 +100,26 @@ module Unpacker
|
|
123
100
|
end
|
124
101
|
end
|
125
102
|
|
103
|
+
def self.supported_archives
|
104
|
+
supported = []
|
105
|
+
if !which('unrar').empty?
|
106
|
+
supported << "rar"
|
107
|
+
end
|
108
|
+
if !which('tar').empty?
|
109
|
+
%w[tar tgz tgz tar.gz tar.bz tar.bz2 tbz].each do |ext|
|
110
|
+
supported << ext
|
111
|
+
end
|
112
|
+
end
|
113
|
+
if !which('unzip').empty?
|
114
|
+
supported << "zip"
|
115
|
+
end
|
116
|
+
if !which('gunzip').empty?
|
117
|
+
supported << "gz"
|
118
|
+
end
|
119
|
+
if !which('bunzip2').empty?
|
120
|
+
supported << "bz2"
|
121
|
+
end
|
122
|
+
supported
|
123
|
+
end
|
124
|
+
|
126
125
|
end # module Unpacker
|
Binary file
|
@@ -0,0 +1,18 @@
|
|
1
|
+
fakelibbin:
|
2
|
+
binaries:
|
3
|
+
- fakelibbin
|
4
|
+
libraries:
|
5
|
+
- fakelib
|
6
|
+
version:
|
7
|
+
number: success
|
8
|
+
command: fakelibbin
|
9
|
+
url:
|
10
|
+
64bit:
|
11
|
+
macosx: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
12
|
+
linux: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
13
|
+
unix: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
14
|
+
32bit:
|
15
|
+
macosx: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
16
|
+
linux: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
17
|
+
unix: https://github.com/Blahah/bindeps/raw/master/test/data/fakelibbin.tgz
|
18
|
+
unpack: true
|
@@ -0,0 +1 @@
|
|
1
|
+
success
|
data/test/helper.rb
CHANGED
data/test/test_bindeps.rb
CHANGED
@@ -10,12 +10,20 @@ class TestBindeps < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
teardown do
|
13
|
-
# delete fake binaries
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
# delete fake binaries
|
14
|
+
bindirs = [File.join(ENV['HOME'], '.local', 'bin')]
|
15
|
+
if !ENV['GEM_HOME'].nil?
|
16
|
+
bindirs << File.join(ENV['GEM_HOME'], 'bin')
|
17
|
+
end
|
18
|
+
bindirs.each do |bindir|
|
19
|
+
%w[fakebin fakebin2 fakebin3 fakebin4 fakelibbin].each do |bin|
|
20
|
+
path = File.join(bindir, bin)
|
21
|
+
FileUtils.rm(path) if File.exist?(path)
|
22
|
+
end
|
23
|
+
# delete fake lib
|
24
|
+
libpath = File.expand_path File.join(bindir, '../lib/fakelib')
|
25
|
+
FileUtils.rm(libpath) if File.exist?(libpath)
|
26
|
+
end
|
19
27
|
end
|
20
28
|
|
21
29
|
should "identify and install missing dependencies" do
|
@@ -141,7 +149,34 @@ class TestBindeps < Test::Unit::TestCase
|
|
141
149
|
config['version'],
|
142
150
|
config['url'],
|
143
151
|
config['unpack'])
|
144
|
-
assert d.installed?('fakebin4'), "fakebin4 installed"
|
152
|
+
assert d.installed?('fakebin4'), "fakebin4 not installed"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
should "install to a local directory if gem_home can't be found" do
|
157
|
+
ENV['GEM_HOME']=nil
|
158
|
+
test_yaml = File.join(@data_dir, 'fakebin.yaml')
|
159
|
+
Bindeps.require test_yaml
|
160
|
+
assert_equal 'success', `fakebin`.strip
|
161
|
+
test_yaml = File.join(@data_dir, 'fakebin2.yaml')
|
162
|
+
# install fakebin2
|
163
|
+
Bindeps.require test_yaml
|
164
|
+
msg = "this is a non-matching line\nfakebin v2.0.1\nmore non-matching stuff"
|
165
|
+
assert_equal msg, `fakebin2`.strip
|
166
|
+
end
|
167
|
+
|
168
|
+
should "handle lib dependencies" do
|
169
|
+
test_yaml = File.join(@data_dir, 'fakelibbin.yaml')
|
170
|
+
Bindeps.require test_yaml
|
171
|
+
deps = YAML.load_file test_yaml
|
172
|
+
deps.each_pair do |name, config|
|
173
|
+
d = Bindeps::Dependency.new(name,
|
174
|
+
config['binaries'],
|
175
|
+
config['version'],
|
176
|
+
config['url'],
|
177
|
+
config['unpack'],
|
178
|
+
config['libraries'])
|
179
|
+
assert d.installed?('fakelibbin'), "fakelibbin not installed"
|
145
180
|
end
|
146
181
|
end
|
147
182
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bindeps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Smith-Unna
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fixwhich
|
@@ -176,6 +176,7 @@ files:
|
|
176
176
|
- lib/bindeps.rb
|
177
177
|
- lib/bindeps/version.rb
|
178
178
|
- lib/unpacker.rb
|
179
|
+
- test/data/bin/fakelibbin
|
179
180
|
- test/data/bowtie2_test.yaml
|
180
181
|
- test/data/fakebin
|
181
182
|
- test/data/fakebin.tgz
|
@@ -188,6 +189,9 @@ files:
|
|
188
189
|
- test/data/fakebin3.yaml
|
189
190
|
- test/data/fakebin4
|
190
191
|
- test/data/fakebin4.yaml
|
192
|
+
- test/data/fakelibbin.tgz
|
193
|
+
- test/data/fakelibbin.yaml
|
194
|
+
- test/data/lib/fakelib
|
191
195
|
- test/data/neverinstalled.yaml
|
192
196
|
- test/data/wget
|
193
197
|
- test/helper.rb
|
@@ -217,6 +221,7 @@ signing_key:
|
|
217
221
|
specification_version: 4
|
218
222
|
summary: binary dependency management for ruby gems
|
219
223
|
test_files:
|
224
|
+
- test/data/bin/fakelibbin
|
220
225
|
- test/data/bowtie2_test.yaml
|
221
226
|
- test/data/fakebin
|
222
227
|
- test/data/fakebin.tgz
|
@@ -229,6 +234,9 @@ test_files:
|
|
229
234
|
- test/data/fakebin3.yaml
|
230
235
|
- test/data/fakebin4
|
231
236
|
- test/data/fakebin4.yaml
|
237
|
+
- test/data/fakelibbin.tgz
|
238
|
+
- test/data/fakelibbin.yaml
|
239
|
+
- test/data/lib/fakelib
|
232
240
|
- test/data/neverinstalled.yaml
|
233
241
|
- test/data/wget
|
234
242
|
- test/helper.rb
|