tetra 0.40.0 → 0.41.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.gitignore +1 -1
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +48 -0
  4. data/MOTIVATION.md +9 -3
  5. data/README.md +5 -5
  6. data/SPECIAL_CASES.md +1 -3
  7. data/integration-tests/{commons.sh → build-commons.sh} +26 -6
  8. data/integration-tests/build-obs.sh +21 -0
  9. data/lib/template/kit_item.spec +53 -0
  10. data/lib/template/package.spec +4 -2
  11. data/lib/tetra.rb +5 -3
  12. data/lib/tetra/archiver.rb +23 -87
  13. data/lib/tetra/commands/generate_all.rb +13 -16
  14. data/lib/tetra/commands/generate_kit_archive.rb +4 -4
  15. data/lib/tetra/commands/generate_kit_spec.rb +4 -2
  16. data/lib/tetra/commands/generate_package_archive.rb +1 -1
  17. data/lib/tetra/commands/generate_package_spec.rb +2 -2
  18. data/lib/tetra/git.rb +19 -10
  19. data/lib/tetra/glue_kit_item.rb +42 -0
  20. data/lib/tetra/jar_kit_item.rb +45 -0
  21. data/lib/tetra/kit.rb +73 -0
  22. data/lib/tetra/maven_kit_item.rb +64 -0
  23. data/lib/tetra/package.rb +82 -0
  24. data/lib/tetra/project.rb +26 -22
  25. data/lib/tetra/spec_generator.rb +38 -42
  26. data/lib/tetra/version.rb +1 -1
  27. data/spec/lib/archiver_spec.rb +30 -86
  28. data/spec/lib/git_spec.rb +8 -8
  29. data/spec/lib/glue_kit_item_spec.rb +31 -0
  30. data/spec/lib/kit_spec.rb +67 -0
  31. data/spec/lib/maven_kit_item_spec.rb +74 -0
  32. data/spec/lib/package_spec.rb +78 -0
  33. data/spec/lib/project_spec.rb +1 -1
  34. data/spec/lib/spec_generator_spec.rb +59 -87
  35. metadata +15 -8
  36. data/lib/template/kit.spec +0 -64
  37. data/lib/tetra/kit_spec_adapter.rb +0 -28
  38. data/lib/tetra/package_spec_adapter.rb +0 -59
  39. data/lib/tetra/template_manager.rb +0 -33
  40. data/spec/lib/template_manager_spec.rb +0 -54
@@ -1,60 +1,56 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Tetra
4
- # creates and updates spec files
5
- class SpecGenerator
6
- include Logging
7
-
8
- def initialize(project)
9
- @project = project
10
- end
11
-
12
- def generate_kit_spec
13
- @project.from_directory do
14
- spec_name = "#{@project.name}-kit.spec"
15
- spec_path = File.join("kit", spec_name)
16
- output_dir = File.join("output", "#{@project.name}-kit")
4
+ # implements a to_spec method
5
+ module SpecGenerator
6
+ # expected attributes:
7
+ # project (Tetra::Project)
8
+ # package_name (string)
9
+ # spec_dir (string)
10
+ # template_spec_name (string)
11
+
12
+ # saves a specfile for this object in correct directories
13
+ # returns the spec path and the conflict count with the previously generated
14
+ # version, if any
15
+ def to_spec
16
+ project.from_directory do
17
+ spec_name = "#{package_name}.spec"
18
+ spec_path = File.join(spec_dir, spec_name)
19
+
20
+ new_content = generate(template_spec_name, binding)
21
+ conflict_count = project.merge_new_content(new_content, spec_path,
22
+ "Spec generated", "generate_#{package_name}_spec")
23
+
24
+ output_dir = File.join("output", package_name)
17
25
  FileUtils.mkdir_p(output_dir)
18
26
 
19
- adapter = Tetra::KitSpecAdapter.new(@project)
20
- conflict_count = generate_merging("kit.spec", adapter.public_binding, spec_path, :generate_kit_spec)
21
-
22
- symlink_to_output(spec_path, output_dir)
27
+ spec_link_path = File.join(output_dir, spec_name)
28
+ FileUtils.symlink(File.expand_path(spec_path), spec_link_path, force: true)
23
29
 
