metacon 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -49,3 +49,9 @@ task :default => :test
49
49
 
50
50
  require 'yard'
51
51
  YARD::Rake::YardocTask.new
52
+
53
+ desc 'For testing binaries in development'
54
+ task :local_bin do
55
+ sh 'rm -f /usr/local/bin/metacon'
56
+ sh "ln -s #{File.dirname(File.expand_path(__FILE__))}/bin/metacon /usr/local/bin/metacon"
57
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
data/bin/metacon CHANGED
@@ -5,11 +5,12 @@
5
5
  # TODO: Not finding .metacon_unwrapped properly when symlinked! (true-absolute __FILE__ before dirname etc.)
6
6
  # TODO: Make sure full environment is set up- not just rvm installed
7
7
  #
8
-
8
+ require 'pathname'
9
9
  rvm_path = File.expand_path("~/.rvm/scripts/rvm")
10
10
  if File.exists?(rvm_path)
11
11
  require 'shellwords'
12
- cmd = Shellwords.shellescape(File.join(File.dirname(File.realdirpath(__FILE__)), '.metacon_unwrapped'))
12
+ cmd = Shellwords.shellescape(
13
+ File.join(File.dirname(Pathname.new(__FILE__).realpath.to_s), '.metacon_unwrapped'))
13
14
  full_cmd = '. "$HOME/.rvm/scripts/rvm" && rvm ruby-1.9.2@metacon exec ' + cmd + ' ' + ARGV.map{|a| Shellwords.shellescape(a)}.join(' ')
14
15
  exec full_cmd
15
16
  else
data/lib/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -76,11 +76,15 @@ module MetaCon
76
76
  o.version = MetaCon.version
77
77
  o.banner = banner
78
78
  o.separator ''
79
- o.on('-v', '--[no-]verbose', 'Run command verbosely'){|v| options[:verbose]=v}
79
+ o.on('-q', '--[no-]quiet', 'Run command quietly'){|v| options[:verbose]= !v}
80
80
 
81
81
  o.on('-h','--help', 'Show this message'){puts o; exit 0}
82
82
  o.on('--version', 'Show version and exit'){puts MetaCon::VERSION; exit 0}
83
83
 
84
+ o.on('-s', '--[no-]shell-output', 'Outputs commands for evaluating in the current shell') do |v|
85
+ options[:shell]=v
86
+ end
87
+
84
88
  o.separator ''
85
89
  o.separator 'commands '
86
90
  o.separator '------------------'
@@ -91,30 +95,36 @@ module MetaCon
91
95
  o.separator cmds
92
96
  end
93
97
  rest = opts.parse(ARGV)
98
+ options[:verbose] = true if options[:verbose].nil?
99
+ options[:shell] = false if options[:shell].nil?
94
100
 
95
101
  if rest.size == 0
96
- puts opts
102
+ puts(opts)
97
103
  exit
98
104
  end
105
+
99
106
  command_key = rest.shift.strip.downcase
100
107
  command = CMD_ALIASES[command_key.to_sym]
101
-
102
108
  if command.nil?
103
109
  cfail "Command #{command_key} not found. Use -h to see the list of commands."
104
110
  exit 2
105
111
  end
112
+
106
113
  $cli = HighLine.new
107
114
  $cli.extend(MetaCon::CLIHelpers)
108
115
  unless command == :init
109
- $proj = MetaCon::Project.new
110
- $cli.cfail 'Not a metacon project. Use `metacon init`' and exit(5) unless $proj.valid
116
+ $proj = MetaCon::Project.new('./', options[:verbose])
117
+ unless $proj.valid
118
+ $cli.cfail 'Not a metacon project. Use `metacon init`'
119
+ exit 5
120
+ end
111
121
  end
112
122
 
113
123
  command_info = COMMANDS.select{|k,v| k == command}[0][1]
114
- command_info[:handler].send :handle, command, rest
124
+ command_info[:handler].send :handle, command, options, rest
115
125
  end
116
126
 
117
- def self.handle(cmd,opts)
127
+ def self.handle(cmd,clo,opts)
118
128
  if cmd == :conf
119
129
  conf = $proj.conf
120
130
  conf = Hash[opts.map{|fam| [fam, conf[fam]]}] if opts.size > 0
data/lib/metacon/init.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module MetaCon
2
2
  class Init
