metacon 0.1.4 → 0.1.5

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/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
+