24
30
  [spec_path, conflict_count]
25
31
  end
26
32
  end
27
33
 
28
- def generate_package_spec(name, pom_path, filter)
29
- pom = Tetra::Pom.new(pom_path)
30
- @project.from_directory do
31
- spec_name = "#{name}.spec"
32
- spec_path = File.join("src", name, spec_name)
33
- output_dir = File.join("output", name)
34
- FileUtils.mkdir_p(output_dir)
35
-
36
- adapter = Tetra::PackageSpecAdapter.new(@project, name, pom, filter)
37
- conflict_count = generate_merging("package.spec", adapter.public_binding, spec_path, "generate_#{name}_spec")
38
-
39
- symlink_to_output(spec_path, output_dir)
40
-
41
- [spec_path, conflict_count]
42
- end
34
+ # returns the spec template path, exposed for testing
35
+ def template_path
36
+ File.join(File.dirname(__FILE__), "..", "template")
43
37
  end
44
38
 
45
39
  private
46
40
 
47
- # generates a spec file from a template and 3-way merges it
48
- def generate_merging(template, binding, path, tag_prefix)
49
- new_content = TemplateManager.new.generate(template, binding)
50
- @project.merge_new_content(new_content, path, "Spec generated", tag_prefix)
51
- end
41
+ # generates content from an ERB template and an object binding
42
+ # if destination_path is given, write it to that file, otherwise just
43
+ # return it
44
+ def generate(template_name, object_binding, destination_path = nil)
45
+ template_path = File.join(File.dirname(__FILE__), "..", "template")
46
+ erb = ERB.new File.read(File.join(template_path, template_name)), nil, "<>"
47
+ new_content = erb.result(object_binding)
48
+
49
+ unless destination_path.nil?
50
+ File.open(destination_path, "w") { |io| io.write new_content }
51
+ end
52
52
 
53
- # links a spec file in a subdirectory of output/
54
- def symlink_to_output(spec_path, destination_dir)
55
- spec_name = Pathname.new(spec_path).basename.to_s
56
- destination_spec_path = File.join(destination_dir, spec_name)
57
- FileUtils.symlink(File.expand_path(spec_path), destination_spec_path, force: true)
53
+ new_content
58
54
  end
59
55
  end
60
56
  end
data/lib/tetra/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  # base module for tetra
4
4
  module Tetra
5
- VERSION = "0.40.0"
5
+ VERSION = "0.41.0"
6
6
  end
@@ -3,103 +3,47 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Tetra::Archiver do
6
- before(:each) do
7
- @project_path = File.join("spec", "data", "test-project")
8
- Dir.mkdir(@project_path)
9
-
10
- Tetra::Project.init(@project_path)
11
- @project = Tetra::Project.new(@project_path)
12
- end
13
-
14
- after(:each) do
15
- FileUtils.rm_rf(@project_path)
16
- end
17
-
18
- let(:archiver) { Tetra::Archiver.new(@project) }
19
-
20
- describe "#archive_single" do
21
- it "archives a list of files" do
22
- @project.from_directory do
23
- File.open("test", "w") { |io| io.puts "test content" }
24
-
25
- archiver.archive_single(".", "test.tar.xz")
26
- expect(`tar -Jtf test.tar.xz`.split).to include("test")
27
- end
6
+ include Tetra::Mockers
7
+
8
+ # mock
9
+ class TestArchiverClass
10
+ include Tetra::Archiver
11
+
12
+ attr_reader :project
13
+ attr_reader :package_name
14
+ attr_reader :source_dir
15
+ attr_reader :source_paths
16
+ attr_reader :destination_dir
17
+
18
+ def initialize(project)
19
+ @project = project
20
+ @package_name = "test-package"
21
+ @source_dir = "kit"
22
+ @source_paths = ["*"]
23
+ @destination_dir = "test-package"
28
24
  end
29
25
  end
30
26
 
