soyuz 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd3caff53d1ac3465a10f1d59e22d45b951bd303
4
- data.tar.gz: 4e9e9253a004283522f0d50db48df1c1186ac59b
3
+ metadata.gz: c53680db5dda2fb6c19772c76e4f59a657a2579f
4
+ data.tar.gz: 56cdcfb9e19379ba71cd46ed6c25bd8713191a43
5
5
  SHA512:
6
- metadata.gz: d708cc3cccb3e5123f9a5c374980974ec6f42821c2af006bf6a9681ea2010f3e9893c73e1e30c5d22e09b937f2451a8b3bc269ebe618db5348603193c9f4a16d
7
- data.tar.gz: c6981603c6e7e5afb331bf86ef3d765d993066c32e60cb9d456a66096713d69ba5635e60d6f8ffe873740a3ca421b470711cfcfa4f9e969d260fa038baf7c0a2
6
+ metadata.gz: bfd38427d3133f9a1480a8bf02efa392586935cb535602fad61df3c0bfe0a45f53f3592b7da71bc660fc3220ee9c2c7fae6a91255932a4801cc80d3b4324aa42
7
+ data.tar.gz: d008cd34a69fd1f4fcb7b77027c95c87c84e816ea139adf734a47e1804db545220d325faf6bbac0913d73ddcb853a4ccabcdb8b54b75684a728d4f52badd8991
@@ -0,0 +1,4 @@
1
+ github_repo: sportngin/soyuz
2
+ semantic_versioning: true
3
+ branches_to_keep:
4
+ - master
@@ -0,0 +1,13 @@
1
+ defaults:
2
+ deploy_cmd: gem push *.gem
3
+ before_deploy_cmds:
4
+ - op tag-release
5
+ - sed -i '' -e "s/\".*/\"$(git tag | tail -1 | sed s/v//)\"/" lib/soyuz/version.rb
6
+ - git add lib/soyuz/version.rb
7
+ - git commit -m "Version Bump" && git push
8
+ - gem build soyuz.gemspec
9
+ after_deploy_cmds:
10
+ - rm *.gem
11
+ environments:
12
+ -
13
+ rubygems: {}
@@ -0,0 +1,11 @@
1
+ #### v0.1.0
2
+ #### v0.1.0
3
+
4
+ * Exit status non zero
5
+
6
+ > Nick LaMuro: Ian Ehlert: https://github.com/sportngin/soyuz/pull/11
7
+
8
+ * Soyuz support class for helper methods
9
+
10
+ > Nick LaMuro: Andy Fleener: https://github.com/sportngin/soyuz/pull/10
11
+
data/README.md CHANGED
@@ -21,20 +21,22 @@ Or install it yourself as:
21
21
  ```yaml
22
22
  # .soyuz.yml in the app you want to deploy with soyuz
23
23
  defaults:
24
- deploy_cmd: 'opsicle deploy $SOYUZ_ENVIRONMENT'
25
-
26
-
24
+ deploy_cmds:
25
+ - 'opsicle deploy $SOYUZ_ENVIRONMENT'
26
+
27
+
27
28
  environments:
28
- -
29
+ -
29
30
  production:
30
- deploy_cmd:
31
- -
32
- display: "Deploy"
33
- cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling"
31
+ deploy_cmds:
34
32
  -
35
- display: "Deploy with Migrations"
36
- cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling_migrations"
37
-
33
+ -
34
+ display: "Deploy"
35
+ cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling"
36
+ -
37
+ display: "Deploy with Migrations"
38
+ cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling_migrations"
39
+
38
40
  before_deploy_cmds:
39
41
  - accept-pull
40
42
  - tag-release
@@ -69,6 +71,11 @@ post-deploy-notes
69
71
  # post all of your deploy notes somewhere useful
70
72
  ```
71
73
 
74
+ ## Deprications
75
+
76
+ `:deploy_cmd` has be depricated in favor of `:deploy_cmds` to better
77
+ match the before_deploy_cmds and after_deploy_cmds symantics
78
+
72
79
  ## Contributing
73
80
 
