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.
@@ -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
+