libyear 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -1
- data/lib/libyear/cli.rb +3 -58
- data/lib/libyear/query.rb +73 -0
- data/lib/libyear/report.rb +30 -0
- data/lib/libyear/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10b6af767f2c311397eb8cacc3411ed2faf23a70
|
4
|
+
data.tar.gz: 46b24478fedc3efac195e8916389e64db44b269f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 568702d22168ad898e48ba88896cbf4f2ba8925549f71baff495342253659af432c39c9913d64480c9dab4f115ebd1bd4255972305279150d72df8cfc7589883
|
7
|
+
data.tar.gz: 45a0b87b0ba1c0e3d84e64e6ec1320d090c882f0de4e7ad195b982b99f8044e0aff42fdf02136d21f5882142a18e74f725f2fe8fee0a704080d66abd71fda18f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# libyear
|
2
2
|
|
3
|
-
|
3
|
+
This project follows [semver 2.0.0][1] and the recommendations
|
4
|
+
of [keepachangelog.com][2].
|
5
|
+
|
6
|
+
## 0.1.1 (2017-02-14)
|
7
|
+
|
8
|
+
Breaking changes:
|
9
|
+
|
10
|
+
- None
|
11
|
+
|
12
|
+
Added:
|
13
|
+
|
14
|
+
- None
|
15
|
+
|
16
|
+
Fixed:
|
17
|
+
|
18
|
+
- Better handling of error when bundle outdated fails
|
19
|
+
|
20
|
+
## 0.1.0 (2017-02-13)
|
4
21
|
|
5
22
|
Initial version. Proof of concept.
|
23
|
+
|
24
|
+
[1]: http://semver.org/spec/v2.0.0.html
|
25
|
+
[2]: http://keepachangelog.com/
|
data/lib/libyear/cli.rb
CHANGED
@@ -1,76 +1,21 @@
|
|
1
1
|
require "bundler/cli"
|
2
2
|
require "bundler/cli/outdated"
|
3
|
+
require "libyear/report"
|
4
|
+
require "libyear/query"
|
3
5
|
|
4
6
|
module Libyear
|
5
7
|
class CLI
|
6
|
-
# Format of `bundle outdated --parseable` (BOP)
|
7
|
-
BOP_FMT = /\A(?<name>[^ ]+) \(newest (?<newest>[^,]+), installed (?<installed>[^,)]+)/
|
8
|
-
|
9
8
|
def initialize(argv)
|
10
9
|
validate_arguments(argv)
|
11
10
|
@gemfile_path = argv.first
|
12
11
|
end
|
13
12
|
|
14
13
|
def run
|
15
|
-
|
16
|
-
gems = []
|
17
|
-
parseable.lines.each do |line|
|
18
|
-
match = BOP_FMT.match(line)
|
19
|
-
next if match.nil?
|
20
|
-
gems.push(
|
21
|
-
installed: { version: match["installed"] },
|
22
|
-
name: match["name"],
|
23
|
-
newest: { version: match["newest"] }
|
24
|
-
)
|
25
|
-
end
|
26
|
-
gems.each do |gem|
|
27
|
-
gem[:installed][:date] = release_date(gem[:name], gem[:installed][:version])
|
28
|
-
gem[:newest][:date] = release_date(gem[:name], gem[:newest][:version])
|
29
|
-
end
|
30
|
-
report(gems)
|
14
|
+
print Report.new(Query.new(@gemfile_path).execute).to_s
|
31
15
|
end
|
32
16
|
|
33
17
|
private
|
34
18
|
|
35
|
-
# Known issue: Probably performs a network request every time, unless
|
36
|
-
# there's some kind of caching.
|
37
|
-
def release_date(gem_name, gem_version)
|
38
|
-
dep = ::Bundler::Dependency.new(gem_name, gem_version)
|
39
|
-
tuples, _errors = ::Gem::SpecFetcher.fetcher.search_for_dependency(dep)
|
40
|
-
tup, source = tuples.first # Gem::NameTuple
|
41
|
-
spec = source.fetch_spec(tup) # raises Gem::RemoteFetcher::FetchError
|
42
|
-
spec.date.to_date
|
43
|
-
end
|
44
|
-
|
45
|
-
def report(gems)
|
46
|
-
sum_years = 0.0
|
47
|
-
gems.each do |gem|
|
48
|
-
di = gem[:installed][:date]
|
49
|
-
dn = gem[:newest][:date]
|
50
|
-
if dn <= di
|
51
|
-
# Known issue: Backports and maintenance releases of older minor versions.
|
52
|
-
# Example: json 1.8.6 (2017-01-13) was released *after* 2.0.3 (2017-01-12)
|
53
|
-
years = 0.0
|
54
|
-
else
|
55
|
-
days = (dn - di).to_f
|
56
|
-
years = days / 365.0
|
57
|
-
end
|
58
|
-
sum_years += years
|
59
|
-
puts(
|
60
|
-
format(
|
61
|
-
"%20s%10s%15s%10s%15s%10.1f",
|
62
|
-
gem[:name],
|
63
|
-
gem[:installed][:version],
|
64
|
-
di,
|
65
|
-
gem[:newest][:version],
|
66
|
-
dn,
|
67
|
-
years
|
68
|
-
)
|
69
|
-
)
|
70
|
-
end
|
71
|
-
puts format("System is %.1f libyears behind", sum_years)
|
72
|
-
end
|
73
|
-
|
74
19
|
def validate_arguments(argv)
|
75
20
|
# todo
|
76
21
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "English"
|
2
|
+
require "open3"
|
3
|
+
|
4
|
+
module Libyear
|
5
|
+
# Responsible for getting all the data that goes into the `Report`.
|
6
|
+
class Query
|
7
|
+
# Format of `bundle outdated --parseable` (BOP)
|
8
|
+
BOP_FMT = /\A(?<name>[^ ]+) \(newest (?<newest>[^,]+), installed (?<installed>[^,)]+)/
|
9
|
+
|
10
|
+
def initialize(gemfile_path)
|
11
|
+
@gemfile_path = gemfile_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
gems = []
|
16
|
+
bundle_outdated.lines.each do |line|
|
17
|
+
match = BOP_FMT.match(line)
|
18
|
+
next if match.nil?
|
19
|
+
gems.push(
|
20
|
+
installed: { version: match["installed"] },
|
21
|
+
name: match["name"],
|
22
|
+
newest: { version: match["newest"] }
|
23
|
+
)
|
24
|
+
end
|
25
|
+
gems.each do |gem|
|
26
|
+
di = release_date(gem[:name], gem[:installed][:version])
|
27
|
+
dn = release_date(gem[:name], gem[:newest][:version])
|
28
|
+
if dn <= di
|
29
|
+
# Known issue: Backports and maintenance releases of older minor versions.
|
30
|
+
# Example: json 1.8.6 (2017-01-13) was released *after* 2.0.3 (2017-01-12)
|
31
|
+
years = 0.0
|
32
|
+
else
|
33
|
+
days = (dn - di).to_f
|
34
|
+
years = days / 365.0
|
35
|
+
end
|
36
|
+
gem[:installed][:date] = di
|
37
|
+
gem[:newest][:date] = dn
|
38
|
+
gem[:libyears] = years
|
39
|
+
end
|
40
|
+
gems
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def bundle_outdated
|
46
|
+
stdout, stderr, status = Open3.capture3(
|
47
|
+
%Q(BUNDLE_GEMFILE="#{@gemfile_path}" bundle outdated --parseable)
|
48
|
+
)
|
49
|
+
# Known statuses:
|
50
|
+
# 0 - Nothing is outdated
|
51
|
+
# 256 - Something is outdated
|
52
|
+
# 1792 - Unable to determine if something is outdated
|
53
|
+
unless [0, 256].include?(status.to_i)
|
54
|
+
$stderr.puts "`bundle outdated` failed with status: #{status.to_i}"
|
55
|
+
$stderr.puts "stderr: #{stderr}"
|
56
|
+
$stderr.puts "stdout: #{stdout}"
|
57
|
+
$stderr.puts "Try running `bundle install`."
|
58
|
+
Kernel.exit(1)
|
59
|
+
end
|
60
|
+
stdout
|
61
|
+
end
|
62
|
+
|
63
|
+
# Known issue: Probably performs a network request every time, unless
|
64
|
+
# there's some kind of caching.
|
65
|
+
def release_date(gem_name, gem_version)
|
66
|
+
dep = ::Bundler::Dependency.new(gem_name, gem_version)
|
67
|
+
tuples, _errors = ::Gem::SpecFetcher.fetcher.search_for_dependency(dep)
|
68
|
+
tup, source = tuples.first # Gem::NameTuple
|
69
|
+
spec = source.fetch_spec(tup) # raises Gem::RemoteFetcher::FetchError
|
70
|
+
spec.date.to_date
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Libyear
|
2
|
+
# Responsible presenting data from the `Query`. Should only be concerned
|
3
|
+
# with presentation, nothing else.
|
4
|
+
class Report
|
5
|
+
# `gems` - Array of hashes.
|
6
|
+
def initialize(gems)
|
7
|
+
@gems = gems
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
sum_years = 0.0
|
12
|
+
@gems.each do |gem|
|
13
|
+
years = gem[:libyears]
|
14
|
+
sum_years += years
|
15
|
+
puts(
|
16
|
+
format(
|
17
|
+
"%20s%10s%15s%10s%15s%10.1f",
|
18
|
+
gem[:name],
|
19
|
+
gem[:installed][:version],
|
20
|
+
gem[:installed][:date],
|
21
|
+
gem[:newest][:version],
|
22
|
+
gem[:newest][:date],
|
23
|
+
years
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
puts format("System is %.1f libyears behind", sum_years)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/libyear/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libyear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared Beck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -57,6 +57,8 @@ files:
|
|
57
57
|
- bin/setup
|
58
58
|
- lib/libyear.rb
|
59
59
|
- lib/libyear/cli.rb
|
60
|
+
- lib/libyear/query.rb
|
61
|
+
- lib/libyear/report.rb
|
60
62
|
- lib/libyear/version.rb
|
61
63
|
- libyear.gemspec
|
62
64
|
homepage: https://libyear.com
|