warning-shot 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -1
- data/README.txt +18 -17
- data/bin/warning-shot +2 -0
- data/lib/warning_shot.rb +6 -2
- data/lib/warning_shot/dep_checker.rb +12 -22
- data/lib/warning_shot/gem_handler.rb +82 -69
- data/lib/warning_shot/version.rb +1 -1
- data/website/index.html +1 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
== 0.9.
|
1
|
+
== 0.9.2 2008-03-13
|
2
|
+
* 2 major enhancement:
|
3
|
+
* Optional gem repos to check
|
4
|
+
* Install gems in "frozen" or "burned-in" dependency directories
|
5
|
+
* 1 minor enhancement:
|
6
|
+
* Outline for WarningShot::Logger
|
7
|
+
|
8
|
+
== 0.9.1 2008-03-12
|
2
9
|
* 1 minor enhancement:
|
3
10
|
* Cleaned up gem output
|
4
11
|
|
data/README.txt
CHANGED
@@ -9,23 +9,24 @@ USAGE
|
|
9
9
|
WarningShot can be used from the command line or in a capistrano script via the 'warning-shot' binary.
|
10
10
|
|
11
11
|
Options are:
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
12
|
+
--environment=APP_ENV Environment to test in.
|
13
|
+
Default: development
|
14
|
+
-s, --strict URL Testing is only successful on 200 instead of 2xx
|
15
|
+
-f, --flush Flush log before running
|
16
|
+
-g, --gems Install/update all missing OR outdated gems
|
17
|
+
--gempath=PATH Semicolon separated list of gem paths, gems will be installed in the 1st path
|
18
|
+
--dir=DIR The root directory of the application to check.
|
19
|
+
Default: .
|
20
|
+
--log=LOG Path of log file.
|
21
|
+
Default: (--dir path)/logs/warning_shot_(--environment).log
|
22
|
+
--configs=PATH Path to config files to use.
|
23
|
+
Default: (--dir path)/config/warning_shot/
|
24
|
+
-v, --verbose Output verbose information.
|
25
|
+
-n, --growl Output final results via growlnotify (Requires growlnotify)
|
26
|
+
--templates=[PATH] Generates template files
|
27
|
+
Default: Not Generated! (If specified, default is '.')
|
28
|
+
-h, --help Show this help message.
|
29
|
+
-d, --debug Enable debugging.
|
29
30
|
|
30
31
|
|
31
32
|
CONFIGURATION FILES
|
data/bin/warning-shot
CHANGED
@@ -31,6 +31,8 @@ BANNER
|
|
31
31
|
"Flush log before running") { |OPTIONS[:flush]| }
|
32
32
|
opts.on("-g", "--gems",
|
33
33
|
"Install/update all missing OR outdated gems") { |OPTIONS[:gems]| }
|
34
|
+
opts.on("--gempath=PATH",String,
|
35
|
+
"Semicolon separated list of gem paths, gems will be installed in the first path") {|OPTIONS[:gempath]|}
|
34
36
|
opts.on("--dir=DIR", String,
|
35
37
|
"The root directory of the application to check.",
|
36
38
|
"Default: #{OPTIONS[:dir]}") { |OPTIONS[:dir]| }
|
data/lib/warning_shot.rb
CHANGED
@@ -25,11 +25,15 @@ include RippleNetworks::WarningShot
|
|
25
25
|
|
26
26
|
=begin
|
27
27
|
TODOs
|
28
|
-
-->
|
29
|
-
|
28
|
+
-->Change from http reqs to protocol http://etc, memcached://etc, ftp://etc...
|
29
|
+
|
30
|
+
-->flag to install gems in first alt gem path
|
31
|
+
|
30
32
|
-->Implement a WarningShot.logger.(info,fatal,etc...) instead of current logging mechanism
|
31
33
|
====>In programatic interface take a logger and override (for passing in external loggers)
|
34
|
+
|
32
35
|
-->Further de-couple the dep_checker class
|
36
|
+
|
33
37
|
-->Update GemHandler#installed? to use Gem::Requirement#satisfied_by?
|
34
38
|
|
35
39
|
|
@@ -49,7 +49,8 @@ module RippleNetworks
|
|
49
49
|
:gems => false,
|
50
50
|
:verbose => false,
|
51
51
|
:growl => false,
|
52
|
-
:templates => false
|
52
|
+
:templates => false,
|
53
|
+
:gempath => nil
|
53
54
|
}
|
54
55
|
|
55
56
|
#Set up CLEAR and Windows Add'l requirement
|
@@ -178,30 +179,19 @@ module RippleNetworks
|
|
178
179
|
|
179
180
|
section("Checking gem dependencies")
|
180
181
|
#Initialize gem handler
|
181
|
-
@gh = GemHandler.new(self.configs["gems"])
|
182
182
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
#install missing gems
|
189
|
-
@gh.missing_gems.each do |gem,version|
|
190
|
-
record("#{gem} v. #{version} was NOT found!",(self.options[:gems]) ? :warning : :error)
|
191
|
-
@gh.install(gem,version) if self.options[:gems]
|
192
|
-
end
|
193
|
-
|
194
|
-
#List failed gems
|
195
|
-
@gh.failed_gems.each do |gem,reason|
|
196
|
-
record("#{gem} failed to install! Reason: #{reason}",:error)
|
197
|
-
end
|
183
|
+
gem_handler = GemHandler.new(self.configs["gems"],{
|
184
|
+
:install_all => @options[:gems],
|
185
|
+
:gem_path => @options[:gempath]
|
186
|
+
})
|
198
187
|
|
199
|
-
|
200
|
-
|
188
|
+
gem_handler.each do |c_gem|
|
189
|
+
if c_gem.status != :installed
|
190
|
+
record("#{c_gem.name} v. #{c_gem.version}:: #{c_gem.details}", :error)
|
191
|
+
else
|
192
|
+
record("#{c_gem.name} v. #{c_gem.version} requirement met!")
|
193
|
+
end
|
201
194
|
end
|
202
|
-
|
203
|
-
gem_errors = @gh.missing_gems.size - @gh.installed_gems.size
|
204
|
-
record("#{gem_errors} gems had errors", :info) if gem_errors > 0
|
205
195
|
|
206
196
|
section("Loading Ruby test scripts")
|
207
197
|
count = load_ruby_scripts
|
@@ -6,100 +6,72 @@ require 'rubygems/dependency_installer'
|
|
6
6
|
|
7
7
|
module RippleNetworks
|
8
8
|
module WarningShot
|
9
|
-
class GemHandler
|
9
|
+
class GemHandler < Array
|
10
10
|
DEFAULT_VERSION = ">0.0.0".freeze
|
11
11
|
CONDITIONAL_RGX = /[^\d]*/.freeze
|
12
12
|
VERSION_RGX = /[\d\.]+/.freeze
|
13
|
+
CandidateGem = Struct.new(:name,:version,:status,:details)
|
13
14
|
|
14
|
-
|
15
|
+
DEFAULTS = {
|
16
|
+
:install_all => false,
|
17
|
+
:gem_path => Gem.dir
|
18
|
+
}
|
15
19
|
|
16
|
-
def initialize(gem_list,
|
17
|
-
@
|
20
|
+
def initialize(gem_list,opts={})
|
21
|
+
@opts = DEFAULTS.merge(opts)
|
18
22
|
|
19
|
-
|
20
|
-
|
21
|
-
@
|
22
|
-
|
23
|
+
Gem.path.clear
|
24
|
+
#Add custom paths to gem..
|
25
|
+
unless @opts[:gem_path].nil? || @opts[:gem_path].empty?
|
26
|
+
@opts[:gem_path].split(";").each do |alt_path|
|
27
|
+
Gem.path.push(alt_path)
|
28
|
+
end
|
29
|
+
end
|
23
30
|
|
24
|
-
|
25
|
-
|
26
|
-
|
31
|
+
#Add candidate gems to array
|
32
|
+
split(gem_list).each do |rgem,ver|
|
33
|
+
self.push(CandidateGem.new(rgem,ver,:unchecked,""))
|
34
|
+
end
|
27
35
|
|
36
|
+
#Check status of gems
|
28
37
|
check_gems
|
29
|
-
|
38
|
+
install_all! if @opts[:install_all]
|
30
39
|
end
|
31
40
|
|
32
41
|
|
33
42
|
def split(gem_list)
|
34
43
|
gems = {}
|
35
44
|
gem_list.collect do |gem|
|
36
|
-
|
45
|
+
case gem
|
46
|
+
when String
|
47
|
+
gem_name, gem_ver = gem.chomp.split(":")
|
48
|
+
when Hash
|
49
|
+
gem_name, gem_ver = gem.keys.first, gem.values.first
|
50
|
+
end
|
37
51
|
gems[gem_name] = gem_ver || DEFAULT_VERSION #Default to newest gem
|
38
52
|
end
|
39
|
-
|
53
|
+
|
40
54
|
return gems
|
41
55
|
end
|
42
56
|
|
43
57
|
|
44
58
|
def add(gems)
|
45
|
-
|
59
|
+
#@gems_to_install.merge!(split(gems))
|
46
60
|
check_gems
|
47
61
|
end
|
48
62
|
|
49
63
|
|
50
64
|
def remove(gems)
|
51
|
-
gems.collect { |g| @gems_to_install.delete(g) }
|
65
|
+
#gems.collect { |g| @gems_to_install.delete(g) }
|
52
66
|
check_gems
|
53
67
|
end
|
54
|
-
|
55
|
-
def install(gem_name,gem_version)
|
56
|
-
begin
|
57
|
-
#RubyGems DependencyInstaller installs all dependencies, and the gem, woot!
|
58
|
-
dep_inst = Gem::DependencyInstaller.new(gem_name,gem_version,{:install_dir => @install_dir})
|
59
|
-
rescue Exception => e
|
60
|
-
#Invalid Gem Name / Version
|
61
|
-
@failed_gems[gem_name] = "Bad gem name or version #{gem_name} #{gem_version}"
|
62
|
-
return false
|
63
|
-
end
|
64
68
|
|
65
|
-
#Determine what dependencies are missing
|
66
|
-
dep_inst.gather_dependencies
|
67
|
-
|
68
|
-
begin
|
69
|
-
#Install the dependencies and the gem
|
70
|
-
dep_inst.install
|
71
|
-
|
72
|
-
#Add list of installed gems to @installed_gems
|
73
|
-
@installed_gems.push(*dep_inst.installed_gems)
|
74
|
-
|
75
|
-
#Remove any isntalled gems from failed list
|
76
|
-
dep_inst.installed_gems.each do |gem|
|
77
|
-
@failed_gems.delete(gem.name) if @failed_gems.has_key?(gem.name)
|
78
|
-
end
|
79
|
-
|
80
|
-
#Update the local gem cache
|
81
|
-
Gem::cache.refresh!
|
82
|
-
|
83
|
-
#Update missing gems
|
84
|
-
check_gems
|
85
|
-
return true
|
86
|
-
rescue Errno::EACCES => e
|
87
|
-
@failed_gems[gem_name] = "Invalid permissions . . . try running w/ su"
|
88
|
-
rescue Gem::FilePermissionError => e
|
89
|
-
@failed_gems[gem_name] = "Invalid permissions . . . try running w/ su"
|
90
|
-
rescue Exception => e
|
91
|
-
@failed_gems[gem_name] = e.message
|
92
|
-
end
|
93
|
-
|
94
|
-
return false
|
95
|
-
end
|
96
69
|
|
97
|
-
|
98
|
-
|
99
|
-
|
70
|
+
#Loop over candidate gems, install each
|
71
|
+
def install_all!
|
72
|
+
self.each do |c_gem|
|
73
|
+
install(c_gem) if c_gem.status != :installed
|
100
74
|
end
|
101
|
-
|
102
|
-
return @failed_gems.length == 0
|
103
75
|
end
|
104
76
|
|
105
77
|
|
@@ -172,6 +144,50 @@ module RippleNetworks
|
|
172
144
|
|
173
145
|
|
174
146
|
private
|
147
|
+
|
148
|
+
#Install a candidate gem
|
149
|
+
def install(c_gem)
|
150
|
+
begin
|
151
|
+
#RubyGems DependencyInstaller installs all dependencies, and the gem, woot!
|
152
|
+
dep_inst = Gem::DependencyInstaller.new(c_gem.name,c_gem.version,{:install_dir => Gem.path.first})
|
153
|
+
rescue Gem::GemNotFoundException => e
|
154
|
+
#Invalid Gem Name / Version
|
155
|
+
c_gem.status = :invalid
|
156
|
+
c_gem.details = "Invalid gem name or version #{c_gem.name} #{c_gem.version}"
|
157
|
+
return false
|
158
|
+
end
|
159
|
+
|
160
|
+
#Determine what dependencies are missing
|
161
|
+
dep_inst.gather_dependencies
|
162
|
+
|
163
|
+
begin
|
164
|
+
#Install the dependencies and the gem
|
165
|
+
dep_inst.install
|
166
|
+
|
167
|
+
#add dependency details to gem
|
168
|
+
c_gem.details = "Installed Dependencies: " << dep_inst.installed_gems.collect { |d_gem| d_gem.name }.join(",")
|
169
|
+
|
170
|
+
#Update the local gem cache
|
171
|
+
Gem::cache.refresh!
|
172
|
+
|
173
|
+
#Update missing gems
|
174
|
+
check_gems
|
175
|
+
return true
|
176
|
+
rescue Errno::EACCES => e
|
177
|
+
c_gem.status = :failed
|
178
|
+
c_gem.details = "Invalid permissions . . . try running w/ su"
|
179
|
+
rescue Gem::FilePermissionError => e
|
180
|
+
c_gem.status = :failed
|
181
|
+
c_gem.details = "Invalid permissions . . . try running w/ su"
|
182
|
+
rescue Exception => e
|
183
|
+
c_gem.status = :failed
|
184
|
+
c_gem.details = e.message
|
185
|
+
end
|
186
|
+
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
|
190
|
+
|
175
191
|
=begin rdoc
|
176
192
|
*Name*:: check_gems
|
177
193
|
*Access*:: private
|
@@ -179,14 +195,11 @@ module RippleNetworks
|
|
179
195
|
*Last_Edited*:: Tue Feb 19 15:09:00 PST 2008
|
180
196
|
=end
|
181
197
|
def check_gems
|
182
|
-
|
183
|
-
|
184
|
-
@gems_to_install.each do |gem_name,gem_version|
|
185
|
-
gem_info = installed?(gem_name,gem_version)
|
198
|
+
self.each do |c_gem|
|
199
|
+
gem_info = installed?(c_gem.name,c_gem.version)
|
186
200
|
if gem_info[:installed]
|
187
|
-
|
188
|
-
|
189
|
-
@missing_gems[gem_name] = gem_version
|
201
|
+
c_gem.status = :installed
|
202
|
+
c_gem.details = gem_info[:info]
|
190
203
|
end
|
191
204
|
end
|
192
205
|
end
|
data/lib/warning_shot/version.rb
CHANGED
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>warning_shot</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/warning_shot"; return false'>
|
35
35
|
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/warning_shot" class="numbers">0.9.
|
36
|
+
<a href="http://rubyforge.org/projects/warning_shot" class="numbers">0.9.2</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ ‘warning_shot’</h1>
|
39
39
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: warning-shot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cory O'Daniel
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-03-
|
12
|
+
date: 2008-03-13 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|