volley 0.1.0.alpha4 → 0.1.0.alpha5

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.
Files changed (48) hide show
  1. data/.gitignore +3 -1
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -1
  4. data/Rakefile +34 -0
  5. data/bin/volley +88 -40
  6. data/conf/common.volleyfile +12 -29
  7. data/features/publisher.feature +45 -0
  8. data/features/step_definitions/common_steps.rb +9 -0
  9. data/features/step_definitions/publisher_steps.rb +92 -0
  10. data/features/support/env.rb +19 -0
  11. data/init/Volleyfile +1 -104
  12. data/lib/volley/descriptor.rb +28 -0
  13. data/lib/volley/dsl/action.rb +31 -0
  14. data/lib/volley/dsl/argument.rb +96 -0
  15. data/lib/volley/dsl/file.rb +70 -0
  16. data/lib/volley/dsl/plan.rb +110 -235
  17. data/lib/volley/dsl/project.rb +10 -2
  18. data/lib/volley/dsl/pull_action.rb +50 -0
  19. data/lib/volley/dsl/push_action.rb +101 -0
  20. data/lib/volley/dsl/stage.rb +40 -0
  21. data/lib/volley/dsl.rb +7 -0
  22. data/lib/volley/log.rb +22 -8
  23. data/lib/volley/meta.rb +24 -0
  24. data/lib/volley/publisher/amazons3.rb +67 -66
  25. data/lib/volley/publisher/base.rb +81 -42
  26. data/lib/volley/publisher/exceptions.rb +7 -0
  27. data/lib/volley/publisher/local.rb +41 -27
  28. data/lib/volley/scm/base.rb +10 -0
  29. data/lib/volley.rb +38 -12
  30. data/spec/descriptor_spec.rb +39 -0
  31. data/spec/dsl_plan_spec.rb +103 -0
  32. data/spec/dsl_project_spec.rb +36 -0
  33. data/spec/dsl_volleyfile_spec.rb +21 -0
  34. data/spec/meta_spec.rb +26 -0
  35. data/spec/publisher_spec.rb +92 -0
  36. data/test/dsl/amazons3_publisher.volleyfile +6 -0
  37. data/test/dsl/local_publisher.volleyfile +4 -0
  38. data/test/dsl/log_console.volleyfile +2 -0
  39. data/test/dsl/log_file.volleyfile +2 -0
  40. data/test/dsl/simple.volleyfile +17 -0
  41. data/test/meta.yml +3 -0
  42. data/test/project/Rakefile +13 -0
  43. data/test/project/Volleyfile +18 -0
  44. data/test/trunk-1.tgz +0 -0
  45. data/volley.gemspec +2 -1
  46. metadata +67 -5
  47. data/lib/volley/config.rb +0 -8
  48. data/lib/volley/volley_file.rb +0 -45
@@ -3,8 +3,8 @@ module Volley
3
3
  class Local < Base
4
4
 
5
5
  def projects
