plugems_deploy 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +5 -0
- data/bin/plugem +7 -0
- data/config/manifest.yml +7 -0
- data/lib/plugems_deploy/capistrano.rb +27 -0
- data/lib/plugems_deploy/cli.rb +128 -0
- data/lib/plugems_deploy/dependency_handler.rb +88 -0
- data/lib/plugems_deploy/gem_service.rb +47 -0
- data/lib/plugems_deploy/manifest.rb +57 -0
- data/recipes/build.rb +119 -0
- data/recipes/configuration.rb +16 -0
- metadata +68 -0
data/README
ADDED
data/bin/plugem
ADDED
data/config/manifest.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Capistrano
|
2
|
+
class Configuration
|
3
|
+
alias :standard_cap_load :load
|
4
|
+
def load(*args, &block)
|
5
|
+
# we always call the original load
|
6
|
+
standard_cap_load(*args, &block)
|
7
|
+
|
8
|
+
# if this happens to be 'config.load "standard"' coming from the CLI, we hook in after
|
9
|
+
# and load all our own recipes before system/dot preferences... if capistrano changes how
|
10
|
+
# they load their "default" recipes, this will probably break
|
11
|
+
if args == ["standard"]
|
12
|
+
load_plugem_deploy_recipes(File.dirname(__FILE__) + '/../..')
|
13
|
+
begin
|
14
|
+
require 'plugems_deploy_ext'
|
15
|
+
load_plugem_deploy_recipes(PLUGEMS_DEPLOY_EXT_DIR) # Overriding from extensions
|
16
|
+
rescue Exception
|
17
|
+
# No extension is loaded
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_plugem_deploy_recipes(dir)
|
23
|
+
Dir[File.join(dir, 'recipes', '*')].each { |f| standard_cap_load(f) }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module PlugemsDeploy
|
2
|
+
class Cli
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'capistrano/cli'
|
6
|
+
require 'plugems_deploy/capistrano'
|
7
|
+
|
8
|
+
def self.execute!
|
9
|
+
new.execute!
|
10
|
+
end
|
11
|
+
|
12
|
+
# The array of (unparsed) command-line options
|
13
|
+
attr_reader :args
|
14
|
+
|
15
|
+
# The hash of (parsed) command-line options
|
16
|
+
attr_reader :options
|
17
|
+
|
18
|
+
def initialize(args = ARGV)
|
19
|
+
@args = args
|
20
|
+
@options = { :version => '> 0.0', :deps_only => false, :debug => false }
|
21
|
+
|
22
|
+
OptionParser.new do |opts|
|
23
|
+
opts.banner = "Usage: #{$0} [options] ACTION ARGS"
|
24
|
+
|
25
|
+
opts.separator ""
|
26
|
+
opts.separator "Options -----------------------"
|
27
|
+
opts.separator ""
|
28
|
+
|
29
|
+
opts.on("-v", "--version VERSION",
|
30
|
+
"The gem version to use. Any valid gem spec",
|
31
|
+
"version expression can be specified."
|
32
|
+
) { |value| @options[:version] = value }
|
33
|
+
|
34
|
+
opts.on("-o", "--only-dependencies",
|
35
|
+
"Update only gem dependencies but not itself."
|
36
|
+
) { @options[:deps_only] = true }
|
37
|
+
|
38
|
+
opts.on("-d", "--debug",
|
39
|
+
"Prints some additional debug information."
|
40
|
+
) { @options[:debug] = true }
|
41
|
+
|
42
|
+
opts.on("-h", "--help", "Display this help message") do
|
43
|
+
puts opts
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.separator ""
|
48
|
+
opts.separator "Actions -----------------------"
|
49
|
+
opts.separator ""
|
50
|
+
opts.separator <<-DETAILS.split(/\n/)
|
51
|
+
push -- pushes gems to the base gem server
|
52
|
+
publish -- builds a gem from the current directory and pushes it to the base gem server
|
53
|
+
build -- builds a gem from the current directory
|
54
|
+
update -- updates gems from the local gem server
|
55
|
+
get -- updates gems from the local gem server for dependencies defined in config/manifest.yml
|
56
|
+
DETAILS
|
57
|
+
|
58
|
+
if args.empty?
|
59
|
+
$stderr.puts opts
|
60
|
+
exit(-1)
|
61
|
+
else
|
62
|
+
opts.parse!(args)
|
63
|
+
@opts = opts
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
if args.size < 1
|
68
|
+
$stderr.puts @opts
|
69
|
+
exit(-1)
|
70
|
+
end
|
71
|
+
|
72
|
+
@options[:action] = args.shift
|
73
|
+
@options[:name] = args.shift
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
def execute!
|
78
|
+
begin
|
79
|
+
process_aliases
|
80
|
+
validate_arguments
|
81
|
+
rescue => ex
|
82
|
+
puts "Invalid arguments: #{ ex }"
|
83
|
+
exit(-1)
|
84
|
+
end
|
85
|
+
begin
|
86
|
+
Capistrano::CLI.new(converted_arguments).execute!
|
87
|
+
rescue Exception => ex
|
88
|
+
if @options[:debug]
|
89
|
+
raise
|
90
|
+
else
|
91
|
+
puts "Failed to execute: #{ ex }"
|
92
|
+
exit(-1)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def validate_arguments
|
101
|
+
|
102
|
+
case
|
103
|
+
when ['push', 'update'].include?(@options[:action]) && @options[:name].nil? then
|
104
|
+
fail "You need to specify the name of the plugem to #{ @options[:action] }"
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
def process_aliases
|
110
|
+
case @options[:action]
|
111
|
+
when 'up' then @options[:action] = 'update'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def converted_arguments
|
116
|
+
|
117
|
+
args = [ "plugem_#{ @options.delete(:action) }" ]
|
118
|
+
|
119
|
+
@options.each do |k, v|
|
120
|
+
args << "-s" << "plugem_#{ k }=#{ v }"
|
121
|
+
end
|
122
|
+
|
123
|
+
args
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module PlugemsDeploy
|
2
|
+
class DependencyHandler
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'yaml'
|
6
|
+
require 'plugems_deploy/gem_service'
|
7
|
+
|
8
|
+
MAX_DEPENDENCY_DEPTH = 10000
|
9
|
+
|
10
|
+
def initialize(source = local_cache)
|
11
|
+
@gems = []
|
12
|
+
@source = source
|
13
|
+
end
|
14
|
+
|
15
|
+
def dependencies(name, version, deps_only = false, show = false)
|
16
|
+
|
17
|
+
gem = gem_data(query_gem_spec(name, version))
|
18
|
+
|
19
|
+
mark_dependency(gem) unless deps_only == 'true'
|
20
|
+
collect_dependencies(gem, show)
|
21
|
+
|
22
|
+
compacted_collected_dependencies
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def collect_dependencies(start_point, show)
|
27
|
+
|
28
|
+
fail("Circular dependencies?\n#{ @gems.to_yaml }") if @gems.size > MAX_DEPENDENCY_DEPTH
|
29
|
+
|
30
|
+
show_data("#{ start_point[:name] }: [ ", show)
|
31
|
+
query_dependencies(start_point).each do |gem|
|
32
|
+
mark_dependency(gem)
|
33
|
+
show_data(" { #{ gem[:name] } => #{ gem[:version] } }", show)
|
34
|
+
collect_dependencies(gem, show && (show + 4))
|
35
|
+
end
|
36
|
+
show_data("]", show)
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def query_dependencies(gem)
|
44
|
+
query_gem_spec(gem[:name], gem[:version]).dependencies.collect do |dependency|
|
45
|
+
spec = query_gem_spec(dependency.name, dependency.version_requirements.to_s)
|
46
|
+
gem_data(spec)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def gem_data(spec)
|
51
|
+
{
|
52
|
+
:name => spec.name,
|
53
|
+
:version => spec.version.to_s,
|
54
|
+
:homepage => spec.homepage,
|
55
|
+
:authors => spec.authors,
|
56
|
+
:download_source => spec.download_source
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def mark_dependency(gem)
|
61
|
+
@gems.unshift(gem)
|
62
|
+
end
|
63
|
+
|
64
|
+
def marked?(gem)
|
65
|
+
@gems.any? { |marked| marked[:name] == gem[:name] }
|
66
|
+
end
|
67
|
+
|
68
|
+
def compacted_collected_dependencies
|
69
|
+
@gems.inject([]) do |dependencies, gem|
|
70
|
+
dependencies << gem unless dependencies.include?(gem)
|
71
|
+
dependencies
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def query_gem_spec(name, version)
|
76
|
+
@source.find_gem(name, version) || fail("No gem found for ['#{ name }', '#{ version }']")
|
77
|
+
end
|
78
|
+
|
79
|
+
def local_cache
|
80
|
+
GemService.new
|
81
|
+
end
|
82
|
+
|
83
|
+
def show_data(data, show)
|
84
|
+
puts " " * show + data if show
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module PlugemsDeploy
|
2
|
+
class GemService
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'yaml'
|
6
|
+
require 'rubygems/remote_installer'
|
7
|
+
|
8
|
+
def initialize(sources = [ cache ])
|
9
|
+
@sources = sources
|
10
|
+
@indexes = { cache => Gem.cache }
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_gem(name, version)
|
14
|
+
|
15
|
+
@sources.each do |source|
|
16
|
+
specs = index(source).search(/^#{ name }$/, version)
|
17
|
+
return spec_with_source(specs.last, source) unless specs.empty?
|
18
|
+
end
|
19
|
+
|
20
|
+
nil
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
LATEST_RUBYGEMS = Gem::RubyGemsVersion.split('.').map{|v|v.to_i}.extend(Comparable) > [0,9,0]
|
27
|
+
|
28
|
+
def cache
|
29
|
+
'cache'
|
30
|
+
end
|
31
|
+
|
32
|
+
def index(source)
|
33
|
+
@indexes[source] ||= source_index(source)
|
34
|
+
end
|
35
|
+
|
36
|
+
def spec_with_source(spec, source)
|
37
|
+
spec.class.send(:attr_accessor, :download_source)
|
38
|
+
spec.download_source = source
|
39
|
+
spec
|
40
|
+
end
|
41
|
+
|
42
|
+
def source_index(source)
|
43
|
+
LATEST_RUBYGEMS ? Gem::SourceIndex.new.update(source) : Gem::RemoteSourceFetcher.new(source, nil).source_index
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'erb'
|
3
|
+
module PlugemsDeploy
|
4
|
+
class Manifest
|
5
|
+
|
6
|
+
attr_accessor :manifest
|
7
|
+
|
8
|
+
[:name, :version, :description, :author, :executables].each do |property|
|
9
|
+
define_method(property) { manifest[property] }
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(file_name = nil)
|
13
|
+
begin
|
14
|
+
@manifest = load_file(file_name || self.class.manifest_file)
|
15
|
+
rescue Exception => e
|
16
|
+
puts "#{e}. Manifest file is not set? (via Plugems::Manifest.manifest_file =)"
|
17
|
+
puts e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def dependencies
|
22
|
+
manifest[:dependencies] || []
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
|
27
|
+
@@manifest_file = nil
|
28
|
+
|
29
|
+
def manifest_file
|
30
|
+
@@manifest_file || default_manifest_file
|
31
|
+
end
|
32
|
+
|
33
|
+
def load(file_name)
|
34
|
+
new(file_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def default_manifest_file
|
38
|
+
"config/manifest.yml"
|
39
|
+
end
|
40
|
+
|
41
|
+
def manifest_file=(file)
|
42
|
+
@@manifest_file = file
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
extend ClassMethods
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def load_file(file)
|
52
|
+
YAML.load(ERB.new(IO.read(file)).result)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/recipes/build.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'plugems_deploy/manifest'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module PlugemsDeployBuild
|
7
|
+
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
def gem_version
|
11
|
+
version_specified? ? plugem_version : get_gem_version
|
12
|
+
end
|
13
|
+
|
14
|
+
def version_specified?
|
15
|
+
! (plugem_version.empty? || (plugem_version == '> 0.0'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_gem_version
|
19
|
+
micro = gem_micro_revision || @manifest.version[2] || 0
|
20
|
+
ver = (@manifest.version + [0,0])[0..1].join('.')
|
21
|
+
"#{ ver }.#{ micro }"
|
22
|
+
end
|
23
|
+
|
24
|
+
def gem_homepage
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def gem_author
|
29
|
+
@manifest.author
|
30
|
+
end
|
31
|
+
|
32
|
+
def gem_requirements
|
33
|
+
[ 'none' ]
|
34
|
+
end
|
35
|
+
|
36
|
+
def gem_require_path
|
37
|
+
'lib'
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_gem_dependencies(s)
|
41
|
+
@manifest.dependencies.each do |name,version|
|
42
|
+
s.add_dependency(name, version || '>= 0.0.0') unless package_ignored_gems.include?(name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def gem_files
|
47
|
+
Dir["**/*"].reject { |f| f == 'test' }
|
48
|
+
end
|
49
|
+
|
50
|
+
def gem_test_files
|
51
|
+
Dir['test/**/*_test.rb']
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_auto_require(s)
|
55
|
+
s.autorequire = plugem_name if File.exist?("lib/#{plugem_name}.rb")
|
56
|
+
end
|
57
|
+
|
58
|
+
def plugem_name
|
59
|
+
@manifest.name
|
60
|
+
end
|
61
|
+
|
62
|
+
def gem_spec
|
63
|
+
|
64
|
+
@manifest = PlugemsDeploy::Manifest.new
|
65
|
+
|
66
|
+
spec = Gem::Specification.new do |s|
|
67
|
+
|
68
|
+
s.platform = Gem::Platform::RUBY
|
69
|
+
s.summary = @manifest.description
|
70
|
+
s.name = plugem_name
|
71
|
+
s.version = gem_version
|
72
|
+
s.homepage = gem_homepage if gem_homepage
|
73
|
+
|
74
|
+
s.author = gem_author
|
75
|
+
s.requirements = gem_requirements
|
76
|
+
s.require_path = gem_require_path
|
77
|
+
|
78
|
+
s.files = gem_files
|
79
|
+
s.test_files = gem_test_files
|
80
|
+
s.description = @manifest.description
|
81
|
+
|
82
|
+
s.executables = @manifest.executables
|
83
|
+
|
84
|
+
add_auto_require(s)
|
85
|
+
|
86
|
+
add_gem_dependencies(s)
|
87
|
+
|
88
|
+
finalize_gem_spec(s)
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def finalize_gem_spec(s)
|
95
|
+
# Use this method to add/overwrite any spec attributes
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
# Allows to have some gem depdencies used at the run time only but not at the packaging time
|
101
|
+
set :package_ignored_gems, []
|
102
|
+
|
103
|
+
# Allows to define the micro revision from the external recipe file
|
104
|
+
set :gem_micro_revision, nil
|
105
|
+
|
106
|
+
desc 'Builds a gem package locally'
|
107
|
+
task :plugem_build do
|
108
|
+
|
109
|
+
self.class.send(:include, PlugemsDeployBuild)
|
110
|
+
|
111
|
+
rm_rf('pkg')
|
112
|
+
|
113
|
+
Rake::GemPackageTask.new(gem_spec) do |pkg|
|
114
|
+
additional_gem_packaging_tasks(pkg) if self.class.method_defined?(:additional_gem_packaging_tasks)
|
115
|
+
end
|
116
|
+
|
117
|
+
Rake::Task['package'].invoke
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
# require 'erb'
|
3
|
+
|
4
|
+
def cfg_dir
|
5
|
+
File.join(File.dirname(__FILE__), '../config')
|
6
|
+
end
|
7
|
+
|
8
|
+
# Should be defined in projects
|
9
|
+
set :gem_servers, lambda { fail("No gem servers are defined. Set :gem_servers to an array of your gem servers") }
|
10
|
+
|
11
|
+
def local_gem_servers
|
12
|
+
gem_servers
|
13
|
+
end
|
14
|
+
|
15
|
+
# Force sudo usage for installing missing gems instead of running 'sudo plugem'
|
16
|
+
set :force_sudo_for_plugem, false
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.2
|
3
|
+
specification_version: 1
|
4
|
+
name: plugems_deploy
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2007-05-03 00:00:00 -04:00
|
8
|
+
summary: Plugems deployment scripts
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email:
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description: Plugems deployment scripts
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
-
|
31
|
+
files:
|
32
|
+
- bin
|
33
|
+
- config
|
34
|
+
- lib
|
35
|
+
- README
|
36
|
+
- recipes
|
37
|
+
- bin/plugem
|
38
|
+
- config/manifest.yml
|
39
|
+
- lib/plugems_deploy
|
40
|
+
- lib/plugems_deploy/capistrano.rb
|
41
|
+
- lib/plugems_deploy/cli.rb
|
42
|
+
- lib/plugems_deploy/dependency_handler.rb
|
43
|
+
- lib/plugems_deploy/gem_service.rb
|
44
|
+
- lib/plugems_deploy/manifest.rb
|
45
|
+
- recipes/build.rb
|
46
|
+
- recipes/configuration.rb
|
47
|
+
test_files: []
|
48
|
+
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
extra_rdoc_files: []
|
52
|
+
|
53
|
+
executables:
|
54
|
+
- plugem
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
requirements:
|
58
|
+
- none
|
59
|
+
dependencies:
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: capistrano
|
62
|
+
version_requirement:
|
63
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "1.0"
|
68
|
+
version:
|