reservoir 0.0.4 → 0.1.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.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  Gemfile.lock
4
4
  pkg/*
5
5
  .rvmrc
6
+ sample.yml
@@ -1,9 +1,10 @@
1
- version: 0.0.4
2
- # remotes:
3
- # - user: deployer
4
- # server: a4word.com
5
- # - user:
6
- # server:
1
+ version: 0.1.0
2
+ display:
3
+ filename: @@SERVER_NAME@@.reservoir
4
+ mode: data_only
5
+ remotes:
6
+ - user: deployer
7
+ server: a4word.com
7
8
  scripts:
8
9
  - name: ruby
9
10
  - name: rvm
@@ -2,17 +2,21 @@ module Reservoir
2
2
 
3
3
  class Application
4
4
 
5
- attr_accessor :print_mode
5
+ attr_accessor :display
6
6
 
7
7
  def initialize(data = {})
8
- @print_mode = data[:print_mode] || :stdio
8
+ @display = data[:display] || :stdio
9
+ @file_resets = []
10
+ @version_displayed_already = false
9
11
  end
10
12
 
11
- def print_mode=(val)
12
- @print_mode = val || :stdio
13
+ def display=(val)
14
+ @display = val || :stdio
13
15
  end
14
16
 
15
- def welcome_message
17
+ def version_message
18
+ return nil if @version_displayed_already
19
+ @version_displayed_already = true
16
20
  print "reservoir, version #{Reservoir::VERSION}\n"
17
21
  end
18
22
 
@@ -25,7 +29,7 @@ module Reservoir
25
29
  end
26
30
 
27
31
  def project_message(project)
28
- print "\n===\nLoading Project: #{project.name} [#{project.file}]\n===\n"
32
+ print "server: #{project.name}\nfile: #{project.file}\n"
29
33
  end
30
34
 
31
35
  def which_version_message(script,version,path)
@@ -39,14 +43,14 @@ module Reservoir
39
43
  usage_message
40
44
  return
41
45
  end
42
-
43
- welcome_message
44
46
 
45
47
  if ["--version","-version","-v","--v","version"].include?(args[0])
48
+ version_message
46
49
  return
47
50
  end
48
51
 
49
52
  if ["--help","-help","-h","--h","help"].include?(args[0])
53
+ version_message
50
54
  usage_message
51
55
  return
52
56
  end
@@ -55,8 +59,10 @@ module Reservoir
55
59
  args.each do |filename|
56
60
  all_projects = Project.load_from_file(filename)
57
61
  all_projects.each do |p|
58
- print_mode = p.output
59
- project_message(p)
62
+ self.display = p.display
63
+ self.flush
64
+ version_message
65
+ project_message(p) unless is_data_only?
60
66
  p.scripts.each do |script|
61
67
  which_script = p.template(WhichScript)
62
68
  version = p.template(Version)
@@ -69,18 +75,35 @@ module Reservoir
69
75
  rescue
70
76
  exception_message($!)
71
77
  end
72
- print ""
78
+ end
79
+
80
+ def flush
81
+ return if @file_resets.include?(display)
82
+ return unless is_file?
83
+ @version_displayed_already = false
84
+ @file_resets<< display
85
+ File.delete(@display[:filename]) if File.exist?(@display[:filename])
73
86
  end
74
87
 
75
88
  def print(output)
76
- if @print_mode == :stdio
89
+ if @display == :stdio
77
90
  STDOUT.puts output
78
- elsif @print_mode.kind_of?(Hash) && !@print_mode[:file].nil?
79
- open(@print_mode[:file], 'a') { |f| f.puts(output) }
91
+ elsif is_file?
92
+ open(@display[:filename], 'a+') { |f| f.puts(output) }
80
93
  else
81
94
  output
82
95
  end
83
96
  end
97
+
98
+ private
99
+
100
+ def is_file?
101
+ @display.kind_of?(Hash) && !@display[:filename].nil?
102
+ end
103
+
104
+ def is_data_only?
105
+ @display.kind_of?(Hash) && @display[:mode] == "data_only"
106
+ end
84
107
 
85
108
  end
86
109
 
@@ -2,27 +2,26 @@ module Reservoir
2
2
 
3
3
  class Project
4
4
 
5
- attr_accessor :scripts, :file, :remote_user, :remote_server, :output
5
+ attr_accessor :scripts, :file, :remote_user, :remote_server, :display
6
6
 
7
7
  def initialize(data = {})
8
8
  @file = data[:file]
9
9
  @remote_user = data[:remote_user]
10
10
  @remote_server = data[:remote_server]
11
11
  @scripts = data[:scripts] || []
12
- @output = data[:output]
12
+ @display = Project.sym_entries(data[:display]) || :stdio
13
13
  end
14
14
 
15
15
  def self.load_from_file(file)
16
16
  options = YAML::load( File.open( file ) )
17
- default_args = { file: file, scripts: options["scripts"].each.collect { |script| script["name"] }, output: options["output"] }
18
-
17
+ default_args = { file: file, scripts: options["scripts"].each.collect { |script| script["name"] }, display: sym_entries(options["display"]) }
19
18
  all_projects = []
20
19
  all_servers = options["remotes"]
21
20
  if all_servers.nil?
22
21
  all_projects << Project.new(default_args)
23
22
  else
24
23
  all_servers.each do |remote|
25
- all_projects << Project.new(default_args.merge( remote_user: remote["user"], remote_server: remote["server"], output: resolve_placeholders(default_args[:output],remote)))
24
+ all_projects << Project.new(default_args.merge( remote_user: remote["user"], remote_server: remote["server"], display: resolve_placeholders(default_args[:display],remote)))
26
25
  end
27
26
  end
28
27
  all_projects
@@ -39,11 +38,20 @@ module Reservoir
39
38
  end
40
39
 
41
40
  private
42
-
41
+
42
+ def self.sym_entries(var)
43
+ return var if var.nil? || var.kind_of?(Symbol)
44
+ return var.to_sym if var.kind_of?(String)
45
+ results = {}
46
+ var.each { |key,val| results[key.to_sym] = val }
47
+ results
48
+ end
49
+
43
50
  def self.resolve_placeholders(var,remote)
44
51
  return var if var.nil?
45
- var = var.gsub("@@SERVER_NAME@@",remote["server"])
46
- var
52
+ results = {}
53
+ var.each { |key,val| results[key.to_sym] = val.gsub("@@SERVER_NAME@@",remote["server"]) }
54
+ results
47
55
  end
48
56
 
49
57
  end
@@ -1,6 +1,6 @@
1
1
  module Reservoir
2
2
 
3
- VERSION = "0.0.4"
3
+ VERSION = "0.1.0"
4
4
 
5
5
  class Version
6
6
 
@@ -7,8 +7,10 @@ module Reservoir
7
7
  before (:each) do
8
8
  @project_file = File.dirname(__FILE__) + '/sample_project.yml'
9
9
  @project_file2 = File.dirname(__FILE__) + '/sample_project2.yml'
10
+ @project_file3 = File.dirname(__FILE__) + '/sample_project3.yml'
11
+
10
12
  @application = Application.new
11
- @application.print_mode = :string
13
+ @application.display = :string
12
14
 
13
15
  Caller.stub!(:exec).with("which ruby").and_return("/path/to/ruby")
14
16
  Caller.stub!(:exec).with("which rvm").and_return("/path/to/rvm")
@@ -32,12 +34,12 @@ module Reservoir
32
34
  describe "#run" do
33
35
 
34
36
  describe "no args" do
35
-
37
+
36
38
  it "should handle nil args" do
37
39
  @application.should_receive(:usage_message)
38
40
  @application.run(nil)
39
41
  end
40
-
42
+
41
43
  it "should handle empty args" do
42
44
  @application.should_receive(:usage_message)
43
45
  @application.run([])
@@ -46,22 +48,22 @@ module Reservoir
46
48
  end
47
49
 
48
50
  describe "help" do
49
-
51
+
50
52
  ["--help","-help","-h","--h","help"].each do |help_name|
51
53
  it "should support --help" do
52
- @application.should_receive(:welcome_message)
54
+ @application.should_receive(:version_message)
53
55
  @application.should_receive(:usage_message)
54
56
  @application.run([help_name])
55
57
  end
56
58
  end
57
-
59
+
58
60
  end
59
61
 
60
62
  describe "version" do
61
-
63
+
62
64
  ["--version","-version","-v","--v","version"].each do |help_name|
63
65
  it "should support --help" do
64
- @application.should_receive(:welcome_message)
66
+ @application.should_receive(:version_message)
65
67
  @application.should_not_receive(:exception_message)
66
68
  @application.run([help_name])
67
69
  end
@@ -72,7 +74,6 @@ module Reservoir
72
74
  describe "invalid project file" do
73
75
 
74
76
  it "should fail gracefully" do
75
- @application.should_receive(:welcome_message)
76
77
  @application.should_receive(:exception_message)
77
78
  @application.run(["blah.yml"])
78
79
  end
@@ -80,9 +81,9 @@ module Reservoir
80
81
  end
81
82
 
82
83
  describe "valid project files" do
83
-
84
+
84
85
  it "should handle one file" do
85
- @application.should_receive(:welcome_message)
86
+ @application.should_receive(:version_message)
86
87
  @application.should_receive(:project_message)
87
88
  @application.should_receive(:which_version_message).with("ruby","1.2.3","/path/to/ruby")
88
89
  @application.should_receive(:which_version_message).with("rvm","1.2.4","/path/to/rvm")
@@ -90,55 +91,72 @@ module Reservoir
90
91
  @application.should_not_receive(:exception_message)
91
92
  @application.run([@project_file])
92
93
  end
93
-
94
+
94
95
  it "should handle multiple file" do
95
- @application.should_receive(:welcome_message)
96
+ @application.should_receive(:version_message).exactly(2).times
96
97
  @application.should_receive(:project_message).exactly(2).times
97
98
  @application.should_receive(:which_version_message).exactly(4).times
98
99
  @application.should_not_receive(:exception_message)
99
100
  @application.run([@project_file,@project_file2])
100
- File.exists?("a4word.com.reservoir")
101
+ end
102
+
103
+ it "should save files to disk" do
104
+ @application.run([@project_file,@project_file2])
105
+ File.exists?("a4word.com.reservoir").should == true
106
+ end
107
+
108
+
109
+ it "should clean up existing files" do
110
+ open("a4word.com.reservoir", 'a+') { |f| f.puts("garble") }
111
+ @application.run([@project_file,@project_file2])
112
+ IO.read("a4word.com.reservoir").should == "reservoir, version 0.1.0\nserver: aforward@a4word.com\nfile: /Users/aforward/tp/projects/cenx/reservoir/spec/sample_project2.yml\nruby : 1.2.6 : /path/to/a4word/ruby\n"
113
+ end
114
+
115
+ it "should support mode: data_only" do
116
+ open("a4word.com.reservoir", 'a+') { |f| f.puts("garble") }
117
+ @application.run([@project_file3])
118
+ IO.read("a4word.com.reservoir").should == "reservoir, version 0.1.0\nruby : 1.2.6 : /path/to/a4word/ruby\n"
101
119
  end
102
120
 
103
121
  end
104
122
 
105
123
  end
106
-
107
- describe "#print_mode" do
124
+
125
+ describe "#display" do
108
126
 
109
127
  it "should be settable" do
110
- @application.print_mode = :a
111
- @application.print_mode.should == :a
128
+ @application.display = :a
129
+ @application.display.should == :a
112
130
  end
113
131
 
114
132
  it "should default to stdio" do
115
- @application.print_mode = nil
116
- @application.print_mode.should == :stdio
133
+ @application.display = nil
134
+ @application.display.should == :stdio
117
135
  end
118
136
 
119
137
  it "should default to :stdio" do
120
- Application.new.print_mode.should == :stdio
138
+ Application.new.display.should == :stdio
121
139
  end
122
140
 
123
141
  it "should be settable in constructor" do
124
- Application.new(print_mode: :blah).print_mode.should == :blah
142
+ Application.new(display: :blah).display.should == :blah
125
143
  end
126
144
 
127
145
  end
128
-
146
+
129
147
  describe "#messages" do
130
148
 
131
- it "should welcome_message" do
132
- @application.welcome_message.should == "reservoir, version 0.0.4\n"
149
+ it "should version_message" do
150
+ @application.version_message.should == "reservoir, version 0.1.0\n"
133
151
  end
134
-
152
+
135
153
  it "should usage_message" do
136
154
  @application.usage_message.should == "USAGE: reservoir <project_file1> <project_file2> ...\n or reservoir help to see this message\n"
137
155
  end
138
156
 
139
157
  it "should project_message" do
140
158
  p = Project.new(file: "blah.txt")
141
- @application.project_message(p).should == "\n===\nLoading Project: local [blah.txt]\n===\n"
159
+ @application.project_message(p).should == "server: local\nfile: blah.txt\n"
142
160
  end
143
161
 
144
162
  it "should exception_message" do
@@ -148,29 +166,29 @@ module Reservoir
148
166
  @application.exception_message($!).split("\n")[0].should == "ERROR: No such file or directory - garble.txt"
149
167
  end
150
168
  end
151
-
169
+
152
170
  it "should which_version_message" do
153
171
  @application.which_version_message("a","1.2.3","/path/to/a").should == "a : 1.2.3 : /path/to/a\n"
154
172
  end
155
-
173
+
156
174
 
157
175
  end
158
176
 
159
177
  describe "#print" do
160
178
 
161
- it "should return a string if print_mode :string" do
162
- @application.print_mode = :string
179
+ it "should return a string if display :string" do
180
+ @application.display = :string
163
181
  @application.print("x").should == "x"
164
182
  end
165
183
 
166
- it "should write to output if print_mode :stdio" do
184
+ it "should write to output if display :stdio" do
167
185
  STDOUT.should_receive(:puts).with("x")
168
- @application.print_mode = :stdio
186
+ @application.display = :stdio
169
187
  @application.print("x")
170
188
  end
171
189
 
172
190
  it "should write to file" do
173
- @application.print_mode = { file: "output.txt" }
191
+ @application.display = { filename: "output.txt" }
174
192
  @application.print("x")
175
193
  @application.print("y")
176
194
  IO.read("output.txt").should == "x\ny\n"
data/spec/project_spec.rb CHANGED
@@ -19,6 +19,23 @@ module Reservoir
19
19
  Project.new(remote_server: "a4word.com", remote_user: "deployer").name.should == "deployer@a4word.com"
20
20
  end
21
21
 
22
+ end
23
+
24
+ describe "display" do
25
+
26
+ it "should default to stdio" do
27
+ Project.new.display.should == :stdio
28
+ end
29
+
30
+ it "should assume strings are files" do
31
+ Project.new(display: { :filename => "blah" }).display.should == { filename: "blah" }
32
+ end
33
+
34
+ it "should assume symbols are as-is" do
35
+ Project.new(display: :string).display.should == :string
36
+ end
37
+
38
+
22
39
  end
23
40
 
24
41
  describe "#load_from_file" do
@@ -30,7 +47,7 @@ module Reservoir
30
47
  all.size.should == 1
31
48
  project = all.first
32
49
  project.scripts.should == [ "ruby", "rvm", "node"]
33
- project.output.should == :string
50
+ project.display.should == :string
34
51
  end
35
52
 
36
53
  end
@@ -47,7 +64,7 @@ module Reservoir
47
64
  t = project.template(clazz)
48
65
  t.remote_user.should == 'aforward'
49
66
  t.remote_server.should == 'a4word.com'
50
- project.output.should == "a4word.com.reservoir"
67
+ project.display.should == { :filename => "a4word.com.reservoir" }
51
68
  end
52
69
 
53
70
  it "should ignore remote data if not set" do
@@ -1,5 +1,5 @@
1
- version: 0.0.4
2
- output: :string
1
+ version: 0.1.0
2
+ display: string
3
3
  scripts:
4
4
  - name: ruby
5
5
  - name: rvm
@@ -1,5 +1,6 @@
1
- version: 0.0.4
2
- output: @@SERVER_NAME@@.reservoir
1
+ version: 0.1.0
2
+ display:
3
+ filename: @@SERVER_NAME@@.reservoir
3
4
  remotes:
4
5
  - user: aforward
5
6
  server: a4word.com
@@ -0,0 +1,9 @@
1
+ version: 0.1.0
2
+ display:
3
+ filename: @@SERVER_NAME@@.reservoir
4
+ mode: data_only
5
+ remotes:
6
+ - user: aforward
7
+ server: a4word.com
8
+ scripts:
9
+ - name: ruby
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reservoir
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-09-15 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70343763104020 !ruby/object:Gem::Requirement
16
+ requirement: &70307851600340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70343763104020
24
+ version_requirements: *70307851600340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: autotest
27
- requirement: &70343763103600 !ruby/object:Gem::Requirement
27
+ requirement: &70307851599920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70343763103600
35
+ version_requirements: *70307851599920
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: autotest-fsevent
38
- requirement: &70343763103140 !ruby/object:Gem::Requirement
38
+ requirement: &70307851599460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70343763103140
46
+ version_requirements: *70307851599460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rb-fsevent
49
- requirement: &70343763102720 !ruby/object:Gem::Requirement
49
+ requirement: &70307851599040 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70343763102720
57
+ version_requirements: *70307851599040
58
58
  description: Helps manage cloud-based server instances by enumerating, comparing and
59
59
  diff'ing application configurations
60
60
  email:
@@ -84,6 +84,7 @@ files:
84
84
  - spec/project_spec.rb
85
85
  - spec/sample_project.yml
86
86
  - spec/sample_project2.yml
87
+ - spec/sample_project3.yml
87
88
  - spec/spec_helper.rb
88
89
  - spec/version_spec.rb
89
90
  - spec/which_script_spec.rb
@@ -117,6 +118,7 @@ test_files:
117
118
  - spec/project_spec.rb
118
119
  - spec/sample_project.yml
119
120
  - spec/sample_project2.yml
121
+ - spec/sample_project3.yml
120
122
  - spec/spec_helper.rb
121
123
  - spec/version_spec.rb
122
124
  - spec/which_script_spec.rb