rconf 0.5.6 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -19,6 +19,7 @@ require File.join(BASE_DIR, 'configurator_registry')
19
19
  require File.join(BASE_DIR, 'configurator')
20
20
  require File.join(BASE_DIR, 'language')
21
21
  require File.join(BASE_DIR, 'platform')
22
+ require File.join(BASE_DIR, 'profile')
22
23
  require File.join(BASE_DIR, 'trollop')
23
24
  require File.join(BASE_DIR, 'version')
24
25
 
@@ -9,6 +9,8 @@
9
9
  # License Agreement between RightScale.com, Inc. and
10
10
  # the licensee
11
11
 
12
+ require 'digest/sha1'
13
+
12
14
  module RightConf
13
15
 
14
16
  # Configurator mixin, defines DSL and common validation method
@@ -118,10 +120,24 @@ module RightConf
118
120
  # true:: Always return true
119
121
  def run(*args)
120
122
  init
121
- Platform.dispatch(*args) { :run }
123
+ sha = Profile.configurator_signature(self.class.key)
124
+ if sha != signature
125
+ Platform.dispatch(*args) { :run }
126
+ Profile.set_configurator_signature(self.class.key, signature)
127
+ end
122
128
  true
123
129
  end
124
130
 
131
+ # Calculate unique SHA for current settings
132
+ #
133
+ # === Return
134
+ # sha(String):: SHA for current settings
135
+ def signature
136
+ return '' if @settings_values.nil?
137
+ blob = @settings_values.inject('') { |b, (k, v)| b += "#{k}:#{v};" }
138
+ sha = Digest::SHA1.hexdigest(blob)
139
+ end
140
+
125
141
  # Get value of configuration option
126
142
  #
127
143
  # === Parameters
@@ -65,8 +65,7 @@ module RightConf
65
65
  exists = res.success? && res.output !~ /exec: bundle: not found/
66
66
  if exists
67
67
  report_check('Uninstalling existing versions of bundler')
68
- res = Command.execute('gem', 'uninstall', 'bundler', '-a', '-x',
69
- :abort_on_failure => 'Failed to uninstall bundler')
68
+ Command.execute('gem', 'uninstall', 'bundler', '-a', '-x')
70
69
  report_success
71
70
  end
72
71
  report_check("Installing bundler #{version}")
@@ -0,0 +1,80 @@
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
+ class Profile
15
+
16
+ include Singleton
17
+
18
+ # Load profile from disk on instantiation
19
+ def initialize
20
+ if File.exist?(profile_path)
21
+ @profile = YAML.load(IO.read(profile_path)) rescue {}
22
+ puts "LOADED PROFILE: #{@profile}"
23
+ else
24
+ @profile = {}
25
+ end
26
+ end
27
+
28
+ # Retrieve persisted configurator signature
29
+ #
30
+ # === Return
31
+ # signature(String):: Persisted configurator signature
32
+ def configurator_signature(key)
33
+ sigs = @profile[:configurator_signatures]
34
+ signature = sigs && sigs[key]
35
+ end
36
+
37
+ # Set signature for given configurator
38
+ #
39
+ # === Parameters
40
+ # key(String):: Configurator key
41
+ # signature(String):: Persisted configurator signature
42
+ #
43
+ # === Return
44
+ # true:: Always return true
45
+ def set_configurator_signature(key, signature)
46
+ @profile[:configurator_signatures] ||= {}
47
+ @profile[:configurator_signatures][key] = signature
48
+ persist
49
+ true
50
+ end
51
+
52
+ # Entire profile with all settings
53
+ #
54
+ # === Return
55
+ # profile(Hash):: Profile settings
56
+ def profile
57
+ @profile
58
+ end
59
+
60
+ protected
61
+
62
+ # Retrieve profile file path
63
+ #
64
+ # === Return
65
+ # path(String):: Profile file path
66
+ def profile_path
67
+ profile_path = ENV['RCONF_PROFILE'] || File.join(ENV['HOME'], '.rconf')
68
+ end
69
+
70
+ # Persist profile to file
71
+ #
72
+ # === Return
73
+ # true:: Always return true
74
+ def persist
75
+ File.open(profile_path, 'w') { |f| f.puts YAML.dump(@profile) } unless @profile.nil?
76
+ end
77
+
78
+ end
79
+ end
80
+
@@ -13,7 +13,7 @@ module RightConf
13
13
 
14
14
  MAJOR = 0
15
15
  MINOR = 5
16
- BUILD = 6
16
+ BUILD = 8
17
17
 
18
18
  VERSION = [MAJOR, MINOR, BUILD].map(&:to_s).join('.')