31
- describe "#archive_incremental" do
32
- it "archives an increment of a directory" do
33
- @project.from_directory do
34
- File.open("test", "w") { |io| io.puts "test content 1" }
35
- File.open("test2", "w") { |io| io.puts "test content 1" }
36
- archiver.archive_incremental(".", ".", "test", ".tar.xz", :archive_kit)
37
- expect(`tar -Jtf test.tar.xz`.split).to include("test")
38
-
39
- @project.take_snapshot("test archive snapshot 1", :archive_kit)
40
-
41
- File.open("test", "w") { |io| io.puts "test content 2" }
42
- File.open("test3", "w") { |io| io.puts "test content 2" }
43
-
44
- @project.take_snapshot("test archive snapshot 2")
45
-
46
- archiver.archive_incremental(".", ".", "test", ".tar.xz", :archive_kit)
47
- files = `tar -Jtf test_0001.tar.xz`.split
48
-
49
- expect(files).to include("test")
50
- expect(files).to include("test3")
51
- expect(files).not_to include("test2")
52
- end
53
- end
27
+ before(:each) do
28
+ create_mock_project
54
29
  end
55
30
 
56
- describe "#archive_kit" do
57
- it "archives a kit package files, not incrementally" do
58
- @project.from_directory do
59
- File.open(File.join("kit", "kit_test"), "w") { |io| io.puts "test content" }
60
- end
61
- @project.finish(false)
62
-
63
- archiver.archive_kit(true)
64
- @project.from_directory do
65
- expect(`tar -Jtf output/test-project-kit/test-project-kit.tar.xz`.split).to include("kit_test")
66
- end
67
- end
68
- it "archives a kit package files incrementally" do
69
- @project.from_directory do
70
- File.open(File.join("kit", "kit_test"), "w") { |io| io.puts "test content" }
71
- end
72
- @project.finish(false)
73
-
74
- archiver.archive_kit(false)
75
- @project.from_directory do
76
- expect(`tar -Jtf output/test-project-kit/test-project-kit.tar.xz`.split).to include("kit_test")
77
- end
31
+ let(:instance) { TestArchiverClass.new(@project) }
78
32
 
79
- @project.from_directory do
80
- File.open(File.join("kit", "kit_test2"), "w") { |io| io.puts "test content" }
81
- end
82
-
83
- archiver.archive_kit(false)
84
- @project.from_directory do
85
- files = `tar -Jtf output/test-project-kit/test-project-kit_0001.tar.xz`.split
86
- expect(files).to include("kit_test2")
87
- expect(files).not_to include("kit_test")
88
- end
89
- end
33
+ after(:each) do
34
+ delete_mock_project
90
35
  end
91
36
 
92
- describe "#archive_package" do
93
- it "archives a package files" do
94
- @project.from_directory do
95
- Dir.mkdir(File.join("src", "package-name"))
96
- File.open(File.join("src", "package-name", "src_test"), "w") { |io| io.puts "test content" }
37
+ describe "#to_archive" do
38
+ it "generates an archive" do
39
+ @project.from_directory("kit") do
40
+ FileUtils.touch("kit_test")
97
41
  end
98
- @project.finish(false)
99
42
 
100
- archiver.archive_package "package-name"
43
+ instance.to_archive
44
+
101
45
  @project.from_directory do
102
- expect(`tar -Jtf output/package-name/package-name.tar.xz`.split).to include("src_test")
46
+ expect(`tar -Jtf output/test-package/test-package.tar.xz`.split).to include("kit_test")
103
47
  end
104
48
  end
105
49
  end
data/spec/lib/git_spec.rb CHANGED
@@ -35,7 +35,7 @@ describe Tetra::Git do
35
35
  file.write "file1o"
36
36
  end
37
37
 
38
- @git.commit_whole_directory("test", "test")
38
+ @git.commit_whole_directory("test", :test)
39
39
 
40
40
  files = `git ls-tree --name-only -r HEAD`.split("\n")
41
41
 
@@ -52,15 +52,15 @@ describe Tetra::Git do
52
52
  file.write "test"
53
53
  end
54
54
 
55
- @git.commit_whole_directory("test", "test")
55
+ @git.commit_whole_directory("test", :test_start)
56
56
 
