mirror of https://github.com/jruby-gradle/jem
parent
f4416ac9a2
commit
0f7c0c94e4
|
@ -13,7 +13,7 @@ apply plugin: 'groovy'
|
||||||
apply plugin: 'maven'
|
apply plugin: 'maven'
|
||||||
apply plugin: 'com.jfrog.bintray'
|
apply plugin: 'com.jfrog.bintray'
|
||||||
|
|
||||||
version = '0.2.1'
|
version = '0.3.0'
|
||||||
group = 'com.github.jruby-gradle'
|
group = 'com.github.jruby-gradle'
|
||||||
description = 'A library for managing Ruby gems'
|
description = 'A library for managing Ruby gems'
|
||||||
defaultTasks 'check', 'assemble'
|
defaultTasks 'check', 'assemble'
|
||||||
|
|
|
@ -7,6 +7,9 @@ import java.io.File;
|
||||||
* {@code GemInstaller}
|
* {@code GemInstaller}
|
||||||
*/
|
*/
|
||||||
public interface GemInstallEvent {
|
public interface GemInstallEvent {
|
||||||
public void onSuccess(Gem gem, File installationDir);
|
/**
|
||||||
public void onFailure(Gem gem, File installationDir);
|
* @param result Instance of {@code GemInstallResult}
|
||||||
|
* @return true if the installation should continue
|
||||||
|
*/
|
||||||
|
public boolean onInstall(GemInstallResult result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package com.github.jrubygradle.jem;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plain-old-Java-object containing properties to tell the consumer something about
|
||||||
|
* an attempted (or successful) gem installation
|
||||||
|
*/
|
||||||
|
public class GemInstallResult {
|
||||||
|
public static enum Type { SUCCESS, FAILURE };
|
||||||
|
|
||||||
|
protected Type resultType;
|
||||||
|
protected Gem gem;
|
||||||
|
protected File gemFile;
|
||||||
|
protected File installationDir;
|
||||||
|
protected Exception exception;
|
||||||
|
|
||||||
|
public GemInstallResult(Gem gem,
|
||||||
|
File gemFile,
|
||||||
|
File installDir,
|
||||||
|
Exception exception) {
|
||||||
|
this.gem = gem;
|
||||||
|
this.gemFile = gemFile;
|
||||||
|
this.installationDir = installDir;
|
||||||
|
this.exception = exception;
|
||||||
|
this.resultType = Type.FAILURE;
|
||||||
|
|
||||||
|
if (exception == null) {
|
||||||
|
this.resultType = Type.SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Metadata about the gem, null if the metadata could not be passed
|
||||||
|
*/
|
||||||
|
public Gem getGem() {
|
||||||
|
return gem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return In the case of a failed installation, this contains a caught exception
|
||||||
|
*/
|
||||||
|
public Exception getException() {
|
||||||
|
return exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return File object for the .gem file which was used for the install
|
||||||
|
*/
|
||||||
|
public File getGemFile() {
|
||||||
|
return gemFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return File object for the intallation dir used for the install
|
||||||
|
*/
|
||||||
|
public File getInstallationDir() {
|
||||||
|
return installationDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type getType() {
|
||||||
|
return resultType;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ public class GemInstaller {
|
||||||
};
|
};
|
||||||
|
|
||||||
protected com.github.jrubygradle.jem.internal.GemInstaller impl;
|
protected com.github.jrubygradle.jem.internal.GemInstaller impl;
|
||||||
|
protected GemInstallEvent callback;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an installer with the given installation directory and a single gem
|
* Create an installer with the given installation directory and a single gem
|
||||||
|
@ -74,4 +75,10 @@ public class GemInstaller {
|
||||||
public void install(DuplicateBehavior overwriteBehavior) {
|
public void install(DuplicateBehavior overwriteBehavior) {
|
||||||
impl.install(overwriteBehavior);
|
impl.install(overwriteBehavior);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public void install(GemInstallEvent eventCallback) {
|
||||||
|
impl.install(eventCallback, DuplicateBehavior.OVERWRITE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.github.jrubygradle.jem.internal;
|
package com.github.jrubygradle.jem.internal;
|
||||||
|
|
||||||
|
import com.github.jrubygradle.jem.GemInstallEvent;
|
||||||
|
import com.github.jrubygradle.jem.GemInstallResult;
|
||||||
import org.jboss.shrinkwrap.api.ArchiveFormat;
|
import org.jboss.shrinkwrap.api.ArchiveFormat;
|
||||||
import org.jboss.shrinkwrap.api.ArchivePath;
|
import org.jboss.shrinkwrap.api.ArchivePath;
|
||||||
import org.jboss.shrinkwrap.api.GenericArchive;
|
import org.jboss.shrinkwrap.api.GenericArchive;
|
||||||
|
@ -40,12 +42,36 @@ public class GemInstaller {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void install(DuplicateBehavior onDuplicateBehavior) {
|
public void install(DuplicateBehavior onDuplicateBehavior) {
|
||||||
|
install(null, onDuplicateBehavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void install(GemInstallEvent eventCallback, DuplicateBehavior onDuplicateBehavior) {
|
||||||
if (!mkdirs()) {
|
if (!mkdirs()) {
|
||||||
/* raise some exception? */
|
/* raise some exception? */
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File gem : this.gems) {
|
for (File gemFile : this.gems) {
|
||||||
installGem(installDirectory, gem, onDuplicateBehavior);
|
boolean shouldContinue = true;
|
||||||
|
Exception caughtException = null;
|
||||||
|
Gem gem = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
gem = installGem(installDirectory, gemFile, onDuplicateBehavior);
|
||||||
|
}
|
||||||
|
catch (Exception exc) {
|
||||||
|
caughtException = exc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventCallback instanceof GemInstallEvent) {
|
||||||
|
shouldContinue = eventCallback.onInstall(new GemInstallResult(gem,
|
||||||
|
gemFile,
|
||||||
|
installDirectory,
|
||||||
|
caughtException));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shouldContinue) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import com.github.jrubygradle.jem.internal.GemInstaller as GemInstallerImpl
|
||||||
class GemInstallerSpec extends Specification {
|
class GemInstallerSpec extends Specification {
|
||||||
final String FIXTURES_ROOT = new File(['src', 'test', 'resources'].join(File.separator)).absolutePath
|
final String FIXTURES_ROOT = new File(['src', 'test', 'resources'].join(File.separator)).absolutePath
|
||||||
final String GEM_FIXTURE = [FIXTURES_ROOT, 'thor-0.19.1.gem'].join(File.separator)
|
final String GEM_FIXTURE = [FIXTURES_ROOT, 'thor-0.19.1.gem'].join(File.separator)
|
||||||
|
final String RACK_FIXTURE = [FIXTURES_ROOT, 'rack-1.6.4.gem'].join(File.separator)
|
||||||
|
|
||||||
GemInstaller installer
|
GemInstaller installer
|
||||||
Path installDirPath = Files.createTempDirectory("geminstallerspec")
|
Path installDirPath = Files.createTempDirectory("geminstallerspec")
|
||||||
|
@ -70,10 +71,75 @@ class GemInstallerSpec extends Specification {
|
||||||
given:
|
given:
|
||||||
GemInstaller.DuplicateBehavior behavior = GemInstaller.DuplicateBehavior.OVERWRITE
|
GemInstaller.DuplicateBehavior behavior = GemInstaller.DuplicateBehavior.OVERWRITE
|
||||||
GemInstallerImpl impl = mockedImpl()
|
GemInstallerImpl impl = mockedImpl()
|
||||||
GemInstaller installer = new GemInstaller(impl)
|
installer = new GemInstaller(impl)
|
||||||
1 * impl.install(behavior)
|
1 * impl.install(behavior)
|
||||||
|
|
||||||
expect:
|
expect:
|
||||||
installer.install(behavior)
|
installer.install(behavior)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Issue("https://github.com/jruby-gradle/jem/issues/6")
|
||||||
|
def "install() with a non-existent gem should call the callback with a failure"() {
|
||||||
|
given:
|
||||||
|
boolean calledBack = false
|
||||||
|
installer = new GemInstaller(installDir, [new File('foo.gem')])
|
||||||
|
|
||||||
|
when:
|
||||||
|
installer.install(new GemInstallEvent() {
|
||||||
|
@Override
|
||||||
|
public boolean onInstall(GemInstallResult result) {
|
||||||
|
calledBack = (result.type == GemInstallResult.Type.FAILURE)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
then:
|
||||||
|
calledBack
|
||||||
|
}
|
||||||
|
|
||||||
|
@Issue("https://github.com/jruby-gradle/jem/issues/6")
|
||||||
|
def "install() with a valid gem should call the callback with a success"() {
|
||||||
|
given:
|
||||||
|
boolean calledBack = false
|
||||||
|
installer = new GemInstaller(installDir, new File(GEM_FIXTURE));
|
||||||
|
|
||||||
|
when:
|
||||||
|
installer.install(new GemInstallEvent() {
|
||||||
|
@Override
|
||||||
|
public boolean onInstall(GemInstallResult result) {
|
||||||
|
calledBack = (result.type == GemInstallResult.Type.SUCCESS)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
then:
|
||||||
|
calledBack
|
||||||
|
}
|
||||||
|
|
||||||
|
@Issue("https://github.com/jruby-gradle/jem/issues/6")
|
||||||
|
def "install() with should stop with a false return"() {
|
||||||
|
given:
|
||||||
|
int calledBack = 0
|
||||||
|
installer = new GemInstaller(installDir, [new File(GEM_FIXTURE),
|
||||||
|
new File(RACK_FIXTURE)])
|
||||||
|
|
||||||
|
when:
|
||||||
|
installer.install(new GemInstallEvent() {
|
||||||
|
@Override
|
||||||
|
public boolean onInstall(GemInstallResult result) {
|
||||||
|
calledBack += 1
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
then: 'the first gem should be installed'
|
||||||
|
(new File(installDir, 'specifications/thor-0.19.1.gemspec')).exists()
|
||||||
|
|
||||||
|
and: 'we should have been called back once'
|
||||||
|
calledBack == 1
|
||||||
|
|
||||||
|
and: 'the second gem should not be installed'
|
||||||
|
!(new File(installDir, 'specifications/rack-1.6.4.gemspec')).exists()
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue