plugems_deploy 0.1.0
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/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:
|