3
3
  require 'fileutils'
4
- def self.handle(_cmd, opts)
4
+ def self.handle(_cmd, clo, opts)
5
5
  dir = opts.shift
6
6
  dir ||= './'
7
7
  # Find out if different roles are specified. If none- default to primary.
@@ -23,8 +23,8 @@ module MetaCon
23
23
  end
24
24
  FileUtils.mkdir(mcd)
25
25
 
26
- $cli.status "Initializing..."
27
- mcp = MetaCon::Project.new(mcd)
26
+ $cli.status "Initializing..." if clo[:verbose]
27
+ mcp = MetaCon::Project.new(mcd, clo[:verbose])
28
28
 
29
29
  init_role = mcp.list(:role)[0] || 'main'
30
30
  init_rtc = mcp.list(:rtc)[0] || 'dev'
@@ -33,7 +33,7 @@ module MetaCon
33
33
  $cli.cfail 'Cannot initialize the metacontext- submodules need to have files committed.'
34
34
  exit 4
35
35
  end
36
- $cli.result "\"#{dir}\" is now a metacon project"
36
+ $cli.result "\"#{dir}\" is now a metacon project" if clo[:verbose]
37
37
  end
38
38
  end
39
39
  end
@@ -4,11 +4,11 @@ module MetaCon
4
4
  require 'metacon/loaders/helpers'
5
5
  include MetaCon::Loaders::Helpers
6
6
  include MetaCon::CLIHelpers
7
- def self.ensure(dep, state, proj, v=true)
8
- kind = dep.shift
7
+ def self.load_dependency(dependency_parts, state, proj, opts)
8
+ kind = dependency_parts.shift
9
9
  if kind == 'ruby'
10
- vstr = dep[0].downcase=='head' ? 'ruby-head' : dep.join('-')
11
- switch_ruby(vstr)
10
+ ruby = fix_ruby_version(dependency_parts)
11
+ return switch_ruby(ruby, state, opts)
12
12
  elsif kind == 'gem'
13
13
 
14
14
  else
@@ -16,22 +16,79 @@ module MetaCon
16
16
  end
17
17
  end
18
18
 
19
- def self.switch_ruby(version, v=true)
20
- # TODO: Be sure and always select a gemset
21
- # TODO: Make sure metacon is always installed in that gemset
22
- select_res, err_txt, st = cmd "rvm use '#{version}'", v
23
- select_res += err_txt
24
- if st == 0 && select_res =~ /rvm install (.*)/
25
- real_version = $1
26
- if install_ruby(real_version,v) then return switch_ruby(real_version)
27
- else return(false) end
28
- elsif select_res =~ /Using/i then return true
29
- else return(false) end
19
+
20
+ RVMS = "source $HOME/.rvm/scripts/rvm && "
21
+
22
+ def self.switch_ruby(ruby, state, opts={})
23
+ unless check_installed(ruby,opts)
24
+ unless install(ruby,opts)
25
+ cfail "Failed to install ruby '#{ruby}'"
26
+ return false
27
+ end
28
+ end
29
+ gemset = fix_gemset_name(state)
30
+ unless check_gemset_installed(gemset, opts)
31
+ unless create_gemset(ruby, gemset, opts)
32
+ cfail "Failed to create a gemset '#{gemset}' for '#{ruby}'"
33
+ return false
34
+ end
35
+ end
36
+ return switch(ruby, gemset, opts)
37
+ end
38
+
39
+
40
+ def self.check_installed(ruby, opts)
41
+ o,e,s = cmd "#{RVMS} rvm use '#{ruby}'", opts[:verbose]
42
+ return (s==0 && o =~ /using/i)
43
+ end
44
+
45
+ def self.check_gemset_installed(ruby, gemset, opts)
46
+ o,e,s = cmd "#{RVMS} rvm use '#{ruby}' && rvm gemset use '#{gemset}'", opts[:verbose]
47
+ return (s == 0 && e.strip.length == 0)
48
+ end
49
+
50
+ def self.install(ruby, opts)
51
+ o,e,s = cmd "#{RVMS} rvm install #{ruby}", opts[:verbose]
52
+ return (s == 0 && check_installed(ruby,opts))
53
+ end
54
+
55
+ def self.create_gemset(ruby, gemset, opts)
56
+ o,e,s = cmd "#{RVMS} rvm use '#{ruby}' && rvm gemset create '#{gemset}'", opts[:verbose]
57
+ res = (o =~ /created/i) && (s == 0) && (e.strip.length == 0)
58
+ return false unless res
59
+ # TODO: Make sure any "permanent" prereqs are loaded (possibly
60
+ # metacon?)
61
+ return true
62
+ end
63
+
64
+ def self.switch(ruby, gemset, opts)
65
+ # TODO: if the --shell flag is sent in, essentially do the following:
66
+ # * Use rvm info to figure out the correct root directory
67
+ # * Find .rvm/environments/... for the currently selected ruby+gemset
68
+ # * Compare actual $PATH to what it would need to change to so that we
69
+ # don't keep prepending to PATH and growing it needlessly on every
70
+ # switch.
71
+ # * Create replacement 'export path' stmt
72
+ # * Take all stmts and concatenate w/ ';' and shell escape where
73
+ # appropriate (esp. newlines at least)
74
+ # * Prepend full string w/ 'bash: ' so that it gets evalled in the
75
+ # current context.
76
+ # * Enjoy!
77
+ return true
78
+ end
79
+
80
+ protected
81
+
82
+ def self.fix_ruby_version(parts)
83
+ return parts[0].downcase=='head' ? 'ruby-head' : parts.join('-')
84
+ end
85
+
86
+ def self.fix_gemset_name(state)
87
+ return "mcon_#{clean(state[:rtc])}__#{clean(state[:role])}"
30
88
  end
31
89
 
32
- def self.install_ruby(version, v=true)
33
- inst_res, err_txt, st = cmd "rvm install '#{version}'", v
34
- return st == 0 && err_text.strip.length == 0
90
+ def self.clean(s)
91
+ s.gsub /[^a-zA-Z0-9_]+/, '_'
35
92
  end
36
93
  end
37
94
  end
@@ -17,7 +17,8 @@ module MetaCon
17
17
  @uid
18
18
  end
19
19
 
20
- def initialize(relative_to='./')
20
+ def initialize(relative_to='./', verbose=true)
21
+ @verbose = verbose
21
22
  @rel_dir = File.expand_path(relative_to)
22
23
  @mc_dir = Project.find_mc_dir(@rel_dir)
23
24
  if @mc_dir.nil?
@@ -45,7 +46,10 @@ module MetaCon
45
46
  @this_host
46
47
  end
47
48
 
48
- def switch(verbose=false,changes={})
49
+ # Options that it cares about:
50
+ # - :verbose true/false
51
+ # - :shell true/false
52
+ def switch(changes={},opts={})
49
53
  return :nochange if changes=={}
50
54
  return :impossible unless can_switch?
51
55
  changed = false
@@ -56,7 +60,7 @@ module MetaCon
56
60
  changed = s.dirty
57
61
  end
58
62
  if changed
59
- return setup_context(verbose)
63
+ return setup_context(opts)
60
64
  else
61
65
  return :nochange
62
66
  end
@@ -93,22 +97,25 @@ module MetaCon
93
97
 
94
98
  def refresh_conf; @config = Config.new(@root_dir) end
95
99
 
96
- def setup_context(verbose=false)
100
+ def setup_context(opts)
97
101
  dependencies = self.conf['dependencies']
98
102
  incomplete = false
99
103
  dependencies.each do |dep|
104
+ orig_dep = dep.dup
100
105
  dep = dep.split('/').map{|part| part.strip}
101
106
  kind = dep[0].downcase
102
107
  loader = LOADERS[kind]
103
108
  if loader.nil?
104
- $stderr.puts "WARNING: Don't know how to work with '#{kind}' dependencies." if verbose
109
+ $stderr.puts "WARNING: Don't know how to work with '#{kind}' dependencies." if opts[:verbose]
105
110
  incomplete = true
106
111
  else
107
- loader.ensure(dep, @state.state, self)
112
+ unless loader.load_dependency(dep, @state.state, self, opts)
113
+ $stderr.puts "ERROR: Failed to load #{orig_dep} - continuing anyway"
114
+ incomplete = true
115
+ end
108
116
  end
109
117
  end
110
118
  return incomplete ? :incomplete : :switched
111
- # TODO: Handle :incomplete in calling modules
112
119
  end
113
120
  end
114
121
 
data/lib/metacon/stat.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  module MetaCon
2
2
  class Stat
3
- def self.handle(cmd, opts)
3
+ def self.handle(cmd, clo, opts)
4
4
  case cmd
5
- when :stat; stat(opts)
6
- when :curr; curr(opts)
5
+ when :stat; stat(opts, clo)
6
+ when :curr; curr(opts, nil, clo)
7
7
  end
8
8
  end
9
9
 
10
- def self.stat(opts)
10
+ def self.stat(opts, clo)
11
11
  puts '(not yet implemented)'
12
12
  puts curr(opts)
13
13
  end
14
14
 
15
- def self.curr(opts=[], proj=nil)
15
+ def self.curr(opts=[], proj=nil, clo)
16
16
  proj ||= $proj
17
17
  $cli.cfail 'Not a metacon project. Use `metacon init`' and exit(5) unless proj.valid
18
18
  state = proj.current_state
@@ -1,6 +1,6 @@
1
1
  module MetaCon
2
2
  class Switch
3
- def self.handle(cmd, opts)
3
+ def self.handle(cmd, clo, opts)
4
4
  if opts.nil? or opts.size == 0
5
5
  all = $proj.list(cmd)
6
6
  current = $proj.current_state[cmd]
@@ -12,12 +12,15 @@ module MetaCon
12
12
  end
13
13
  end
14
14
  else
15
- res = $proj.switch(true, {cmd=>opts[0]})
15
+ res = $proj.switch({cmd=>opts[0]}, clo)
16
16
  case res
17
17
  when :nochange
18
- $cli.cwarn 'Nothing changed'
18
+ $cli.cwarn 'Nothing changed' if clo[:verbose]
19
19
  when :switched
20
- $cli.result "Switched #{cmd} to '#{opts[0]}'"
20
+ $cli.result "Switched #{cmd} to '#{opts[0]}'" if clo[:verbose]
21
+ when :incomplete
22
+ $cli.cwarn "Not all dependencies loaded."
23
+ $cli.result "Switched #{cmd} to '#{opts[0]}' more or less." if clo[:verbose]
21
24
  when :impossible
22
25
  $cli.cfail 'Cannot switch. Probably because submodules need committing.'
23
26
  end
data/metacon.gemspec CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "metacon"
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joseph Wecker"]
12
- s.date = "2011-10-20"
12
+ s.date = "2011-10-21"
13
13
  s.description = "Tool with some similarities to puppet but specializing in fast development iteration and continuous deployment. Specifically initially for use with justin.tv / twitch.tv project clusters."
14
14
  s.email = "jwecker@justin.tv"
15
- s.executables = [".metacon_unwrapped", "metacon", "metacon-installer"]
15
+ s.executables = [".metacon_unwrapped", "metacon-installer", "metacon"]
16
16
  s.extra_rdoc_files = [
17
17
  "LICENSE.txt",
18
18
  "README.rdoc"
@@ -30,20 +30,25 @@ fi
30
30
 
31
31
  source "$HOME/.rvm/scripts/rvm"
32
32
  set +e
33
- rvm use $MCON_RUBY_V || ( rvm install $MCON_RUBY_V && rvm use $MCON_RUBY_V ) || exit 3
34
- echo `rvm current`
35
- rvm gemset use metacon || ( rvm gemset create metacon && rvm gemset use metacon ) || exit 3
33
+ [[ `rvm use $MCON_RUBY_V` == *Using* ]] || ( rvm install $MCON_RUBY_V && rvm use $MCON_RUBY_V ) || exit 3
34
+ rvm use $MCON_RUBY_V
35
+ [[ `rvm use $MCON_RUBY_V; rvm gemset use metacon 2>&1` == *ERROR* ]] && ( ( rvm use $MCON_RUBY_V && rvm gemset create metacon && rvm gemset use metacon ) || exit 3 )
36
+ rvm gemset use metacon
37
+ rvm current
36
38
  rvm --force gemset empty metacon || exit 3
37
- echo `rvm current`
38
39
 
39
40
  set -e
40
41
  GEMOUT=`mktemp /tmp/metacon.XXXXXX`
41
- gem install metacon | tee $GEMOUT
42
+ gem install metacon | grep -v metacon-installer | grep -v "^$" | tee $GEMOUT
42
43
  DIRNAME=`grep 'Successfully installed metacon-' $GEMOUT | cut -d' ' -f3`
43
44
  unlink $GEMOUT
45
+ TMPGEMDIR=`rvm gemdir`
44
46
 
45
- rm -f /usr/local/bin/metacon /usr/local/bin/.metacon_unwrapped
46
- ln -s `rvm gemdir`/gems/${DIRNAME}/bin/metacon /usr/local/bin/metacon
47
+ set +e
48
+ rm -f /usr/local/bin/metacon &> /dev/null || sudo rm -f /usr/local/bin/metacon
49
+ ln -s ${TMPGEMDIR}/gems/${DIRNAME}/bin/metacon /usr/local/bin/metacon &> /dev/null || \
50
+ sudo ln -s ${TMPGEMDIR}/gems/${DIRNAME}/bin/metacon /usr/local/bin/metacon
51
+ set -e
47
52
 
48
53
  if [ $INSTALLED_RVM ]; then
49
54
  echo "To finish installing RVM you need to add the following to your .bashrc (or .bash_profile etc.) - then restart the shell."
data/shelp/metacon.bashrc CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env bash
2
- # NOTE: make sure not to show role in prompt if no role differentiation is
3
- # used.
2
+ # TODO: make sure not to show role in prompt if no role differentiation is used.
4
3
 
5
- echo 'hello'
4
+ mcon(){
5
+ # Essentially just let metacon do its thing but then do in the current
6
+ # context anything it tells us to do (such as setting environment variables)
7
+ eval `metacon -s $@ | grep '^:bash' | cut -d' ' -f2-`
8
+ }
metadata CHANGED
@@ -1,106 +1,142 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: metacon
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.4
3
+ version: !ruby/object:Gem::Version
4
+ hash: 17
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 5
10
+ version: 0.1.5
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Joseph Wecker
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-10-20 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: god
16
- requirement: &2153230080 !ruby/object:Gem::Requirement
17
+
18
+ date: 2011-10-21 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
22
  none: false
18
- requirements:
23
+ requirements:
19
24
  - - ~>
20
- - !ruby/object:Gem::Version
25
+ - !ruby/object:Gem::Version
26
+ hash: 51
27
+ segments:
28
+ - 0
29
+ - 11
30
+ - 0
21
31
  version: 0.11.0
22
- type: :runtime
32
+ name: god
23
33
  prerelease: false
24
- version_requirements: *2153230080
25
- - !ruby/object:Gem::Dependency
26
- name: highline
27
- requirement: &2153229600 !ruby/object:Gem::Requirement
34
+ type: :runtime
35
+ requirement: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
28
38
  none: false
29
- requirements:
39
+ requirements:
30
40
  - - ~>
31
- - !ruby/object:Gem::Version
41
+ - !ruby/object:Gem::Version
42
+ hash: 11
43
+ segments:
44
+ - 1
45
+ - 6
46
+ - 2
32
47
  version: 1.6.2
33
- type: :runtime
48
+ name: highline
34
49
  prerelease: false
35
- version_requirements: *2153229600
36
- - !ruby/object:Gem::Dependency
37
- name: minitest
38
- requirement: &2153229120 !ruby/object:Gem::Requirement
50
+ type: :runtime
51
+ requirement: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
- type: :development
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ name: minitest
45
63
  prerelease: false
46
- version_requirements: *2153229120
47
- - !ruby/object:Gem::Dependency
48
- name: yard
49
- requirement: &2153228640 !ruby/object:Gem::Requirement
64
+ type: :development
65
+ requirement: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ version_requirements: &id004 !ruby/object:Gem::Requirement
50
68
  none: false
51
- requirements:
69
+ requirements:
52
70
  - - ~>
53
- - !ruby/object:Gem::Version
71
+ - !ruby/object:Gem::Version
72
+ hash: 7
73
+ segments:
74
+ - 0
75
+ - 6
76
+ - 0
54
77
  version: 0.6.0
55
- type: :development
78
+ name: yard
56
79
  prerelease: false
57
- version_requirements: *2153228640
58
- - !ruby/object:Gem::Dependency
59
- name: bundler
60
- requirement: &2153228160 !ruby/object:Gem::Requirement
80
+ type: :development
81
+ requirement: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ version_requirements: &id005 !ruby/object:Gem::Requirement
61
84
  none: false
62
- requirements:
85
+ requirements:
63
86
  - - ~>
64
- - !ruby/object:Gem::Version
87
+ - !ruby/object:Gem::Version
88
+ hash: 23
89
+ segments:
90
+ - 1
91
+ - 0
92
+ - 0
65
93
  version: 1.0.0
66
- type: :development
94
+ name: bundler
67
95
  prerelease: false
68
- version_requirements: *2153228160
69
- - !ruby/object:Gem::Dependency
70
- name: jeweler
71
- requirement: &2153244040 !ruby/object:Gem::Requirement
96
+ type: :development
97
+ requirement: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ version_requirements: &id006 !ruby/object:Gem::Requirement
72
100
  none: false
73
- requirements:
101
+ requirements:
74
102
  - - ~>
75
- - !ruby/object:Gem::Version
103
+ - !ruby/object:Gem::Version
104
+ hash: 7
105
+ segments:
106
+ - 1
107
+ - 6
108
+ - 4
76
109
  version: 1.6.4
77
- type: :development
110
+ name: jeweler
78
111
  prerelease: false
79
- version_requirements: *2153244040
80
- - !ruby/object:Gem::Dependency
81
- name: rcov
82
- requirement: &2153243560 !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
88
112
  type: :development
113
+ requirement: *id006
114
+ - !ruby/object:Gem::Dependency
115
+ version_requirements: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ name: rcov
89
125
  prerelease: false
90
- version_requirements: *2153243560
91
- description: Tool with some similarities to puppet but specializing in fast development
92
- iteration and continuous deployment. Specifically initially for use with justin.tv
93
- / twitch.tv project clusters.
126
+ type: :development
127
+ requirement: *id007
128
+ description: Tool with some similarities to puppet but specializing in fast development iteration and continuous deployment. Specifically initially for use with justin.tv / twitch.tv project clusters.
94
129
  email: jwecker@justin.tv
95
- executables:
130
+ executables:
96
131
  - .metacon_unwrapped
97
- - metacon
98
132
  - metacon-installer
133
+ - metacon
99
134
  extensions: []
100
- extra_rdoc_files:
135
+
136
+ extra_rdoc_files:
101
137
  - LICENSE.txt
102
138
  - README.rdoc
103
- files:
139
+ files:
104
140
  - .attic/metacon-install
105
141
  - .attic/old/.cmd_common
106
142
  - .attic/old/Gemfile
@@ -148,29 +184,33 @@ files:
148
184
  - test/helper.rb
149
185
  - test/test_metacon.rb
150
186
  homepage: http://github.com/josephwecker/metacon
151
- licenses:
187
+ licenses:
152
188
  - MIT
153
- post_install_message: ! "\n\n\e[1;32m\e[40m--- You may need to run \e[1;37mmetacon-installer\e[1;32m
154
- to check dependencies & finish the installation --- \e[0m\n\n"
189
+ post_install_message: "\n\n\
190
+ \e[1;32m\e[40m--- You may need to run \e[1;37mmetacon-installer\e[1;32m to check dependencies & finish the installation --- \e[0m\n\n"
155
191
  rdoc_options: []
156
- require_paths:
192
+
193
+ require_paths:
157
194
  - lib
158
- required_ruby_version: !ruby/object:Gem::Requirement
195
+ required_ruby_version: !ruby/object:Gem::Requirement
159
196
  none: false
160
- requirements:
161
- - - ! '>='
162
- - !ruby/object:Gem::Version
163
- version: '0'
164
- segments:
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ hash: 3
201
+ segments:
165
202
  - 0
166
- hash: 365216294395297813
167
- required_rubygems_version: !ruby/object:Gem::Requirement
203
+ version: "0"
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
205
  none: false
169
- requirements:
170
- - - ! '>='
171
- - !ruby/object:Gem::Version
172
- version: '0'
173
- requirements:
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ hash: 3
210
+ segments:
211
+ - 0
212
+ version: "0"
213
+ requirements:
174
214
  - git, v1.7.4.1 or greater
175
215
  - rvm, v1.8.2 or greater
176
216
  - pythonbrew, v1.1 or greater
@@ -180,3 +220,4 @@ signing_key:
180
220
  specification_version: 3
181
221
  summary: Metacontroller for organizing aggregate projects
182
222
  test_files: []
223
+