dply 0.2.19 → 0.3.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.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +4 -0
  3. data/Rakefile +0 -14
  4. data/TODO +0 -1
  5. data/code_dump/old_remote_task.rb +2 -0
  6. data/{dev_bin → dev_exe}/dplyr +0 -0
  7. data/{dev_bin → dev_exe}/drake +1 -1
  8. data/dply.gemspec +2 -2
  9. data/{bin → exe}/dplyr +0 -0
  10. data/{bin → exe}/drake +12 -14
  11. data/lib/dply/TEST_TODO +50 -0
  12. data/lib/dply/app_config.rb +108 -0
  13. data/lib/dply/base_config.rb +110 -0
  14. data/lib/dply/build.rb +17 -11
  15. data/lib/dply/build_config.rb +28 -96
  16. data/lib/dply/bundle.rb +7 -30
  17. data/lib/dply/cli/build.rb +5 -12
  18. data/lib/dply/cli/ctl.rb +7 -8
  19. data/lib/dply/cli/deploy.rb +6 -10
  20. data/lib/dply/cli/devbuild.rb +6 -10
  21. data/lib/dply/cli/install_pkgs.rb +2 -3
  22. data/lib/dply/cli/run.rb +27 -0
  23. data/lib/dply/cli/status.rb +1 -2
  24. data/lib/dply/cli/task.rb +6 -12
  25. data/lib/dply/code_archive.rb +123 -0
  26. data/lib/dply/command.rb +57 -0
  27. data/lib/dply/config_downloader.rb +3 -2
  28. data/lib/dply/curl.rb +1 -5
  29. data/lib/dply/custom_logger.rb +18 -1
  30. data/lib/dply/deplist.rb +16 -48
  31. data/lib/dply/deploy_config.rb +34 -0
  32. data/lib/dply/elf.rb +60 -0
  33. data/lib/dply/env.rb +9 -0
  34. data/lib/dply/git.rb +15 -8
  35. data/lib/dply/helper.rb +21 -33
  36. data/lib/dply/linker.rb +27 -27
  37. data/lib/dply/lock.rb +2 -9
  38. data/lib/dply/logger.rb +1 -1
  39. data/lib/dply/pkgs.rb +9 -11
  40. data/lib/dply/release.rb +2 -2
  41. data/lib/dply/{archive.rb → remote_archive.rb} +1 -1
  42. data/lib/dply/repo.rb +3 -3
  43. data/lib/dply/rpm.rb +12 -20
  44. data/lib/dply/scripts/depcheck.rb +4 -0
  45. data/lib/dply/shared_dirs.rb +1 -1
  46. data/lib/dply/strategy/archive.rb +15 -22
  47. data/lib/dply/strategy/base.rb +82 -0
  48. data/lib/dply/strategy/git.rb +18 -19
  49. data/lib/dply/task_dsl.rb +101 -0
  50. data/lib/dply/util.rb +75 -0
  51. data/lib/dply/venv.rb +53 -0
  52. data/lib/dply/version.rb +1 -1
  53. data/lib/dply/yum.rb +21 -31
  54. data/lib/dplyr/consul.rb +1 -1
  55. data/spec/dply/base_config_spec.rb +178 -0
  56. data/spec/dply/bundle_spec.rb +100 -0
  57. data/spec/dply/command_spec.rb +190 -0
  58. data/spec/dply/curl_spec.rb +41 -0
  59. data/spec/dply/deplist_spec.rb +48 -0
  60. data/spec/dply/elf_spec.rb +64 -0
  61. data/spec/dply/env_spec.rb +57 -0
  62. data/spec/dply/git_spec.rb +136 -0
  63. data/spec/dply/helper_spec.rb +168 -0
  64. data/spec/dply/linker_spec.rb +81 -0
  65. data/spec/dply/lock_spec.rb +24 -0
  66. data/spec/dply/pkgs_spec.rb +105 -0
  67. data/spec/dply/repo_spec.rb +58 -0
  68. data/spec/dply/rpm_spec.rb +32 -0
  69. data/spec/dply/yum_spec.rb +29 -0
  70. data/spec/integration/archive_flow_spec.rb +87 -0
  71. data/spec/integration/git_flow_spec.rb +63 -0
  72. data/spec/repo.rb +27 -0
  73. data/spec/spec_helper.rb +44 -0
  74. data/spec/test_data/build.tar.gz +0 -0
  75. data/spec/test_data/build.tar.gz.md5 +1 -0
  76. data/spec/test_data/bundle/gems_installed/Gemfile +1 -0
  77. data/spec/test_data/bundle/gems_not_installed/Gemfile +2 -0
  78. data/spec/test_data/bundle/no_gemfile/.gitkeep +0 -0
  79. data/spec/test_data/command/test.rb +7 -0
  80. data/spec/test_data/elf/elf +0 -0
  81. data/spec/test_data/elf/libpgtypes.so.3 +0 -0
  82. data/spec/test_data/elf/not_elf +1 -0
  83. data/spec/test_data/sample_repo/.dply.lock +0 -0
  84. data/spec/test_data/sample_repo/Gemfile +2 -0
  85. data/spec/test_data/sample_repo/Rakefile +3 -0
  86. data/spec/test_data/sample_repo/app.rb +1 -0
  87. data/spec/test_data/sample_repo/dply/app.rb +33 -0
  88. data/spec/test_data/sample_repo/lib/libacl.so.1 +0 -0
  89. data/spec/test_data/sample_repo/pkgs.yml +2 -0
  90. data/spec/webserver.rb +21 -0
  91. metadata +96 -28
  92. data/lib/dply/cli/app_task.rb +0 -38
  93. data/lib/dply/config.rb +0 -120
  94. data/lib/dply/config_struct.rb +0 -52
  95. data/lib/dply/rakelib/drake.rake +0 -33
  96. data/lib/dply/tasks.rb +0 -136
@@ -0,0 +1,81 @@
1
+ require 'dply/linker'
2
+ require 'pathname'
3
+
4
+ module Dply
5
+ describe Linker do
6
+
7
+ before :all do
8
+ FileUtils.rm_rf "tmp/linker"
9
+ FileUtils.mkdir_p "tmp/linker"
10
+ end
11
+
12
+ def new_work_dir
13
+ d = Dir.mktmpdir nil, "tmp/linker"
14
+ Dir.chdir d do
15
+ FileUtils.mkdir ["src", "src/dir1", "src/dir2", "dest", "dest/config"]
16
+ FileUtils.touch ["src/file1", "src/file2"]
17
+ end
18
+ "#{Dir.pwd}/#{d}"
19
+ end
20
+
21
+ def linker(map:, work_dir:)
22
+ src = "#{work_dir}/src"
23
+ dest = "#{work_dir}/dest"
24
+ Linker.new src, dest, map: map
25
+ end
26
+
27
+ let(:map) do
28
+ {
29
+ "config/1" => "file1",
30
+ "file2" => "file2",
31
+ "tmp" => "dir1",
32
+ "log" => "dir2"
33
+ }
34
+ end
35
+
36
+ describe ".new" do
37
+ it "doesn't accept relative path for src_dir" do
38
+ expect { Linker.new("tmp", "/tmp", map: {}) }.to raise_error(Dply::Error)
39
+ end
40
+
41
+ it "doesn't accept relative path for dest_dir" do
42
+ expect { Linker.new("/tmp", "tmp", map: {}) }.to raise_error(Dply::Error)
43
+ end
44
+
45
+ it "doesn't accept relative paths in map" do
46
+ expect { Linker.new("/tmp", "/tmp/1", map: {"/a" => "b"}) }.to raise_error(Dply::Error)
47
+ expect { Linker.new("/tmp", "/tmp/1", map: {"a" => "/b"}) }.to raise_error(Dply::Error)
48
+ end
49
+ end
50
+
51
+ describe "#create_symlinks" do
52
+
53
+ it "creates expected symlinks" do
54
+ work_dir = new_work_dir
55
+ linker = linker(map: map, work_dir: work_dir)
56
+ linker.create_symlinks
57
+ map.each do |k, v|
58
+ dpath = Pathname.new("#{work_dir}/dest/#{k}").realpath
59
+ spath = Pathname.new("#{work_dir}/src/#{v}")
60
+ expect(dpath).to eq(spath)
61
+ end
62
+ end
63
+
64
+ it "errors out if link target already exists" do
65
+ work_dir = new_work_dir
66
+ FileUtils.touch "#{work_dir}/dest/tmp"
67
+ linker = linker(map: map, work_dir: work_dir)
68
+ expect { linker.create_symlinks }.to raise_error(Dply::Error)
69
+ end
70
+
71
+ it "errors out if link source doesn't exist" do
72
+ work_dir = new_work_dir
73
+ FileUtils.touch "#{work_dir}/dest/tmp"
74
+ map = { "log" => "non_existent" }
75
+ linker = linker(map: map, work_dir: work_dir)
76
+ expect { linker.create_symlinks }.to raise_error(Dply::Error)
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,24 @@
1
+ require 'dply/lock'
2
+
3
+ module Dply
4
+ describe Lock do
5
+ describe "#acquire" do
6
+ it "acquires an exclusive lock(flock) on the given dir" do
7
+ lock = Lock.new("tmp")
8
+ lock.acquire
9
+ other_lock = Lock.new("tmp")
10
+ expect { other_lock.acquire }.to raise_error(Error, /exclusive lock/)
11
+ end
12
+
13
+ specify "lock survives GC" do
14
+ GC.start(full_mark: true, immediate_sweep: true)
15
+ lock = Lock.new("tmp")
16
+ lock.acquire
17
+
18
+ GC.start(full_mark: true, immediate_sweep: true)
19
+ other_lock = Lock.new("tmp")
20
+ expect { other_lock.acquire }.to raise_error(Error, /exclusive lock/)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,105 @@
1
+ require 'dply/pkgs'
2
+
3
+ module Dply
4
+ describe Pkgs do
5
+
6
+ before :all do
7
+ FileUtils.rm_rf "tmp/pkgs"
8
+ FileUtils.mkdir_p "tmp/pkgs"
9
+ end
10
+
11
+ def build_yml(file, data)
12
+ case data
13
+ when Hash
14
+ File.write file, YAML.dump(data)
15
+ else
16
+ File.write file, data
17
+ end
18
+ end
19
+
20
+ def pkgs_yml(data, &block)
21
+ d = Dir.mktmpdir nil, "tmp/pkgs"
22
+ file = "p.yml"
23
+ Dir.chdir(d) do
24
+ build_yml file, data
25
+ yield file
26
+ end
27
+ end
28
+
29
+ def new_data
30
+ {"build_pkgs" => ["b1"], "pkgs" => ["p1", "p2"]}
31
+ end
32
+
33
+ INVALID_PKG_NAMES = [
34
+ "a1.rpm",
35
+ "a1*.pm",
36
+ "http://a.co/rpm",
37
+ "/a/b"
38
+ ]
39
+
40
+ describe ".new" do
41
+ it "reads pkg lists from given pkgs_yml to all/build/runtime" do
42
+ pkgs_yml(new_data) do |f|
43
+ pkgs = Pkgs.new f
44
+ expect(pkgs.build).to eq(["b1"])
45
+ expect(pkgs.runtime).to eq(["p1", "p2"])
46
+ expect(pkgs.all.sort).to eq(["b1", "p1", "p2"])
47
+ end
48
+ end
49
+
50
+ INVALID_PKG_NAMES.each do |i|
51
+ it "raises error for pkg name #{i}" do
52
+ d1 = new_data
53
+ d1["build_pkgs"] << i
54
+ pkgs_yml(d1) do |f|
55
+ expect { Pkgs.new f}.to raise_error(Error)
56
+ end
57
+
58
+ d2 = new_data
59
+ d2["pkgs"] << i
60
+ pkgs_yml(d2) do |f|
61
+ expect { Pkgs.new f}.to raise_error(Error)
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ subject(:pkgs) { pkgs_yml(new_data) { |f| Pkgs.new f } }
68
+
69
+ describe "#install" do
70
+ context "when build_mode: true" do
71
+ it "installs all the packages" do
72
+ expect(Yum).to receive(:install).with(pkgs.all)
73
+ expect(pkgs.all.size).to eq(3)
74
+ pkgs.install build_mode: true
75
+ end
76
+ end
77
+
78
+ context "when build_mode: false" do
79
+ it "installs only the runtime packages" do
80
+ expect(Yum).to receive(:install).with(pkgs.runtime)
81
+ expect(pkgs.runtime.size).to eq(2)
82
+ pkgs.install build_mode: false
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#installed?" do
88
+ context "when build_mode: true" do
89
+ it "returns install status" do
90
+ expect(Yum).to receive(:installed?).with(pkgs.all).and_return(:status)
91
+ expect(pkgs.all.size).to eq(3)
92
+ expect(pkgs.installed? build_mode: true).to eq(:status)
93
+ end
94
+ end
95
+
96
+ context "when build_mode: false" do
97
+ it "returns install status" do
98
+ expect(Yum).to receive(:installed?).with(pkgs.runtime).and_return(:status)
99
+ expect(pkgs.runtime.size).to eq(2)
100
+ expect(pkgs.installed? build_mode: false).to eq(:status)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,58 @@
1
+ require 'dply/repo'
2
+ require 'repo'
3
+
4
+ module Dply
5
+ describe Repo do
6
+
7
+ before :all do
8
+ @work_dir = "tmp/repo"
9
+ @source_repo = "#{Dir.pwd}/tmp/repo.git"
10
+ FileUtils.rm_rf @work_dir
11
+ FileUtils.mkdir_p @work_dir
12
+ end
13
+
14
+ def source_repo
15
+ @source_repo
16
+ end
17
+
18
+ def tmp_dir(&block)
19
+ d = Dir.mktmpdir nil, "#{Dir.pwd}/#{@work_dir}"
20
+ Dir.chdir(d) { yield d }
21
+ end
22
+
23
+ subject(:repo) { Repo.new "repo", source_repo, mirror: nil }
24
+
25
+ describe ".create" do
26
+ it "creates the repo from the given upstream" do
27
+ tmp_dir do |d|
28
+ suppress_output { repo.create }
29
+ expect(File).to exist("repo/.git")
30
+ end
31
+ end
32
+
33
+ it "throws an error if a different git repo already exists at [dir]" do
34
+ tmp_dir do |d|
35
+ FileUtils.mkdir "repo"
36
+ Dir.chdir "repo" do
37
+ system! "touch a"
38
+ system! "git init"
39
+ system! "git add a; git commit -m 'commit'"
40
+ system! "git remote add origin /some/other/upstream"
41
+ end
42
+ expect { repo.create }.to raise_error(Error)
43
+ end
44
+ end
45
+
46
+ it "clones repo from a mirror if specified" do
47
+ upstream = "/some/upstream.git"
48
+ repo = Repo.new "repo", upstream, mirror: source_repo
49
+ tmp_dir do
50
+ suppress_output { repo.create }
51
+ Dir.chdir "repo" do
52
+ expect(Git.remote_url).to eq(upstream)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,32 @@
1
+ require 'dply/rpm'
2
+
3
+ module Dply
4
+ describe Rpm do
5
+
6
+ def test_cases
7
+ {
8
+ "libc.so.6" => [ "glibc" ],
9
+ "libacl.so.1" => ["libacl"],
10
+ "libattr.so.1" => ["libattr"]
11
+ }
12
+ end
13
+
14
+ def to_64bit(lib)
15
+ "#{lib}()(64bit)"
16
+ end
17
+
18
+ subject(:rpm) { Rpm }
19
+
20
+ describe ".libs_pkgs_map" do
21
+ it "returns the map of lib => [list of pkgs] which provide that lib" do
22
+ test_cases = test_cases()
23
+ libs = test_cases.keys.map { |i| to_64bit i }
24
+ map = rpm.libs_pkgs_map libs
25
+ test_cases.keys.each do |i|
26
+ lib = to_64bit(i)
27
+ expect(map[lib]).to eq(test_cases[i])
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ require 'dply/yum'
2
+
3
+ module Dply
4
+ describe Yum do
5
+
6
+ describe ".install" do
7
+ it "installs the missing packages" do
8
+ expect(Yum).to receive(:cmd).with(["yum", "install", "-y", "xyz"])
9
+ expect { Yum.install(["glibc", "xyz"]) }.to raise_error(Error)
10
+ end
11
+
12
+ it "doesn't do anything if packages are already installed" do
13
+ expect(Yum).not_to receive(:cmd).with(array_including("yum", "install"))
14
+ Yum.install(["glibc", "bash"])
15
+ end
16
+
17
+ end
18
+
19
+ describe ".installed?" do
20
+ it "returns true if all pkgs are installed" do
21
+ expect(Yum.installed? ["glibc", "bash"]).to eq(true)
22
+ end
23
+
24
+ it "returns false if some pkgs are not installed" do
25
+ expect(Yum.installed? ["glibc", "xyz"]).to eq(false)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,87 @@
1
+ require 'repo'
2
+
3
+ describe "archive flow" do
4
+
5
+ before :all do
6
+ @work_dir = "tmp/archive_flow"
7
+ @repo_dir = "tmp/repo.git"
8
+ @build_dir = "#{@work_dir}/build"
9
+ @deploy_dir = "#{@work_dir}/deploy"
10
+ @drake = "#{Dir.pwd}/dev_exe/drake"
11
+ FileUtils.rm_rf @work_dir
12
+ FileUtils.mkdir_p @work_dir
13
+
14
+ puts "=="* 40
15
+ build_archive
16
+ deploy_archive
17
+ puts "=="* 40
18
+ end
19
+
20
+ def system!(command)
21
+ status = system command
22
+ raise "error in '#{command}'" if not status
23
+ end
24
+
25
+ def build_config
26
+ <<~CONFIG
27
+ repo "#{Dir.pwd}/#{@repo_dir}"
28
+ dir_map({
29
+ "tmp" => "tmp",
30
+ "log" => "log"
31
+ })
32
+ CONFIG
33
+ end
34
+
35
+ def deploy_config
36
+ <<~CONFIG
37
+ name "test"
38
+ repo "http://127.0.0.1:8000/#{@build_dir}/build"
39
+ strategy :archive
40
+ branch "master"
41
+
42
+ build_url do
43
+ "\#{repo}/\#{name}-\#{revision}-\#{branch}.tar.gz"
44
+ end
45
+
46
+ dir_map ({
47
+ "log" => "log",
48
+ "tmp" => "tmp",
49
+ })
50
+ CONFIG
51
+ end
52
+
53
+ def build_archive
54
+ FileUtils.mkdir @build_dir
55
+ File.write "#{@build_dir}/build.rb", build_config
56
+ Dir.chdir @build_dir do
57
+ system! "#{@drake} build -r 0"
58
+ end
59
+ end
60
+
61
+ def deploy_archive
62
+ FileUtils.mkdir @deploy_dir
63
+ IO.write "#{@deploy_dir}/deploy.rb", deploy_config
64
+ Dir.chdir @deploy_dir do
65
+ system! "#{@drake} deploy -r 0"
66
+ end
67
+ end
68
+
69
+ specify "app is deployed" do
70
+ Dir.chdir @deploy_dir do
71
+ expect(File).to exist("current")
72
+ expect(File.directory?("current")).to be(true)
73
+ end
74
+ end
75
+
76
+ specify "bundler installs the gems" do
77
+ Dir.chdir @deploy_dir do
78
+ expect(File).to exist("current/vendor/bundle/ruby")
79
+ end
80
+ end
81
+
82
+ specify "reload works" do
83
+ Dir.chdir @deploy_dir do
84
+ system! "#{@drake} reload"
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,63 @@
1
+ require 'repo'
2
+
3
+ describe "git flow" do
4
+
5
+ before :all do
6
+ @work_dir = "tmp/git_flow"
7
+ @repo_dir = "#{Dir.pwd}/tmp/repo.git"
8
+ @deploy_dir = "#{@work_dir}/deploy"
9
+ @drake = "#{Dir.pwd}/dev_exe/drake"
10
+ FileUtils.rm_rf @work_dir
11
+ FileUtils.mkdir_p @work_dir
12
+
13
+ puts "=="* 40
14
+ deploy_git
15
+ puts "==" * 40
16
+ end
17
+
18
+ def system!(command)
19
+ status = system command
20
+ raise "error in '#{command}'" if not status
21
+ end
22
+
23
+ def deploy_config
24
+ <<~CONFIG
25
+ name "test"
26
+ repo "#{@repo_dir}"
27
+ strategy :git
28
+ branch "master"
29
+
30
+ dir_map ({
31
+ "log" => "log",
32
+ "tmp" => "tmp"
33
+ })
34
+ CONFIG
35
+ end
36
+
37
+ def deploy_git
38
+ FileUtils.mkdir @deploy_dir
39
+ IO.write "#{@deploy_dir}/deploy.rb", deploy_config
40
+ Dir.chdir @deploy_dir do
41
+ system! "#{@drake} deploy"
42
+ end
43
+ end
44
+
45
+ specify "app is deployed" do
46
+ Dir.chdir @deploy_dir do
47
+ expect(File).to exist("current")
48
+ expect(File.directory?("current")).to be(true)
49
+ end
50
+ end
51
+
52
+ specify "bundler installs the gems" do
53
+ Dir.chdir @deploy_dir do
54
+ expect(File).to exist("current/vendor/bundle/ruby")
55
+ end
56
+ end
57
+
58
+ specify "reload works" do
59
+ Dir.chdir @deploy_dir do
60
+ system! "#{@drake} reload"
61
+ end
62
+ end
63
+ end