57
57
  File.open("file2", "w") do |file|
58
58
  file.write "test"
59
59
  end
60
60
 
61
- @git.commit_whole_directory("test end")
61
+ @git.commit_whole_directory("test end", :test_end)
62
62
 
63
- files = @git.changed_files_since("test")
63
+ files = @git.changed_files_since(:test_start)
64
64
 
65
65
  expect(files).not_to include("file1")
66
66
  expect(files).to include("file2")
@@ -75,7 +75,7 @@ describe Tetra::Git do
75
75
  file.write "test"
76
76
  end
77
77
 
78
- @git.commit_whole_directory("test", "test_start")
78
+ @git.commit_whole_directory("test", :test_start)
79
79
 
80
80
  File.open("file2", "w") do |file|
81
81
  file.write "test"
@@ -85,15 +85,15 @@ describe Tetra::Git do
85
85
  file.write "test"
86
86
  end
87
87
 
88
- @git.commit_whole_directory("test", "test_end")
88
+ @git.commit_whole_directory("test", :test_end)
89
89
 
90
90
  File.open("file4", "w") do |file|
91
91
  file.write "test"
92
92
  end
93
93
 
94
- @git.commit_whole_directory("test")
94
+ @git.commit_whole_directory("test", :test_after)
95
95
 
96
- files = @git.changed_files_between("test_start", "test_end", "subdir")
96
+ files = @git.changed_files_between(:test_start, :test_end, "subdir")
97
97
 
98
98
  expect(files).not_to include("file1")
