deproll 0.0.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.
- data/Manifest +7 -0
- data/README +7 -0
- data/Rakefile +12 -0
- data/bin/deproll +5 -0
- data/deproll.gemspec +32 -0
- data/labs/format.txt +9 -0
- data/labs/installed_gems.rb +104 -0
- data/lib/deproll.rb +224 -0
- metadata +69 -0
data/Manifest
ADDED
data/README
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
Public repo for the Rails Rubmle at RubyEnRails 2009, Amsterdam
|
2
|
+
|
3
|
+
Contenders: Iain Hecker (@iain_nl) and Marcel de Graaf (@marceldegraaf)
|
4
|
+
|
5
|
+
To use: run 'deproll' from any Rails directory.
|
6
|
+
|
7
|
+
Our other work is in a fork of Webistrano, see http://github.com/thyraon/webistrano
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('deproll', '0.0.1') do |p|
|
6
|
+
p.description = "Integration Gem Managment and Webistrano"
|
7
|
+
p.url = "http://github.com/Thyraon/rer09"
|
8
|
+
p.author = "Iain Hecker"
|
9
|
+
p.email = "iain@iain.nl"
|
10
|
+
p.ignore_pattern = [ "tmp/*", "script/*" ]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
data/bin/deproll
ADDED
data/deproll.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{deproll}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Iain Hecker"]
|
9
|
+
s.date = %q{2009-10-31}
|
10
|
+
s.default_executable = %q{deproll}
|
11
|
+
s.description = %q{Integration Gem Managment and Webistrano}
|
12
|
+
s.email = %q{iain@iain.nl}
|
13
|
+
s.executables = ["deproll"]
|
14
|
+
s.extra_rdoc_files = ["README", "bin/deproll", "lib/deproll.rb"]
|
15
|
+
s.files = ["Manifest", "README", "Rakefile", "bin/deproll", "labs/format.txt", "labs/installed_gems.rb", "lib/deproll.rb", "deproll.gemspec"]
|
16
|
+
s.homepage = %q{http://github.com/Thyraon/rer09}
|
17
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Deproll", "--main", "README"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{deproll}
|
20
|
+
s.rubygems_version = %q{1.3.5}
|
21
|
+
s.summary = %q{Integration Gem Managment and Webistrano}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
data/labs/format.txt
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
if File.exist?('./Rakefile')
|
2
|
+
eval(File.read('./Rakefile'))
|
3
|
+
else
|
4
|
+
raise 'You must run this script in a Rails directory!'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rubygems/command'
|
8
|
+
require 'rubygems/commands/update_command'
|
9
|
+
|
10
|
+
class InstalledGem
|
11
|
+
attr_accessor :name, :version, :dependencies
|
12
|
+
|
13
|
+
def initialize(gemspec)
|
14
|
+
gemspec = gemspec.last
|
15
|
+
@name = gemspec.name
|
16
|
+
@version = gemspec.version
|
17
|
+
@dependencies = gemspec.requirements.collect(&:first) #returns the name of a gem, e.g. 'fastthread' for Passenger
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class ProjectGem
|
22
|
+
attr_reader :name, :source, :lib, :latest_version, :version
|
23
|
+
def initialize(gemspec)
|
24
|
+
@name = gemspec.name
|
25
|
+
@source = gemspec.source
|
26
|
+
@lib = gemspec.lib
|
27
|
+
end
|
28
|
+
|
29
|
+
def updateable?
|
30
|
+
return false if available_versions.empty?
|
31
|
+
latest_version > vendored_version
|
32
|
+
end
|
33
|
+
|
34
|
+
def vendored_version
|
35
|
+
@version = (installed? ? installed_version : '0')
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
if installed?
|
40
|
+
"#{name} is #{version}, can be updated to #{latest_version}"
|
41
|
+
else
|
42
|
+
"#{name} is not yet installed. Version #{latest_version} is available."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def dependency
|
49
|
+
@dependency ||= Gem::Dependency.new(name, "> #{vendored_version}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetcher
|
53
|
+
@fetcher ||= Gem::SpecFetcher.fetcher
|
54
|
+
end
|
55
|
+
|
56
|
+
def available_versions
|
57
|
+
@available_versions ||= fetcher.find_matching(dependency).map(&:flatten).map(&:second).map(&:version)
|
58
|
+
end
|
59
|
+
|
60
|
+
def latest_version
|
61
|
+
@latest_version = available_versions.last
|
62
|
+
end
|
63
|
+
|
64
|
+
def installed?
|
65
|
+
vendored_gem.empty? ? false : true
|
66
|
+
end
|
67
|
+
|
68
|
+
def installed_version
|
69
|
+
@version = vendored_gem.first.split('-').last
|
70
|
+
end
|
71
|
+
|
72
|
+
def vendored_gem
|
73
|
+
@vendored_gem ||= Dir.new('./vendor/gems').entries.select{|gem| gem =~ /#{name}/}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class System
|
78
|
+
def self.gems
|
79
|
+
Gem.source_index.collect do |gemspec|
|
80
|
+
InstalledGem.new(gemspec)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class Project
|
86
|
+
def self.gems
|
87
|
+
$gems_rake_task = true
|
88
|
+
require 'rubygems/gem_runner'
|
89
|
+
Rake::Task[:environment].invoke
|
90
|
+
Rails.configuration.gems.collect{|gemspec| ProjectGem.new(gemspec)}.flatten
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.updateable_gems
|
94
|
+
gems.select(&:updateable?)
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.marshalled_gems
|
98
|
+
Marshal.dump(gems)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
#puts Project.marshalled_gems
|
104
|
+
puts Project.updateable_gems
|
data/lib/deproll.rb
ADDED
@@ -0,0 +1,224 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/command'
|
3
|
+
require 'rubygems/commands/update_command'
|
4
|
+
require 'httparty'
|
5
|
+
|
6
|
+
module Deproll
|
7
|
+
|
8
|
+
def self.scan(dir)
|
9
|
+
$deproll_dir = dir
|
10
|
+
gems = RailsEnvironment.new.updateable_gems
|
11
|
+
puts gems
|
12
|
+
puts "Sending to Webistrano..."
|
13
|
+
Post.new(gems).post
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
class Post
|
18
|
+
|
19
|
+
attr_reader :gems
|
20
|
+
|
21
|
+
include HTTParty
|
22
|
+
base_uri 'webistrano.local' # sorry hardcoded yet
|
23
|
+
|
24
|
+
def initialize(gems)
|
25
|
+
@gems = gems
|
26
|
+
end
|
27
|
+
|
28
|
+
def post
|
29
|
+
puts options.inspect
|
30
|
+
self.class.post('/projects/1/stages/1/dependencies', :query => options) # again hard coded
|
31
|
+
end
|
32
|
+
|
33
|
+
def dependencies
|
34
|
+
gems.map(&:to_hash)
|
35
|
+
end
|
36
|
+
|
37
|
+
def options
|
38
|
+
{ :dependencies => dependencies }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
module Helper
|
44
|
+
|
45
|
+
def file(*segments)
|
46
|
+
File.join(*[$deproll_dir] << segments)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
class InstalledGem
|
52
|
+
|
53
|
+
attr_accessor :gemspec
|
54
|
+
|
55
|
+
def initialize(gemspec)
|
56
|
+
@gemspec = gemspec.last
|
57
|
+
end
|
58
|
+
|
59
|
+
def dependencies
|
60
|
+
requirements.collect(&:first) #returns the name of a gem, e.g. 'fastthread' for Passenger
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_missing(method, *args, &block)
|
64
|
+
if gemspec.respond_to?(method)
|
65
|
+
gemspec.send(method, *args, &block)
|
66
|
+
else
|
67
|
+
super
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
class ProjectGem
|
74
|
+
|
75
|
+
include Helper
|
76
|
+
|
77
|
+
attr_reader :gemspec
|
78
|
+
|
79
|
+
def initialize(gemspec)
|
80
|
+
@gemspec = gemspec
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_hash
|
84
|
+
{ :name => name.to_s,
|
85
|
+
:current_version => version.to_s,
|
86
|
+
:available_version => latest_version.to_s,
|
87
|
+
:source => source.to_s,
|
88
|
+
:lib => lib.to_s,
|
89
|
+
:requirement => requirement.to_s }
|
90
|
+
end
|
91
|
+
|
92
|
+
def requirement
|
93
|
+
gemspec.requirement
|
94
|
+
end
|
95
|
+
|
96
|
+
def name
|
97
|
+
gemspec.name
|
98
|
+
end
|
99
|
+
|
100
|
+
def source
|
101
|
+
gemspec.source || Gem.sources.first
|
102
|
+
end
|
103
|
+
|
104
|
+
def lib
|
105
|
+
gemspec.lib
|
106
|
+
end
|
107
|
+
|
108
|
+
def updateable?
|
109
|
+
return false if available_versions.empty?
|
110
|
+
latest_version > version
|
111
|
+
end
|
112
|
+
|
113
|
+
def to_s
|
114
|
+
case
|
115
|
+
when vendored? then "#{name} is #{version} (vendored), can be updated to #{latest_version} from #{source}"
|
116
|
+
when installed? then "#{name} is #{version} (installed), can be updated to #{latest_version} from #{source}"
|
117
|
+
else
|
118
|
+
"#{name} is not yet installed. Version #{latest_version} is available on #{source}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def version
|
123
|
+
case
|
124
|
+
when vendored? then vendored_version
|
125
|
+
when installed? then installed_version
|
126
|
+
else
|
127
|
+
'0'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def dependency
|
134
|
+
@dependency ||= Gem::Dependency.new(name, "> #{version}")
|
135
|
+
end
|
136
|
+
|
137
|
+
def fetcher
|
138
|
+
@fetcher ||= Gem::SpecFetcher.fetcher
|
139
|
+
end
|
140
|
+
|
141
|
+
def available_versions
|
142
|
+
@available_versions ||= fetcher.find_matching(dependency).map(&:flatten).map(&:second).map(&:version)
|
143
|
+
end
|
144
|
+
|
145
|
+
def latest_version
|
146
|
+
@latest_version = available_versions.last
|
147
|
+
end
|
148
|
+
|
149
|
+
def installed?
|
150
|
+
installed_versions.any?
|
151
|
+
end
|
152
|
+
|
153
|
+
def installed_version
|
154
|
+
installed_versions.last.last.version.version
|
155
|
+
end
|
156
|
+
|
157
|
+
def vendored?
|
158
|
+
!vendored_gem.empty?
|
159
|
+
end
|
160
|
+
|
161
|
+
def vendored_version
|
162
|
+
vendored_gem.first.split('-').last
|
163
|
+
end
|
164
|
+
|
165
|
+
def vendored_gem
|
166
|
+
@vendored_gem ||= Dir.new(vendor_directory).entries.select{|gem| gem =~ /\A#{name}-[\w|.]+\z/}
|
167
|
+
end
|
168
|
+
|
169
|
+
def vendor_directory
|
170
|
+
file("vendor", "gems")
|
171
|
+
end
|
172
|
+
|
173
|
+
def installed_versions
|
174
|
+
@installed_gems ||= Gem.source_index.select{|gem| gem.last.name == name}
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
class RailsEnvironment
|
180
|
+
|
181
|
+
include Helper
|
182
|
+
|
183
|
+
def rails?
|
184
|
+
File.exist?(file("config", "environment.rb"))
|
185
|
+
end
|
186
|
+
|
187
|
+
def rakefile
|
188
|
+
file("Rakefile")
|
189
|
+
end
|
190
|
+
|
191
|
+
def rakefile?
|
192
|
+
File.exist?(rakefile)
|
193
|
+
end
|
194
|
+
|
195
|
+
def load_rails
|
196
|
+
puts "Loading Rails..."
|
197
|
+
eval(File.read(rakefile))
|
198
|
+
$gems_rake_task = true
|
199
|
+
require 'rubygems/gem_runner'
|
200
|
+
Rake::Task[:environment].invoke
|
201
|
+
end
|
202
|
+
|
203
|
+
def gems
|
204
|
+
gemspecs.map { |gemspec| ProjectGem.new(gemspec) }.flatten
|
205
|
+
end
|
206
|
+
|
207
|
+
def dependencies(gem)
|
208
|
+
([gem] + gem.dependencies.map { |dp| dependencies(dp) }.flatten).flatten
|
209
|
+
end
|
210
|
+
|
211
|
+
def gemspecs
|
212
|
+
Rails.configuration.gems.map do |gem|
|
213
|
+
[gem] + dependencies(gem)
|
214
|
+
end.flatten.uniq
|
215
|
+
end
|
216
|
+
|
217
|
+
def updateable_gems
|
218
|
+
load_rails if rails?
|
219
|
+
gems.select(&:updateable?)
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: deproll
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Iain Hecker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-31 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Integration Gem Managment and Webistrano
|
17
|
+
email: iain@iain.nl
|
18
|
+
executables:
|
19
|
+
- deproll
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
- bin/deproll
|
25
|
+
- lib/deproll.rb
|
26
|
+
files:
|
27
|
+
- Manifest
|
28
|
+
- README
|
29
|
+
- Rakefile
|
30
|
+
- bin/deproll
|
31
|
+
- labs/format.txt
|
32
|
+
- labs/installed_gems.rb
|
33
|
+
- lib/deproll.rb
|
34
|
+
- deproll.gemspec
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: http://github.com/Thyraon/rer09
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options:
|
41
|
+
- --line-numbers
|
42
|
+
- --inline-source
|
43
|
+
- --title
|
44
|
+
- Deproll
|
45
|
+
- --main
|
46
|
+
- README
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "1.2"
|
60
|
+
version:
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project: deproll
|
64
|
+
rubygems_version: 1.3.5
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Integration Gem Managment and Webistrano
|
68
|
+
test_files: []
|
69
|
+
|