diff --git a/pom.xml b/pom.xml
index 8d8bf52cbe..79c521c4a4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
github-api
- 1.55
+ 1.56
GitHub API for Java
http://github-api.kohsuke.org/
GitHub API for Java
@@ -16,7 +16,7 @@
scm:git:git@github.com/kohsuke/${project.artifactId}.git
scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git
http://${project.artifactId}.kohsuke.org/
- github-api-1.55
+ github-api-1.56
@@ -93,8 +93,8 @@
com.squareup.okhttp
- okhttp
- 1.5.3
+ okhttp-urlconnection
+ 2.0.0
true
@@ -103,6 +103,11 @@
1.2
test
+
+ org.mockito
+ mockito-all
+ 1.9.5
+
diff --git a/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java b/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java
index faa0545ad6..07f10d710c 100644
--- a/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java
+++ b/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java
@@ -4,7 +4,7 @@
* The response that is returned when updating
* repository content.
**/
-public final class GHContentUpdateResponse {
+public class GHContentUpdateResponse {
private GHContent content;
private GHCommit commit;
diff --git a/src/main/java/org/kohsuke/github/GHGist.java b/src/main/java/org/kohsuke/github/GHGist.java
index 9f757be73b..6cfada36d0 100644
--- a/src/main/java/org/kohsuke/github/GHGist.java
+++ b/src/main/java/org/kohsuke/github/GHGist.java
@@ -17,7 +17,7 @@
* @see GitHub#getGist(String)
* @see GitHub#createGist()
*/
-public final class GHGist {
+public class GHGist {
/*package almost final*/ GHUser owner;
/*package almost final*/ GitHub root;
diff --git a/src/main/java/org/kohsuke/github/GHHook.java b/src/main/java/org/kohsuke/github/GHHook.java
index aca2b6dc01..4a8ce78b88 100644
--- a/src/main/java/org/kohsuke/github/GHHook.java
+++ b/src/main/java/org/kohsuke/github/GHHook.java
@@ -10,7 +10,7 @@
/**
* @author Kohsuke Kawaguchi
*/
-public final class GHHook {
+public class GHHook {
/**
* Repository that the hook belongs to.
*/
diff --git a/src/main/java/org/kohsuke/github/GHPersonSet.java b/src/main/java/org/kohsuke/github/GHPersonSet.java
index 824febee39..1c1d43dccb 100644
--- a/src/main/java/org/kohsuke/github/GHPersonSet.java
+++ b/src/main/java/org/kohsuke/github/GHPersonSet.java
@@ -9,7 +9,7 @@
*
* @author Kohsuke Kawaguchi
*/
-public final class GHPersonSet extends HashSet {
+public class GHPersonSet extends HashSet {
public GHPersonSet() {
}
diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java
index 294347b596..b6985f99fa 100644
--- a/src/main/java/org/kohsuke/github/GHRepository.java
+++ b/src/main/java/org/kohsuke/github/GHRepository.java
@@ -25,6 +25,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
+import java.io.FileNotFoundException;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
@@ -321,7 +322,32 @@ public int getSize() {
*/
@WithBridgeMethods(Set.class)
public GHPersonSet getCollaborators() throws IOException {
- return new GHPersonSet(GHUser.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class),root));
+ return new GHPersonSet(listCollaborators().asList());
+ }
+
+ /**
+ * Lists up the collaborators on this repository.
+ *
+ * @return Users
+ * @throws IOException
+ */
+ public PagedIterable listCollaborators() throws IOException {
+ return new PagedIterable() {
+ public PagedIterator iterator() {
+
+ return new PagedIterator(root.retrieve().asIterator("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class)) {
+
+ @Override
+ protected void wrapUp(GHUser[] users) {
+ for (GHUser user : users) {
+ user.wrapUp(root);
+ }
+ }
+ };
+
+ }
+ };
+
}
/**
@@ -416,7 +442,11 @@ public void setHomepage(String value) throws IOException {
* Deletes this repository.
*/
public void delete() throws IOException {
- new Requester(root).method("DELETE").to("/repos/" + owner.login + "/" + name);
+ try {
+ new Requester(root).method("DELETE").to("/repos/" + owner.login + "/" + name);
+ } catch (FileNotFoundException x) {
+ throw (FileNotFoundException) new FileNotFoundException("Failed to delete " + owner.login + "/" + name + "; might not exist, or you might need the delete_repo scope in your token: http://stackoverflow.com/a/19327004/12916").initCause(x);
+ }
}
/**
diff --git a/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java b/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java
index 671c32eaca..faa06b0d3b 100644
--- a/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java
+++ b/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java
@@ -1,6 +1,7 @@
package org.kohsuke.github.extras;
import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.OkUrlFactory;
import org.kohsuke.github.HttpConnector;
import java.io.IOException;
@@ -19,13 +20,13 @@
* @author Kohsuke Kawaguchi
*/
public class OkHttpConnector implements HttpConnector {
- private final OkHttpClient client;
+ private final OkUrlFactory urlFactory;
- public OkHttpConnector(OkHttpClient client) {
- this.client = client;
+ public OkHttpConnector(OkUrlFactory urlFactory) {
+ this.urlFactory = urlFactory;
}
public HttpURLConnection connect(URL url) throws IOException {
- return client.open(url);
+ return urlFactory.open(url);
}
}
diff --git a/src/test/java/org/kohsuke/github/RepositoryTest.java b/src/test/java/org/kohsuke/github/RepositoryTest.java
new file mode 100644
index 0000000000..1bc612b29c
--- /dev/null
+++ b/src/test/java/org/kohsuke/github/RepositoryTest.java
@@ -0,0 +1,91 @@
+package org.kohsuke.github;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Iterator;
+
+import static org.mockito.Mockito.when;
+
+/**
+ * @author Luciano P. Sabenca (luciano.sabenca [at] movile [com] | lucianosabenca [at] gmail [dot] com
+ */
+public class RepositoryTest {
+
+ @Mock
+ GitHub mockGitHub;
+
+ @Mock
+ Iterator iterator;
+
+ @Mock
+ GHRepository mockRepository;
+
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void listCollaborators() throws Exception {
+ GHUser user1 = new GHUser();
+ user1.login = "login1";
+
+ GHUser user2 = new GHUser();
+ user2.login = "login2";
+
+
+ when(iterator.hasNext()).thenReturn(true, false, true);
+ when(iterator.next()).thenReturn(new GHUser[]{user1}, new GHUser[]{user2});
+
+ Requester requester = Mockito.mock(Requester.class);
+ when(mockGitHub.retrieve()).thenReturn(requester);
+
+
+ when(requester.asIterator("/repos/*/*/collaborators",
+ GHUser[].class)).thenReturn(iterator, iterator);
+
+
+ PagedIterable pagedIterable = Mockito.mock(PagedIterable.class);
+ when(mockRepository.listCollaborators()).thenReturn(pagedIterable);
+
+ PagedIterator userPagedIterator = new PagedIterator(iterator) {
+ @Override
+ protected void wrapUp(GHUser[] page) {
+
+ }
+ };
+ PagedIterator userPagedIterator2 = new PagedIterator(iterator) {
+ @Override
+ protected void wrapUp(GHUser[] page) {
+
+ }
+ };
+
+
+ when(pagedIterable.iterator()).thenReturn(userPagedIterator, userPagedIterator2);
+
+ Iterator returnIterator1 = mockRepository.listCollaborators().iterator();
+
+
+ Assert.assertTrue(returnIterator1.hasNext());
+ GHUser user = returnIterator1.next();
+ Assert.assertEquals(user, user1);
+ Assert.assertFalse(returnIterator1.hasNext());
+
+
+ Iterator returnIterator2 = mockRepository.listCollaborators().iterator();
+
+
+ Assert.assertTrue(returnIterator2.hasNext());
+ user = returnIterator1.next();
+ Assert.assertEquals(user, user2);
+
+
+ }
+}