99
99
  expect(files).not_to include("file2")
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Tetra::GlueKitItem do
6
+ include Tetra::Mockers
7
+
8
+ before(:each) do
9
+ create_mock_project
10
+ end
11
+
12
+ after(:each) do
13
+ delete_mock_project
14
+ end
15
+
16
+ let(:instance) { Tetra::GlueKitItem.new(@project, []) }
17
+
18
+ describe "#to_spec" do
19
+ it "generates a specfile" do
20
+ expect(instance.to_spec).to be_truthy
21
+
22
+ @project.from_directory do
23
+ package_name = instance.package_name
24
+ spec_lines = File.readlines(File.join("output", package_name, "#{package_name}.spec"))
25
+
26
+ expect(spec_lines).to include("Conflicts: otherproviders(tetra-glue)\n")
27
+ expect(spec_lines).to include("Provides: tetra-glue == test-project-0\n")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Tetra::Kit do
6
+ include Tetra::Mockers
7
+
8
+ before(:each) do
9
+ create_mock_project
10
+
11
+ @project.dry_run
12
+ @project.finish(false)
13
+
14
+ @kit = Tetra::Kit.new(@project)
15
+ end
16
+
17
+ after(:each) do
18
+ delete_mock_project
19
+ end
20
+
21
+ describe "#maven_kit_items" do
22
+ it "finds binary packages" do
23
+ @project.from_directory(File.join("kit", "m2")) do
24
+ maven_kit_item_path = File.join(".", "com", "company",
25
+ "project", "artifact", "1.0")
26
+ FileUtils.mkdir_p(maven_kit_item_path)
27
+
28
+ expected_source_paths = [
29
+ File.join(maven_kit_item_path, "artifact-1.0.jar"),
30
+ File.join(maven_kit_item_path, "artifact-1.0.pom"),
31
+ File.join(maven_kit_item_path, "artifact-1.0.sha1")
32
+ ]
33
+
34
+ expected_source_paths.each do |file|
35
+ FileUtils.touch(file)
36
+ end
37
+
38
+ actual_maven_kit_item = @kit.maven_kit_items.first
39
+ expect(actual_maven_kit_item.source_paths.sort).to eql(expected_source_paths)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#jar_kit_items" do
45
+ it "finds binary packages" do
46
+ @project.from_directory(File.join("kit", "jars")) do
47
+ FileUtils.touch("test1.jar")
48
+ end
49
+
50
+ actual_jar_kit_item = @kit.jar_kit_items.first
51
+ expect(actual_jar_kit_item.source_paths).to eql([Pathname.new("test1.jar")])
52
+ end
53
+ end
54
+
55
+ describe "#glue_kit_items" do
56
+ it "finds binary packages" do
57
+ @project.from_directory(File.join("kit")) do
58
+ FileUtils.touch(File.join("jars", "test1.jar"))
59
+ FileUtils.touch("test2.jar")
60
+ end
61
+
62
+ actual_glue_kit_items = @kit.glue_kit_items(@kit.jar_kit_items).first
63
+ expect(actual_glue_kit_items.source_paths).not_to include(Pathname.new("test1.jar"))
64
+ expect(actual_glue_kit_items.source_paths).to include(Pathname.new("test2.jar"))
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Tetra::MavenKitItem do
6
+ include Tetra::Mockers
7
+
8
+ before(:each) do
9
+ create_mock_project
10
+ end
11
+
12
+ after(:each) do
13
+ delete_mock_project
14
+ end
15
+
16
+ let(:group_id) { "com.company.project" }
17
+ let(:artifact_id) { "artifact" }
18
+ let(:version) { "1.0" }
19
+ let(:dir) { File.join(group_id.gsub(".", File::SEPARATOR), artifact_id, version) }
20
+ let(:pom) { File.join(dir, "#{artifact_id}-#{version}.pom") }
21
+ let(:jar) { File.join(dir, "#{artifact_id}.jar") }
22
+ let(:package_name) { "kit-item-#{group_id.gsub(".", "-")}-#{artifact_id}-#{version}" }
23
+ let(:maven_kit_item) { Tetra::MavenKitItem.new(@project, pom, [pom, jar]) }
24
+
25
+ describe "#provides_symbol" do
26
+ it "returns the sepec Provides: symbol" do
27
+ expect(maven_kit_item.provides_symbol).to eq("tetra-mvn(com.company.project:artifact)")
28
+ end
29
+ end
30
+
31
+ describe "#provides_version" do
32
+ it "returns the spec Provides: version" do
33
+ expect(maven_kit_item.provides_version).to eq("1.0")
34
+ end
35
+ end
36
+
37
+ describe "#to_spec" do
38
+ it "generates a specfile" do
39
+ expect(maven_kit_item.to_spec).to be_truthy
40
+
41
+ @project.from_directory do
42
+ spec_lines = File.readlines(File.join("output", package_name, "#{package_name}.spec"))
43
+
44
+ expect(spec_lines).to include("# spec file for a build-time dependency of project \"test-project\"\n")
45
+ expect(spec_lines).to include("Name: kit-item-com-company-project-artifact-1.0\n")
46
+ expect(spec_lines).to include("Summary: Build-time dependency of project \"test-project\"\n")
47
+ expect(spec_lines).to include("Provides: tetra-mvn(#{group_id}:#{artifact_id}) == #{version}\n")
48
+
49
+ expect(spec_lines).to include("install -d -m 0755 %{buildroot}%{_datadir}/tetra/m2\n")
50
+ expect(spec_lines).to include("cp -a * %{buildroot}%{_datadir}/tetra/m2\n")
51
+ expect(spec_lines).to include("%{_datadir}/tetra/m2\n")
52
+ end
53
+ end
54
+ end
55
+
56
+ describe "#to_archive" do
57
+ it "generates an archive" do
58
+ @project.from_directory(File.join("kit", "m2")) do
59
+ FileUtils.mkdir_p(dir)
60
+ FileUtils.touch(pom)
61
+ FileUtils.touch(jar)
62
+ end
63
+
64
+ expected_filename = File::SEPARATOR + "kit-item-com-company-project-artifact-1.0.tar.xz"
65
+ expect(maven_kit_item.to_archive).to end_with(expected_filename)
66
+
67
+ @project.from_directory do
68
+ contents = `tar -Jtf output/#{package_name}/#{package_name}.tar.xz`.split
69
+ expect(contents).to include("com/company/project/artifact/1.0/artifact-1.0.pom")
70
+ expect(contents).to include("com/company/project/artifact/1.0/artifact.jar")
71
+ end
72
+ end
73
+ end
74
+ end