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 ADDED
@@ -0,0 +1,5 @@
1
+ Provides capistrano recipes for managing plugems.
2
+
3
+ The recipes can be overriden in standard capistrano files (i.e. ~/.caprc, config/deploy.rb, etc) or in a plugems_deploy_ext gem.
4
+
5
+
data/bin/plugem ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'capistrano'
4
+
5
+ require 'plugems_deploy/cli'
6
+
7
+ PlugemsDeploy::Cli.execute!
@@ -0,0 +1,7 @@
1
+ :version: [0, 1, 0]
2
+ :name: "plugems_deploy"
3
+ :description: "Plugems deployment scripts"
4
+ :executables: [ 'plugem' ]
5
+ :dependencies:
6
+ - ['capistrano', '~> 1.0']
7
+
@@ -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: