gemshine 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +39 -37
- data/lib/gemshine/cli.rb +1 -1
- data/lib/gemshine/command.rb +88 -69
- data/lib/gemshine/version.rb +1 -1
- data/test/integration/cli_test.rb +1 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fa09e476c4fe67b9cd33fa0d06b16c88f6469ac
|
4
|
+
data.tar.gz: 059c1ab86f61f15e2e0f60201b68d777264d1165
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8052d8b19b87f12e9a0533f19b2a9d25f758f13eb683dc292b3a5015a639ecaa83a084a2cdf2f0c4e2f6c45c933a381fc7580c74b382f8f04d576c7c80972a1b
|
7
|
+
data.tar.gz: 87b6b361ada593885405245deb9c900227d28a54093149c40c8ea2d493f6828ffe2f4f0677fe55e12d62f0568e1b740d89fe91fe02f6f3b5b7935e5e630b1ded
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
## What is gemshine?
|
2
2
|
|
3
|
-
Gemshine recursively searches a given path for all ruby projects and reports back a table showing the latest version of each gem you have installed in addition the version
|
3
|
+
Gemshine recursively searches a given path for all ruby projects and reports back a table showing the latest version of each gem you have installed in addition to the version you have installed locally for that project.
|
4
4
|
|
5
5
|
### What problem does it solve and why is it useful?
|
6
6
|
|
7
|
-
A typical rails project might have 40 or even 80 gems and keeping track of when a gem author updates each gem is painful.
|
7
|
+
A typical rails project might have 40 or even 80 gems and keeping track of when a gem author updates each gem is painful. `bundle outdated` partly solves this problem but not quite.
|
8
8
|
|
9
9
|
**To check for updates manually without gemshine** involves the following excruciating workflow:
|
10
10
|
|
@@ -19,6 +19,14 @@ A typical rails project might have 40 or even 80 gems and keeping track of when
|
|
19
19
|
9. Repeat n times for each project you want to retrieve this information for.
|
20
20
|
10. Get up and look in the mirror to see if you can see your eye spasm after doing this workflow only once.
|
21
21
|
|
22
|
+
**To check for updates with bundle outdated instead of gemshine** involves the following boring workflow:
|
23
|
+
|
24
|
+
1. Open a terminal.
|
25
|
+
2. `cd` into a directory containing a Gemfile and type `bundle outdated`.
|
26
|
+
3. Mentally parse out the gems you probably don't care about (dependencies of dependencies).
|
27
|
+
4. Repeat step 2 and 3 until you are done checking all of your projects.
|
28
|
+
- This is annoying when you have 15 rails projects to go through.
|
29
|
+
|
22
30
|
**To check for updates with gemshine** involves the following awesome workflow:
|
23
31
|
|
24
32
|
1. Open a terminal.
|
@@ -31,40 +39,34 @@ After typing: `$ gemshine path /path/to/some/rails/app`
|
|
31
39
|
You would see a table similar to this:
|
32
40
|
|
33
41
|
```
|
34
|
-
|
35
|
-
|
|
36
|
-
|
37
|
-
| Gem
|
38
|
-
|
39
|
-
| bootstrap-sass
|
40
|
-
| bullet
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
60
|
-
|
|
61
|
-
|
62
|
-
| turbolinks | ~> 1.3.1 | 2.2.2 |
|
63
|
-
| uglifier | ~> 2.4.0 | 2.5.0 |
|
64
|
-
| whenever | ---------> | 0.9.2 |
|
65
|
-
+----------------------+------------+---------+
|
66
|
-
| 26 total gems | | |
|
67
|
-
+----------------------+------------+---------+
|
42
|
+
+-------------------------+-----------------+----------------+-----------------+
|
43
|
+
| awesomeapp |
|
44
|
+
+-------------------------+-----------------+----------------+-----------------+
|
45
|
+
| Gem | Defined | Installed | Latest |
|
46
|
+
+-------------------------+-----------------+----------------+-----------------+
|
47
|
+
| bootstrap-sass | ~> 3.0.1 | 3.0.3.0 | 3.1.1.1 |
|
48
|
+
| bullet | ~> 4.7.1 | 4.7.1 | 4.8.0 |
|
49
|
+
| dotenv | | 0.9.0 | 0.11.1 |
|
50
|
+
| dotenv-rails | ~> 0.9.0 | 0.9.0 | 0.11.1 |
|
51
|
+
| favicon_maker | ~> 1.1.0 | 1.1.1 | 1.1.2 |
|
52
|
+
| font-awesome-rails | ~> 4.0.3.1 | 4.0.3.1 | 4.0.3.2 |
|
53
|
+
| foreman | | 0.63.0 | 0.67.0 |
|
54
|
+
| jquery-rails | ~> 3.0.4 | 3.0.4 | 3.1.0 |
|
55
|
+
| meta_request | | 0.2.8 | 0.3.0 |
|
56
|
+
| puma | ~> 2.7.1 | 2.7.1 | 2.8.2 |
|
57
|
+
| rack-mini-profiler | | 0.9.0 | 0.9.1 |
|
58
|
+
| rails | = 4.0.2 | 4.0.2 | 4.1.0 |
|
59
|
+
| sass | | 3.2.14 | 3.3.6 |
|
60
|
+
| sass-rails | ~> 4.0.1 | 4.0.1 | 4.0.3 |
|
61
|
+
| sidekiq | ~> 2.17.4 | 2.17.4 | 3.0.0 |
|
62
|
+
| sinatra | | 1.4.4 | 1.4.5 |
|
63
|
+
| sitemap_generator | ~> 4.3.1 | 4.3.1 | 5.0.2 |
|
64
|
+
| turbolinks | ~> 1.3.1 | 1.3.1 | 2.2.2 |
|
65
|
+
| uglifier | ~> 2.4.0 | 2.4.0 | 2.5.0 |
|
66
|
+
| whenever | | 0.9.0 | 0.9.2 |
|
67
|
+
+-------------------------+-----------------+----------------+-----------------+
|
68
|
+
| 20 outdated gems | | | |
|
69
|
+
+-------------------------+-----------------+----------------+-----------------+
|
68
70
|
```
|
69
71
|
|
70
72
|
## Installation
|
@@ -76,5 +78,5 @@ You would see a table similar to this:
|
|
76
78
|
Here is an overview of the available commands. You can find out more information about each command and flag by simply
|
77
79
|
running `gemshine <command name> help` from your terminal. You can also type `gemshine` on its own to see a list of all commands.
|
78
80
|
|
79
|
-
- Get the latest gem versions for this project and compare them to your
|
81
|
+
- Get the latest gem versions for this project and compare them to your installed version
|
80
82
|
- `gemshine path <PROJECT_PATH>`
|
data/lib/gemshine/cli.rb
CHANGED
@@ -5,7 +5,7 @@ module Gemshine
|
|
5
5
|
class CLI < Thor
|
6
6
|
desc 'path PROJECT_PATH', ''
|
7
7
|
long_desc <<-D
|
8
|
-
`gemshine path myapp` will recursively search through the myapp path and report the
|
8
|
+
`gemshine path myapp` will recursively search through the myapp path and report the installed vs latest gem versions for all ruby projects.
|
9
9
|
D
|
10
10
|
def path(app_name)
|
11
11
|
Command.new(app_name, options).path
|
data/lib/gemshine/command.rb
CHANGED
@@ -7,6 +7,10 @@ module Gemshine
|
|
7
7
|
include Thor::Shell
|
8
8
|
include Thor::Actions
|
9
9
|
|
10
|
+
MSG_MISSING_GEMFILE = 'A Gemfile could not be found for:'
|
11
|
+
MSG_GATHER_OUTDATED = 'Gathering outdated top level gems for:'
|
12
|
+
MSG_UP_TO_DATE = 'Every top level gem is up to date for this project.'
|
13
|
+
|
10
14
|
def initialize(app_name = '', options = {})
|
11
15
|
@app_name = app_name
|
12
16
|
@options = options
|
@@ -16,110 +20,125 @@ module Gemshine
|
|
16
20
|
end
|
17
21
|
|
18
22
|
def path
|
19
|
-
rows = []
|
20
|
-
gems_regex = ''
|
21
|
-
gems_total = 0
|
22
|
-
|
23
23
|
ruby_project_directories.each do |project_dir|
|
24
24
|
gemfile_path = File.join(project_dir, 'Gemfile')
|
25
|
+
project_name = File.basename(project_dir)
|
25
26
|
|
26
|
-
|
27
|
-
File.open(gemfile_path, 'r').each_line do |line|
|
28
|
-
clean_gem_line = line.strip
|
27
|
+
log_project File.basename(project_dir)
|
29
28
|
|
30
|
-
|
31
|
-
|
29
|
+
unless File.exists?(gemfile_path)
|
30
|
+
log_missing project_name
|
31
|
+
next
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
+
gem_table build_gem_list(bundle_outdated(project_dir), project_dir), project_name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def version
|
39
|
+
puts "Gemshine version #{VERSION}"
|
40
|
+
end
|
34
41
|
|
35
|
-
|
42
|
+
private
|
36
43
|
|
37
|
-
|
38
|
-
|
39
|
-
|
44
|
+
def ruby_project_directories
|
45
|
+
gemfiles = run("find #{@app_name} -type f -name Gemfile", capture: true)
|
46
|
+
gemfile_paths = gemfiles.split("\n")
|
40
47
|
|
41
|
-
|
48
|
+
gemfile_paths.map { |gemfile| File.dirname(gemfile) }
|
49
|
+
end
|
42
50
|
|
43
|
-
|
51
|
+
def bundle_outdated(path)
|
52
|
+
run "cd #{path} && bundle outdated && cd -", capture: true
|
53
|
+
end
|
44
54
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
rubygems_data = run("gem list '#{gems_regex[0...-1]}' --remote --all", capture: true)
|
55
|
+
def build_gem_list(data, project_dir)
|
56
|
+
plucked_gems(data, project_dir).map! { |gem| parse_gem_data(gem) }
|
57
|
+
end
|
49
58
|
|
50
|
-
|
59
|
+
def plucked_gems(bundle_data, project_dir)
|
60
|
+
lines = bundle_data.split("\n")
|
51
61
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
t.add_row ["#{gems_total} total gems", '', '']
|
56
|
-
end
|
62
|
+
gemfile_path = File.join(project_dir, 'Gemfile')
|
63
|
+
gemspec_path = Dir.glob("#{project_dir}/*.gemspec").first
|
64
|
+
gemfile_contents = IO.read(gemfile_path)
|
57
65
|
|
58
|
-
|
59
|
-
puts table
|
60
|
-
end
|
66
|
+
gemspec_path ? gemspec_contents = IO.read(gemspec_path) : gemspec_contents = ''
|
61
67
|
|
62
|
-
|
63
|
-
|
64
|
-
|
68
|
+
lines.keep_if do |line|
|
69
|
+
line.strip!
|
70
|
+
line.start_with?('*')
|
65
71
|
end
|
66
|
-
end
|
67
|
-
end
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
end
|
73
|
+
lines.keep_if do |line|
|
74
|
+
parts = line.split
|
72
75
|
|
73
|
-
|
76
|
+
parts[0] == '*' ? is_gem_line = true : is_gem_line = false
|
74
77
|
|
75
|
-
|
76
|
-
line_parts = gem_line.split(',')
|
77
|
-
gem_name = line_parts[0][5...-1]
|
78
|
+
is_gem_line ? name = parts[1][0..-1] : name = ''
|
78
79
|
|
79
|
-
|
80
|
-
might_be_version = line_parts[1].strip
|
81
|
-
else
|
82
|
-
might_be_version = ''
|
83
|
-
end
|
80
|
+
expression = /\b#{name}\b/
|
84
81
|
|
85
|
-
|
86
|
-
gem_version = line_parts[1][2...-1]
|
87
|
-
else
|
88
|
-
gem_version = '--------->'
|
82
|
+
is_gem_line && gemfile_contents.match(expression) || gemspec_contents.match(expression)
|
89
83
|
end
|
90
84
|
|
91
|
-
|
85
|
+
lines.map! { |line| line[2..-1] }
|
92
86
|
end
|
93
87
|
|
94
|
-
def
|
95
|
-
|
88
|
+
def parse_gem_data(line)
|
89
|
+
parts = line.split
|
90
|
+
|
91
|
+
name = parts[0]
|
92
|
+
ver_installed = parts[3][0...-1]
|
93
|
+
ver_latest = parts[1][1..-1]
|
94
|
+
ver_specific = parts[4]
|
95
|
+
ver_defined = ''
|
96
|
+
ver_operator = ''
|
97
|
+
ver_locked = ''
|
98
|
+
|
99
|
+
if ver_specific
|
100
|
+
ver_operator = parts[6][1..-1]
|
101
|
+
ver_locked = parts[7][0...-1]
|
102
|
+
ver_defined = "#{ver_operator} #{ver_locked}"
|
103
|
+
end
|
96
104
|
|
97
|
-
|
98
|
-
|
105
|
+
[name, ver_defined, ver_installed, ver_latest]
|
106
|
+
end
|
99
107
|
|
100
|
-
|
108
|
+
def gem_table(rows, title)
|
109
|
+
if rows.size == 0
|
110
|
+
log_up_to_date
|
111
|
+
return
|
112
|
+
end
|
101
113
|
|
102
|
-
|
103
|
-
latest_gem_version = might_be_latest_gem_version[0...-1]
|
104
|
-
else
|
105
|
-
latest_gem_version = might_be_latest_gem_version
|
106
|
-
end
|
114
|
+
rows.sort!
|
107
115
|
|
108
|
-
|
116
|
+
table = Terminal::Table.new title: title, headings: %w(Gem Defined Installed Latest), style: {width: 80} do |t|
|
117
|
+
t.rows = rows
|
118
|
+
t.add_separator
|
119
|
+
t.add_row ["#{rows.size} outdated gems", '', '', '']
|
109
120
|
end
|
121
|
+
|
122
|
+
puts
|
123
|
+
puts table
|
110
124
|
end
|
111
125
|
|
112
|
-
def
|
113
|
-
|
114
|
-
|
126
|
+
def log_project(project_name)
|
127
|
+
puts
|
128
|
+
say_status 'info', "\e[1m#{MSG_GATHER_OUTDATED}\e[0m", :yellow
|
129
|
+
say_status 'project', project_name, :cyan
|
130
|
+
puts
|
131
|
+
end
|
115
132
|
|
116
|
-
|
133
|
+
def log_up_to_date
|
134
|
+
puts
|
135
|
+
say_status 'nice', "#{MSG_UP_TO_DATE}", :magenta
|
117
136
|
end
|
118
137
|
|
119
|
-
def
|
138
|
+
def log_missing(project_name)
|
120
139
|
puts
|
121
|
-
say_status
|
122
|
-
say_status
|
140
|
+
say_status 'skip', "\e[1m#{MSG_MISSING_GEMFILE}\e[0m", :red
|
141
|
+
say_status 'project', project_name, :yellow
|
123
142
|
puts
|
124
143
|
end
|
125
144
|
end
|
data/lib/gemshine/version.rb
CHANGED
@@ -4,15 +4,11 @@ class TestCLI < Minitest::Unit::TestCase
|
|
4
4
|
include Gemshine::Test
|
5
5
|
|
6
6
|
def test_path
|
7
|
-
create_dummy_gemfile
|
8
|
-
|
9
7
|
out, err = capture_subprocess_io do
|
10
8
|
gemshine 'path Gemfile'
|
11
9
|
end
|
12
10
|
|
13
|
-
assert_match /
|
14
|
-
|
15
|
-
system "rm -rf #{TEST_PATH}"
|
11
|
+
assert_match /Gathering/, out
|
16
12
|
end
|
17
13
|
|
18
14
|
def test_version
|
@@ -22,24 +18,4 @@ class TestCLI < Minitest::Unit::TestCase
|
|
22
18
|
|
23
19
|
assert_match /Gemshine/, out
|
24
20
|
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def create_dummy_gemfile
|
29
|
-
gems = []
|
30
|
-
gems << 'gem "rails", "~> 4.1.0"'
|
31
|
-
gems << ' gem "sidekiq", "~> 2.17.4"'
|
32
|
-
gems << 'gem "whenever", require: false'
|
33
|
-
gems << 'gemwhenever",,,,d,,e'
|
34
|
-
gems << 'gem "sdoc", "~> 0.4.0", require: false'
|
35
|
-
gems << ' '
|
36
|
-
|
37
|
-
gemfile_path = "#{TEST_PATH}/Gemfile"
|
38
|
-
|
39
|
-
system "mkdir -p #{TEST_PATH}"
|
40
|
-
|
41
|
-
File.open(gemfile_path, 'w+') do |f|
|
42
|
-
gems.each { |element| f.puts(element) }
|
43
|
-
end
|
44
|
-
end
|
45
21
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gemshine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Janetakis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|