deproll 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ Manifest
2
+ README
3
+ Rakefile
4
+ bin/deproll
5
+ labs/format.txt
6
+ labs/installed_gems.rb
7
+ lib/deproll.rb
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
@@ -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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/deproll'
4
+
5
+ Deproll.scan(File.expand_path('.'))
@@ -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
@@ -0,0 +1,9 @@
1
+ Dependency:
2
+ name (string) # e.g. 'mislav-will_paginate'
3
+ current_version (string)
4
+ available_version (string)
5
+ source (string)
6
+ lib (string)
7
+ requirement (string) # e.g. '>= 0.2.3'
8
+ stage_id (integer)
9
+
@@ -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
@@ -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
+