gems-status 0.38.0 → 0.39.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/gems-status +1 -1
- data/lib/gems-status.rb +26 -23
- data/lib/gems-status/checkers/exists_in_upstream.rb +17 -14
- data/lib/gems-status/checkers/gem_checker.rb +8 -6
- data/lib/gems-status/checkers/git_check_messages.rb +25 -22
- data/lib/gems-status/checkers/hg_check_messages.rb +25 -22
- data/lib/gems-status/checkers/not_a_security_alert_checker.rb +161 -158
- data/lib/gems-status/checkers/not_native_gem_checker.rb +33 -30
- data/lib/gems-status/checkers/not_rails_checker.rb +16 -13
- data/lib/gems-status/checkers/print_gem_versions.rb +27 -23
- data/lib/gems-status/checkers/scm_check_messages.rb +44 -41
- data/lib/gems-status/checkers/scm_security_messages.rb +5 -3
- data/lib/gems-status/checkers/security_alert.rb +7 -5
- data/lib/gems-status/checkers/svn_check_messages.rb +29 -26
- data/lib/gems-status/gem_simple.rb +42 -40
- data/lib/gems-status/gems_command.rb +30 -28
- data/lib/gems-status/gems_composite_command.rb +85 -82
- data/lib/gems-status/gems_status_metadata.rb +2 -2
- data/lib/gems-status/html_view.rb +240 -237
- data/lib/gems-status/sources/lockfile_gems.rb +64 -61
- data/lib/gems-status/sources/obs_gems.rb +86 -83
- data/lib/gems-status/sources/ruby_gems_gems.rb +32 -30
- data/lib/gems-status/sources/ruby_gems_gems_gem_simple.rb +29 -26
- data/lib/gems-status/utils.rb +77 -74
- data/test/test-gems_command.rb +52 -49
- data/test/test-gems_composite_command.rb +43 -40
- data/test/test-helper.rb +2 -0
- data/test/test-lockfile_gems.rb +64 -61
- data/test/test-not_rails_checker.rb +45 -42
- data/test/test-obs_gems.rb +31 -29
- data/test/test-ruby_gems_gems.rb +22 -20
- data/test/test-utils.rb +42 -39
- metadata +181 -176
data/lib/gems-status/utils.rb
CHANGED
@@ -1,93 +1,96 @@
|
|
1
1
|
require "openssl"
|
2
2
|
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
|
3
3
|
|
4
|
-
|
5
|
-
attr_accessor :errors
|
6
|
-
@@errors = {}
|
7
|
-
@@md5_sums = {}
|
8
|
-
@@licenses = {}
|
9
|
-
@@keys = {}
|
10
|
-
@@gems = {}
|
4
|
+
module GemsStatus
|
11
5
|
|
12
|
-
|
13
|
-
|
14
|
-
|
6
|
+
class Utils
|
7
|
+
attr_accessor :errors
|
8
|
+
@@errors = {}
|
9
|
+
@@md5_sums = {}
|
10
|
+
@@licenses = {}
|
11
|
+
@@keys = {}
|
12
|
+
@@gems = {}
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
raise "trying to initialize #{classname} when parameter classname does not exists"
|
19
|
-
end
|
20
|
-
if conf['classname'] != classname then
|
21
|
-
raise "trying to initialize #{classname} when parameter classname is #{conf['classname']}"
|
14
|
+
def Utils.errors
|
15
|
+
return @@errors
|
22
16
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
|
18
|
+
def Utils.check_parameters(classname, conf, parameters)
|
19
|
+
if !conf['classname'] then
|
20
|
+
raise "trying to initialize #{classname} when parameter classname does not exists"
|
21
|
+
end
|
22
|
+
if conf['classname'] != classname then
|
23
|
+
raise "trying to initialize #{classname} when parameter classname is #{conf['classname']}"
|
24
|
+
end
|
25
|
+
parameters.each do |p|
|
26
|
+
if !conf[p] then
|
27
|
+
raise "parameter #{p} not found for #{classname}"
|
28
|
+
end
|
26
29
|
end
|
27
30
|
end
|
28
|
-
end
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
def Utils.log_error(name, msg)
|
33
|
+
@@errors[name] = "\n" unless @@errors[name]
|
34
|
+
@@errors[name] << msg << "\n"
|
35
|
+
$stderr.puts "ERROR: #{msg}"
|
36
|
+
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
def Utils.log_debug(msg)
|
39
|
+
$stderr.puts "DEBUG: #{msg}"
|
40
|
+
end
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
def Utils.download_md5(name, version, gems_url)
|
43
|
+
key = "#{name}-#{version}-#{gems_url.gsub("/", "_").gsub(":", "_")}"
|
44
|
+
return @@md5_sums[key] if @@md5_sums[key]
|
45
|
+
begin
|
46
|
+
gem_file_path = self.download_gem(name, version, gems_url)
|
47
|
+
rescue Exception => e
|
48
|
+
self.log_error(name, e.message)
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
md5 = Digest::MD5.hexdigest(open(gem_file_path).read)
|
52
|
+
@@md5_sums["#{name}-#{version}"] = md5
|
53
|
+
return md5
|
48
54
|
end
|
49
|
-
md5 = Digest::MD5.hexdigest(open(gem_file_path).read)
|
50
|
-
@@md5_sums["#{name}-#{version}"] = md5
|
51
|
-
return md5
|
52
|
-
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
def Utils.download_license(name, version, gems_url)
|
57
|
+
key = "#{name}-#{version}-#{gems_url.gsub("/", "_").gsub(":", "_")}"
|
58
|
+
return @@licenses[key] if @@licenses[key]
|
59
|
+
begin
|
60
|
+
gem_file_path = self.download_gem(name, version, gems_url)
|
61
|
+
rescue Exception => e
|
62
|
+
self.log_error(name, e.message)
|
63
|
+
return nil
|
64
|
+
end
|
65
|
+
license = Gem::Format.from_file_by_path(gem_file_path).spec.license
|
66
|
+
@@licenses[key] = license
|
67
|
+
return license
|
62
68
|
end
|
63
|
-
license = Gem::Format.from_file_by_path(gem_file_path).spec.license
|
64
|
-
@@licenses[key] = license
|
65
|
-
return license
|
66
|
-
end
|
67
69
|
|
68
|
-
|
70
|
+
private
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
72
|
+
def Utils.download_gem(name, version, gems_url)
|
73
|
+
gem_uri = URI.parse("#{gems_url}/#{name}-#{version}.gem")
|
74
|
+
tmp_path = "tmp/utils/gems/#{gems_url.gsub("/", "_").gsub(":", "_")}/"
|
75
|
+
gem_name = "#{name}-#{version}.gem"
|
76
|
+
full_path = "#{tmp_path}/#{gem_name}"
|
77
|
+
return full_path if File.exists? full_path
|
78
|
+
uri_debug = gem_uri.clone
|
79
|
+
uri_debug.password = "********" if uri_debug.password
|
80
|
+
Utils::log_debug "download #{@name} from #{uri_debug}"
|
81
|
+
FileUtils::mkdir_p(tmp_path) if ! File.exists?(tmp_path)
|
82
|
+
if gem_uri.user && gem_uri.password
|
83
|
+
source = open(gem_uri.scheme + "://" + gem_uri.host + "/" + gem_uri.path,
|
84
|
+
"rb",
|
85
|
+
:http_basic_authentication=>[gem_uri.user, gem_uri.password])
|
86
|
+
else
|
87
|
+
source = open(gem_uri)
|
88
|
+
end
|
89
|
+
open(full_path, "wb") do |file|
|
90
|
+
file.write(source.read)
|
91
|
+
end
|
92
|
+
source.close
|
93
|
+
return full_path
|
89
94
|
end
|
90
|
-
source.close
|
91
|
-
return full_path
|
92
95
|
end
|
93
96
|
end
|
data/test/test-gems_command.rb
CHANGED
@@ -3,62 +3,65 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'gems-status'
|
5
5
|
|
6
|
-
|
7
|
-
def test_gem_name_wrong_name
|
8
|
-
gem_name = 'wrong_name'
|
9
|
-
result = GemsCommand.new.gem_name(gem_name)
|
10
|
-
expected = gem_name
|
11
|
-
assert_equal(result, expected)
|
12
|
-
end
|
6
|
+
module GemsStatus
|
13
7
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
class TestGemsCommand < Test::Unit::TestCase
|
9
|
+
def test_gem_name_wrong_name
|
10
|
+
gem_name = 'wrong_name'
|
11
|
+
result = GemsCommand.new.gem_name(gem_name)
|
12
|
+
expected = gem_name
|
13
|
+
assert_equal(result, expected)
|
14
|
+
end
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
def test_gem_name_without_version
|
17
|
+
gem_name = 'name.gem'
|
18
|
+
result = GemsCommand.new.gem_name(gem_name)
|
19
|
+
expected = 'name'
|
20
|
+
assert_equal(result, expected)
|
21
|
+
end
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
def test_gem_name_simple
|
24
|
+
gem_name = 'name-1.0.0.gem'
|
25
|
+
result = GemsCommand.new.gem_name(gem_name)
|
26
|
+
expected = 'name'
|
27
|
+
assert_equal(result, expected)
|
28
|
+
end
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
def test_gem_name_with_dashes
|
31
|
+
gem_name = 'name-1-1.0.0.gem'
|
32
|
+
result = GemsCommand.new.gem_name(gem_name)
|
33
|
+
expected = 'name-1'
|
34
|
+
assert_equal(result, expected)
|
35
|
+
end
|
41
36
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
37
|
+
def test_gem_version_no_version
|
38
|
+
gem_name = 'name.gem'
|
39
|
+
result = GemsCommand.new.gem_version(gem_name)
|
40
|
+
expected = '-1'
|
41
|
+
assert_equal(result, expected)
|
42
|
+
end
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
44
|
+
def test_gem_version_wrong_name
|
45
|
+
gem_name = 'name-1.0'
|
46
|
+
result = GemsCommand.new.gem_version(gem_name)
|
47
|
+
expected = '-1'
|
48
|
+
assert_equal(result, expected)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_gem_version_simple_version
|
52
|
+
gem_name = 'name-1.0.0.gem'
|
53
|
+
result = GemsCommand.new.gem_version(gem_name)
|
54
|
+
expected = '1.0.0'
|
55
|
+
assert_equal(result, expected)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_gem_version_with_dashes
|
59
|
+
gem_name = 'name-a-1.0.0.gem'
|
60
|
+
result = GemsCommand.new.gem_version(gem_name)
|
61
|
+
expected = '1.0.0'
|
62
|
+
assert_equal(result, expected)
|
63
|
+
end
|
55
64
|
|
56
|
-
def test_gem_version_with_dashes
|
57
|
-
gem_name = 'name-a-1.0.0.gem'
|
58
|
-
result = GemsCommand.new.gem_version(gem_name)
|
59
|
-
expected = '1.0.0'
|
60
|
-
assert_equal(result, expected)
|
61
65
|
end
|
62
66
|
|
63
67
|
end
|
64
|
-
|
@@ -3,47 +3,50 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'gems-status'
|
5
5
|
|
6
|
-
|
7
|
-
attr_accessor :results
|
8
|
-
end
|
6
|
+
module GemsStatus
|
9
7
|
|
10
|
-
class
|
11
|
-
|
12
|
-
gemscompositecommand = GemsCompositeCommand.new('id')
|
13
|
-
result = gemscompositecommand.common_key?("this key does not exists")
|
14
|
-
assert(!result)
|
15
|
-
end
|
16
|
-
def test_common_key_in_zero_coincidences_one_result
|
17
|
-
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
18
|
-
gemscompositecommand.results['id'] = {"a key"=>"a value"}
|
19
|
-
result = gemscompositecommand.common_key?("this key does not exists")
|
20
|
-
assert(!result)
|
21
|
-
end
|
22
|
-
def test_common_key_in_zero_coincidences_two_results
|
23
|
-
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
24
|
-
gemscompositecommand.results['id'] = {"a key"=>"a value"}
|
25
|
-
gemscompositecommand.results['id2'] = {"another key"=>"another value"}
|
26
|
-
result = gemscompositecommand.common_key?("this key does not exists")
|
27
|
-
assert(!result)
|
8
|
+
class GemsCompositeCommandTest < GemsCompositeCommand
|
9
|
+
attr_accessor :results
|
28
10
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
11
|
+
|
12
|
+
class TestGemsCompositeCommand < Test::Unit::TestCase
|
13
|
+
def test_common_key_in_empty_results
|
14
|
+
gemscompositecommand = GemsCompositeCommand.new('id')
|
15
|
+
result = gemscompositecommand.common_key?("this key does not exists")
|
16
|
+
assert(!result)
|
17
|
+
end
|
18
|
+
def test_common_key_in_zero_coincidences_one_result
|
19
|
+
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
20
|
+
gemscompositecommand.results['id'] = {"a key"=>"a value"}
|
21
|
+
result = gemscompositecommand.common_key?("this key does not exists")
|
22
|
+
assert(!result)
|
23
|
+
end
|
24
|
+
def test_common_key_in_zero_coincidences_two_results
|
25
|
+
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
26
|
+
gemscompositecommand.results['id'] = {"a key"=>"a value"}
|
27
|
+
gemscompositecommand.results['id2'] = {"another key"=>"another value"}
|
28
|
+
result = gemscompositecommand.common_key?("this key does not exists")
|
29
|
+
assert(!result)
|
30
|
+
end
|
31
|
+
def test_common_key_in_one_coincidence_one_results
|
32
|
+
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
33
|
+
gemscompositecommand.results['id']= {"a key"=>"a value"}
|
34
|
+
result = gemscompositecommand.common_key?("a key")
|
35
|
+
assert(!result)
|
36
|
+
end
|
37
|
+
def test_common_key_in_one_coincidence_two_results
|
38
|
+
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
39
|
+
gemscompositecommand.results['id']= {"a key"=>"a value"}
|
40
|
+
gemscompositecommand.results['id2']= {"another key"=>"another value"}
|
41
|
+
result = gemscompositecommand.common_key?("a key")
|
42
|
+
assert(!result)
|
43
|
+
end
|
44
|
+
def test_common_key_in_two_coincidence_two_results
|
45
|
+
gemscompositecommand = GemsCompositeCommandTest.new('id')
|
46
|
+
gemscompositecommand.results['id']= {"a key"=>"a value"}
|
47
|
+
gemscompositecommand.results['id2']= {"a key"=>"another value"}
|
48
|
+
result = gemscompositecommand.common_key?("a key")
|
49
|
+
assert(result)
|
50
|
+
end
|
48
51
|
end
|
49
52
|
end
|
data/test/test-helper.rb
CHANGED
data/test/test-lockfile_gems.rb
CHANGED
@@ -4,69 +4,72 @@ require 'test/unit'
|
|
4
4
|
require 'gems-status'
|
5
5
|
require 'rubygems/dependency'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
module GemsStatus
|
8
|
+
|
9
|
+
class LockfileGemsTest < LockfileGems
|
10
|
+
attr_accessor :result
|
11
|
+
def initialize
|
12
|
+
dir=File.expand_path(File.dirname(__FILE__))
|
13
|
+
puts "DEBUG: dir : #{dir} #{dir.class.name}"
|
14
|
+
@filenames = ["#{dir}/Gemfile.lock.test"]
|
15
|
+
@gems_url = ""
|
16
|
+
@result = {}
|
17
|
+
end
|
15
18
|
end
|
16
|
-
end
|
17
19
|
|
18
|
-
class TestLockfileGems < Test::Unit::TestCase
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
20
|
+
class TestLockfileGems < Test::Unit::TestCase
|
21
|
+
def test_get_rubygems_names
|
22
|
+
lockfilegems = LockfileGemsTest.new
|
23
|
+
lockfilegems.execute
|
24
|
+
assert(lockfilegems.result.length == 6)
|
25
|
+
result = lockfilegems.result["test"][0].name
|
26
|
+
assert_equal("test",result)
|
27
|
+
result = lockfilegems.result["test"][0].version
|
28
|
+
assert_equal(Gem::Version.new("0.8.6"), result)
|
29
|
+
result = lockfilegems.result["test2"][0].name
|
30
|
+
assert_equal("test2",result)
|
31
|
+
result = lockfilegems.result["test2"][0].version
|
32
|
+
assert_equal(Gem::Version.new("1.2.3"), result)
|
33
|
+
result = lockfilegems.result["test3"][0].name
|
34
|
+
assert_equal("test3",result)
|
35
|
+
result = lockfilegems.result["test3"][0].version
|
36
|
+
assert_equal(Gem::Version.new("1.2.3"), result)
|
37
|
+
result = lockfilegems.result["test4"][0].name
|
38
|
+
assert_equal("test4",result)
|
39
|
+
result = lockfilegems.result["test4"][0].version
|
40
|
+
assert_equal(Gem::Version.new("1.2.3"), result)
|
41
|
+
result = lockfilegems.result["from_git"][0].version
|
42
|
+
assert_equal(Gem::Version.new("1.0.3"), result)
|
43
|
+
result = lockfilegems.result["dep_from_git"][0].version
|
44
|
+
assert_equal(Gem::Version.new("1.0.0"), result)
|
45
|
+
end
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
47
|
+
def test_get_rubygems_dependencies
|
48
|
+
lockfilegems = LockfileGemsTest.new
|
49
|
+
lockfilegems.execute
|
50
|
+
result = lockfilegems.result["test"][0].dependencies
|
51
|
+
assert(result)
|
52
|
+
result = lockfilegems.result["test"][0].dependencies.length
|
53
|
+
assert_equal(3, result)
|
54
|
+
result = lockfilegems.result["test"][0].dependencies
|
55
|
+
assert_equal(
|
56
|
+
Gem::Dependency.new("test2", Gem::Requirement.new(["= 1.2.3"])),
|
57
|
+
result[0])
|
58
|
+
assert_equal(
|
59
|
+
Gem::Dependency.new("test3", Gem::Requirement.new(["= 1.2.3"])),
|
60
|
+
result[1])
|
61
|
+
assert_equal(
|
62
|
+
Gem::Dependency.new("test4", Gem::Requirement.new(["= 1.2.3"])),
|
63
|
+
result[2])
|
64
|
+
end
|
63
65
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
66
|
+
def test_from_git
|
67
|
+
lockfilegems = LockfileGemsTest.new
|
68
|
+
lockfilegems.execute
|
69
|
+
result = lockfilegems.result["from_git"][0].gems_url
|
70
|
+
assert(result.start_with?("git://"))
|
71
|
+
assert(lockfilegems.result["from_git"][0].from_git?)
|
72
|
+
end
|
73
|
+
end
|
72
74
|
|
75
|
+
end
|