soyuz 0.0.3 → 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.
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