plugems_deploy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: