paraduct 0.0.1.beta5 → 0.0.1.beta6

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/README.md CHANGED
@@ -10,7 +10,8 @@ Paraduct (**parallel** + **parameterize** + **product**) is matrix test runner
10
10
  [![Stories in Ready](https://badge.waffle.io/sue445/paraduct.svg?label=ready&title=Ready)](http://waffle.io/sue445/paraduct)
11
11
 
12
12
  ## Requirements
13
- ruby 1.9+
13
+ * ruby 1.9+
14
+ * rsync
14
15
 
15
16
  ## Installation
16
17
 
data/lib/paraduct/cli.rb CHANGED
@@ -5,6 +5,14 @@ module Paraduct
5
5
  class CLI < Thor
6
6
  include Thor::Actions
7
7
 
8
+ class_option :version, type: :boolean
9
+
10
+ desc "version", "Show paraduct version"
11
+ def version
12
+ puts Paraduct::VERSION
13
+ end
14
+ default_task :version
15
+
8
16
  desc "test", "run matrix test"
9
17
  def test
10
18
  script = Paraduct.config.script
@@ -22,6 +30,7 @@ module Paraduct
22
30
  desc "generate", "generate .paraduct.yml"
23
31
  def generate
24
32
  template(".paraduct.yml")
33
+ template(".paraduct_rsync_exclude.txt")
25
34
  end
26
35
 
27
36
  def self.source_root
@@ -5,29 +5,28 @@ module Paraduct
5
5
  class Configuration
6
6
  include Singleton
7
7
 
8
- def initialize
9
- raise "not found .paraduct.yml" unless config_file.exist?
10
- @config = YAML.load_file(config_file)
11
- end
12
-
13
8
  # @return [Pathname]
14
9
  def variables
15
- @config["variables"]
10
+ config_data[:variables]
16
11
  end
17
12
 
18
13
  # @return [String, Array<String>]
19
14
  def script
20
- @config["script"]
15
+ config_data[:script]
21
16
  end
22
17
 
23
18
  # @return [Integer]
24
19
  def max_threads
25
- @config["max_threads"] || 4
20
+ config_data[:max_threads] || 4
21
+ end
22
+
23
+ def rsync_option
24
+ config_data[:rsync_option] || {}
26
25
  end
27
26
 
28
27
  # @return [Pathname]
29
28
  def work_dir
30
- _work_dir = @config["work_dir"] || "tmp/paraduct_workspace"
29
+ _work_dir = config_data[:work_dir] || "tmp/paraduct_workspace"
31
30
  root_dir.join(_work_dir)
32
31
  end
33
32
 
@@ -40,5 +39,11 @@ module Paraduct
40
39
  def root_dir
41
40
  Pathname.pwd
42
41
  end
42
+
43
+ private
44
+
45
+ def config_data
46
+ @config_data ||= YAML.load_file(config_file).with_indifferent_access
47
+ end
43
48
  end
44
49
  end
@@ -16,7 +16,7 @@ module Paraduct
16
16
 
17
17
  def setup_dir
18
18
  FileUtils.mkdir_p(job_dir) unless job_dir.exist?
19
- self.class.copy_recursive(Paraduct.config.root_dir, job_dir)
19
+ Paraduct::SyncUtils.copy_recursive(Paraduct.config.root_dir, job_dir)
20
20
  Dir.chdir(job_dir)
21
21
  end
22
22
 
@@ -48,20 +48,6 @@ module Paraduct
48
48
  @params.map{ |key, value| "#{key}=#{value}" }.join(", ")
49
49
  end
50
50
 
51
- # @param source_dir [Pathname]
52
- # @param destination_dir [Pathname]
53
- def self.copy_recursive(source_dir, destination_dir)
54
- FileUtils.mkdir_p(destination_dir)
55
- source_dir.children.each do |source_child_dir|
56
- begin
57
- FileUtils.cp_r(source_child_dir, destination_dir)
58
- rescue ArgumentError => e
59
- # TODO: refactoring
60
- raise unless e.message =~ /^cannot copy directory .+ to itself /
61
- end
62
- end
63
- end
64
-
65
51
  def self.capitalize_keys(params)
66
52
  params.inject({}) do |res, (key, value)|
67
53
  res[key.upcase] = value
@@ -0,0 +1,20 @@
1
+ module Paraduct
2
+ require "rsync"
3
+
4
+ class SyncUtils
5
+ # @param source_dir [Pathname]
6
+ # @param destination_dir [Pathname]
7
+ def self.copy_recursive(source_dir, destination_dir)
8
+ FileUtils.mkdir_p(destination_dir)
9
+
10
+ rsync_options = %W(
11
+ --recursive
12
+ --delete
13
+ --exclude-from=#{Paraduct.config.rsync_option[:exclude_from]}
14
+ )
15
+ result = Rsync.run(source_dir.to_s + "/", destination_dir, rsync_options)
16
+ raise result.error unless result.success?
17
+ result
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,2 @@
1
+ .git/
2
+ tmp/
@@ -1,3 +1,3 @@
1
1
  module Paraduct
2
- VERSION = "0.0.1.beta5"
2
+ VERSION = "0.0.1.beta6"
3
3
  end
data/lib/paraduct.rb CHANGED
@@ -8,6 +8,7 @@ module Paraduct
8
8
  autoload :Errors , 'paraduct/errors'
9
9
  autoload :ParallelRunner , 'paraduct/parallel_runner'
10
10
  autoload :Runner , 'paraduct/runner'
11
+ autoload :SyncUtils , 'paraduct/sync_utils'
11
12
  autoload :TestResponse , 'paraduct/test_response'
12
13
  autoload :VariableConverter, 'paraduct/variable_converter'
13
14
  autoload :Version , 'paraduct/version'
data/paraduct.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "activesupport"
22
+ spec.add_dependency "rsync"
22
23
  spec.add_dependency "thor"
23
24
  spec.add_dependency "thread"
24
25
 
data/spec/.paraduct.yml CHANGED
@@ -13,3 +13,5 @@ variables:
13
13
  - 4.0.0
14
14
  - 4.1.0
15
15
  max_threads: 4
16
+ rsync_option:
17
+ exclude_from: .paraduct_rsync_exclude.txt
@@ -0,0 +1,2 @@
1
+ .git/
2
+ tmp/
@@ -3,33 +3,41 @@ describe Paraduct::CLI do
3
3
 
4
4
  let(:args){ [command] }
5
5
 
6
+ describe "#version" do
7
+ %w(version --version).each do |_command|
8
+ context "with #{_command}" do
9
+ let(:command){ _command }
10
+
11
+ it { expect{ subject }.to output("#{Paraduct::VERSION}\n").to_stdout }
12
+ end
13
+ end
14
+ end
15
+
6
16
  describe "#test" do
7
17
  let(:command){ "test" }
8
18
 
9
- include_context :within_temp_work_dir
19
+ include_context :stub_configuration
20
+ include_context :within_temp_dir
10
21
 
11
22
  context "successful test" do
23
+ let(:config_data) do
24
+ {
25
+ script: "./script/build_success.sh",
26
+ work_dir: "tmp/paraduct_workspace",
27
+ variables: {
28
+ ruby: ["1.9.3", "2.0.0"],
29
+ database: ["mysql", "postgresql"],
30
+ },
31
+ }
32
+ end
33
+
12
34
  let(:script){ "./script/build_success.sh" }
13
35
  let(:product_variables) do
14
36
  [
15
- { "ruby" => "1.9.3", "database" => "mysql" , "rails" => "3.2.0" },
16
- { "ruby" => "1.9.3", "database" => "mysql" , "rails" => "4.0.0" },
17
- { "ruby" => "1.9.3", "database" => "mysql" , "rails" => "4.1.0" },
18
- { "ruby" => "1.9.3", "database" => "postgresql", "rails" => "3.2.0" },
19
- { "ruby" => "1.9.3", "database" => "postgresql", "rails" => "4.0.0" },
20
- { "ruby" => "1.9.3", "database" => "postgresql", "rails" => "4.1.0" },
21
- { "ruby" => "2.0.0", "database" => "mysql" , "rails" => "3.2.0" },
22
- { "ruby" => "2.0.0", "database" => "mysql" , "rails" => "4.0.0" },
23
- { "ruby" => "2.0.0", "database" => "mysql" , "rails" => "4.1.0" },
24
- { "ruby" => "2.0.0", "database" => "postgresql", "rails" => "3.2.0" },
25
- { "ruby" => "2.0.0", "database" => "postgresql", "rails" => "4.0.0" },
26
- { "ruby" => "2.0.0", "database" => "postgresql", "rails" => "4.1.0" },
27
- { "ruby" => "2.1.2", "database" => "mysql" , "rails" => "3.2.0" },
28
- { "ruby" => "2.1.2", "database" => "mysql" , "rails" => "4.0.0" },
29
- { "ruby" => "2.1.2", "database" => "mysql" , "rails" => "4.1.0" },
30
- { "ruby" => "2.1.2", "database" => "postgresql", "rails" => "3.2.0" },
31
- { "ruby" => "2.1.2", "database" => "postgresql", "rails" => "4.0.0" },
32
- { "ruby" => "2.1.2", "database" => "postgresql", "rails" => "4.1.0" },
37
+ { "ruby" => "1.9.3", "database" => "mysql" },
38
+ { "ruby" => "1.9.3", "database" => "postgresql" },
39
+ { "ruby" => "2.0.0", "database" => "mysql" },
40
+ { "ruby" => "2.0.0", "database" => "postgresql" },
33
41
  ]
34
42
  end
35
43
 
@@ -46,9 +54,14 @@ describe Paraduct::CLI do
46
54
  end
47
55
 
48
56
  context "failure test" do
49
- before do
50
- allow(Paraduct.config).to receive(:script) { %q(exit ${STATUS}) }
51
- allow(Paraduct.config).to receive(:variables){ { status: [0, 1] } }
57
+ let(:config_data) do
58
+ {
59
+ script: %q(exit ${STATUS}),
60
+ work_dir: "tmp/paraduct_workspace",
61
+ variables: {
62
+ status: [0, 1],
63
+ },
64
+ }
52
65
  end
53
66
 
54
67
  it { expect{ subject }.to raise_error Paraduct::Errors::TestFailureError }
@@ -58,21 +71,19 @@ describe Paraduct::CLI do
58
71
  describe "#generate" do
59
72
  let(:command){ "generate" }
60
73
 
61
- include_context "uses temp dir"
62
-
63
- around do |example|
64
- Dir.chdir(temp_dir) do
65
- example.run
66
- end
67
- end
74
+ include_context :within_temp_dir
68
75
 
69
76
  before do
70
77
  # exercise
71
78
  subject
72
79
  end
73
80
 
74
- let(:generated_config_file){ temp_dir_path.join(".paraduct.yml") }
81
+ %w(.paraduct.yml .paraduct_rsync_exclude.txt).each do |template_file|
82
+ describe "whether copy #{template_file}" do
83
+ let(:generated_config_file){ temp_dir_path.join(template_file) }
75
84
 
76
- it { expect(generated_config_file).to be_exist }
85
+ it { expect(generated_config_file).to be_exist }
86
+ end
87
+ end
77
88
  end
78
89
  end
@@ -69,34 +69,6 @@ DATABASE=mysql
69
69
  it { should eq Pathname("/tmp/jobs/RUBY_1.9_DATABASE_mysql") }
70
70
  end
71
71
 
72
- describe "#copy_recursive" do
73
- subject{ Paraduct::Runner.copy_recursive(source_dir, destination_dir) }
74
-
75
- include_context "uses temp dir"
76
-
77
- let(:source_dir) { temp_dir_path }
78
- let(:destination_dir){ temp_dir_path.join("tmp/paraduct_workspace/RUBY_1.9_DATABASE_mysql") }
79
- let(:copied_file) { destination_dir.join("build_success.sh") }
80
- let(:not_copied_file){ destination_dir.join("tmp/paraduct_workspace/dummy.txt") }
81
-
82
- before do
83
- # setup
84
- FileUtils.cp_r(spec_dir.join("script/tmp/paraduct_workspace"), source_dir)
85
- FileUtils.cp_r(spec_dir.join("script/build_success.sh"), source_dir)
86
-
87
- # exercise
88
- subject
89
- end
90
-
91
- # after do
92
- # puts `tree #{source_dir}`
93
- # end
94
-
95
- it { expect(destination_dir).to be_exist }
96
- it { expect(copied_file).to be_exist }
97
- it { expect(not_copied_file).not_to be_exist }
98
- end
99
-
100
72
  describe "#formatted_params" do
101
73
  subject{ runner.formatted_params }
102
74
 
@@ -0,0 +1,39 @@
1
+ describe Paraduct::SyncUtils do
2
+ describe "#copy_recursive" do
3
+ subject{ Paraduct::SyncUtils.copy_recursive(source_dir, destination_dir) }
4
+
5
+ include_context :within_temp_dir
6
+ include_context :stub_configuration
7
+
8
+ let(:config_data) do
9
+ {
10
+ rsync_option: {
11
+ exclude_from: ".paraduct_rsync_exclude.txt",
12
+ },
13
+ }
14
+ end
15
+
16
+ let(:source_dir) { temp_dir_path }
17
+ let(:destination_dir){ temp_dir_path.join("tmp/paraduct_workspace/RUBY_1.9_DATABASE_mysql") }
18
+ let(:copied_file) { destination_dir.join("build_success.sh") }
19
+ let(:not_copied_file){ destination_dir.join("tmp/paraduct_workspace/dummy.txt") }
20
+
21
+ before do
22
+ # setup
23
+ FileUtils.cp_r(spec_dir.join("script/tmp/paraduct_workspace"), source_dir)
24
+ FileUtils.cp(spec_dir.join("script/build_success.sh"), source_dir)
25
+ FileUtils.cp(spec_dir.join(".paraduct_rsync_exclude.txt"), source_dir)
26
+
27
+ # exercise
28
+ subject
29
+ end
30
+
31
+ # after do
32
+ # puts `tree #{source_dir}`
33
+ # end
34
+
35
+ it { expect(destination_dir).to be_exist }
36
+ it { expect(copied_file).to be_exist }
37
+ it { expect(not_copied_file).not_to be_exist }
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ shared_context :stub_configuration do
2
+ before do
3
+ allow_any_instance_of(Paraduct::Configuration).to receive(:config_data){ config_data.stringify_keys.with_indifferent_access }
4
+ end
5
+
6
+ let(:config_data) do
7
+ {
8
+ script: %q(echo "NAME1=${NAME1}, NAME2=${NAME2}"),
9
+ work_dir: "tmp/paraduct_workspace",
10
+ variables: {
11
+ name1: ["value1a", "value1b"],
12
+ name2: ["value2a", "value2b"],
13
+ },
14
+ }
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ shared_context :within_temp_dir do
2
+ include_context "uses temp dir"
3
+
4
+ before do
5
+ # avoid "warning: conflicting chdir during another chdir block"
6
+ @current_dir = Pathname.pwd
7
+ Dir.chdir(temp_dir)
8
+ end
9
+
10
+ after do
11
+ Dir.chdir(@current_dir)
12
+ end
13
+ end
@@ -6,7 +6,8 @@ shared_context :within_temp_work_dir do
6
6
  @current_dir = Pathname.pwd
7
7
  Dir.chdir(temp_dir)
8
8
  FileUtils.cp_r(spec_dir.join("script"), temp_dir)
9
- FileUtils.cp_r(spec_dir.join(".paraduct.yml"), temp_dir)
9
+ FileUtils.cp(spec_dir.join(".paraduct.yml"), temp_dir)
10
+ FileUtils.cp(spec_dir.join(".paraduct_rsync_exclude.txt"), temp_dir)
10
11
  end
11
12
 
12
13
  after do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paraduct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta5
4
+ version: 0.0.1.beta6
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-20 00:00:00.000000000 Z
12
+ date: 2014-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rsync
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: thor
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -293,17 +309,21 @@ files:
293
309
  - lib/paraduct/errors.rb
294
310
  - lib/paraduct/parallel_runner.rb
295
311
  - lib/paraduct/runner.rb
312
+ - lib/paraduct/sync_utils.rb
296
313
  - lib/paraduct/templates/.paraduct.yml.tt
314
+ - lib/paraduct/templates/.paraduct_rsync_exclude.txt.tt
297
315
  - lib/paraduct/test_response.rb
298
316
  - lib/paraduct/variable_converter.rb
299
317
  - lib/paraduct/version.rb
300
318
  - paraduct.gemspec
301
319
  - spec/.paraduct.yml
320
+ - spec/.paraduct_rsync_exclude.txt
302
321
  - spec/.rubocop.yml
303
322
  - spec/paraduct/cli_spec.rb
304
323
  - spec/paraduct/configuration_spec.rb
305
324
  - spec/paraduct/parallel_runner_spec.rb
306
325
  - spec/paraduct/runner_spec.rb
326
+ - spec/paraduct/sync_utils_spec.rb
307
327
  - spec/paraduct/test_response_spec.rb
308
328
  - spec/paraduct/variable_converter_spec.rb
309
329
  - spec/paraduct_spec.rb
@@ -311,7 +331,9 @@ files:
311
331
  - spec/script/build_success.sh
312
332
  - spec/script/tmp/paraduct_workspace/dummy.txt
313
333
  - spec/spec_helper.rb
334
+ - spec/support/contexts/stub_configuration.rb
314
335
  - spec/support/contexts/within_spec_dir.rb
336
+ - spec/support/contexts/within_temp_dir.rb
315
337
  - spec/support/contexts/within_temp_work_dir.rb
316
338
  - tmp/.gitkeep
317
339
  homepage: https://github.com/sue445/paraduct
@@ -329,7 +351,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
329
351
  version: '0'
330
352
  segments:
331
353
  - 0
332
- hash: 981450971291940130
354
+ hash: 3159191224660044510
333
355
  required_rubygems_version: !ruby/object:Gem::Requirement
334
356
  none: false
335
357
  requirements:
@@ -344,11 +366,13 @@ specification_version: 3
344
366
  summary: matrix test runner
345
367
  test_files:
346
368
  - spec/.paraduct.yml
369
+ - spec/.paraduct_rsync_exclude.txt
347
370
  - spec/.rubocop.yml
348
371
  - spec/paraduct/cli_spec.rb
349
372
  - spec/paraduct/configuration_spec.rb
350
373
  - spec/paraduct/parallel_runner_spec.rb
351
374
  - spec/paraduct/runner_spec.rb
375
+ - spec/paraduct/sync_utils_spec.rb
352
376
  - spec/paraduct/test_response_spec.rb
353
377
  - spec/paraduct/variable_converter_spec.rb
354
378
  - spec/paraduct_spec.rb
@@ -356,6 +380,8 @@ test_files:
356
380
  - spec/script/build_success.sh
357
381
  - spec/script/tmp/paraduct_workspace/dummy.txt
358
382
  - spec/spec_helper.rb
383
+ - spec/support/contexts/stub_configuration.rb
359
384
  - spec/support/contexts/within_spec_dir.rb
385
+ - spec/support/contexts/within_temp_dir.rb
360
386
  - spec/support/contexts/within_temp_work_dir.rb
361
387
  has_rdoc: