tetra 0.40.0 → 0.41.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 (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