gemfresh 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.md +5 -2
  2. data/gemfresh.gemspec +1 -1
  3. data/gemfresh.rb +69 -84
  4. data/support.rb +39 -0
  5. metadata +28 -53
data/README.md CHANGED
@@ -4,17 +4,20 @@ Scans your bundler Gemfile and lets you know how up-to-date your gems are.
4
4
  ## Installation and Usage
5
5
 
6
6
  To install, simply grab the gem:
7
+
7
8
  gem install gemfresh
8
-
9
+
9
10
  Change a project directory with a Gemfile (e.g. Your Rails v3+ project) and
10
11
  type:
12
+
11
13
  gemfresh
12
14
 
13
15
  This will output a list of current, updateable and obsolete gems. For more
14
16
  information on what this means, run gemfresh with the --help option:
17
+
15
18
  gemfresh --help
16
19
 
17
20
  ## License
18
21
  MIT Licensed. See MIT-LICENSE.txt for more information.
19
22
 
20
- Thanks [@jonathannen](http://twitter.com/jonathannen).
23
+ Thanks, [@jonathannen](http://twitter.com/jonathannen).
data/gemfresh.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'gemfresh'
3
- s.version = '1.0.2'
3
+ s.version = '1.0.3'
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.authors = ['Jon Williams']
6
6
  s.email = ['jon@jonathannen.com']
data/gemfresh.rb CHANGED
@@ -14,13 +14,17 @@ if ARGV.include?('--help')
14
14
  your current directory. Generally you'll simply invoke gemfresh from your
15
15
  Rails (or similar) project directory.
16
16
 
17
- Gemfresh will list three categories of gems. "Current" gems are up-to-date.
18
- "Obsolete" gems
17
+ Gemfresh will list three categories of gems:
18
+
19
+ "Current" gems are up-to-date.
20
+
21
+ "Obsolete" gems have a newer version than the one specified in your Gemfile
19
22
 
20
- "Updateable" gems that have a 'fuzzy' gemspec - e.g. '~> 2.2.0' is a fuzzy
21
- match for 2.2.1, 2.2.2, etc. Running bundle update will attempt to update
22
- your gems. If something is listed at updateable, you have an older version
23
- - e.g. "2.2.1", when the current is "2.2.2".
23
+ "Updateable" gems have a newer version, and it is within the version in your Gemfile
24
+ e.g. Gemfile: '~> 2.2.0'
25
+ Gemfile.lock: 2.2.1
26
+ Latest: 2.2.2
27
+ Running bundle update will attempt to update these gems.
24
28
 
25
29
  Just because a gem is updateable or obsolete, doesn't mean it can be
26
30
  updated. There might be dependencies that limit you to specific versions.
@@ -28,7 +32,7 @@ if ARGV.include?('--help')
28
32
  Check the bundler documentation (http://gembundler.com/) for more
29
33
  information on Gemfiles.
30
34
  HELP
31
- exit
35
+ exit 1
32
36
  end
33
37
 
34
38
  # Check for gemfile and lockfiles
@@ -36,34 +40,14 @@ gemfile = ARGV[0] || './Gemfile'
36
40
  lockfile = ARGV[1] || './Gemfile.lock'
37
41
  unless File.exists?(gemfile)
38
42
  puts "Couldn't find #{gemfile}.\nRun gemfresh with --help if you need more information."
39
- exit
43
+ exit -1
40
44
  end
41
45
  unless File.exists?(lockfile)
42
46
  puts "Couldn't find #{lockfile}.\nRun gemfresh with --help if you need more information."
43
- exit
44
- end
45
-
46
- # Front for RubyGems
47
- class RubyGemReader < Struct.new('RubyGemReader', :uri)
48
- def get(path, data={}, content_type='application/x-www-form-urlencoded')
49
- request = Net::HTTP::Get.new(path)
50
- request.add_field 'Connection', 'keep-alive'
51
- request.add_field 'Keep-Alive', '30'
52
- request.add_field 'User-Agent', 'github.com/jonathannen/gemfresh'
53
- response = connection.request request
54
- response.body
55
- end
56
- private
57
- # A persistent connection
58
- def connection(host = Gem.host)
59
- return @connection unless @connection.nil?
60
- @connection = Net::HTTP.new self.uri.host, self.uri.port
61
- @connection.start
62
- @connection
63
- end
47
+ exit -1
64
48
  end
65
49
 
66
- # Start in earnets
50
+ # Start in earnest
67
51
  puts "Checking the freshness of your Gemfile.\n"
68
52
 
69
53
  # Get the data from bundler
@@ -77,6 +61,8 @@ sources = {}
77
61
  results = { :current => [], :update => [], :obsolete => [] }
78
62
  count = 0
79
63
  prereleases = 0
64
+ unavailable = 0
65
+ untracked = 0
80
66
 
81
67
  # Map dependencies to their specs, then select RubyGem sources
82
68
  dep_specs = deps.map { |dep| [dep, specs.find { |spec| spec.name == dep.name }] }
@@ -85,43 +71,67 @@ dep_specs = dep_specs.select { |dep, spec| !spec.nil? && (spec.source.class == B
85
71
  # Do we have any deps?
86
72
  if deps.empty?
87
73
  puts "No top-level RubyGem dependencies found in your Gemfile.\nRun gemfresh with --help if you need more information."
88
- exit
74
+ exit true # Successful in that everything is theoretically up-to-date
89
75
  end
90
76
 
91
77
  # Iterate through the deps, checking the spec against the latest version
92
78
  print "Hitting up your RubyGems sources: "
93
79
  dep_specs.each do |dep, spec|
94
80
  name = dep.name
95
- # version = spec.version.to_s
96
-
97
- # Get a connection to the rubygem repository, reusing if we can
98
- remote = spec.source.remotes.first
99
- next if remote.nil?
100
- reader = sources[remote]
101
- reader = sources[remote] = RubyGemReader.new(remote) if reader.nil?
102
-
103
- # Get the RubyGems data
104
- # lookup = RubyGems.get("/api/v1/gems/#{name}.yaml")
105
- gemdata = reader.get("/api/v1/gems/#{name}.yaml")
106
- gemdata = YAML.load(gemdata)
107
-
108
- # Get the versions list as well
109
- versions = reader.get("/api/v1/versions/#{name}.yaml")
110
- versions = YAML.load(versions)
111
-
112
- # Store the result as a diff object
113
- diff = SpecDiff.new(dep, spec, gemdata, versions)
114
- results[diff.classify] << diff
115
-
116
- # Stats
117
- prereleases +=1 if diff.prerelease?
118
- count += 1
119
- print "."
81
+
82
+ # Get a connection to the rubygem repository, reusing the source
83
+ # connection if we can. Any error and that source is marked unavailable.
84
+ gemdata = versions = false
85
+ spec.source.remotes.each do |remote|
86
+ begin
87
+ next if remote.nil?
88
+ reader = sources[remote]
89
+ next if reader == :unavailable # Source previously marked unavailable
90
+ reader = sources[remote] = RubyGemReader.new(remote) if reader.nil?
91
+
92
+ # Get the RubyGems data
93
+ # lookup = RubyGems.get("/api/v1/gems/#{name}.yaml")
94
+ gemdata = reader.get("/api/v1/gems/#{name}.yaml")
95
+ gemdata = YAML.load(gemdata)
96
+
97
+ # Get the versions list as well
98
+ versions = reader.get("/api/v1/versions/#{name}.yaml")
99
+ versions = YAML.load(versions)
100
+
101
+ # Break if we've got the data we need
102
+ break unless !gemdata || !versions
103
+
104
+ rescue SourceUnavailableError => sae
105
+ # Mark source as unavailable
106
+ sources[remote] = :unavailable
107
+ end
108
+ end
109
+
110
+ # No Gem Data or Version information? Not a versioned or tracked gem, so
111
+ # nothing we can deal with
112
+ if !gemdata || !versions || gemdata['version'].nil?
113
+ unavailable =+ 1
114
+ print "x"
115
+
116
+ # Otherwise, all good - store as a diff and move on
117
+ else
118
+ diff = SpecDiff.new(dep, spec, gemdata, versions)
119
+ results[diff.classify] << diff
120
+ prereleases +=1 if diff.prerelease?
121
+ count += 1
122
+ print "."
123
+ end
124
+
120
125
  STDOUT.flush
121
126
  end
122
127
  puts " Done!"
123
128
 
124
- # Let the user about prereleases
129
+ # Let the user know about prereleases
130
+ if unavailable > 0
131
+ puts "\nCouldn't get data for #{unavailable} gem#{unavailable == 1 ? '' : 's'}. It might be the RubyGem source is down or unaccessible. Give it another try in a moment."
132
+ end
133
+
134
+ # Let the user know about prereleases
125
135
  if prereleases > 0
126
136
  puts "\nYou have #{prereleases} prerelease gem#{prereleases == 1 ? '' : 's'}. Prereleases will be marked with a '*'."
127
137
  end
@@ -170,30 +180,5 @@ else
170
180
  end
171
181
  end
172
182
 
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
183
+ # Exit code is determined by presence of obsolete gems
184
+ exit results[:obsolete].empty?
data/support.rb CHANGED
@@ -1,3 +1,42 @@
1
+ # Front for RubyGems
2
+ class SourceUnavailableError < StandardError; end
3
+ class RubyGemReader
4
+ attr_reader :uri
5
+
6
+ def initialize(uri)
7
+ @connection = nil
8
+ @uri = uri #.gsub('https://', 'http://') # No SSL for the moment
9
+ # puts @uri.inspect
10
+ # puts @uri.scheme
11
+ end
12
+
13
+ # May raise SourceUnavailableError if the source can't be accessed
14
+ def get(path, data={}, content_type='application/x-www-form-urlencoded')
15
+ begin
16
+ request = Net::HTTP::Get.new(path)
17
+ request.add_field 'Connection', 'keep-alive'
18
+ request.add_field 'Keep-Alive', '30'
19
+ request.add_field 'User-Agent', 'github.com/jonathannen/gemfresh'
20
+ response = connection.request request
21
+ response.body
22
+ rescue StandardError => se
23
+ # For now we assume this is an unavailable repo
24
+ raise SourceUnavailableError.new(se.message)
25
+ end
26
+ end
27
+
28
+ private
29
+ # A persistent connection
30
+ def connection
31
+ return @connection unless @connection.nil?
32
+ @connection = Net::HTTP.new self.uri.host, self.uri.port
33
+ @connection.start
34
+ @connection
35
+ end
36
+ end
37
+
38
+
39
+ # A class to encapsulate the difference between gem states
1
40
  class SpecDiff < Struct.new(:dep, :spec, :gemdata, :versions)
2
41
 
3
42
  # Configure the diff
metadata CHANGED
@@ -1,49 +1,35 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gemfresh
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 2
10
- version: 1.0.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jon Williams
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-09-29 00:00:00 +10:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-30 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: bundler
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70155552550560 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 1
32
- - 0
33
- - 10
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
34
21
  version: 1.0.10
35
22
  type: :runtime
36
- version_requirements: *id001
23
+ prerelease: false
24
+ version_requirements: *70155552550560
37
25
  description: Scans Gemfiles to check for obsolete and updateable gems.
38
- email:
26
+ email:
39
27
  - jon@jonathannen.com
40
- executables:
28
+ executables:
41
29
  - gemfresh
42
30
  extensions: []
43
-
44
31
  extra_rdoc_files: []
45
-
46
- files:
32
+ files:
47
33
  - .gitignore
48
34
  - Gemfile
49
35
  - MIT-LICENSE.txt
@@ -53,39 +39,28 @@ files:
53
39
  - gemfresh.gemspec
54
40
  - gemfresh.rb
55
41
  - support.rb
56
- has_rdoc: true
57
42
  homepage: https://github.com/jonathannen/gemfresh
58
43
  licenses: []
59
-
60
44
  post_install_message:
61
45
  rdoc_options: []
62
-
63
- require_paths:
46
+ require_paths:
64
47
  - .
65
- required_ruby_version: !ruby/object:Gem::Requirement
48
+ required_ruby_version: !ruby/object:Gem::Requirement
66
49
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
74
- required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
55
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
83
60
  requirements: []
84
-
85
61
  rubyforge_project:
86
- rubygems_version: 1.6.2
62
+ rubygems_version: 1.8.6
87
63
  signing_key:
88
64
  specification_version: 3
89
65
  summary: Checks the freshness of your Gemfile.
90
66
  test_files: []
91
-