rconf 0.5.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.
@@ -0,0 +1,30 @@
1
+ # Copyright (C) 2011 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
+ MAJOR = 0
15
+ MINOR = 5
16
+ BUILD = 0
17
+
18
+ VERSION = [MAJOR, MINOR, BUILD].map(&:to_s).join('.')
19
+
20
+ DESCRIPTION = <<-EOS
21
+ rconf configures the environment for a given application. rconf reads
22
+ the content of an application configuration file (.rc) and installs and/or
23
+ configures the required tools for running or developing the corresponding
24
+ application. rconf can easily be extended to configure new tools and makes
25
+ it easy to support multiple platforms.
26
+ Consult the README.rdoc file for information on how to write rconf
27
+ configuration files (.rc).
28
+ EOS
29
+
30
+ end
@@ -0,0 +1,24 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'rconf/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'rconf'
6
+ s.version = RightConf::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Raphael Simon']
9
+ s.email = ['raphael@rightscale.com']
10
+ s.homepage = 'http://rubygems.org/gems/rconf'
11
+ s.summary = %q{Cross platform environment configuration}
12
+ s.description = RightConf::DESCRIPTION
13
+
14
+ s.rubyforge_project = 'rconf'
15
+
16
+ s.add_development_dependency('rspec', "~> 2.5")
17
+ s.add_development_dependency('flexmock', "~> 0.9")
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- spec/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ['lib']
23
+ end
24
+
@@ -0,0 +1,38 @@
1
+ # Copyright (C) 2011 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::Command do
15
+
16
+ def success_result
17
+ RightConf::CommandResult.new(0, '')
18
+ end
19
+
20
+ def failed_result
21
+ RightConf::CommandResult.new(1, '')
22
+ end
23
+
24
+ it 'should execute' do
25
+ flexmock(RightConf::Platform.instance).should_receive(:dispatch).with('test', '42', Proc).once.and_return(success_result)
26
+ RightConf::Command.execute('test', '42')
27
+ end
28
+
29
+ it 'should report fatal errors when required to' do
30
+ flexmock(RightConf::Platform.instance).should_receive(:dispatch).with('test', '42',
31
+ Proc).once.and_return(failed_result)
32
+ flexmock(RightConf::Command.instance).should_receive(:report_fatal).once.with("FAILED: 'test 42' returned\n1")
33
+ RightConf::Command.execute('test', '42', :abort_on_failure => 'FAILED')
34
+ end
35
+
36
+ end
37
+
38
+
@@ -0,0 +1,64 @@
1
+ # Copyright (C) 2011 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::Configurator do
15
+
16
+ class TestConfigurator
17
+ include RightConf::Configurator
18
+ register :test
19
+ validate_has_settings :required
20
+ attr_reader :custom_setting
21
+ def test_setter(value)
22
+ @custom_setting = value
23
+ end
24
+ end
25
+
26
+ class AnotherConfigurator
27
+ include RightConf::Configurator
28
+ register :another
29
+ end
30
+
31
+ before(:each) do
32
+ @configurator = TestConfigurator.new
33
+ end
34
+
35
+ it 'should register configurators' do
36
+ RightConf::ConfiguratorRegistry[:test].should == TestConfigurator
37
+ RightConf::ConfiguratorRegistry[:another].should == AnotherConfigurator
38
+ end
39
+
40
+ it 'should have associated key' do
41
+ TestConfigurator.key.should == :test
42
+ AnotherConfigurator.key.should == :another
43
+ end
44
+
45
+ it 'should initialize configuration using meta-programming' do
46
+ @configurator.instance_eval { test_setting 42 }
47
+ @configurator[:test_setting].should == 42
48
+ end
49
+
50
+ it 'should use configurator setter if it exists' do
51
+ @configurator.instance_eval { test_setter 43 }
52
+ @configurator.custom_setting.should == 43
53
+ end
54
+
55
+ it 'should validate' do
56
+ @configurator.validate.should =~ /^Required setting.*missing for configuration/
57
+ @configurator.instance_eval { required 42 }
58
+ @configurator.validate.should be_nil
59
+ end
60
+
61
+ end
62
+
63
+
64
+
@@ -0,0 +1,51 @@
1
+ # Copyright (C) 2011 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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
13
+
14
+ describe RightConf::BundlerConfigurator do
15
+
16
+ def success_result(output=nil)
17
+ flexmock('res', :success? => true, :output => output)
18
+ end
19
+
20
+ before(:each) do
21
+ lang = RightConf::Language.parse('bundler { bundler_version "0" }')
22
+ @configurator = lang.configurators.first
23
+ [:report_check, :report_result, :report_fatal, :report_success].each do |meth|
24
+ flexmock(@configurator).should_receive(meth)
25
+ end
26
+ end
27
+
28
+ it 'should succeed when bundler succeeds' do
29
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
30
+ 'bundle', '--version').and_return(success_result('0'))
31
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
32
+ 'bundle', 'install', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
33
+ @configurator.run_linux
34
+ end
35
+
36
+ it 'should install bunlder if needed' do
37
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
38
+ 'bundle', '--version').and_return(success_result('1'))
39
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
40
+ 'bundle', 'install', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
41
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
42
+ 'gem', 'uninstall', 'bundler', '-a', '-x', {:abort_on_failure=>"Failed to uninstall bundler"}).and_return(success_result)
43
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
44
+ 'gem', 'install',
45
+ File.join(RightConf::BundlerConfigurator::DEFAULT_GEM_PATH, 'bundler-0.gem'),
46
+ '--no-ri', '--no-rdoc', {:abort_on_failure=>"Failed to install bundler"}).once.and_return(success_result)
47
+ @configurator.run_linux
48
+ end
49
+
50
+
51
+ end
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2011 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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
13
+
14
+ describe RightConf::RubyConfigurator do
15
+
16
+ def success_result(output=nil)
17
+ flexmock('res', :success? => true, :output => output)
18
+ end
19
+
20
+ before(:each) do
21
+ lang = RightConf::Language.parse('ruby { ruby_version "0"; rubygems_version "1" }')
22
+ @configurator = lang.configurators.first
23
+ [:report_check, :report_result, :report_fatal, :report_success, :report].each do |meth|
24
+ flexmock(@configurator).should_receive(meth)
25
+ end
26
+ end
27
+
28
+ it 'should succeed on linux when rvm succeeds' do
29
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
30
+ 'rvm', '--version').and_return(success_result("rvm #{RightConf::RubyConfigurator::RVM_VERSION}"))
31
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
32
+ 'rvm', 'list').and_return(success_result("=> rvm #{RightConf::RubyConfigurator::RVM_VERSION}"))
33
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
34
+ 'rvm', 'use', '0').and_return(success_result('Using'))
35
+ @configurator.run_linux
36
+ end
37
+
38
+ it 'should install rvm if needed' do
39
+ rvm_tar = "rvm-#{RightConf::RubyConfigurator::RVM_VERSION}.tar.gz"
40
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
41
+ 'rvm', '--version').and_return(success_result("rvm"))
42
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
43
+ 'rvm', 'list').and_return(success_result("=> rvm #{RightConf::RubyConfigurator::RVM_VERSION}"))
44
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
45
+ 'curl', '-O', '-f',
46
+ "http://rvm.beginrescueend.com/releases/#{rvm_tar}",
47
+ {:abort_on_failure=>"Failed to download rvm #{RightConf::RubyConfigurator::RVM_VERSION}"}).and_return(success_result)
48
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
49
+ 'tar', 'zxf', rvm_tar).and_return(success_result)
50
+ flexmock(Dir).should_receive(:chdir).and_yield
51
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
52
+ './install', {:abort_on_failure=>"Failed to install rvm #{RightConf::RubyConfigurator::RVM_VERSION}"}).and_return(success_result)
53
+ flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
54
+ 'rvm', 'use', '0').and_return(success_result('Using'))
55
+ @configurator.run_linux
56
+ end
57
+
58
+
59
+ end
60
+
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2011 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::Language do
15
+
16
+ it 'should invalidate missing blocks' do
17
+ lang = RightConf::Language.parse('toto')
18
+ lang.validation_errors.size.should == 1
19
+ lang.validation_errors.first.should == "Invalid syntax, expecting block after 'toto'"
20
+ end
21
+
22
+ it 'should invalidate non-existent configurator' do
23
+ lang = RightConf::Language.parse('toto { 42 }')
24
+ lang.validation_errors.size.should == 1
25
+ lang.validation_errors.first.should == "Unknown configurator 'toto'"
26
+ end
27
+
28
+ it 'should parse correctly' do
29
+ lang = RightConf::Language.parse('ruby { ruby_version "1"; rubygems_version "2" }')
30
+ lang.validation_errors.size.should == 0
31
+ lang.configurators.size.should == 1
32
+ lang.configurators.first.class.should == RightConf::RubyConfigurator
33
+ lang.configurators.first.instance_variable_get(:@settings_values).should ==
34
+ { :ruby_version => '1', :rubygems_version => '2' }
35
+ end
36
+
37
+ it 'should parse multiple configurations' do
38
+ lang = RightConf::Language.parse(<<-EOS
39
+ ruby do
40
+ ruby_version "1"
41
+ rubygems_version "2"
42
+ end
43
+ bundler do
44
+ bundler_version "3"
45
+ end
46
+ EOS
47
+ )
48
+ lang.validation_errors.size.should == 0
49
+ lang.configurators.size.should == 2
50
+ lang.configurators[0].class.should == RightConf::RubyConfigurator
51
+ lang.configurators[0].instance_variable_get(:@settings_values).should ==
52
+ { :ruby_version => '1', :rubygems_version => '2' }
53
+ lang.configurators[1].class.should == RightConf::BundlerConfigurator
54
+ lang.configurators[1].instance_variable_get(:@settings_values).should ==
55
+ { :bundler_version => '3' }
56
+ end
57
+
58
+
59
+ end
60
+
@@ -0,0 +1,37 @@
1
+ # Copyright (C) 2011 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::Platform do
15
+
16
+ it 'should try to dispatch using platform family' do
17
+ def test_amiga(val); val; end
18
+ flexmock(RightConf::Platform.instance).should_receive(:family).and_return('amiga')
19
+ RightConf::Platform.dispatch(44) { :test }.should == 44
20
+ end
21
+
22
+ it 'should try to dispatch using platform family and flavor' do
23
+ def test_atari_st(val); val; end
24
+ flexmock(RightConf::Platform.instance).should_receive(:flavor).and_return('st')
25
+ flexmock(RightConf::Platform.instance).should_receive(:family).and_return('atari')
26
+ RightConf::Platform.dispatch(43) { :test }.should == 43
27
+ end
28
+
29
+ it 'should try to dispatch using platform family, flavor and release' do
30
+ def test_commodore_c_64(val); val; end
31
+ flexmock(RightConf::Platform.instance).should_receive(:release).and_return('64')
32
+ flexmock(RightConf::Platform.instance).should_receive(:flavor).and_return('c')
33
+ flexmock(RightConf::Platform.instance).should_receive(:family).and_return('commodore')
34
+ RightConf::Platform.dispatch(42) { :test }.should == 42
35
+ end
36
+
37
+ end
@@ -0,0 +1,84 @@
1
+ # Copyright (C) 2011 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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
13
+
14
+ describe RightConf::BaseReporter do
15
+
16
+ before(:each) do
17
+ @written = nil
18
+ @reporter = RightConf::BaseReporter.new
19
+ flexmock(@reporter).should_receive(:write).and_return { |t| @written = t }
20
+ end
21
+
22
+ it 'should report standard messages' do
23
+ @reporter.report('42')
24
+ @written.should == @reporter.send(:format_message, '42')
25
+ @reporter.report_message('43')
26
+ @written.should == @reporter.send(:format_message, '43')
27
+ end
28
+
29
+ it 'should report new sections' do
30
+ @reporter.report_section('42')
31
+ @written.should == @reporter.send(:format_section, '42')
32
+ end
33
+
34
+ it 'should report errors' do
35
+ @reporter.report_error('42')
36
+ @written.should == @reporter.send(:format_error, '42')
37
+ end
38
+
39
+ it 'should report checks' do
40
+ @reporter.report_check('42')
41
+ @written.should == @reporter.send(:format_check, '42')
42
+ end
43
+
44
+ it 'should report success' do
45
+ @reporter.report_success
46
+ @written.should == @reporter.send(:format_success)
47
+ @written = nil
48
+ @reporter.report_result(true)
49
+ @written.should == @reporter.send(:format_success)
50
+ end
51
+
52
+ it 'should report failures' do
53
+ @reporter.report_failure
54
+ @written.should == @reporter.send(:format_failure)
55
+ @written = nil
56
+ @reporter.report_result(false)
57
+ @written.should == @reporter.send(:format_failure)
58
+ end
59
+
60
+ it 'should report fatal' do
61
+ exception = nil
62
+ begin
63
+ @reporter.report_fatal('42')
64
+ rescue Exception => e
65
+ exception = e
66
+ end
67
+ @written.should == @reporter.send(:format_fatal, '42')
68
+ exception.should_not be_nil
69
+ exception.class.should == SystemExit
70
+ exception.message.should == 'exit'
71
+ end
72
+
73
+ it 'should raise NoMethodError when using a wrong report method' do
74
+ exception = nil
75
+ begin
76
+ @reporter.report_something_that_does_no_exist
77
+ rescue Exception => e
78
+ exception = e
79
+ end
80
+ exception.should_not be_nil
81
+ exception.class.should == NoMethodError
82
+ end
83
+
84
+ end