6
- puts "#@directory"
7
- Dir["#@directory/*"].map {|e| e.gsub(/#@directory\//,"")}
6
+ l = Dir["#@directory/*"]
7
+ l.map {|e| e.gsub(/#@directory\//,"")}
8
8
  end
9
9
 
10
10
  def branches(pr)
@@ -12,7 +12,29 @@ module Volley
12
12
  end
13
13
 
14
14
  def versions(pr, br)
15
- Dir["#@directory/#{pr}/#{br}/*"].map {|e| e.gsub(/#@directory\/#{pr}\/#{br}\//,"")}
15
+ Dir["#@directory/#{pr}/#{br}/*"].map do |e|
16
+ e.gsub(/#@directory\/#{pr}\/#{br}\//,"")
17
+ end
18
+ end
19
+
20
+ def exists?(project, branch, version)
21
+ d = "#@directory/#{project}/#{branch}/#{version}"
22
+ File.directory?(d)
23
+ end
24
+
25
+ def contents(project, branch, version)
26
+ d = "#@directory/#{project}/#{branch}/#{version}"
27
+ Dir["#{d}/*"].map do |e|
28
+ e.gsub("#{d}/","")
29
+ end
30
+ end
31
+
32
+ def delete_project(project)
33
+ FileUtils.rm_rf("#@directory/#{project}")
34
+ true
35
+ rescue => e
36
+ Volley::Log.error "error deleting project: #{e.message} at #{e.backtrace.first}"
37
+ false
16
38
  end
17
39
 
18
40
  private
@@ -23,37 +45,29 @@ module Volley
23
45
  @debug = optional(:debug, false)
24
46
  end
25
47
 
26
- def remote_file
27
- "#@branch-#@version.tgz#{".cpt" if @encrypted}"
28
- end
29
-
30
- def push_file(local, path, content = nil)
31
- Volley::Log.debug "content=#{content.inspect}"
32
- local = File.basename(local) if local =~ /^\//
33
- dest = "#@directory/#{path}"
34
- file = "#{dest}/#{local}"
35
- Volley::Log.info".. -> #{dest}"
36
- FileUtils.mkdir_p(File.dirname(file))
48
+ def push_file(dir, file, content = nil)
49
+ file = File.basename(file) if file =~ /^\//
50
+ dest = "#@directory/#{dir}/#{file}"
51
+ FileUtils.mkdir_p(File.dirname(dest))
37
52
  content = content.read if content.is_a?(File)
38
53
  if content
39
- File.open(file, "w") { |f| f.write(content) }
54
+ File.open(dest, "w") {|f| f.write(content)}
40
55
  else
41
- FileUtils.copy(local, file)
56
+ FileUtils.copy(file, dest)
42
57
  end
43
- Volley::Log.info".. => #{file}"
58
+ log "=> #{dest}"
59
+ dest
44
60
  end
45
61
 
46
- def pull_file(file, path, ldir=nil)
47
- remote = "#@directory/#{path}"
48
- Volley::Log.info".. <- #{remote}/#{file}"
49
- if ldir
50
- FileUtils.mkdir_p(ldir)
51
- end
52
- if ldir
53
- Volley::Log.info".. <= #@local/#{path}/#{file}"
54
- FileUtils.copy("#{remote}/#{file}", "#@local/#{path}")
62
+ def pull_file(dir, file, localdir=nil)
63
+ remote = "#@directory/#{dir}"
64
+ raise ArtifactMissing, "missing: #{remote}" unless File.exists?("#{remote}/#{file}")
65
+ if localdir
66
+ FileUtils.mkdir_p(localdir)
67
+ log "<= #@local/#{dir}/#{file}"
68
+ FileUtils.copy("#{remote}/#{file}", "#@local/#{dir}")
55
69
  else
56
- File.open("#{remote}/#{file}") { |f| f.read }
70
+ File.read("#{remote}/#{file}")
57
71
  end
58
72
  end
59
73
  end
@@ -2,7 +2,17 @@
2
2
  module Volley
3
3
  module Scm
4
4
  class Base
5
+ def initialize(opt={ })
6
+ end
5
7
 
8
+ def branch
9
+ end
10
+
11
+ def revision
12
+ end
13
+
14
+ def update
15
+ end
6
16
  end
7
17
  end
8
18
  end
data/lib/volley.rb CHANGED
@@ -3,34 +3,59 @@ require "ostruct"
3
3
  require "active_support/all"
4
4
 
5
5
  require "volley/version"
6
- require "volley/config"
7
6
  require "volley/log"
8
- require "volley/volley_file"
9
7
  require "volley/publisher/base"
8
+ require "volley/publisher/exceptions"
9
+ require "volley/descriptor"
10
+ require "volley/meta"
10
11
 
11
12
  require "volley/dsl"
12
13
 
13
14
  module Volley
14
15
  class << self
16
+ def config
17
+ @config ||= OpenStruct.new({:directory => "/opt/volley"})
18
+ end
19
+
20
+ def meta
21
+ @meta ||= Volley::Meta.new
22
+ end
23
+
24
+ def unload
25
+ Volley::Log.debug "Unload"
26
+ @config = nil
27
+ @meta = nil
28
+ Volley::Dsl::VolleyFile.unload
29
+ Volley::Dsl::Project.unload
30
+ end
31
+
15
32
  def process(opts)
16
- project = opts[:project]
33
+ project = nil
17
34
  plan = opts[:plan]
18
- branch = opts[:branch]
19
- version = opts[:version]
20
- args = opts[:args]
35
+ args = opts[:args] || []
36
+ desc = opts[:descriptor]
21
37
  second = opts[:second]
22
38
 
39
+ (project, plan) = plan.split(/:/) if plan =~ /\:/
40
+ (project, _, _) = Volley::Descriptor.new(desc).get unless project
41
+
23
42
  begin
24
- Volley::Log.debug "PROCESS project:#{project} plan:#{plan} branch:#{branch} version:#{version} args:#{args}"
43
+ Volley::Log.debug "PROCESS plan:#{plan} descriptor:#{desc} args:#{args}"
25
44
  if Volley::Dsl.project?(project)
26
45
  # we have the project locally
27
46
  pr = Volley::Dsl.project(project)
28
47
  if pr.plan?(plan)
29
48
  # plan is defined
30
49
  pl = pr.plan(plan)
31
- args << "branch:#{branch}" if branch && args.select{|e| e =~ /^branch\:/}.count == 0
32
- args << "version:#{version}" if version && args.select{|e| e =~ /^version\:/}.count == 0
33
- pl.call(:rawargs => args)
50
+ #args << "branch:#{branch}" if branch && args.select{|e| e =~ /^branch\:/}.count == 0
51
+ #args << "version:#{version}" if version && args.select{|e| e =~ /^version\:/}.count == 0
52
+ args << "descriptor=#{desc}"
53
+ data = pl.call(:args => args)
54
+
55
+ if plan == "deploy"
56
+ Volley.meta[project] = data
57
+ end
58
+ Volley.meta.save
34
59
  else
35
60
  # plan is not defined
36
61
  raise "could not find plan #{plan} in project #{project}"
@@ -43,7 +68,7 @@ module Volley
43
68
  if pub.projects.include?(project)
44
69
  vf = pub.volleyfile(opts)
45
70
  Volley::Log.debug "downloaded volleyfile: #{vf}"
46
- Volley::VolleyFile.load(vf)
71
+ Volley::Dsl::VolleyFile.load(vf)
47
72
  process(:project => project, :plan => plan, :branch => branch, :version => version, :args => args, :second => true)
48
73
  else
49
74
  raise "project #{project} does not exist in configured publisher #{pub.class}"
@@ -55,10 +80,11 @@ module Volley
55
80
  rescue => e
56
81
  Volley::Log.error "error while processing: #{e.message}"
57
82
  Volley::Log.debug e
83
+ raise e
58
84
  end
59
85
 
60
86
  #if Volley.config.debug
61
- # ap Volley::Dsl::Project.projects
87
+ # ap Volley::Dsl::Project.project
62
88
  #end
63
89
  end
64
90
  end
@@ -0,0 +1,39 @@
1
+ require 'volley/descriptor'
2
+
3
+ describe Volley::Descriptor do
4
+ [
5
+ %w{spec@trunk:1 spec trunk 1},
6
+ %w{spec/trunk/1 spec trunk 1},
7
+ %w{spec-trunk-1 spec trunk 1},
8
+ %w{spec:trunk:1 spec trunk 1},
9
+ %w{spec\trunk\1 spec trunk 1},
10
+ %w{spec@trunk spec trunk latest},
11
+ %w{spec/trunk spec trunk latest},
12
+ %w{spec:trunk spec trunk latest},
13
+ %w{spec\trunk spec trunk latest},
14
+ ].each do |a|
15
+ (desc, project, branch, version) = a
16
+ it "should handle format: '#{desc}'" do
17
+ d = Volley::Descriptor.new(desc)
18
+ expect(d).not_to be(nil)
19
+ expect(d.project).to eq(project)
20
+ expect(d.branch).to eq(branch)
21
+ expect(d.version).to eq(version)
22
+ end
23
+ end
24
+
25
+ %w{
26
+ spec
27
+ spec:
28
+ spec~trunk
29
+ spec:trunk:1:blarg
30
+ }.each do |desc|
31
+ it "should not handle format: '#{desc}'" do
32
+ expect { Volley::Descriptor.new(desc) }.to raise_error(StandardError)
33
+ end
34
+ end
35
+
36
+ it "should allow partials when specified" do
37
+ expect { Volley::Descriptor.new("environment", :partial => true)}.not_to raise_exception
38
+ end
39
+ end
@@ -0,0 +1,103 @@
1
+ require 'volley'
2
+
3
+ root = File.expand_path("../../", __FILE__)
4
+
5
+ describe Volley::Dsl::Plan do
6
+ before(:each) do
7
+ Volley.unload
8
+ @project = Volley::Dsl::Project.project(:spec) do
9
+ scm :git
10
+ plan :publish do
11
+ #nothing
12
+ end
13
+ plan :notremote do
14
+ remote false
15
+
16
+ end
17
+ end
18
+ @plan = @project.plan(:publish)
19
+ @notremote = @project.plan(:notremote)
20
+ end
21
+
22
+ it "should be able to define a plan" do
23
+ expect(@plan).not_to be(nil)
24
+ end
25
+
26
+ it "should be able to define an action" do
27
+ @plan.action :first do
28
+ #nothing
29
+ end
30
+ expect(@plan.stages.count).to eq(3)
31
+ expect(@plan.stages[:main].actions.count).to eq(1)
32
+ end
33
+
34
+ it "should be able to define an action in another stage" do
35
+ @plan.action :second, :post do
36
+ expect(@plan.stages.count).to eq(3)
37
+ expect(@plan.stages[:main].actions.count).to eq(1)
38
+ expect(@plan.stages[:post].actions.count).to eq(1)
39
+ end
40
+ end
41
+
42
+ it "should be able to access source" do
43
+ expect {@plan.source.branch}.not_to raise_exception
44
+ end
45
+
46
+ it "should be able to access global config" do
47
+ Volley.config.blarg = true
48
+ expect do
49
+ raise "fail" unless @plan.config.blarg == true
50
+ end.not_to raise_exception
51
+ end
52
+
53
+ it "should be able to load another Volleyfile" do
54
+ expect {@plan.load("#{root}/test/dsl/simple.volleyfile")}.not_to raise_exception
55
+ expect(Volley::Dsl.project(:test)).not_to be(nil)
56
+ end
57
+
58
+ it "should handle arguments" do
59
+ @plan.argument(:testarg)
60
+ expect(@plan.arguments.count).to eq(2) # descriptor and testarg
61
+ @plan.call(:args => ["descriptor=test@trunk/1","testarg=true"])
62
+ expect(@plan.args.testarg).to eq("true")
63
+ end
64
+
65
+ it "should handle arguments (with remote false)" do
66
+ @notremote.argument(:testarg)
67
+ expect(@notremote.arguments.count).to eq(2) # descriptor and testarg
68
+ @notremote.call(:args => ["testarg=true"])
69
+ expect(@notremote.args.testarg).to eq("true")
70
+ end
71
+
72
+ # boolean as strings because we test conversion later
73
+ it "should handle argument defaults" do
74
+ @plan.argument(:testarg, :default => "false")
75
+ expect {@plan.call(:args => ["descriptor=test@trunk/2"])}.not_to raise_exception
76
+ expect(@plan.args.testarg).to eq("false")
77
+ end
78
+
79
+ # boolean as strings because we test conversion later
80
+ it "should handle arguments overriding defaults" do
81
+ @plan.argument(:testarg, :default => "false")
82
+ expect {@plan.call(:args => ["descriptor=test@trunk/3","testarg=true"])}.not_to raise_exception
83
+ expect(@plan.args.testarg).to eq("true")
84
+ end
85
+
86
+ it "should fail if required arguments aren't specified" do
87
+ expect {@plan.call(:args => [])}.to raise_exception
88
+ end
89
+
90
+ [
91
+ ["boolean", "true", true],
92
+ ["descriptor", "test@trunk/5", Volley::Descriptor.new("test@trunk/5")],
93
+ ["to_i", "1", 1],
94
+ ["to_f", "1.12", 1.12],
95
+ ].each do |arg|
96
+ (type, original, value) = arg
97
+ it "should handle converting argument: #{type}" do
98
+ @plan.argument(type, :convert => type.to_sym)
99
+ @plan.call(:args => ["descriptor=test@trunk/6","#{type}=#{original}"])
100
+ expect(@plan.args.send(type.to_sym)).to eq(value)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,36 @@
1
+ require 'volley'
2
+
3
+ root = File.expand_path("../../", __FILE__)
4
+
5
+ describe Volley::Dsl::Project do
6
+ before(:each) do
7
+ Volley.unload
8
+ @project = Volley::Dsl::Project.project(:spec) { }
9
+ end
10
+
11
+ it "should be able to define a project" do
12
+ expect(@project).not_to be(nil)
13
+ end
14
+
15
+ it "should be able to define a project with an SCM configuration" do
16
+ expect(@project.scm :git).not_to be(nil)
17
+ end
18
+
19
+ it "should not allow the same project name to used more than once" do
20
+ expect {Volley::Dsl::Project.project(:spec) { }}.to raise_exception
21
+ end
22
+
23
+ it "should be able to define a project with a plan" do
24
+ @project.plan(:publish) {}
25
+ plan = @project.plan(:publish)
26
+ expect(plan).not_to be(nil)
27
+ expect(plan.project).to eq(@project)
28
+ end
29
+
30
+ it "should be able to access global config" do
31
+ Volley.config.blarg = true
32
+ expect do
33
+ raise "fail" unless @project.config.blarg == true
34
+ end.not_to raise_exception
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ require 'volley'
2
+
3
+ root = File.expand_path("../../", __FILE__)
4
+
5
+ describe Volley::Dsl::VolleyFile do
6
+ it "should be able to load a volleyfile" do
7
+ Volley::Dsl::VolleyFile.load("#{root}/test/dsl/simple.volleyfile")
8
+ end
9
+
10
+ it "should have a project called test" do
11
+ expect(Volley::Dsl.project("test")).not_to eq(nil)
12
+ end
13
+
14
+ it "should have a plan called publish" do
15
+ expect(Volley::Dsl.project("test").plan("publish")).not_to eq(nil)
16
+ end
17
+
18
+ it "should have a plan called deploy" do
19
+ expect(Volley::Dsl.project("test").plan("deploy")).not_to eq(nil)
20
+ end
21
+ end
data/spec/meta_spec.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'volley'
2
+
3
+ root = File.expand_path("../../", __FILE__)
4
+
5
+ describe Volley::Meta do
6
+ before(:each) do
7
+ @meta = Volley::Meta.new("#{root}/test/meta.yml")
8
+ end
9
+
10
+ it "should be instantiated" do
11
+ expect(@meta).not_to be(nil)
12
+ end
13
+
14
+ it "should be able to get current version for project" do
15
+ expect(@meta["spec"]).to eq("trunk:2")
16
+ end
17
+
18
+ it "should be able to set new version for project" do
19
+ @meta["spec"] = "trunk:3"
20
+ expect(@meta["spec"]).to eq("trunk:3")
21
+ end
22
+
23
+ it "should be able to set version for new project" do
24
+ expect {@meta["new"] = "blarg:1"}.not_to raise_exception
25
+ end
26
+ end
@@ -0,0 +1,92 @@
1
+ require 'volley/publisher/local'
2
+ require 'volley/publisher/amazons3'
3
+
4
+ root = File.expand_path("../../", __FILE__)
5
+
6
+ Volley::Log.add(:debug, "#{root}/log/volley.log")
7
+ Volley::Log.console_disable
8
+
9
+ shared_examples_for Volley::Publisher::Base do
10
+ before(:all) do
11
+ @remote = "#{root}/test/publisher/remote"
12
+ @local = "#{root}/test/publisher/local"
13
+ FileUtils.mkdir_p(@remote)
14
+ FileUtils.mkdir_p(@local)
15
+ [@local, @remote].each { |d| %x{rm -rf #{d}/*} }
16
+ end
17
+
18
+ after(:all) do
19
+ FileUtils.rm_rf(@remote)
20
+ FileUtils.rm_rf(@local)
21
+ end
22
+
23
+ it "should be able to publish artifacts" do
24
+ Dir.chdir("#{root}/test/")
25
+ expect(@pub.push("spec", "trunk", "1", "./trunk-1.tgz")).to eq(true)
26
+ expect(@pub.push("spec", "trunk", "2", "./trunk-1.tgz")).to eq(true)
27
+ expect(@pub.push("spec", "staging", "1", "./trunk-1.tgz")).to eq(true)
28
+ Dir.chdir(root)
29
+ end
30
+
31
+ it "should be able to retrieve an artifact" do
32
+ expect(@pub.pull("spec", "trunk", "1")).to eq("#@local/spec/trunk/1/trunk-1.tgz")
33
+ end
34
+
35
+ it "should fail to retrieve a missing artifact" do
36
+ expect{ @pub.pull("spec", "trunk", "15")}.to raise_error(Volley::Publisher::ArtifactMissing)
37
+ end
38
+
39
+ it "should be able to tell me the list of projects" do
40
+ expect(@pub.projects).to match_array(%w{spec})
41
+ end
42
+
43
+ it "should be able to tell me the list of branches" do
44
+ expect(@pub.branches("spec")).to match_array(%w{trunk staging})
45
+ end
46
+
47
+ it "should be able to tell me the list of versions" do
48
+ expect(@pub.versions("spec", "trunk")).to match_array(%w{1 2 latest})
49
+ end
50
+
51
+ it "should be able to tell me the list of files" do
52
+ expect(@pub.contents("spec","trunk","2")).to match_array(%w{trunk-1.tgz})
53
+ end
54
+
55
+ it "should be able to get a remote volleyfile" do
56
+ Dir.chdir("#{root}/test/project")
57
+ expect(@pub.push("spec","trunk","3","Volleyfile")).to eq(true)
58
+ Dir.chdir(root)
59
+ expect(@pub.volleyfile("spec","trunk","3")).to match(/#@local\/Volleyfile-.*-.*/)
60
+ end
61
+
62
+ it "should be able to tell me the latest of a project and branch" do
63
+ expect(@pub.latest("spec", "trunk")).to eq("spec/trunk/3")
64
+ end
65
+
66
+ it "should throw an exeception when trying to publish a duplicate artifact" do
67
+ expect { @pub.push("spec", "trunk", "1", "./trunk-1.tgz") }.to raise_error(StandardError)
68
+ end
69
+
70
+ it "should be able to delete a project" do
71
+ expect(@pub.delete_project("spec")).to eq(true)
72
+ end
73
+ end
74
+
75
+ describe Volley::Publisher::Local do
76
+ it_behaves_like Volley::Publisher::Base
77
+
78
+ before(:each) do
79
+ @pub = Volley::Publisher::Local.new(:directory => @remote, :local => @local)
80
+ end
81
+ end
82
+
83
+ describe Volley::Publisher::Amazons3 do
84
+ it_behaves_like Volley::Publisher::Base
85
+
86
+ before(:each) do
87
+ @pub = Volley::Publisher::Amazons3.new(:aws_access_key_id => "AKIAIWUGNGSUZWW5XVCQ",
88
+ :aws_secret_access_key => "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",
89
+ :bucket => "inqcloud-volley-test",
90
+ :local => @local)
91
+ end
92
+ end
@@ -0,0 +1,6 @@
1
+
2
+ publisher :amazons3,
3
+ :aws_access_key_id => "AKIAIWUGNGSUZWW5XVCQ",
4
+ :aws_secret_access_key => "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",
5
+ :bucket => "inqcloud-volley-test",
6
+ :local => "#{root}/test/publisher/local"
@@ -0,0 +1,4 @@
1
+
2
+ publisher :local,
3
+ :directory => "#{Dir.pwd}/test/publisher/remote",
4
+ :local => "#{Dir.pwd}/test/publisher/local"
@@ -0,0 +1,2 @@
1
+
2
+ log :debug, STDOUT
@@ -0,0 +1,2 @@
1
+
2
+ log :debug, "#{Dir.pwd}/test.log"
@@ -0,0 +1,17 @@
1
+ project :test do
2
+ plan :publish do
3
+ action :build do
4
+ FileUtils.rm_f("file")
5
+ File.open("file", "w") {|f| f.write("#{project}/#{branch}/#{version}")}
6
+ end
7
+ push do
8
+ ["file"]
9
+ end
10
+ end
11
+
12
+ plan :deploy do
13
+ pull do |dir|
14
+ File.read("#{dir}/file")
15
+ end
16
+ end
17
+ end
data/test/meta.yml ADDED
@@ -0,0 +1,3 @@
1
+
2
+ :spec: trunk:2
3
+ :test: staging:3
@@ -0,0 +1,13 @@
1
+
2
+ task :build do
3
+ pwd = Dir.pwd
4
+ project = "test"
5
+ %w{trunk staging}.each do |branch|
6
+ Dir.chdir(branch)
7
+ Dir["*"].each do |version|
8
+ cmd = "tar cfz #{pwd}/#{project}-#{branch}-#{version}.tgz *"
9
+ %x{#{cmd}}
10
+ end
11
+ Dir.chdir(pwd)
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ project :test do
2
+ plan :publish do
3
+ action :build do
4
+ FileUtils.rm_f("file")
5
+ ver = "#{project.name}/#{branch}/#{version}"
6
+ File.open("file", "w") {|f| f.write(ver)}
7
+ end
8
+ push do
9
+ ["file"]
10
+ end
11
+ end
12
+
13
+ plan :deploy do
14
+ pull do |dir|
15
+ File.read("#{dir}/file")
16
+ end
17
+ end
18
+ end
data/test/trunk-1.tgz ADDED
Binary file
data/volley.gemspec CHANGED
@@ -13,11 +13,12 @@ Gem::Specification.new do |gem|
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "volley"
15
15
  gem.require_paths = ["lib"]
16
- gem.version = "#{Volley::Version::STRING}.alpha4"
16
+ gem.version = "#{Volley::Version::STRING}.alpha5"
17
17
 
18
18
  gem.add_dependency "clamp"
19
19
  gem.add_dependency "fog"
20
20
  gem.add_dependency "activesupport"
21
21
  gem.add_dependency "mixlib-shellout"
22
22
  gem.add_dependency "yell"
23
+ gem.add_dependency "docopt"
23
24
  end