gem_version_check 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/gem_version_check +0 -4
- data/gem_version_check.gemspec +4 -3
- data/lib/gem_version_check.rb +4 -2
- data/lib/gem_version_check/checks.rb +2 -12
- data/lib/gem_version_check/cli.rb +70 -9
- data/lib/gem_version_check/configuration.rb +3 -2
- data/lib/gem_version_check/dependency.rb +14 -9
- data/lib/gem_version_check/formatter/json.rb +7 -4
- data/lib/gem_version_check/formatter/pretty_print.rb +32 -17
- data/lib/gem_version_check/lockfile.rb +28 -0
- data/lib/gem_version_check/lockfile_fetcher.rb +51 -0
- data/lib/gem_version_check/project.rb +25 -41
- data/lib/gem_version_check/report.rb +25 -0
- data/lib/gem_version_check/version.rb +1 -1
- data/spec/dependency_spec.rb +1 -1
- data/spec/lockfile_fetch_spec.rb +38 -0
- data/spec/lockfile_spec.rb +31 -0
- data/spec/project_spec.rb +13 -31
- data/spec/report_spec.rb +35 -0
- data/spec/spec_helper.rb +1 -0
- metadata +35 -10
data/bin/gem_version_check
CHANGED
data/gem_version_check.gemspec
CHANGED
@@ -16,8 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.add_development_dependency
|
20
|
-
s.add_development_dependency
|
21
|
-
s.add_development_dependency
|
19
|
+
s.add_development_dependency "rake"
|
20
|
+
s.add_development_dependency "rspec", "~> 2.12.0"
|
21
|
+
s.add_development_dependency "mocha", "~> 0.13.0"
|
22
22
|
s.add_runtime_dependency "bundler"
|
23
|
+
s.add_runtime_dependency "progressbar"
|
23
24
|
end
|
data/lib/gem_version_check.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
require "bundler"
|
2
|
+
require "progressbar"
|
2
3
|
|
3
4
|
require "gem_version_check/cli"
|
4
5
|
require "gem_version_check/version"
|
5
6
|
require "gem_version_check/project"
|
6
7
|
require "gem_version_check/dependency"
|
7
8
|
require "gem_version_check/checks"
|
9
|
+
require "gem_version_check/lockfile"
|
10
|
+
require "gem_version_check/lockfile_fetcher"
|
8
11
|
require "gem_version_check/configuration"
|
12
|
+
require "gem_version_check/report"
|
9
13
|
require "gem_version_check/formatter/json"
|
10
14
|
require "gem_version_check/formatter/pretty_print"
|
11
15
|
|
12
16
|
module GemVersionCheck
|
13
17
|
extend self
|
14
18
|
|
15
|
-
class GemfileLockNotFoundError < StandardError; end
|
16
|
-
|
17
19
|
def configuration
|
18
20
|
@@configuration ||= Configuration.new
|
19
21
|
end
|
@@ -3,8 +3,8 @@ module GemVersionCheck
|
|
3
3
|
class Checks
|
4
4
|
include Enumerable
|
5
5
|
|
6
|
-
def initialize(gem_names
|
7
|
-
@gem_names = gem_names
|
6
|
+
def initialize(gem_names)
|
7
|
+
@gem_names = gem_names
|
8
8
|
end
|
9
9
|
|
10
10
|
def each(&block)
|
@@ -28,15 +28,5 @@ module GemVersionCheck
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
private
|
32
|
-
|
33
|
-
def configured_checks
|
34
|
-
ActiveSupport::JSON.decode(IO.read(checks_file))
|
35
|
-
end
|
36
|
-
|
37
|
-
def checks_file
|
38
|
-
File.expand_path("../../../checks.json", __FILE__)
|
39
|
-
end
|
40
|
-
|
41
31
|
end
|
42
32
|
end
|
@@ -1,22 +1,83 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
1
3
|
module GemVersionCheck
|
2
4
|
module Cli
|
3
5
|
extend self
|
4
6
|
|
5
7
|
def run(params)
|
6
|
-
|
7
|
-
if
|
8
|
-
generate_report(
|
9
|
-
else
|
8
|
+
project_names, options = parse(params)
|
9
|
+
if project_names.size > 0
|
10
|
+
generate_report(project_names, options)
|
11
|
+
else
|
10
12
|
puts "Missing params: gem_version_check my-gh-name/my-project gem1 gem2 gem3"
|
11
13
|
exit(1)
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse(params)
|
20
|
+
options = {}
|
21
|
+
option_parser = nil
|
22
|
+
project_names = OptionParser.new do |opts|
|
23
|
+
opts.banner = "Usage: gem_version_check project [options]"
|
24
|
+
|
25
|
+
opts.separator ""
|
26
|
+
opts.separator "Specific options:"
|
27
|
+
|
28
|
+
opts.on("--only gem1,gem2,gem3", Array, "List of ruby gems") do |list|
|
29
|
+
options[:only] = list
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on("--host github.com", String, "Github host name") do |host|
|
33
|
+
options[:host] = host
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on("--disable-progress-bar", "Disable progress bar") do |disable_progress_bar|
|
37
|
+
options[:disable_progress_bar] = disable_progress_bar
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on("--output-format FORMAT", %w(json pretty), "Output format") do |output_format|
|
41
|
+
options[:output_format] = output_format
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.on_tail("--version", "Show version") do
|
45
|
+
puts GemVersionCheck::VERSION
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
50
|
+
puts opts
|
51
|
+
exit
|
52
|
+
end
|
53
|
+
|
54
|
+
option_parser = opts
|
55
|
+
end.parse!(params)
|
56
|
+
|
57
|
+
GemVersionCheck.configuration = {
|
58
|
+
:github_host => options[:host],
|
59
|
+
:show_progress_bar => !options[:disable_progress_bar]
|
60
|
+
}
|
61
|
+
|
62
|
+
[Array(project_names), options]
|
63
|
+
rescue OptionParser::InvalidOption, OptionParser::InvalidArgument, OptionParser::MissingArgument => e
|
64
|
+
puts "#{e}\n"
|
65
|
+
puts option_parser
|
66
|
+
exit(1)
|
67
|
+
end
|
68
|
+
|
69
|
+
def generate_report(project_names, options)
|
70
|
+
report = Report.new(project_names, options)
|
71
|
+
|
72
|
+
case options[:output_format]
|
73
|
+
when "json"
|
74
|
+
puts Formatter::JSON.new(report.generate).format
|
75
|
+
else
|
76
|
+
puts Formatter::PrettyPrint.new(report.generate).format
|
77
|
+
end
|
78
|
+
|
79
|
+
report.check_failed? ? exit(1) : exit(0)
|
80
|
+
rescue LockfileFetcher::NotFoundError => e
|
20
81
|
puts "Can't find Gemfile.lock for #{e}"
|
21
82
|
exit(1)
|
22
83
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module GemVersionCheck
|
2
2
|
class Configuration
|
3
|
-
attr_reader :github_host
|
3
|
+
attr_reader :github_host, :show_progress_bar
|
4
4
|
|
5
5
|
def initialize(settings = {})
|
6
|
-
@github_host = settings[:github_host]
|
6
|
+
@github_host = settings[:github_host] || "github.com"
|
7
|
+
@show_progress_bar = settings[:show_progress_bar] || false
|
7
8
|
end
|
8
9
|
end
|
9
10
|
end
|
@@ -1,15 +1,17 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
1
3
|
module GemVersionCheck
|
2
4
|
class Dependency
|
3
5
|
|
4
6
|
attr_reader :name, :expected_version, :version
|
5
7
|
|
6
|
-
def initialize(name, expected_version)
|
8
|
+
def initialize(name, expected_version = nil)
|
7
9
|
@name = name
|
8
|
-
@expected_version = expected_version
|
10
|
+
@expected_version = expected_version || latest_version
|
9
11
|
end
|
10
12
|
|
11
13
|
def check(lock_file)
|
12
|
-
@version =
|
14
|
+
@version = lock_file.version_for(@name)
|
13
15
|
@used = !!@version
|
14
16
|
return unless used?
|
15
17
|
|
@@ -24,15 +26,18 @@ module GemVersionCheck
|
|
24
26
|
@used
|
25
27
|
end
|
26
28
|
|
29
|
+
def latest_version
|
30
|
+
@latest_version ||= begin
|
31
|
+
spec = retrieve_spec
|
32
|
+
spec ? spec.version.to_s : nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
27
36
|
private
|
28
37
|
|
29
|
-
def
|
30
|
-
|
31
|
-
spec ? spec.version.to_s : nil
|
38
|
+
def retrieve_spec
|
39
|
+
Gem.latest_spec_for(@name)
|
32
40
|
end
|
33
41
|
|
34
|
-
def find_spec(name, lock_file)
|
35
|
-
lock_file.specs.find { |spec| spec.name == name }
|
36
|
-
end
|
37
42
|
end
|
38
43
|
end
|
@@ -1,5 +1,8 @@
|
|
1
|
+
require "json"
|
2
|
+
|
1
3
|
module GemVersionCheck
|
2
4
|
module Formatter
|
5
|
+
|
3
6
|
class JSON
|
4
7
|
def initialize(report_result)
|
5
8
|
@report_result = Array(report_result)
|
@@ -7,14 +10,14 @@ module GemVersionCheck
|
|
7
10
|
|
8
11
|
def format
|
9
12
|
result = []
|
10
|
-
|
13
|
+
@report_result.each do |project|
|
11
14
|
project_hash = project_hash(project)
|
12
15
|
project.report.each do |dependency|
|
13
16
|
project_hash[:dependencies] << dependency_hash(dependency)
|
14
17
|
end
|
15
18
|
result << project_hash
|
16
19
|
end
|
17
|
-
result
|
20
|
+
::JSON.pretty_generate(result)
|
18
21
|
end
|
19
22
|
|
20
23
|
private
|
@@ -32,8 +35,8 @@ module GemVersionCheck
|
|
32
35
|
:name => dependency.name,
|
33
36
|
:expected_version => dependency.expected_version,
|
34
37
|
:version => dependency.version,
|
35
|
-
:
|
36
|
-
:
|
38
|
+
:valid => dependency.valid?,
|
39
|
+
:used => dependency.used?
|
37
40
|
}
|
38
41
|
end
|
39
42
|
end
|
@@ -2,30 +2,45 @@
|
|
2
2
|
module GemVersionCheck
|
3
3
|
module Formatter
|
4
4
|
class PrettyPrint
|
5
|
+
|
5
6
|
def initialize(report_result)
|
6
7
|
@report_result = Array(report_result)
|
7
8
|
end
|
8
9
|
|
9
10
|
def format
|
10
|
-
result
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dep << black + "\n"
|
22
|
-
else
|
23
|
-
dep << "not used\n"
|
24
|
-
end
|
11
|
+
@report_result.inject("") do |result, project|
|
12
|
+
result << "#{project_title(project)}\n#{format_project(project)}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def format_project(project)
|
19
|
+
project.report.inject("") do |result, dependency|
|
20
|
+
result << dependency_listitem(dependency) do |dep|
|
21
|
+
dep.used? ? format_dependency(dependency) : "not used"
|
25
22
|
end
|
26
|
-
result << "Project: #{project.check_failed? ? red : green}#{project.name}#{black}" + "\n" + dep
|
27
23
|
end
|
28
|
-
|
24
|
+
end
|
25
|
+
|
26
|
+
def project_title(project)
|
27
|
+
"Project: #{project.check_failed? ? red : green}#{project.name}#{black}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def dependency_listitem(dependency)
|
31
|
+
" * #{dependency.name}: #{ yield dependency }\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def format_dependency(dependency)
|
35
|
+
result = dependency.valid? ? valid_dependency(dependency) : invalid_dependency(dependency)
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid_dependency(dependency)
|
39
|
+
"#{green}#{dependency.expected_version} ✓#{black}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def invalid_dependency(dependency)
|
43
|
+
"#{dependency.expected_version} != #{red}#{dependency.version}#{black}"
|
29
44
|
end
|
30
45
|
|
31
46
|
def black
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module GemVersionCheck
|
2
|
+
class Lockfile
|
3
|
+
|
4
|
+
def initialize(content)
|
5
|
+
@content = content
|
6
|
+
end
|
7
|
+
|
8
|
+
def spec_names
|
9
|
+
lock_file.specs.map { |spec| spec.name }
|
10
|
+
end
|
11
|
+
|
12
|
+
def version_for(name)
|
13
|
+
spec = lock_file.specs.find { |spec| spec.name == name }
|
14
|
+
spec ? spec.version.to_s : nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def total
|
18
|
+
lock_file.specs.size
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def lock_file
|
24
|
+
@lock_file ||= Bundler::LockfileParser.new(@content)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module GemVersionCheck
|
2
|
+
class LockfileFetcher
|
3
|
+
|
4
|
+
class NotFoundError < StandardError; end
|
5
|
+
|
6
|
+
def initialize(project)
|
7
|
+
@project = project
|
8
|
+
end
|
9
|
+
|
10
|
+
def content
|
11
|
+
uri = URI.parse(repository)
|
12
|
+
body = request(uri)
|
13
|
+
raise NotFoundError.new(repository) if body.nil?
|
14
|
+
body
|
15
|
+
end
|
16
|
+
|
17
|
+
def repository
|
18
|
+
@repository ||= begin
|
19
|
+
if @project =~ /^http(s)?:\/\//
|
20
|
+
@project
|
21
|
+
else
|
22
|
+
gemfile_lock_url
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# github.com redirects github.com/user/project/raw/master/Gemfile.lock to raw.github.com/user/project/master/Gemfile.lock
|
28
|
+
# github enterprise does not redirect
|
29
|
+
# TODO: change if github enterprise redirects too
|
30
|
+
def gemfile_lock_url
|
31
|
+
if GemVersionCheck.configuration.github_host == "github.com"
|
32
|
+
"https://raw.#{GemVersionCheck.configuration.github_host}/#{@project}/master/Gemfile.lock"
|
33
|
+
else
|
34
|
+
"https://#{GemVersionCheck.configuration.github_host}/#{@project}/raw/master/Gemfile.lock"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def request(uri)
|
39
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
40
|
+
http.use_ssl = true if uri.scheme == 'https'
|
41
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
42
|
+
response = http.request(request)
|
43
|
+
if response.code == "200"
|
44
|
+
response.body
|
45
|
+
else
|
46
|
+
puts "Error retrieving Gemfile.lock: #{response.inspect}"
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -1,19 +1,13 @@
|
|
1
1
|
require "uri"
|
2
2
|
require "net/http"
|
3
|
+
require "net/https"
|
3
4
|
|
4
5
|
module GemVersionCheck
|
5
6
|
class Project
|
6
|
-
attr_reader :repository, :report
|
7
7
|
|
8
|
-
def
|
9
|
-
project = Project.new(project_name, checks || Checks.new())
|
10
|
-
project.report
|
11
|
-
project
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(project, checks)
|
8
|
+
def initialize(project, spec_names = [])
|
15
9
|
@project = project
|
16
|
-
@
|
10
|
+
@spec_names = spec_names
|
17
11
|
end
|
18
12
|
|
19
13
|
def name
|
@@ -27,11 +21,12 @@ module GemVersionCheck
|
|
27
21
|
def generate_report
|
28
22
|
@check_failed = false
|
29
23
|
result = []
|
30
|
-
|
31
|
-
dependency = Dependency.new(
|
24
|
+
with_progress_bar(spec_names) do |spec_name|
|
25
|
+
dependency = Dependency.new(spec_name)
|
32
26
|
dependency.check(lock_file)
|
33
|
-
@check_failed = true unless dependency.valid?
|
34
27
|
result << dependency
|
28
|
+
|
29
|
+
@check_failed = true unless dependency.valid?
|
35
30
|
end
|
36
31
|
result
|
37
32
|
end
|
@@ -41,45 +36,34 @@ module GemVersionCheck
|
|
41
36
|
end
|
42
37
|
|
43
38
|
def lock_file
|
44
|
-
@lock_file ||=
|
45
|
-
|
46
|
-
|
47
|
-
def repository
|
48
|
-
@repository ||= begin
|
49
|
-
if @project =~ /^http(s)?:\/\//
|
50
|
-
@project
|
51
|
-
else
|
52
|
-
gemfile_lock_url
|
53
|
-
end
|
39
|
+
@lock_file ||= begin
|
40
|
+
content = LockfileFetcher.new(@project).content
|
41
|
+
Lockfile.new(content)
|
54
42
|
end
|
55
43
|
end
|
56
44
|
|
57
45
|
private
|
58
46
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
"https://raw.#{GemVersionCheck.configuration.github_host}/#{@project}/master/Gemfile.lock"
|
65
|
-
else
|
66
|
-
"https://#{GemVersionCheck.configuration.github_host}/#{@project}/raw/master/Gemfile.lock"
|
47
|
+
def with_progress_bar(elements)
|
48
|
+
pb = ProgressBar.new("Fetch specs", lock_file.total) if display_status?
|
49
|
+
elements.each do |el|
|
50
|
+
yield el
|
51
|
+
pb.inc if display_status?
|
67
52
|
end
|
53
|
+
pb.clear if display_status?
|
68
54
|
end
|
69
55
|
|
70
|
-
def
|
71
|
-
|
72
|
-
body = request(uri)
|
73
|
-
raise GemfileLockNotFoundError.new(repository) if body.nil?
|
74
|
-
body
|
56
|
+
def display_status?
|
57
|
+
GemVersionCheck.configuration.show_progress_bar
|
75
58
|
end
|
76
59
|
|
77
|
-
def
|
78
|
-
|
79
|
-
http.use_ssl = true if uri.scheme == 'https'
|
80
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
81
|
-
response = http.request(request)
|
82
|
-
response.code == "200" ? response.body : nil
|
60
|
+
def spec_names
|
61
|
+
@spec_names.any? ? @spec_names : all_spec_names
|
83
62
|
end
|
63
|
+
|
64
|
+
def all_spec_names
|
65
|
+
lock_file.spec_names
|
66
|
+
end
|
67
|
+
|
84
68
|
end
|
85
69
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module GemVersionCheck
|
2
|
+
class Report
|
3
|
+
|
4
|
+
def initialize(project_names, options = {})
|
5
|
+
@project_names = project_names
|
6
|
+
@options = options
|
7
|
+
@only = options[:only] || []
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate
|
11
|
+
@check_failed = false
|
12
|
+
@project_names.inject([]) do |result, project_name|
|
13
|
+
project = Project.new(project_name, @only)
|
14
|
+
project.report
|
15
|
+
@check_failed = true if project.check_failed?
|
16
|
+
result << project
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def check_failed?
|
21
|
+
@check_failed
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/spec/dependency_spec.rb
CHANGED
@@ -5,7 +5,7 @@ module GemVersionCheck
|
|
5
5
|
describe Dependency do
|
6
6
|
|
7
7
|
context "#check" do
|
8
|
-
let(:lock_file) {
|
8
|
+
let(:lock_file) { Lockfile.new(lock_file_content("Gemfile.lock")) }
|
9
9
|
|
10
10
|
let(:dependency) { Dependency.new("activesupport", "3.2.9") }
|
11
11
|
let(:invalid_dependency) { Dependency.new("activesupport", "3.2.10") }
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module GemVersionCheck
|
5
|
+
describe LockfileFetcher do
|
6
|
+
let(:url) { "https://github.com/toadkicker/teststrap/raw/master/Gemfile.lock" }
|
7
|
+
let(:redirect_url) { "https://raw.github.com/toadkicker/teststrap/master/Gemfile.lock" }
|
8
|
+
|
9
|
+
context "#repository" do
|
10
|
+
it "returns a url as is" do
|
11
|
+
fetcher = LockfileFetcher.new(url)
|
12
|
+
fetcher.repository.should == url
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns a resolved url if gh project name given" do
|
16
|
+
fetcher = LockfileFetcher.new("toadkicker/teststrap")
|
17
|
+
fetcher.repository.should == redirect_url
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "#lock_file" do
|
22
|
+
it "downloads lock file content and returns lock_file" do
|
23
|
+
fetcher = LockfileFetcher.new(redirect_url)
|
24
|
+
fetcher.expects(:request).returns(lock_file_content("Gemfile.lock"))
|
25
|
+
Bundler::LockfileParser.new(fetcher.content).specs.size.should > 0
|
26
|
+
end
|
27
|
+
|
28
|
+
it "raises GemfileLockNotFoundError if not found" do
|
29
|
+
fetcher = LockfileFetcher.new(redirect_url)
|
30
|
+
fetcher.expects(:request).returns(nil)
|
31
|
+
expect { fetcher.content }.to raise_error(LockfileFetcher::NotFoundError)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module GemVersionCheck
|
5
|
+
describe Lockfile do
|
6
|
+
let(:lockfile) { Lockfile.new(lock_file_content("Gemfile.lock")) }
|
7
|
+
|
8
|
+
describe "#spec_names" do
|
9
|
+
it "returns all spec names" do
|
10
|
+
lockfile.spec_names.size.should == 12
|
11
|
+
lockfile.spec_names.should include("activesupport")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#version_for" do
|
16
|
+
it "returns spec for name" do
|
17
|
+
lockfile.version_for("activesupport").should == "3.2.9"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns nil if spec does not exist" do
|
21
|
+
lockfile.version_for("non_existing_gem").should be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#total" do
|
26
|
+
it "returns total number of spec" do
|
27
|
+
lockfile.total.should == 12
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/project_spec.rb
CHANGED
@@ -5,51 +5,33 @@ module GemVersionCheck
|
|
5
5
|
describe Project do
|
6
6
|
let(:url) { "https://github.com/toadkicker/teststrap/raw/master/Gemfile.lock" }
|
7
7
|
let(:redirect_url) { "https://raw.github.com/toadkicker/teststrap/master/Gemfile.lock" }
|
8
|
-
|
9
|
-
let(:
|
10
|
-
|
8
|
+
let(:lock_file) { Lockfile.new(lock_file_content("rails_app_example.lock")) }
|
9
|
+
let(:project) do
|
10
|
+
Dependency.any_instance.stubs(:latest_version).returns("1.0")
|
11
11
|
project = Project.new("toadkicker/teststrap", %w(actionpack not_existing))
|
12
12
|
project.stubs(:lock_file).returns(lock_file)
|
13
13
|
project
|
14
|
-
|
14
|
+
end
|
15
15
|
|
16
16
|
context "#report" do
|
17
|
-
it "returns array of
|
17
|
+
it "returns array of given dependencies" do
|
18
18
|
project.report.size.should == 2
|
19
19
|
project.report.first.name.should == "actionpack"
|
20
20
|
project.report.last.name.should == "not_existing"
|
21
21
|
end
|
22
|
-
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
project
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
context "#repository" do
|
31
|
-
it "returns a url as is" do
|
32
|
-
project = Project.new(url, [])
|
33
|
-
project.repository.should == url
|
34
|
-
end
|
23
|
+
it "returns array of all dependencies" do
|
24
|
+
Dependency.any_instance.stubs(:latest_version).returns("1.0")
|
25
|
+
project = Project.new("toadkicker/teststrap")
|
26
|
+
project.stubs(:lock_file).returns(lock_file)
|
35
27
|
|
36
|
-
|
37
|
-
project = Project.new("toadkicker/teststrap", [])
|
38
|
-
project.repository.should == redirect_url
|
28
|
+
project.report.size.should == 47
|
39
29
|
end
|
40
30
|
end
|
41
31
|
|
42
|
-
context "#
|
43
|
-
it "
|
44
|
-
project
|
45
|
-
project.expects(:request).returns(lock_file_content("Gemfile.lock"))
|
46
|
-
project.lock_file.specs.size.should > 0
|
47
|
-
end
|
48
|
-
|
49
|
-
it "raises GemfileLockNotFoundError if not found" do
|
50
|
-
project1 = Project.new(redirect_url, [])
|
51
|
-
project1.expects(:request).returns(nil)
|
52
|
-
expect { project1.lock_file }.to raise_error(GemfileLockNotFoundError)
|
32
|
+
context "#check_failed?" do
|
33
|
+
it "returns true if at least one dependency is not up to date or non existing" do
|
34
|
+
project.check_failed? == true
|
53
35
|
end
|
54
36
|
end
|
55
37
|
|
data/spec/report_spec.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module GemVersionCheck
|
5
|
+
describe Report do
|
6
|
+
|
7
|
+
before do
|
8
|
+
Project.any_instance.stubs(:report)
|
9
|
+
end
|
10
|
+
|
11
|
+
let (:report) do
|
12
|
+
report = Report.new(%w(proj1, proj2))
|
13
|
+
report.generate
|
14
|
+
report
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#generate" do
|
18
|
+
it "returns array of projects" do
|
19
|
+
report = Report.new(%w(proj1, proj2))
|
20
|
+
report.generate.size.should == 2
|
21
|
+
end
|
22
|
+
|
23
|
+
it "#check_failed? returns true if at least on project failed" do
|
24
|
+
Project.any_instance.stubs(:check_failed?).returns(true)
|
25
|
+
report.should be_check_failed
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#check_failed? returns false if all projects report success" do
|
29
|
+
Project.any_instance.stubs(:check_failed?).returns(false)
|
30
|
+
report.should_not be_check_failed
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem_version_check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -32,26 +32,42 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
37
|
+
version: 2.12.0
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
45
|
+
version: 2.12.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: mocha
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.13.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.13.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: bundler
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
49
65
|
none: false
|
50
66
|
requirements:
|
51
67
|
- - ! '>='
|
52
68
|
- !ruby/object:Gem::Version
|
53
69
|
version: '0'
|
54
|
-
type: :
|
70
|
+
type: :runtime
|
55
71
|
prerelease: false
|
56
72
|
version_requirements: !ruby/object:Gem::Requirement
|
57
73
|
none: false
|
@@ -60,7 +76,7 @@ dependencies:
|
|
60
76
|
- !ruby/object:Gem::Version
|
61
77
|
version: '0'
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
79
|
+
name: progressbar
|
64
80
|
requirement: !ruby/object:Gem::Requirement
|
65
81
|
none: false
|
66
82
|
requirements:
|
@@ -96,11 +112,17 @@ files:
|
|
96
112
|
- lib/gem_version_check/dependency.rb
|
97
113
|
- lib/gem_version_check/formatter/json.rb
|
98
114
|
- lib/gem_version_check/formatter/pretty_print.rb
|
115
|
+
- lib/gem_version_check/lockfile.rb
|
116
|
+
- lib/gem_version_check/lockfile_fetcher.rb
|
99
117
|
- lib/gem_version_check/project.rb
|
118
|
+
- lib/gem_version_check/report.rb
|
100
119
|
- lib/gem_version_check/version.rb
|
101
120
|
- spec/configuration_spec.rb
|
102
121
|
- spec/dependency_spec.rb
|
122
|
+
- spec/lockfile_fetch_spec.rb
|
123
|
+
- spec/lockfile_spec.rb
|
103
124
|
- spec/project_spec.rb
|
125
|
+
- spec/report_spec.rb
|
104
126
|
- spec/spec_helper.rb
|
105
127
|
- spec/stubs/rails_app_example.lock
|
106
128
|
homepage: ''
|
@@ -117,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
139
|
version: '0'
|
118
140
|
segments:
|
119
141
|
- 0
|
120
|
-
hash:
|
142
|
+
hash: 2330606061019261803
|
121
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
144
|
none: false
|
123
145
|
requirements:
|
@@ -126,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
148
|
version: '0'
|
127
149
|
segments:
|
128
150
|
- 0
|
129
|
-
hash:
|
151
|
+
hash: 2330606061019261803
|
130
152
|
requirements: []
|
131
153
|
rubyforge_project:
|
132
154
|
rubygems_version: 1.8.24
|
@@ -136,6 +158,9 @@ summary: Check your gem dependencies
|
|
136
158
|
test_files:
|
137
159
|
- spec/configuration_spec.rb
|
138
160
|
- spec/dependency_spec.rb
|
161
|
+
- spec/lockfile_fetch_spec.rb
|
162
|
+
- spec/lockfile_spec.rb
|
139
163
|
- spec/project_spec.rb
|
164
|
+
- spec/report_spec.rb
|
140
165
|
- spec/spec_helper.rb
|
141
166
|
- spec/stubs/rails_app_example.lock
|