rconf 0.9.25 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg/*
3
3
  .rvmrc
4
4
  Gemfile.lock
5
5
  .idea/
6
+ *.swp
data/bin/rconf CHANGED
@@ -22,7 +22,7 @@ module RightConf
22
22
 
23
23
  def self.run
24
24
  opts = Trollop::options do
25
- version "rconf #{VERSION} (c) 2011 RightScale"
25
+ version "rconf #{VERSION} (c) 2012 RightScale"
26
26
  banner <<-EOS
27
27
  #{DESCRIPTION}
28
28
 
@@ -34,11 +34,12 @@ where [options] are:
34
34
 
35
35
  opt :configurators, 'Show available configurators'
36
36
  opt :platform, 'Show current platform'
37
+ opt :overrides, 'Show current overrides'
37
38
  opt :update, 'Update rconf to latest version'
38
39
  opt :remove, 'Remove rconf from all gemsets'
39
40
  opt :config, 'Set path to configuration file', :type => :string
40
41
  opt :output, 'Output file (output to STDOUT by default)', :type => :string
41
- opt :reconfigure, 'Bypass all checks and force configuration'
42
+ opt :reconfigure, 'Bypass all checks and force configuration and ignore overrides'
42
43
  opt :force, 'Run rconf even if configuration file has not changed'
43
44
  opt :verbose,'Print debug output'
44
45
  end
@@ -62,6 +63,8 @@ where [options] are:
62
63
  new.list_configurators
63
64
  elsif opts[:platform]
64
65
  new.show_platform
66
+ elsif opts[:overrides]
67
+ new.show_overrides
65
68
  elsif opts[:update]
66
69
  new.update
67
70
  elsif opts[:remove]
@@ -81,16 +84,14 @@ where [options] are:
81
84
  puts "== #{key} ==".bold
82
85
  puts configurator.desc
83
86
  puts 'Settings:'
84
- max_size = configurator.all_settings.keys.map(&:to_s).map(&:size).max
85
- configurator.all_settings.each do |name, desc|
86
- num_spaces = max_size - name.to_s.size + 1
87
- print " - #{name.to_s.blue}:#{' ' * num_spaces}#{desc}"
88
- required_settings = configurator.required_settings || []
89
- if required_settings.include?(name)
90
- puts ' [required]'.green
91
- else
92
- puts
93
- end
87
+ max_size = configurator.all_settings.map { |s| s[:name] }.map(&:size).max
88
+ configurator.all_settings.each do |setting|
89
+ name = setting[:name]
90
+ desc = setting[:description]
91
+ options = setting[:options].keys.map { |k| "[#{k}]" }.join(' ')
92
+ num_spaces = max_size - name.size + 1
93
+ print " - #{name.blue}:#{' ' * num_spaces}#{desc}"
94
+ puts ' ' + options.green
94
95
  end
95
96
  puts
96
97
  end
@@ -107,6 +108,32 @@ where [options] are:
107
108
  puts "Release: #{Platform.release}"
108
109
  end
109
110
 
111
+ # List current overrides as defined in ~/.rconf_overrides
112
+ #
113
+ # === Return
114
+ # true:: Always return true
115
+ def show_overrides
116
+ if !File.readable?(OverridesLanguage::OVERRIDES_FILE)
117
+ puts "No rconf overrides file at #{OverridesLanguage::OVERRIDES_FILE}"
118
+ else
119
+ overrides = OverridesLanguage.load
120
+ if overrides
121
+ puts "Loading overrides from #{OverridesLanguage::OVERRIDES_FILE}"
122
+ msg = ''
123
+ overrides.each do |key, setting|
124
+ msg += "* #{key}\n" +
125
+ msg += setting.inject([]) do |m, (name, value)|
126
+ m << " - #{name} = #{value}"
127
+ m
128
+ end.join("\n")
129
+ end
130
+ puts msg
131
+ else
132
+ puts "Failed to load overrides from #{OverridesLanguage::OVERRIDES_FILE}: #{OverridesLanguage.parse_error.error_message}"
133
+ end
134
+ end
135
+ end
136
+
110
137
  # Update rconf to latest in all installed rubies
111
138
  #
112
139
  # === Return
@@ -116,7 +143,7 @@ where [options] are:
116
143
  report_check 'Retrieving latest rconf...'
117
144
  json = Command.execute('curl', '-s', 'http://rubygems.org/api/v1/gems/rconf.json').output
118
145
  json =~ /"version":"([^"]+)"/
119
- version = Regexp.last_match(1)
146
+ version = Regexp.last_match(1)
120
147
  report_fatal 'Failed to retrieve rconf gem information, check network connectivity' unless version
121
148
  report_success
122
149
  report('Latest rconf version is ' + version.blue)
@@ -166,11 +193,11 @@ where [options] are:
166
193
  report_check("Checking rconf for #{ruby}@#{gs}")
167
194
  rconf = Command.execute('rvm', "#{ruby}@#{gs}", 'gem', 'list', 'rconf').output
168
195
  if rconf =~ /rconf \(#{version}/
169
- report_success
196
+ report_success
170
197
  elsif rconf =~ /^rconf /
171
198
  report_failure
172
199
  report_check("Updating rconf for #{ruby}@#{gs}")
173
- res = Command.execute('rvm', "#{ruby}@#{gs}", 'gem', 'install',
200
+ res = Command.execute('rvm', "#{ruby}@#{gs}", 'gem', 'install',
174
201
  'rconf', '-v', version, '--no-ri', '--no-rdoc')
175
202
  report_result(res.success?)
176
203
  else
@@ -22,16 +22,13 @@ module RightConf
22
22
 
23
23
  # Key associated with configurator
24
24
  attr_reader :key
25
-
25
+
26
26
  # Description
27
27
  attr_reader :desc
28
28
 
29
29
  # Access to settings for documentation
30
30
  attr_reader :all_settings
31
31
 
32
- # Access to required settings for validation
33
- attr_reader :required_settings
34
-
35
32
  # Associate configurator with given key
36
33
  #
37
34
  # === Parameters
@@ -57,32 +54,25 @@ module RightConf
57
54
  true
58
55
  end
59
56
 
60
- # Store settings and their descriptions in a hash
57
+ # Store setting definition
58
+ # A definition consists of a name, a description and optionally options
59
+ # Possible options are:
60
+ # :required => true|false Whether the setting is required
61
61
  #
62
62
  # === Parameters
63
63
  # settings(Hash):: Settings descriptions indexed by names
64
64
  #
65
65
  # === Return
66
66
  # true:: Always return true
67
- def settings(settings)
68
- default_settings = { :only_if => 'Ruby code that should return true for configurator to proceed' }
69
- @all_settings = settings.merge(default_settings)
67
+ def setting(name, description, options={})
68
+ @all_settings ||= [{ :name => 'only_if',
69
+ :description => 'Ruby code that should return true for configurator to proceed',
70
+ :options => {} }]
71
+ @all_settings << { :name => name, :description => description, :options => options || {} }
70
72
  true
71
73
  end
72
74
 
73
- # Store required settings for validation
74
- #
75
- # === Parameters
76
- # settings(Array):: List of settings that should be checked
77
- #
78
- # === Return
79
- # true:: Always return true
80
- def validate_has_settings(*settings)
81
- @required_settings = settings.flatten
82
- true
83
- end
84
-
85
- end
75
+ end
86
76
 
87
77
  # Extend base class with ClassMethods module methods
88
78
  #
@@ -98,16 +88,21 @@ module RightConf
98
88
  # nil:: If settings are valid for this configurator
99
89
  # error(String):: Error message otherwise
100
90
  def validate
101
- required = self.class.required_settings
102
- return nil unless required
103
- missing = required.flatten.select { |s| !@settings_values.include?(s) }
104
- error = case missing.size
105
- when 0 then nil
106
- when 1 then "Required setting #{missing.first} is "
107
- else
108
- "Required settings #{missing.join(', ')} are "
91
+ @settings_values.merge!(OverridesLanguage.overrides_for(self.class.key.to_s)) unless Profile.force_reconfigure?
92
+ if e = OverridesLanguage.parse_error
93
+ error = "Could not load overrides file '#{OverridesLanguage::OVERRIDES_FILE}' (#{e.message})"
94
+ else
95
+ required = self.class.all_settings.select { |s| s[:options][:required] }.map { |s| s[:name] }
96
+ return nil unless required
97
+ missing = required.select { |s| !@settings_values.include?(s) }
98
+ error = case missing.size
99
+ when 0 then nil
100
+ when 1 then "Required setting #{missing.first} is "
101
+ else
102
+ "Required settings #{missing.join(', ')} are "
103
+ end
104
+ error += "missing for configuration section '#{self.class.key}'" if error
109
105
  end
110
- error += "missing for configuration section '#{self.class.key}'" if error
111
106
  error
112
107
  end
113
108
 
@@ -124,7 +119,7 @@ module RightConf
124
119
  #
125
120
  # === Parameters
126
121
  # args:: Pass-through arguments, given to platform specific implementation
127
- #
122
+ #
128
123
  # === Return
129
124
  # true:: Always return true
130
125
  def run(*args)
@@ -168,7 +163,7 @@ module RightConf
168
163
  # value:: Value of configuration option if there is one
169
164
  # nil:: Otherwise
170
165
  def [](config_option)
171
- @settings_values[config_option]
166
+ @settings_values[config_option.to_s]
172
167
  end
173
168
 
174
169
  protected
@@ -192,10 +187,10 @@ module RightConf
192
187
  if self.public_methods.include?("#{method_name}=")
193
188
  res = self.send("#{method_name}=", value)
194
189
  else
195
- res = @settings_values[meth] = value
190
+ res = @settings_values[meth.to_s] = value
196
191
  end
197
192
  end
198
- res || @settings_values[meth]
193
+ res || @settings_values[meth.to_s]
199
194
  end
200
195
 
201
196
  # Initialize configuration settings hash and index
@@ -19,16 +19,14 @@ module RightConf
19
19
 
20
20
  description 'Builds a repository using the ./configure, make, make install commands'
21
21
 
22
- settings :path => 'Path to source files',
23
- :tarball_url => 'URL to source code tarball to be downloaded, supports .tgz and .zip',
24
- :tarball_dir => 'Name of directory created when untaring tarball, required if "tarball_url" is set',
25
- :pre_step => 'Command ran prior to ./configure',
26
- :message => 'Progress message to display if any while building',
27
- :configure_opts => 'Hash of options to be given to the configure script. ' +
22
+ setting 'path', 'Path to source files', :required => true
23
+ setting 'tarball_url', 'URL to source code tarball to be downloaded, supports .tgz and .zip'
24
+ setting 'tarball_dir', 'Name of directory created when untaring tarball, required if "tarball_url" is set'
25
+ setting 'pre_step', 'Command ran prior to ./configure'
26
+ setting 'message', 'Progress message to display if any while building'
27
+ setting 'configure_opts', 'Hash of options to be given to the configure script. ' +
28
28
  'The keys are the platform families (:darwin, :linux or :windows)'
29
29
 
30
- validate_has_settings :path
31
-
32
30
  # No way to check, return false
33
31
  #
34
32
  # === Return
@@ -21,12 +21,10 @@ module RightConf
21
21
 
22
22
  description 'Installs bundler and runs "bundle install"'
23
23
 
24
- settings :version => 'Version of bundler gem, e.g. "1.0.21"',
25
- :exclusions => 'Comma separated list of gem groups to be excluded when installing bundle',
26
- :bundle_path => 'Path where bundle should be installed',
27
- :gem_path => 'Path to bundler gem, e.g. "vendor/system_gems/cache"'
28
-
29
- validate_has_settings :version
24
+ setting 'version', 'Version of bundler gem, e.g. "1.0.21"', :required => true
25
+ setting 'exclusions', 'Comma separated list of gem groups to be excluded when installing bundle'
26
+ setting 'bundle_path', 'Path where bundle should be installed'
27
+ setting 'gem_path', 'Path to bundler gem, e.g. "vendor/system_gems/cache"'
30
28
 
31
29
  # Check whether bundler is already installed
32
30
  #
@@ -22,13 +22,11 @@ module RightConf
22
22
 
23
23
  description 'Installs Cassandra'
24
24
 
25
- settings :version => 'Cassandra version to install',
26
- :install_path => 'Path to Cassandra installation directory, uses /opt/cassandra if it ' +
27
- 'is writable by the current user or ~/cassandra otherwise by default',
28
- :abort_on_failure => 'Whether to abort if Cassandra failed to install (false by default)',
29
- :endpoint_snitch => 'Set custom endpoint snitch for installed cassandra'
30
-
31
- validate_has_settings :version
25
+ setting 'version', 'Cassandra version to install', :required => true
26
+ setting 'install_path', 'Path to Cassandra installation directory, uses /opt/cassandra if it ' +
27
+ 'is writable by the current user or ~/cassandra otherwise by default'
28
+ setting 'abort_on_failure','Whether to abort if Cassandra failed to install (false by default)'
29
+ setting 'endpoint_snitch', 'Set custom endpoint snitch for installed cassandra'
32
30
 
33
31
  # Check whether Cassandra is installed
34
32
  #
@@ -19,13 +19,11 @@ module RightConf
19
19
 
20
20
  description 'Run arbitrary shell commands'
21
21
 
22
- settings :command_line => 'Command line to run',
23
- :message => 'Progress message to display if any while command is running',
24
- :abort_on_failure => 'Message to display when aborting configuration if command fails. ' +
22
+ setting 'command_line', 'Command line to run', :required => true
23
+ setting 'message', 'Progress message to display if any while command is running'
24
+ setting 'abort_on_failure', 'Message to display when aborting configuration if command fails. ' +
25
25
  'Do not abort if not set'
26
26
 
27
- validate_has_settings :command_line
28
-
29
27
  # No way to check, return false
30
28
  #
31
29
  # === Return
@@ -19,11 +19,9 @@ module RightConf
19
19
 
20
20
  description 'Clone git repository and build if needed'
21
21
 
22
- settings :repo => 'git repo URL',
23
- :path => 'Path where git repo should be cloned to',
24
- :tag => 'git tag or branch or sha that should be checked out ("master" by default)'
25
-
26
- validate_has_settings :repo, :path
22
+ setting 'repo','git repo URL', :required => true
23
+ setting 'path','Path where git repo should be cloned to', :required => true
24
+ setting 'tag', 'git tag or branch or sha that should be checked out ("master" by default)'
27
25
 
28
26
  # Check whether repo was already cloned
29
27
  #
@@ -24,7 +24,7 @@ module RightConf
24
24
 
25
25
  description 'Installs Mercurial'
26
26
 
27
- settings :abort_on_failure => 'Whether to abort if Mercurial failed to install (false by default)'
27
+ setting 'abort_on_failure', 'Whether to abort if Mercurial failed to install (false by default)'
28
28
 
29
29
  # Check whether Mercurial is installed
30
30
  #
@@ -19,11 +19,11 @@ module RightConf
19
19
 
20
20
  description 'Installs packages defined for running platform'
21
21
 
22
- settings :debian => 'Packages to be installed on Debian based Linux',
23
- :centos => 'Packages to be installed on RedHat / Centos',
24
- :windows => 'Softwared to be downloaded and installed on Windows',
25
- :darwin => 'Brew packages to be installed on Mac OS X (https://github.com/mxcl/homebrew)',
26
- :abort_on_failure => 'Whether to abort if packages failed to install (false by default)'
22
+ setting 'debian', 'Packages to be installed on Debian based Linux'
23
+ setting 'centos', 'Packages to be installed on RedHat / Centos'
24
+ setting 'windows', 'Softwared to be downloaded and installed on Windows'
25
+ setting 'darwin', 'Brew packages to be installed on Mac OS X (https://github.com/mxcl/homebrew)'
26
+ setting 'abort_on_failure', 'Whether to abort if packages failed to install (false by default)'
27
27
 
28
28
  # Let package manager check for idempotency, return false
29
29
  #
@@ -28,9 +28,9 @@ module RightConf
28
28
  'passenger section then that ruby will be used, otherwise ' +
29
29
  'the default ruby will.'
30
30
 
31
- settings :library_src_path => "Path to library sources, #{File.expand_path(File.join(Dir.getwd, '..', 'library'))} by default",
32
- :gem_version => "Passenger gem version #{PASSENGER_GEM_VERSION} by default",
33
- :install_path => 'Path to nginx installation directory, uses /opt/nginx if it ' +
31
+ setting 'library_src_path', "Path to library sources, #{File.expand_path(File.join(Dir.getwd, '..', 'library'))} by default"
32
+ setting 'gem_version', "Passenger gem version #{PASSENGER_GEM_VERSION} by default"
33
+ setting 'install_path', 'Path to nginx installation directory, uses /opt/nginx if it ' +
34
34
  'is writable by the current user or ~/nginx otherwise by default'
35
35
 
36
36
  # Check that passenger gem is installed and that passenger+nginx is installed
@@ -20,11 +20,9 @@ module RightConf
20
20
  description "Installs ruby interpreter and rubygems.\n" +
21
21
  'Installs and uses rvm on supported (i.e. non-Windows) platforms'
22
22
 
23
- settings :version => 'Ruby version using rvm notation (see "rvm list known")',
24
- :rubygems => 'Rubygems version, e.g. "1.3.7"',
25
- :gemset => 'Gemset to be used for platforms supporting rvm'
26
-
27
- validate_has_settings :version
23
+ setting 'version', 'Ruby version using rvm notation (see "rvm list known")', :required => true
24
+ setting 'rubygems', 'Rubygems version, e.g. "1.3.7"'
25
+ setting 'gemset', 'Gemset to be used for platforms supporting rvm'
28
26
 
29
27
  # RVM version used to install rubies
30
28
  RVM_VERSION = '1.10.2'
@@ -0,0 +1,145 @@
1
+ # Copyright (C) 2011-2012 RightScale, Inc, All Rights Reserved Worldwide.
2
+ #
3
+ # THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
4
+ # AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
5
+ # reproduction, modification, or disclosure of this program is
6
+ # strictly prohibited. Any use of this program by an authorized
7
+ # licensee is strictly subject to the terms and conditions,
8
+ # including confidentiality obligations, set forth in the applicable
9
+ # License Agreement between RightScale.com, Inc. and
10
+ # the licensee
11
+
12
+ module RightConf
13
+
14
+ # Defines ~/.rconf_overrides file DSL
15
+ class OverridesLanguage
16
+
17
+ # Path to overrides file
18
+ OVERRIDES_FILE = File.join(ENV['HOME'], '.rconf_overrides')
19
+
20
+ # Return override for given configurator setting if any
21
+ #
22
+ # === Parameters
23
+ # key(String):: Configurator key
24
+ # setting(String):: Setting name
25
+ #
26
+ # === Return
27
+ # value(String||Nil):: Override value if any, nil otherwise
28
+ def self.overrides_for(key)
29
+ self.load unless @overrides
30
+ @overrides && @overrides[key] || {}
31
+ end
32
+
33
+ # Load overrides from file
34
+ #
35
+ # === Return
36
+ # overrides(Hash):: Loaded overrides
37
+ def self.load
38
+ return @overrides if @overrides
39
+ return {} unless File.readable?(OVERRIDES_FILE)
40
+ @overrides = self.parse(IO.read(OVERRIDES_FILE)) || {}
41
+ end
42
+
43
+ # Persist overrides to overrides file
44
+ #
45
+ # === Return
46
+ # true:: Always return true
47
+ def self.save
48
+ File.open(OVERRIDES_FILE, 'w') do |f|
49
+ @overrides.each do |key, settings|
50
+ settings.each do |name, value|
51
+ f.puts "#{key}.#{name}=#{value}"
52
+ end
53
+ end
54
+ end
55
+ true
56
+ end
57
+
58
+ # Return parse errors from last call to 'parse' if any
59
+ def self.parse_error
60
+ @parse_error
61
+ end
62
+
63
+ protected
64
+
65
+ # Load overrides from config file and produce hash of
66
+ # overrides keyed by configurator and setting name
67
+ #
68
+ # === Parameters
69
+ # source(String):: Overrides text
70
+ #
71
+ # === Return
72
+ # overrides(Hash):: Overrides hash
73
+ def self.parse(source)
74
+ @parse_error = nil
75
+ @overrides = nil
76
+ overrides = Object.new
77
+ ConfiguratorRegistry.each do |key, configurator|
78
+ klass, code = override_class_code(key, configurator)
79
+ overrides.class.class_eval(code)
80
+ overrides.instance_eval("@#{key} = #{klass}.new")
81
+ end
82
+ begin
83
+ source.split("\n").each do |o|
84
+ operands = o.gsub(/\s+/, '').split('=')
85
+ if operands.size != 2
86
+ raise "Invalid syntax '#{o}', must be of the form 'key.setting=value'"
87
+ end
88
+ if operands[1].start_with?('"') || operands[1].start_with?("'")
89
+ value = operands[1]
90
+ else
91
+ value = "'#{operands[1]}'"
92
+ end
93
+ overrides.instance_eval("@#{operands[0]}=#{value}")
94
+ end
95
+ rescue Exception => e
96
+ @overrides = nil
97
+ @parse_error = e
98
+ end
99
+ @overrides
100
+ end
101
+
102
+ # Add override read from overrides file
103
+ #
104
+ # === Paramaters
105
+ # key(String):: Configurator key
106
+ # setting(String):: Setting name
107
+ # value(String):: Override value
108
+ #
109
+ # === Return
110
+ # true:: Always return true
111
+ def self.add_override(key, setting, value)
112
+ @overrides ||= {}
113
+ @overrides[key] ||= {}
114
+ @overrides[key][setting] = value
115
+ true
116
+ end
117
+
118
+ # Build code for override class associated with given configurator
119
+ # That class defines one setter method per setting which sets
120
+ # the value in the @overrides class variable of *this*
121
+ # (OverridesLanguage) class
122
+ #
123
+ # === Parameters
124
+ # key(String):: Configurator key
125
+ # configurator(Class):: Configurator class
126
+ #
127
+ # === Return
128
+ # res(Array):: Pair of class name and class ruby code
129
+ def self.override_class_code(key, configurator)
130
+ klass = key.capitalize
131
+ code = "class #{klass}\n"
132
+ configurator.all_settings.each do |s|
133
+ code += <<-EOS
134
+ def #{s[:name]}=(val)
135
+ OverridesLanguage.add_override('#{key}', '#{s[:name]}', val)
136
+ end
137
+ EOS
138
+ end
139
+ code += 'end'
140
+ [klass, code]
141
+ end
142
+
143
+ end
144
+ end
145
+
data/lib/rconf/version.rb CHANGED
@@ -12,8 +12,8 @@
12
12
  module RightConf
13
13
 
14
14
  MAJOR = 0
15
- MINOR = 9
16
- BUILD = 25
15
+ MINOR = 10
16
+ BUILD = 0
17
17
 
18
18
  VERSION = [MAJOR, MINOR, BUILD].map(&:to_s).join('.')
19
19
 
data/lib/rconf.rb CHANGED
@@ -18,6 +18,7 @@ require File.join(BASE_DIR, 'command')
18
18
  require File.join(BASE_DIR, 'configurator_registry')
19
19
  require File.join(BASE_DIR, 'configurator')
20
20
  require File.join(BASE_DIR, 'language')
21
+ require File.join(BASE_DIR, 'overrides_language')
21
22
  require File.join(BASE_DIR, 'platform')
22
23
  require File.join(BASE_DIR, 'profile')
23
24
  require File.join(BASE_DIR, 'trollop')
data/rconf.rconf CHANGED
@@ -1,11 +1,11 @@
1
1
  # Configuration settings for RightSite
2
2
  ruby do
3
3
  version 'ruby-1.9.2-p290'
4
- rubygems '1.8.11'
4
+ rubygems '1.8.24'
5
5
  gemset 'rconf'
6
6
  end
7
7
  bundler do
8
- version '1.1.3'
8
+ version '1.2.1'
9
9
  end
10
10
 
11
11
 
@@ -16,8 +16,8 @@ describe RightConf::Configurator do
16
16
  class TestConfigurator
17
17
  include RightConf::Configurator
18
18
  register :test
19
- validate_has_settings :required
20
- attr_reader :custom_setting
19
+ attr_accessor :custom_setting
20
+ setting 'required', 'required setting', :required => true
21
21
  def test_setter(value)
22
22
  @custom_setting = value
23
23
  end
@@ -34,10 +34,22 @@ describe RightConf::Configurator do
34
34
  register :another
35
35
  end
36
36
 
37
+ before(:all) do
38
+ # Disable overrides
39
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, {})
40
+ end
41
+
37
42
  before(:each) do
38
43
  @configurator = TestConfigurator.new(1)
39
44
  end
40
45
 
46
+ after(:all) do
47
+ confs = RightConf::ConfiguratorRegistry.instance.instance_variable_get(:@configurators)
48
+ confs.delete(:test)
49
+ confs.delete(:another)
50
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, nil)
51
+ end
52
+
41
53
  it 'should register configurators' do
42
54
  RightConf::ConfiguratorRegistry[:test].should == TestConfigurator
43
55
  RightConf::ConfiguratorRegistry[:another].should == AnotherConfigurator
@@ -17,6 +17,15 @@ describe RightConf::BundlerConfigurator do
17
17
  flexmock('res', :success? => true, :output => output)
18
18
  end
19
19
 
20
+ before(:all) do
21
+ # Disable overrides
22
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, {})
23
+ end
24
+
25
+ after(:all) do
26
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, nil)
27
+ end
28
+
20
29
  before(:each) do
21
30
  @configurator = create_configurator('bundler { version "0" }')
22
31
  RightConf::Command.instance.instance_variable_set(:@rvm_prefix, 'r@g')
@@ -13,6 +13,15 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
13
13
 
14
14
  describe RightConf::Language do
15
15
 
16
+ before(:all) do
17
+ # Disable overrides
18
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, {})
19
+ end
20
+
21
+ after(:all) do
22
+ RightConf::OverridesLanguage.instance_variable_set(:@overrides, nil)
23
+ end
24
+
16
25
  it 'should invalidate missing blocks' do
17
26
  lang = RightConf::Language.parse('toto')
18
27
  lang.validation_errors.size.should == 1
@@ -31,7 +40,7 @@ describe RightConf::Language do
31
40
  lang.configurators.size.should == 1
32
41
  lang.configurators.first.class.should == RightConf::RubyConfigurator
33
42
  lang.configurators.first.instance_variable_get(:@settings_values).should ==
34
- { :version => '1', :rubygems => '2' }
43
+ { 'version' => '1', 'rubygems' => '2' }
35
44
  end
36
45
 
37
46
  it 'should parse multiple configurations' do
@@ -49,10 +58,10 @@ describe RightConf::Language do
49
58
  lang.configurators.size.should == 2
50
59
  lang.configurators[0].class.should == RightConf::RubyConfigurator
51
60
  lang.configurators[0].instance_variable_get(:@settings_values).should ==
52
- { :version => '1', :rubygems => '2' }
61
+ { 'version' => '1', 'rubygems' => '2' }
53
62
  lang.configurators[1].class.should == RightConf::BundlerConfigurator
54
63
  lang.configurators[1].instance_variable_get(:@settings_values).should ==
55
- { :version => '3' }
64
+ { 'version' => '3' }
56
65
  end
57
66
 
58
67
  end
@@ -0,0 +1,37 @@
1
+ # Copyright (C) 2011-2012 RightScale, Inc, All Rights Reserved Worldwide.
2
+ #
3
+ # THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
4
+ # AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
5
+ # reproduction, modification, or disclosure of this program is
6
+ # strictly prohibited. Any use of this program by an authorized
7
+ # licensee is strictly subject to the terms and conditions,
8
+ # including confidentiality obligations, set forth in the applicable
9
+ # License Agreement between RightScale.com, Inc. and
10
+ # the licensee
11
+
12
+ require File.join(File.dirname(__FILE__), 'spec_helper')
13
+
14
+ describe RightConf::OverridesLanguage do
15
+
16
+ it 'should load overrides' do
17
+ hash = RightConf::OverridesLanguage.parse("ruby.version='2.0'\nbundler.version = 3.0")
18
+ if e = RightConf::OverridesLanguage.parse_error
19
+ puts "Failed to parse overrides: #{e.message}"
20
+ end
21
+ hash.size.should == 2
22
+ hash['ruby'].size.should == 1
23
+ hash['ruby']['version'].should == '2.0'
24
+ hash['bundler'].size.should == 1
25
+ hash['bundler']['version'].should == '3.0'
26
+ RightConf::OverridesLanguage.parse_error.should be_nil
27
+ end
28
+
29
+ it 'should catch errors' do
30
+ hash = RightConf::OverridesLanguage.parse('foo')
31
+ hash.should be_nil
32
+ RightConf::OverridesLanguage.parse_error.should_not be_nil
33
+ end
34
+
35
+ end
36
+
37
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rconf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.25
4
+ version: 0.10.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000Z
12
+ date: 2012-11-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70216575231940 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '2.5'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70216575231940
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.5'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: flexmock
27
- requirement: &70216575228820 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,7 +37,12 @@ dependencies:
32
37
  version: '0.9'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70216575228820
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.9'
36
46
  description: ! 'rconf configures the environment for a given application. rconf reads
37
47
 
38
48
  the content of an application configuration file and installs and/or
@@ -76,6 +86,7 @@ files:
76
86
  - lib/rconf/configurators/passenger_configurator.rb
77
87
  - lib/rconf/configurators/ruby_configurator.rb
78
88
  - lib/rconf/language.rb
89
+ - lib/rconf/overrides_language.rb
79
90
  - lib/rconf/platform.rb
80
91
  - lib/rconf/platforms/darwin.rb
81
92
  - lib/rconf/platforms/linux.rb
@@ -102,6 +113,7 @@ files:
102
113
  - spec/configurators/passenger_configurator_spec.rb
103
114
  - spec/configurators/ruby_configurator_spec.rb
104
115
  - spec/language_spec.rb
116
+ - spec/overrides_language_spec.rb
105
117
  - spec/platform_spec.rb
106
118
  - spec/profile_spec.rb
107
119
  - spec/progress_reporters/base_reporter_spec.rb
@@ -130,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
142
  version: '0'
131
143
  requirements: []
132
144
  rubyforge_project: rconf
133
- rubygems_version: 1.8.11
145
+ rubygems_version: 1.8.24
134
146
  signing_key:
135
147
  specification_version: 3
136
148
  summary: Cross platform environment configuration
@@ -144,6 +156,7 @@ test_files:
144
156
  - spec/configurators/passenger_configurator_spec.rb
145
157
  - spec/configurators/ruby_configurator_spec.rb
146
158
  - spec/language_spec.rb
159
+ - spec/overrides_language_spec.rb
147
160
  - spec/platform_spec.rb
148
161
  - spec/profile_spec.rb
149
162
  - spec/progress_reporters/base_reporter_spec.rb