doubleshot 0.2.0-java → 0.3.0-java

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 (47) hide show
  1. data/Doubleshot +16 -6
  2. data/README-OLD.textile +216 -0
  3. data/README.textile +38 -182
  4. data/lib/doubleshot.rb +100 -39
  5. data/lib/doubleshot/commands/gem.rb +15 -12
  6. data/lib/doubleshot/commands/test.rb +38 -5
  7. data/lib/doubleshot/configuration.rb +2 -2
  8. data/lib/doubleshot/dependencies/dependency.rb +1 -1
  9. data/lib/doubleshot/dependencies/gem_dependency.rb +2 -10
  10. data/lib/doubleshot/dependencies/jar_dependency.rb +12 -2
  11. data/lib/doubleshot/lockfile.rb +9 -6
  12. data/lib/doubleshot/pom.rb +15 -2
  13. data/lib/doubleshot/resolver.rb +1 -0
  14. data/lib/doubleshot/resolver/gem_resolver.rb +45 -0
  15. data/lib/doubleshot/resolver/gem_resolver/artifact.rb +146 -0
  16. data/lib/doubleshot/resolver/gem_resolver/demand.rb +57 -0
  17. data/lib/doubleshot/resolver/gem_resolver/dependency.rb +57 -0
  18. data/lib/doubleshot/resolver/gem_resolver/errors.rb +37 -0
  19. data/lib/doubleshot/resolver/gem_resolver/gem_source.rb +58 -0
  20. data/lib/doubleshot/resolver/gem_resolver/graph.rb +200 -0
  21. data/lib/doubleshot/resolver/gem_resolver/solver.rb +279 -0
  22. data/lib/doubleshot/resolver/gem_resolver/solver/constraint_row.rb +29 -0
  23. data/lib/doubleshot/resolver/gem_resolver/solver/constraint_table.rb +35 -0
  24. data/lib/doubleshot/resolver/gem_resolver/solver/variable_row.rb +47 -0
  25. data/lib/doubleshot/resolver/gem_resolver/solver/variable_table.rb +59 -0
  26. data/lib/doubleshot/resolver/gem_resolver/source.rb +36 -0
  27. data/lib/doubleshot/resolver/jar_resolver.rb +1 -3
  28. data/lib/ruby/gem/requirement.rb +9 -0
  29. data/target/doubleshot.jar +0 -0
  30. data/test/compiler_spec.rb +31 -3
  31. data/test/configuration_spec.rb +11 -3
  32. data/test/dependencies/gem_dependency_spec.rb +3 -17
  33. data/test/dependencies/jar_dependency_spec.rb +20 -0
  34. data/test/helper.rb +3 -1
  35. data/test/helpers/stub_source.rb +120 -0
  36. data/test/lockfile_spec.rb +9 -17
  37. data/test/pom_spec.rb +31 -1
  38. data/test/resolver/gem_resolver/artifact_spec.rb +106 -0
  39. data/test/resolver/gem_resolver/demand_spec.rb +70 -0
  40. data/test/resolver/gem_resolver/dependency_spec.rb +33 -0
  41. data/test/resolver/gem_resolver/gem_source_spec.rb +28 -0
  42. data/test/resolver/gem_resolver/graph_spec.rb +239 -0
  43. data/test/resolver/gem_resolver/solver_spec.rb +449 -0
  44. data/test/resolver/gem_resolver/source_spec.rb +18 -0
  45. data/test/resolver/gem_resolver_spec.rb +102 -0
  46. metadata +35 -73
  47. data/lib/doubleshot/jar.rb +0 -62
@@ -0,0 +1,36 @@
1
+ require "uri"
2
+
3
+ class Doubleshot
4
+ class Resolver
5
+ class GemResolver
6
+
7
+ class Source
8
+
9
+ def self.map(*mime_types)
10
+ mime_types.each do |mime_type|
11
+ mappings[mime_type.to_s] = self
12
+ end
13
+ end
14
+
15
+ def self.mappings
16
+ @@mappings ||= {}
17
+ end
18
+
19
+ def self.new(uri)
20
+ uri = URI.parse(uri.to_s)
21
+ instance = mappings[uri.scheme].allocate
22
+ instance.send(:initialize, uri)
23
+ instance
24
+ end
25
+
26
+ def initialize(uri)
27
+ @uri = uri
28
+ end
29
+
30
+ SUPPORTED_PLATFORMS = [ /\bjava\b/i, /^jruby$/i, /^ruby$/i ]
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ require "doubleshot/resolver/gem_resolver/gem_source"
@@ -1,5 +1,3 @@
1
- java_import "org.sam.doubleshot.Aether"
2
-
3
1
  class Doubleshot
4
2
  class Resolver
5
3
  class JarResolver < Resolver
@@ -8,7 +6,7 @@ class Doubleshot
8
6
  def initialize(*repositories)
9
7
  super
10
8
  # Change the second argument to "true" to get verbose output.
11
- @aether = Aether.new(Pathname("~/.m2").expand_path.to_s, false, false)
9
+ @aether = org.sam.doubleshot.Aether.new(Pathname("~/.m2").expand_path.to_s, false, false)
12
10
  @repositories.each do |repository|
13
11
  @aether.add_repository repository.host, repository.to_s
14
12
  end
@@ -1,4 +1,13 @@
1
1
  class Gem::Requirement
2
+ # TODO: refactor Doubleshot to only use satisfied_by?(Gem::Version) instead of satisfies?(String|Gem::Version)
3
+ def satisfies?(version)
4
+ unless version.is_a? Gem::Version
5
+ version = Gem::Version.new(version.to_s)
6
+ end
7
+ satisfied_by? version
8
+ end
9
+ alias :satisfies :satisfies?
10
+
2
11
  def eql?(other)
3
12
  self == other
4
13
  end
Binary file
@@ -4,12 +4,12 @@ require_relative "helper"
4
4
 
5
5
  describe Doubleshot::Compiler do
6
6
 
7
- def compile
7
+ def compile(source = "java", target = "target")
8
8
  Helper::tmp do |tmp|
9
- source = tmp + "java"
9
+ source = tmp + source
10
10
  source.mkdir
11
11
 
12
- target = tmp + "target"
12
+ target = tmp + target
13
13
  target.mkdir
14
14
 
15
15
  (source + "Cow.java").open("w+") do |cow|
@@ -43,6 +43,34 @@ describe Doubleshot::Compiler do
43
43
 
44
44
  describe "#pending?" do
45
45
 
46
+ it "must be pending if the target doesn't exist" do
47
+ Helper::tmp do |tmp|
48
+ source = tmp + "java"
49
+ source.mkdir
50
+
51
+ target = tmp + "notarget"
52
+ # We're testing that target doesn't exist so:
53
+ # target.mkdir
54
+
55
+ (source + "Cow.java").open("w+") do |cow|
56
+ cow << <<-EOS.margin
57
+ package org.sam.doubleshot;
58
+
59
+ public class Cow {
60
+ public Cow() {}
61
+
62
+ public String moo() {
63
+ return "MOO!";
64
+ }
65
+ }
66
+ EOS
67
+ end
68
+
69
+ compiler = Doubleshot::Compiler.new(source, target)
70
+ compiler.must_be :pending
71
+ end
72
+ end
73
+
46
74
  it "wont be pending after a build" do
47
75
  compile do |compiler|
48
76
  compiler.build!
@@ -62,12 +62,12 @@ describe Doubleshot::Configuration do
62
62
 
63
63
  describe "repositories" do
64
64
  it "must add Maven repositories" do
65
- @config.mvn_repository "http://repository.jboss.com/maven2/"
66
- @config.mvn_repositories.must_include "http://repository.jboss.com/maven2/"
65
+ @config.mvn_repository "http://repository.jboss.com/maven2"
66
+ @config.mvn_repositories.must_include "http://repository.jboss.com/maven2"
67
67
  end
68
68
 
69
69
  it "must return the passed value from mvn_repository" do
70
- example = "http://repository.jboss.com/maven2/"
70
+ example = "http://repository.jboss.com/maven2"
71
71
  @config.mvn_repository(example).must_be_same_as example
72
72
  end
73
73
 
@@ -80,6 +80,14 @@ describe Doubleshot::Configuration do
80
80
  example = "http://rubyforge.org"
81
81
  @config.gem_repository(example).must_be_same_as example
82
82
  end
83
+
84
+ it "must default to rubygems.org if no other gem repositories are specified" do
85
+ @config.gem_repositories.must_include "http://rubygems.org"
86
+ end
87
+
88
+ it "must default to central if no other maven repositories are specified" do
89
+ @config.mvn_repositories.must_include "http://repo1.maven.org/maven2"
90
+ end
83
91
  end
84
92
 
85
93
  describe "jar" do
@@ -39,23 +39,9 @@ describe Doubleshot::Dependencies::GemDependency do
39
39
  @dependency.to_s.must_equal "listen"
40
40
  end
41
41
 
42
- it "must have a long-form that includes requirements" do
43
- @dependency.to_s(true).must_equal "listen (= 0.5.3, >= 0.5)"
44
- end
45
- end
46
-
47
- describe "gemspec" do
48
- it "must return a Gem::Specification" do
49
- skip
50
- @dependency.gemspec = Gem::Specification.new
51
- @dependency.gemspec.must_be_kind_of Gem::Specification
52
- end
53
- end
54
-
55
- describe "dependencies" do
56
- it "must return a Doubleshot::Dependencies::DependencyList" do
57
- skip
58
- @dependency.dependencies.must_be_kind_of Doubleshot::Dependencies::DependencyList
42
+ it "must have a long-form that includes version if present" do
43
+ @dependency.lock "0.5.3"
44
+ @dependency.to_s(true).must_equal "listen:0.5.3"
59
45
  end
60
46
  end
61
47
  end
@@ -65,4 +65,24 @@ describe Doubleshot::Dependencies::JarDependency do
65
65
  Doubleshot::Dependencies::JarDependency.new("ch.qos.logback:logback-core:1.0.6")
66
66
  .to_s(true).must_equal "ch.qos.logback:logback-core:jar:1.0.6"
67
67
  end
68
+
69
+ describe "exclude" do
70
+ before do
71
+ @jar_dependency = Doubleshot::Dependencies::JarDependency.new "org.sonatype.aether:aether-connector-wagon:1.13.1"
72
+ end
73
+
74
+ it "allows you to exclude a groupId:artifactId for use in POM-file dependency exclusions" do
75
+ @jar_dependency.exclude("org.sonatype.sisu:sisu-guice")
76
+ @jar_dependency.exclusions.must_equal [ "org.sonatype.sisu:sisu-guice" ]
77
+ end
78
+
79
+ it "should verify that your exclusion string contains one and only one colon" do
80
+ -> { @jar_dependency.exclude "missing-colon" }.must_raise(ArgumentError)
81
+ -> { @jar_dependency.exclude "too:many:colons" }.must_raise(ArgumentError)
82
+ end
83
+
84
+ it "should return self so you can chain exclusions" do
85
+ @jar_dependency.exclude("org.sonatype.sisu:sisu-guice").must_equal @jar_dependency
86
+ end
87
+ end
68
88
  end
data/test/helper.rb CHANGED
@@ -50,4 +50,6 @@ module Helper
50
50
  ensure
51
51
  dir.rmtree if dir.exist?
52
52
  end
53
- end
53
+ end
54
+
55
+ require(Pathname(__FILE__).dirname + "helpers/stub_source")
@@ -0,0 +1,120 @@
1
+ module Helper
2
+ class StubSource < Doubleshot::Resolver::GemResolver::Source
3
+ map :stub
4
+
5
+ def self.index(gems)
6
+ @@index = {}
7
+ gems.each_pair do |name, versions|
8
+ specs = @@index[name] ||= {}
9
+ versions.each_pair do |version, dependencies|
10
+ spec = specs[Gem::Version.new(version)] = Gem::Specification.new
11
+ spec.name = name
12
+ spec.version = version
13
+ dependencies.each_pair do |name, versions|
14
+ spec.add_runtime_dependency name, *versions
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ def versions(name)
21
+ @@index[name.to_s].keys
22
+ end
23
+
24
+ def spec(name, version)
25
+ @@index[name.to_s][version]
26
+ end
27
+
28
+ index(
29
+ "rdoc" => {
30
+ "3.12" => { "json" => "~>1.4" },
31
+ "3.9.0" => {},
32
+ "3.8.3" => { "json" => "=1.7.2" }
33
+ },
34
+ "json" => {
35
+ "1.7.5" => { "erubis" => "~>2.6.6" },
36
+ "1.7.4" => {},
37
+ "1.7.3" => {},
38
+ "1.7.2" => { "erubis" => "2.6.5" }
39
+ },
40
+ "minitest-wscolor" => {
41
+ "0.0.3" => { "minitest" => ">=2.3.1" },
42
+ "0.0.2" => {}
43
+ },
44
+ "minitest" => {
45
+ "3.0.4" => {},
46
+ "3.0.3" => {},
47
+ "3.0.0" => {},
48
+ "2.3.1" => {},
49
+ "2.3.0" => {},
50
+ },
51
+ "erubis" => {
52
+ "2.7.0" => { "minitest" => ">=3.0.0" },
53
+ "2.6.6" => {},
54
+ "2.6.5" => {}
55
+ },
56
+ "rack" => {
57
+ "1.4.1" => {},
58
+ "1.4.0" => {},
59
+ "1.3.6" => {},
60
+ "1.2.5" => {},
61
+ "1.1.3" => {}
62
+ },
63
+ "harbor" => {
64
+ "0.16.12" => { "erubis" => ">=0", "rack" => "~>1.0.0", "json" => ">=0" },
65
+ "0.16.11" => { "erubis" => ">=0", "rack" => "~>1.0.0" },
66
+ "0.16.10" => { "erubis" => ">=0", "rack" => ">=0" }
67
+ },
68
+ "hello" => {
69
+ "4.0" => { "harbor" => "~>0.16.10", "json" => "~>1.7.0", "minitest-wscolor" => "=0.0.3" },
70
+ "3.9" => { "harbor" => ">=0", "json" => ">=0", "minitest-wscolor" => ">=0", "minitest" => "~>2.3" },
71
+ "3.8" => { "harbor" => ">=0", "erubis" => "~>2.6.5" },
72
+ "2.2" => { "harbor" => ">=0" }
73
+ },
74
+ "top-level" => {
75
+ "1.0" => { "mid-level-1" => ">=0", "mid-level-2" => ">=0" }
76
+ },
77
+ "mid-level-1" => {
78
+ "2.0" => { "bottom-level" => [ ">=1.0", "<=3.0" ] },
79
+ "1.0" => {}
80
+ },
81
+ "mid-level-2" => {
82
+ "2.0" => { "bottom-level" => ">=2.0" },
83
+ "1.0" => {}
84
+ },
85
+ "bottom-level" => {
86
+ "2.3" => {},
87
+ "2.0" => {},
88
+ "1.3" => {},
89
+ "1.0" => {},
90
+ "0.9" => {}
91
+ },
92
+ "get-the-old-one" => {
93
+ "1.0" => { "locked-mid-1" => ">=0", "locked-mid-2" => ">=0" },
94
+ "0.5" => {}
95
+ },
96
+ "locked-mid-1" => {
97
+ "2.0" => { "old-bottom" => "=2.0" },
98
+ "1.3" => { "old-bottom" => "=0.5" },
99
+ "1.0" => {}
100
+ },
101
+ "locked-mid-2" => {
102
+ "2.0" => { "old-bottom" => "=2.1" },
103
+ "1.4" => { "old-bottom" => "=0.5" },
104
+ "1.0" => {}
105
+ },
106
+ "old-bottom" => {
107
+ "2.1" => {},
108
+ "2.0" => {},
109
+ "1.0" => {},
110
+ "0.5" => {}
111
+ },
112
+ "oops" => {
113
+ "1.0" => { "oops-2" => "=2.0" }
114
+ },
115
+ "oops-2" => {
116
+ "1.0" => {}
117
+ }
118
+ )
119
+ end
120
+ end
@@ -195,32 +195,24 @@ describe Doubleshot::Lockfile do
195
195
  @lockfile_contents = <<-EOS.margin
196
196
  ---
197
197
  GEMS:
198
- backports (2.6.4): []
199
- ffi (1.0.11): []
200
- ffi (1.0.11-java): []
201
- hitimes (1.1.1): []
202
- hitimes (1.1.1-java): []
203
- minitest (3.4.0): []
204
- minitest-wscolor (0.0.3):
205
- - minitest (>= 2.3.1)
206
- multi_json (1.3.6): []
207
- path (1.3.1): []
208
- perfer (0.2.0):
209
- - backports (~> 2.6.3)
210
- - ffi (~> 1.0.11)
211
- - hitimes (~> 1.1.1)
212
- - path (~> 1.3.1)
198
+ - backports:2.6.4
199
+ - ffi:1.0.11
200
+ - hitimes:1.1.1
201
+ - minitest:3.4.0
202
+ - minitest-wscolor:0.0.3
203
+ - multi_json:1.3.6
204
+ - path:1.3.1
205
+ - perfer:0.2.0
213
206
  JARS: []
214
207
  EOS
215
208
  end
216
209
 
217
210
  it "must handle proper YAML format" do
218
- skip
219
211
  lockfile "test_good.lock" do |lockfile|
220
212
  lockfile.path.open("w+") do |file|
221
213
  file << @lockfile_contents
222
214
  end
223
- lockfile.gems.size.must_equal 10
215
+ lockfile.gems.size.must_equal 8
224
216
  end
225
217
  end
226
218
 
data/test/pom_spec.rb CHANGED
@@ -15,6 +15,8 @@ describe Doubleshot::Pom do
15
15
  config.jar "org.jruby:jruby-complete:jar:1.7.0.RC1"
16
16
  config.jar "org.sonatype.aether:aether-api:jar:1.13.1"
17
17
  config.jar "org.sonatype.aether:aether-util:jar:1.13.1"
18
+ config.jar("org.sonatype.aether:aether-connector-wagon:1.13.1").exclude("org.sonatype.sisu:sisu-guice")
19
+ config.jar("testing:chaining-exclusions:jar:0.0.1").exclude("testing:exclusion-1").exclude("testing:exclusion-2")
18
20
 
19
21
  config.gemspec do |spec|
20
22
  spec.summary = "Build, Dependencies and Testing all in one!"
@@ -59,8 +61,36 @@ describe Doubleshot::Pom do
59
61
  <type>jar</type>
60
62
  <version>1.13.1</version>
61
63
  </dependency>
64
+ <dependency>
65
+ <groupId>org.sonatype.aether</groupId>
66
+ <artifactId>aether-connector-wagon</artifactId>
67
+ <type>jar</type>
68
+ <version>1.13.1</version>
69
+ <exclusions>
70
+ <exclusion>
71
+ <groupId>org.sonatype.sisu</groupId>
72
+ <artifactId>sisu-guice</artifactId>
73
+ </exclusion>
74
+ </exclusions>
75
+ </dependency>
76
+ <dependency>
77
+ <groupId>testing</groupId>
78
+ <artifactId>chaining-exclusions</artifactId>
79
+ <type>jar</type>
80
+ <version>0.0.1</version>
81
+ <exclusions>
82
+ <exclusion>
83
+ <groupId>testing</groupId>
84
+ <artifactId>exclusion-1</artifactId>
85
+ </exclusion>
86
+ <exclusion>
87
+ <groupId>testing</groupId>
88
+ <artifactId>exclusion-2</artifactId>
89
+ </exclusion>
90
+ </exclusions>
91
+ </dependency>
62
92
  </dependencies>
63
93
  </project>
64
94
  EOS
65
95
  end
66
- end
96
+ end
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env jruby
2
+
3
+ # encoding: utf-8
4
+
5
+ require_relative "../../helper"
6
+
7
+ describe Doubleshot::Resolver::GemResolver::Artifact do
8
+
9
+ before do
10
+ @graph = Doubleshot::Resolver::GemResolver::Graph.new
11
+ @artifact = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
12
+ end
13
+
14
+ describe "equality" do
15
+ it "must equal another artifact with the same name and version" do
16
+ artifact_1 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
17
+ artifact_2 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
18
+ artifact_1.must_equal artifact_2
19
+ end
20
+
21
+ it "must not equal another artifact with the same name but different version" do
22
+ artifact_1 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
23
+ artifact_2 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "2.0")
24
+ artifact_1.wont_equal artifact_2
25
+ end
26
+
27
+ it "must not equal another artifact with the same version but different name" do
28
+ artifact_1 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
29
+ artifact_2 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "not_listen", "1.0")
30
+ artifact_1.wont_equal artifact_2
31
+ end
32
+ end
33
+
34
+ describe "sorting" do
35
+ it "must sort artifacts by their name, then version number" do
36
+ artifact_1 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "1.0")
37
+ artifact_2 = Doubleshot::Resolver::GemResolver::Artifact.new(@graph, "listen", "2.0")
38
+
39
+ [artifact_2, artifact_1].sort.must_equal [artifact_1, artifact_2]
40
+ end
41
+ end
42
+
43
+ describe "#dependencies" do
44
+ it "returns an array" do
45
+ @artifact.dependencies.must_be_kind_of Array
46
+ end
47
+
48
+ it "returns an empty array if no dependencies have been accessed" do
49
+ @artifact.dependencies.must_be_empty
50
+ end
51
+ end
52
+
53
+ describe "#depends" do
54
+ before do
55
+ @name = "nginx"
56
+ @constraint = "~> 0.101.5"
57
+ end
58
+
59
+ describe "given a name and constraint argument" do
60
+ describe "given the dependency of the given name and constraint does not exist" do
61
+ it "returns a Solve::Artifact" do
62
+ @artifact.depends(@name, @constraint).must_be_kind_of Doubleshot::Resolver::GemResolver::Artifact
63
+ end
64
+
65
+ it "adds a dependency with the given name and constraint to the list of dependencies" do
66
+ @artifact.depends(@name, @constraint)
67
+
68
+ @artifact.dependencies.size.must_equal 1
69
+ @artifact.dependencies.first.name.must_equal @name
70
+ @artifact.dependencies.first.constraint.to_s.must_equal @constraint
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "given only a name argument" do
76
+ it "adds a dependency with a all constraint (>= 0.0.0)" do
77
+ @artifact.depends(@name)
78
+
79
+ @artifact.dependencies.size.must_equal 1
80
+ @artifact.dependencies.first.constraint.to_s.must_equal ">= 0"
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "::get_dependency" do
86
+
87
+ it "returns an instance of Solve::Dependency matching the given name and constraint" do
88
+ @artifact.depends("nginx", "~> 1.2.3")
89
+ dependency = @artifact.get_dependency("nginx", "~> 1.2.3")
90
+
91
+ dependency.must_be_kind_of Doubleshot::Resolver::GemResolver::Dependency
92
+ dependency.name.must_equal "nginx"
93
+ dependency.constraint.to_s.must_equal "~> 1.2.3"
94
+ end
95
+ end
96
+
97
+ describe "#delete" do
98
+
99
+ describe "given the artifact is not the member of a graph" do
100
+ it "returns nil" do
101
+ artifact = Doubleshot::Resolver::GemResolver::Artifact.new(nil, "listen", "1.0")
102
+ artifact.delete.must_be_nil
103
+ end
104
+ end
105
+ end
106
+ end