19
19
 
@@ -21,6 +21,9 @@ describe RightConf::Configurator do
21
21
  def test_setter(value)
22
22
  @custom_setting = value
23
23
  end
24
+ def run_darwin; end
25
+ alias :run_linux :run_darwin
26
+ alias :run_windows :run_darwin
24
27
  end
25
28
 
26
29
  class AnotherConfigurator
@@ -58,6 +61,18 @@ describe RightConf::Configurator do
58
61
  @configurator.validate.should be_nil
59
62
  end
60
63
 
64
+ it 'should persist the signature of configurators that ran' do
65
+ flexmock(RightConf::Profile.instance).should_receive(:set_configurator_signature).once
66
+ @configurator.run
67
+ end
68
+
69
+ it 'should skip configurators that have already run' do
70
+ flexmock(RightConf::Profile.instance).should_receive(:configurator_signature).with(:test).and_return('42')
71
+ flexmock(@configurator).should_receive(:signature).and_return('42')
72
+ flexmock(RightConf::Platform.instance).should_receive(:dispatch).never
73
+ @configurator.run
74
+ end
75
+
61
76
  end
62
77
 
63
78
 
@@ -0,0 +1,24 @@
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::Profile do
15
+
16
+ it 'should save profile to disk when changing values' do
17
+ flexmock(RightConf::Profile.instance).should_receive(:persist).once
18
+ RightConf::Profile.set_configurator_signature(:test, '42')
19
+ end
20
+
21
+ end
22
+
23
+
24
+
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rconf
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.5.6
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 5
9
+ - 8
10
+ version: 0.5.8
6
11
  platform: ruby
7
12
  authors:
8
13
  - Raphael Simon
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-03-06 00:00:00 -08:00
18
+ date: 2011-03-07 00:00:00 -08:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
@@ -21,6 +26,10 @@ dependencies:
21
26
  requirements:
22
27
  - - ~>
23
28
  - !ruby/object:Gem::Version
29
+ hash: 9
30
+ segments:
31
+ - 2
32
+ - 5
24
33
  version: "2.5"
25
34
  type: :development
26
35
  version_requirements: *id001
@@ -32,6 +41,10 @@ dependencies:
32
41
  requirements:
33
42
  - - ~>
34
43
  - !ruby/object:Gem::Version
44
+ hash: 25
45
+ segments:
46
+ - 0
47
+ - 9
35
48
  version: "0.9"
36
49
  type: :development
37
50
  version_requirements: *id002
@@ -70,6 +83,7 @@ files:
70
83
  - lib/rconf/platforms/darwin.rb
71
84
  - lib/rconf/platforms/linux.rb
72
85
  - lib/rconf/platforms/windows.rb
86
+ - lib/rconf/profile.rb
73
87
  - lib/rconf/progress_reporter.rb
74
88
  - lib/rconf/progress_reporters/base_reporter.rb
75
89
  - lib/rconf/progress_reporters/file_reporter.rb
@@ -85,6 +99,7 @@ files:
85
99
  - spec/configurators/ruby_configurator_spec.rb
86
100
  - spec/language_spec.rb
87
101
  - spec/platform_spec.rb
102
+ - spec/profile_spec.rb
88
103
  - spec/progress_reporters/base_reporter_spec.rb
89
104
  - spec/progress_reporters/file_reporter_spec.rb
90
105
  - spec/progress_reporters/stdout_reporter_spec.rb
@@ -104,17 +119,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
119
  requirements:
105
120
  - - ">="
106
121
  - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
107
125
  version: "0"
108
126
  required_rubygems_version: !ruby/object:Gem::Requirement
109
127
  none: false
110
128
  requirements:
111
129
  - - ">="
112
130
  - !ruby/object:Gem::Version
131
+ hash: 3
132
+ segments:
133
+ - 0
113
134
  version: "0"
114
135
  requirements: []
115
136
 
116
137
  rubyforge_project: rconf
117
- rubygems_version: 1.5.0
138
+ rubygems_version: 1.3.7
118
139
  signing_key:
119
140
  specification_version: 3
120
141
  summary: Cross platform environment configuration
@@ -126,6 +147,7 @@ test_files:
126
147
  - spec/configurators/ruby_configurator_spec.rb
127
148
  - spec/language_spec.rb
128
149
  - spec/platform_spec.rb
150
+ - spec/profile_spec.rb
129
151
  - spec/progress_reporters/base_reporter_spec.rb
130
152
  - spec/progress_reporters/file_reporter_spec.rb
131
153
  - spec/progress_reporters/stdout_reporter_spec.rb