74
81
  1. Fork it ( http://github.com/sportngin/soyuz/fork )
@@ -3,5 +3,4 @@ require "soyuz/config"
3
3
  require "soyuz/deploy"
4
4
 
5
5
  module Soyuz
6
- # Your code goes here...
7
6
  end
@@ -9,12 +9,13 @@ module Soyuz
9
9
  end
10
10
 
11
11
  def self.build(cmd)
12
- cmd.is_a?(Array) ? CommandChoice.new(cmd) : new(cmd)
12
+ return if cmd.nil? || cmd.empty?
13
+ cmd.is_a?(Array) ? CommandChoice.new(cmd) : new(cmd)
13
14
  end
14
15
 
15
16
  def run
16
17
  say("<%= color('executing [#{@cmd}]...', :green) %>")
17
- system(@cmd)
18
+ exit(false) unless system(@cmd)
18
19
  end
19
20
  end
20
21
  end
@@ -1,6 +1,8 @@
1
1
  require_relative "command"
2
+
2
3
  module Soyuz
3
4
  class CommandChoice
5
+
4
6
  def initialize(choices)
5
7
  raise ArgumentError, "Choices must be an array" unless choices.is_a?(Array)
6
8
  @choices = choices
@@ -11,7 +13,7 @@ module Soyuz
11
13
  say "#{index+1}) #{choice[:display]}"
12
14
  end
13
15
  choice = ask("? ", Integer) { |q| q.in = 1..@choices.length }
14
- Command.new(@choices[choice-1][:cmd]).run
16
+ Command.build(@choices[choice-1][:cmd]).run
15
17
  end
16
18
  end
17
19
  end
@@ -1,7 +1,11 @@
1
1
  require 'safe_yaml'
2
2
  require_relative 'environment'
3
+ require_relative 'support'
4
+
3
5
  module Soyuz
4
6
  class Config
7
+ include Soyuz::Support
8
+
5
9
  def initialize(config_file)
6
10
  @config_file = config_file
7
11
  end
@@ -37,27 +41,11 @@ module Soyuz
37
41
  def valid?
38
42
  begin
39
43
  File.exists?(@config_file) && config_data.is_a?(Hash)
44
+ environments.all?{|env| env.valid?}
40
45
  rescue StandardError
41
46
  false
42
47
  end
43
48
  end
44
-
45
- def symbolize_keys(hash)
46
- return hash unless hash.is_a?(Hash)
47
- hash.inject({}){|result, (key, value)|
48
- new_key = case key
49
- when String then key.to_sym
50
- else key
51
- end
52
- new_value = case value
53
- when Hash then symbolize_keys(value)
54
- when Array then value.map{|el| symbolize_keys(el) }
55
- else value
56
- end
57
- result[new_key] = new_value
58
- result
59
- }
60
- end
61
49
  end
62
50
  InvalidConfig = Class.new(StandardError)
63
51
  end
@@ -1,11 +1,22 @@
1
1
  require_relative 'command'
2
+
2
3
  module Soyuz
3
4
  class Environment
4
5
  def initialize(attributes={}, defaults={})
5
6
  set_attributes(attributes, defaults)
7
+
8
+ if [:deploy_cmds, :deploy_cmd].all?{ |attr| @attributes.has_key?(attr) }
9
+ raise ArgumentError, "Only one definiton of deploy_cmd or deploy_cmds is allowed"
10
+ end
11
+
6
12
  build
7
13
  end
8
14
 
15
+ def valid?
16
+ # If the environment built then it's valid
17
+ true
18
+ end
19
+
9
20
  def before_callbacks
10
21
  @before_callbacks.each do|cmd|
11
22
  cmd.run
@@ -19,7 +30,9 @@ module Soyuz
19
30
  end
20
31
 
21
32
  def deploy
22
- @deploy_cmd.run
33
+ @deploy_cmds.each do |cmd|
34
+ cmd.run
35
+ end
23
36
  end
24
37
 
25
38
  def name
@@ -34,7 +47,9 @@ module Soyuz
34
47
  end
35
48
 
36
49
  def build
37
- @deploy_cmd = Command.build(@attributes[:deploy_cmd])
50
+ # deploy_cmd is deprecated and will be removed in a future version
51
+ @deploy_cmds = Array(Command.build(@attributes[:deploy_cmd]))
52
+ @deploy_cmds += Array(@attributes[:deploy_cmds]).compact.map{|cmd| Command.build(cmd) }
38
53
  @before_callbacks = Array(@attributes[:before_deploy_cmds]).compact.map{|cmd| Command.build(cmd) }
39
54
  @after_callbacks = Array(@attributes[:after_deploy_cmds]).compact.map{|cmd| Command.build(cmd) }
40
55
  end
@@ -0,0 +1,27 @@
1
+ module Soyuz
2
+ module Support
3
+
4
+ private
5
+
6
+ def symbolize_keys(objekt)
7
+ case objekt
8
+ when Hash then symbolize_hash(objekt)
9
+ when Array then symbolize_array(objekt)
10
+ else objekt
11
+ end
12
+ end
13
+
14
+ def symbolize_hash(hash)
15
+ hash.inject({}) do |result, (key, value)|
16
+ new_key = key.to_sym rescue key
17
+ result[new_key] = symbolize_keys(value)
18
+ result
19
+ end
20
+ end
21
+
22
+ def symbolize_array(array)
23
+ array.map {|val| symbolize_keys(val)}
24
+ end
25
+
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Soyuz
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -12,6 +12,9 @@ environments:
12
12
  -
13
13
  display: "Deploy with Migrations"
14
14
  cmd: "echo deploying with migrations $SOYUZ_ENVIRONMENT"
15
+ deploy_cmds:
16
+ - "echo deploy command 1"
17
+ - "echo deploy command 2"
15
18
 
16
19
  before_deploy_cmds:
17
20
  - "echo before deploy callback"
@@ -15,13 +15,27 @@ module Soyuz
15
15
  end
16
16
 
17
17
  context "#run" do
18
+
18
19
  it "creates a command for the given choice" do
19
20
  expect(subject).to receive(:say).with("1) choice1").once
20
21
  expect(subject).to receive(:say).with("2) choice2").once
21
22
  expect(subject).to receive(:ask).with(instance_of(String), Integer).and_return(1).once
22
- expect(Command).to receive(:new).with("echo choice1").and_return(command_double)
23
+ expect(Command).to receive(:build).with("echo choice1").and_return(command_double)
23
24
  subject.run
24
25
  end
26
+
27
+ context "Nested choices" do
28
+ let(:nested_choices) { [{display: "choice1.1", cmd: "echo choice1.1"}, {display: "choice1.2", cmd: "echo choice1.2" }] }
29
+ let(:choices){ [{display: "choice1", cmd: nested_choices }, {display: "choice2", cmd: "echo choice2" }] }
30
+
31
+ it "creates a command for the given choice" do
32
+ expect(subject).to receive(:say).with("1) choice1").once
33
+ expect(subject).to receive(:say).with("2) choice2").once
34
+ expect(subject).to receive(:ask).with(instance_of(String), Integer).and_return(1).once
35
+ expect(Command).to receive(:build).with(nested_choices).and_return(command_double)
36
+ subject.run
37
+ end
38
+ end
25
39
  end
26
40
 
27
41
  end
@@ -18,8 +18,16 @@ module Soyuz
18
18
  end
19
19
 
20
20
  context "#run" do
21
+ before(:each) { allow(subject).to receive(:say) }
22
+
21
23
  it "to make a system call" do
24
+ expect(subject).to receive(:system).and_return(true)
25
+ subject.run
26
+ end
27
+
28
+ it "exits if the command returns a non-zero exist status" do
22
29
  expect(subject).to receive(:system)
30
+ expect(subject).to receive(:exit)
23
31
  subject.run
24
32
  end
25
33
  end
@@ -2,51 +2,64 @@ require 'spec_helper'
2
2
  require 'soyuz/environment'
3
3
  module Soyuz
4
4
  describe Environment do
5
- let(:attributes){ {environment: {deploy_cmd: "echo derp", before_deploy_cmds: ['echo before', 'echo more before'], after_deploy_cmds: ['echo after', 'echo another after']}} }
5
+ let(:attributes){ {environment: {deploy_cmds: ["echo herp", "echo blarg"], before_deploy_cmds: ['echo before', 'echo more before'], after_deploy_cmds: ['echo after', 'echo another after']}} }
6
6
  subject{ Environment.new(attributes) }
7
7
  let(:cmd){ double("Command") }
8
8
 
9
9
  context ".new" do
10
+
10
11
  subject{ Environment }
12
+
13
+ context "invalid deploy command" do
14
+
15
+ let(:attributes){ {environment: {deploy_cmd: "echo derp", deploy_cmds: ["echo herp", "echo blarg"], before_deploy_cmds: ['echo before', 'echo more before'], after_deploy_cmds: ['echo after', 'echo another after']}} }
16
+
17
+ it "Rasies an invalid configuration error if both deploy_cmd and deploy_cmds are defined" do
18
+ expect{ subject.new(attributes) }.to raise_error(ArgumentError)
19
+ end
20
+
21
+ end
22
+
11
23
  it "sets the environment name" do
12
24
  expect(subject.name).to_not be_nil
13
25
  subject.new(attributes)
14
26
  end
15
- it "sets the attributes" do
16
- allow_any_instance_of(subject).to receive(:build)
17
- expect_any_instance_of(subject).to receive(:set_attributes)
18
- subject.new(attributes)
19
- end
20
27
 
21
28
  it "builds the environment" do
22
- allow_any_instance_of(subject).to receive(:set_attributes)
23
29
  expect_any_instance_of(subject).to receive(:build)
24
30
  subject.new(attributes)
25
31
  end
32
+
26
33
  end
27
34
 
28
35
  context "#deploy" do
36
+
29
37
  it "runs the deploy command" do
30
38
  allow(Command).to receive(:new).and_return(cmd)
31
- expect(cmd).to receive(:run)
39
+ expect(cmd).to receive(:run).exactly(2).times
32
40
  subject.deploy
33
41
  end
42
+
34
43
  end
35
44
 
36
45
  context "#before_callbacks" do
46
+
37
47
  it "runs all of the before callbacks" do
38
48
  allow(Command).to receive(:new).and_return(cmd)
39
49
  expect(cmd).to receive(:run).twice
40
50
  subject.before_callbacks
41
51
  end
52
+
42
53
  end
43
54
 
44
55
  context "#after_callbacks" do
56
+
45
57
  it "runs all of the after callbacks" do
46
58
  allow(Command).to receive(:new).and_return(cmd)
47
59
  expect(cmd).to receive(:run).twice
48
60
  subject.after_callbacks
49
61
  end
62
+
50
63
  end
51
64
  end
52
65
  end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'soyuz/support'
3
+
4
+ describe Soyuz::Support do
5
+
6
+ let(:soyuz_class) { Class.new { include Soyuz::Support }.new }
7
+
8
+ describe "#symbolize_keys" do
9
+ context "for a hash" do
10
+ subject { {'foo' => 'bar'} }
11
+
12
+ it "converts all the keys to symbols" do
13
+ new_keys = soyuz_class.send(:symbolize_keys, subject).keys
14
+ expect(new_keys).to eq([:foo])
15
+ end
16
+ end
17
+
18
+ context "for a hash with a hash for a value" do
19
+ subject { {'foo' => {'bar' => 'baz'}} }
20
+
21
+ it "converts all the keys nested in the array" do
22
+ value_keys = soyuz_class.send(:symbolize_keys, subject).values.first.keys
23
+ expect(value_keys).to eq([:bar])
24
+ end
25
+ end
26
+
27
+ context "for a hash with an array for a value" do
28
+ subject { {'foo' => [{'bar' => 'baz'}]} }
29
+
30
+ it "converts all the keys nested in the array" do
31
+ array_keys = soyuz_class.send(:symbolize_keys, subject).values.first.first.keys
32
+ expect(array_keys).to eq([:bar])
33
+ end
34
+ end
35
+
36
+ context "with a non-string/non-symbol key" do
37
+ subject { {1 => 2} }
38
+
39
+ it "does not convert the key" do
40
+ new_keys = soyuz_class.send(:symbolize_keys, subject).keys
41
+ expect(new_keys).to eq([1])
42
+ end
43
+ end
44
+
45
+ context "when a non-hash is passed in" do
46
+ subject { [1,2] }
47
+
48
+ it "does not convert the key" do
49
+ result = soyuz_class.send(:symbolize_keys, subject)
50
+ expect(result).to eq([1, 2])
51
+ end
52
+ end
53
+
54
+ context "with a hash nested in an array" do
55
+ subject { [{'foo' => 'bar'}] }
56
+
57
+ it "it converts the keys" do
58
+ result = soyuz_class.send(:symbolize_keys, subject)
59
+ expect(result).to eq([{:foo => 'bar'}])
60
+ end
61
+ end
62
+
63
+ context "with a hash deeply nested in multiple arrays" do
64
+ subject { [[[{'foo' => 'bar'}]]] }
65
+
66
+ it "it converts the keys" do
67
+ result = soyuz_class.send(:symbolize_keys, subject)
68
+ expect(result).to eq([[[{:foo => 'bar'}]]])
69
+ end
70
+ end
71
+ end
72
+
73
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soyuz
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Fleener
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-06 00:00:00.000000000 Z
11
+ date: 2014-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gli
@@ -146,10 +146,13 @@ extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
148
148
  - ".gitignore"
149
+ - ".octopolo.yml"
149
150
  - ".rspec"
150
151
  - ".ruby-gemset"
151
152
  - ".ruby-version"
153
+ - ".soyuz.yml"
152
154
  - ".travis.yml"
155
+ - CHANGELOG.markdown
153
156
  - Gemfile
154
157
  - Guardfile
155
158
  - LICENSE.txt
@@ -162,6 +165,7 @@ files:
162
165
  - lib/soyuz/config.rb
163
166
  - lib/soyuz/deploy.rb
164
167
  - lib/soyuz/environment.rb
168
+ - lib/soyuz/support.rb
165
169
  - lib/soyuz/version.rb
166
170
  - soyuz.gemspec
167
171
  - spec/files/soyuz_example.yml
@@ -170,6 +174,7 @@ files:
170
174
  - spec/soyuz/config_spec.rb
171
175
  - spec/soyuz/deploy_spec.rb
172
176
  - spec/soyuz/environment_spec.rb
177
+ - spec/soyuz/support_spec.rb
173
178
  - spec/spec_helper.rb
174
179
  homepage: https://github.com/sportngin/soyuz
175
180
  licenses:
@@ -202,4 +207,5 @@ test_files:
202
207
  - spec/soyuz/config_spec.rb
203
208
  - spec/soyuz/deploy_spec.rb
204
209
  - spec/soyuz/environment_spec.rb
210
+ - spec/soyuz/support_spec.rb
205
211
  - spec/spec_helper.rb