diff --git a/libraries/pom.xml b/libraries/pom.xml
index d2b8d6ffd8..6666900c1d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -1,6 +1,6 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
parent-modules
com.baeldung
@@ -105,515 +105,532 @@
-
-
-
-
-
- org.beykery
- neuroph
- ${neuroph.version}
-
-
-
- cglib
- cglib
- ${cglib.version}
-
-
- commons-beanutils
- commons-beanutils
- ${commons-beanutils.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang.version}
-
-
- org.apache.commons
- commons-text
- ${commons-text.version}
-
-
- javax.measure
- jsr-275
- 1.0.0
-
-
- org.apache.commons
- commons-collections4
- ${commons.collections.version}
-
-
- org.jasypt
- jasypt
- ${jasypt.version}
-
-
- org.javatuples
- javatuples
- ${javatuples.version}
-
-
- org.javassist
- javassist
- ${javaassist.version}
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
-
-
- org.skyscreamer
- jsonassert
- ${jsonassert.version}
-
-
- org.javers
- javers-core
- ${javers.version}
-
-
- org.eclipse.jetty
- jetty-server
- ${jetty.version}
-
-
- org.eclipse.jetty
- jetty-servlet
- ${jetty.version}
-
-
- rome
- rome
- ${rome.version}
-
-
- io.specto
- hoverfly-java
- 0.8.1
-
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- commons-io
- commons-io
- ${commons.io.version}
-
-
- commons-chain
- commons-chain
- ${commons-chain.version}
-
-
- org.apache.commons
- commons-csv
- ${commons-csv.version}
-
-
- commons-dbutils
- commons-dbutils
- ${commons.dbutils.version}
-
-
- org.apache.flink
- flink-core
- ${flink.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- org.apache.flink
- flink-java
- ${flink.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- org.apache.flink
- flink-test-utils_2.10
- ${flink.version}
- test
-
-
- org.apache.commons
- commons-math3
- 3.6.1
-
-
- net.serenity-bdd
- serenity-core
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-junit
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-jbehave
- ${serenity.jbehave.version}
- test
-
-
- net.serenity-bdd
- serenity-rest-assured
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-jira-requirements-provider
- ${serenity.jira.version}
- test
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
-
- org.datanucleus
- javax.jdo
- 3.2.0-m7
-
-
- org.datanucleus
- datanucleus-core
- 5.1.1
-
-
- org.datanucleus
- datanucleus-api-jdo
- 5.1.1
-
-
- org.datanucleus
- datanucleus-rdbms
- 5.1.1
-
-
- org.datanucleus
- datanucleus-maven-plugin
- 5.0.2
-
-
- org.datanucleus
- datanucleus-xml
- 5.0.0-release
-
-
- net.openhft
- chronicle
- 3.6.4
-
-
- org.springframework
- spring-web
- 4.3.8.RELEASE
-
-
- net.serenity-bdd
- serenity-spring
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-screenplay
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-screenplay-webdriver
- ${serenity.version}
- test
-
-
- io.rest-assured
- spring-mock-mvc
- 3.0.3
- test
-
-
- org.multiverse
- multiverse-core
- ${multiverse.version}
-
-
- com.zaxxer
- HikariCP
- 2.6.3
- compile
-
-
- com.h2database
- h2
- ${h2.version}
-
-
- pl.pragmatists
- JUnitParams
- ${jUnitParams.version}
- test
-
-
- org.quartz-scheduler
- quartz
- 2.3.0
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- org.jooq
- jool
- 0.9.12
-
-
- org.openjdk.jmh
- jmh-core
- 1.19
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- 1.19
-
-
- io.netty
- netty-all
- ${netty.version}
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- info.debatty
- java-lsh
- ${java-lsh.version}
-
-
- au.com.dius
- pact-jvm-consumer-junit_2.11
- ${pact.version}
- test
-
-
- org.codehaus.groovy
- groovy-all
- 2.4.10
-
-
- org.awaitility
- awaitility
- ${awaitility.version}
- test
-
-
- org.awaitility
- awaitility-proxy
- ${awaitility.version}
- test
-
-
- org.hamcrest
- java-hamcrest
- ${org.hamcrest.java-hamcrest.version}
- test
-
-
- net.agkn
- hll
- ${hll.version}
-
-
- net.bytebuddy
- byte-buddy
- ${bytebuddy.version}
-
-
- net.bytebuddy
- byte-buddy-agent
- ${bytebuddy.version}
-
-
- org.pcollections
- pcollections
- ${pcollections.version}
-
-
- com.machinezoo.noexception
- noexception
- 1.1.0
-
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse-collections.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.geotools
- gt-shapefile
- ${geotools.version}
-
-
- org.geotools
- gt-epsg-hsql
- ${geotools.version}
-
-
- org.geotools
- gt-swing
- ${geotools.version}
-
-
- com.darwinsys
- hirondelle-date4j
- RELEASE
- test
-
-
- joda-time
- joda-time
- ${joda-time.version}
-
-
- com.darwinsys
- hirondelle-date4j
- ${hirondelle-date4j.version}
-
-
- com.haulmont.yarg
- yarg
- 2.0.4
-
-
- net.engio
- mbassador
- 1.3.1
-
-
- org.jdeferred
- jdeferred-core
- 1.2.6
-
+
+
+
+
+
+ org.beykery
+ neuroph
+ ${neuroph.version}
+
+
+
+ cglib
+ cglib
+ ${cglib.version}
+
+
+ commons-beanutils
+ commons-beanutils
+ ${commons-beanutils.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+ javax.measure
+ jsr-275
+ 1.0.0
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons.collections.version}
+
+
+ org.jasypt
+ jasypt
+ ${jasypt.version}
+
+
+ org.javatuples
+ javatuples
+ ${javatuples.version}
+
+
+ org.javassist
+ javassist
+ ${javaassist.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ org.skyscreamer
+ jsonassert
+ ${jsonassert.version}
+
+
+ org.javers
+ javers-core
+ ${javers.version}
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-servlet
+ ${jetty.version}
+
+
+ rome
+ rome
+ ${rome.version}
+
+
+ io.specto
+ hoverfly-java
+ 0.8.1
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ commons-io
+ commons-io
+ ${commons.io.version}
+
+
+ commons-chain
+ commons-chain
+ ${commons-chain.version}
+
+
+ org.apache.commons
+ commons-csv
+ ${commons-csv.version}
+
+
+ commons-dbutils
+ commons-dbutils
+ ${commons.dbutils.version}
+
+
+ org.apache.flink
+ flink-core
+ ${flink.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.flink
+ flink-java
+ ${flink.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.flink
+ flink-test-utils_2.10
+ ${flink.version}
+ test
+
+
+ org.apache.commons
+ commons-math3
+ 3.6.1
+
+
+ net.serenity-bdd
+ serenity-core
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-junit
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-jbehave
+ ${serenity.jbehave.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-rest-assured
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-jira-requirements-provider
+ ${serenity.jira.version}
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ org.datanucleus
+ javax.jdo
+ 3.2.0-m7
+
+
+ org.datanucleus
+ datanucleus-core
+ 5.1.1
+
+
+ org.datanucleus
+ datanucleus-api-jdo
+ 5.1.1
+
+
+ org.datanucleus
+ datanucleus-rdbms
+ 5.1.1
+
+
+ org.datanucleus
+ datanucleus-maven-plugin
+ 5.0.2
+
+
+ org.datanucleus
+ datanucleus-xml
+ 5.0.0-release
+
+
+ net.openhft
+ chronicle
+ 3.6.4
+
+
+ org.springframework
+ spring-web
+ 4.3.8.RELEASE
+
+
+ net.serenity-bdd
+ serenity-spring
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay-webdriver
+ ${serenity.version}
+ test
+
+
+ io.rest-assured
+ spring-mock-mvc
+ 3.0.3
+ test
+
+
+ org.multiverse
+ multiverse-core
+ ${multiverse.version}
+
+
+ com.zaxxer
+ HikariCP
+ 2.6.3
+ compile
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+ pl.pragmatists
+ JUnitParams
+ ${jUnitParams.version}
+ test
+
+
+ org.quartz-scheduler
+ quartz
+ 2.3.0
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ org.jooq
+ jool
+ 0.9.12
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.19
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.19
+
+
+ io.netty
+ netty-all
+ ${netty.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ info.debatty
+ java-lsh
+ ${java-lsh.version}
+
+
+ au.com.dius
+ pact-jvm-consumer-junit_2.11
+ ${pact.version}
+ test
+
+
+ org.codehaus.groovy
+ groovy-all
+ 2.4.10
+
+
+ org.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
+
+ org.awaitility
+ awaitility-proxy
+ ${awaitility.version}
+ test
+
+
+ org.hamcrest
+ java-hamcrest
+ ${org.hamcrest.java-hamcrest.version}
+ test
+
+
+ net.agkn
+ hll
+ ${hll.version}
+
+
+ net.bytebuddy
+ byte-buddy
+ ${bytebuddy.version}
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ ${bytebuddy.version}
+
+
+ org.pcollections
+ pcollections
+ ${pcollections.version}
+
+
+ com.machinezoo.noexception
+ noexception
+ 1.1.0
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.geotools
+ gt-shapefile
+ ${geotools.version}
+
+
+ org.geotools
+ gt-epsg-hsql
+ ${geotools.version}
+
+
+ org.geotools
+ gt-swing
+ ${geotools.version}
+
+
+
+ com.squareup.retrofit2
+ retrofit
+ ${retrofit.version}
+
+
+ com.squareup.retrofit2
+ converter-gson
+ ${retrofit.version}
+
+
+ com.squareup.retrofit2
+ adapter-rxjava
+ ${retrofit.version}
+
+
+ com.darwinsys
+ hirondelle-date4j
+ RELEASE
+ test
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ com.darwinsys
+ hirondelle-date4j
+ ${hirondelle-date4j.version}
+
+
+ com.haulmont.yarg
+ yarg
+ 2.0.4
+
+
+ net.engio
+ mbassador
+ 1.3.1
+
+
+ org.jdeferred
+ jdeferred-core
+ 1.2.6
+
com.codepoetics
protonpack
${protonpack.version}
-
-
- maven2-repository.dev.java.net
- Java.net repository
- http://download.java.net/maven/2
-
-
- osgeo
- Open Source Geospatial Foundation Repository
- http://download.osgeo.org/webdav/geotools/
-
-
-
- true
-
- opengeo
- OpenGeo Maven Repository
- http://repo.opengeo.org
-
-
-
- false
-
- bintray-cuba-platform-main
- bintray
- http://dl.bintray.com/cuba-platform/main
-
-
-
- 0.7.0
- 3.2.4
- 3.6
- 1.1
- 1.9.3
- 1.2
- 1.4
- 1.9.2
- 1.2
- 3.21.0-GA
- 3.6.2
- 1.5.0
- 3.1.0
- 9.4.3.v20170317
- 4.5.3
- 2.5
- 1.6
- 1.4.196
- 9.4.2.v20170220
- 4.5.3
- 2.5
- 1.2.0
- 2.8.5
- 2.92
- 1.4.0
- 1.24.0
- 1.1.3-rc.5
- 1.4.0
- 1.1.0
- 4.1.15.Final
- 4.1
- 4.12
- 0.10
- 3.5.0
- 3.0.0
- 2.0.0.0
- 1.6.0
- 1.7.1
- 2.1.2
- 1.0
- 8.2.0
- 0.6.5
- 0.9.0
- 15.2
- 2.9.9
- 1.5.1
+
+
+ maven2-repository.dev.java.net
+ Java.net repository
+ http://download.java.net/maven/2
+
+
+ osgeo
+ Open Source Geospatial Foundation Repository
+ http://download.osgeo.org/webdav/geotools/
+
+
+
+ true
+
+ opengeo
+ OpenGeo Maven Repository
+ http://repo.opengeo.org
+
+
+
+ false
+
+ bintray-cuba-platform-main
+ bintray
+ http://dl.bintray.com/cuba-platform/main
+
+
+
+ 0.7.0
+ 3.2.4
+ 3.6
+ 1.1
+ 1.9.3
+ 1.2
+ 1.4
+ 1.9.2
+ 1.2
+ 3.21.0-GA
+ 3.6.2
+ 1.5.0
+ 3.1.0
+ 9.4.3.v20170317
+ 4.5.3
+ 2.5
+ 1.6
+ 1.4.196
+ 9.4.2.v20170220
+ 4.5.3
+ 2.5
+ 1.2.0
+ 2.8.5
+ 2.92
+ 1.4.0
+ 1.24.0
+ 1.1.3-rc.5
+ 1.4.0
+ 1.1.0
+ 4.1.15.Final
+ 4.1
+ 4.12
+ 0.10
+ 3.5.0
+ 3.0.0
+ 2.0.0.0
+ 1.6.0
+ 1.7.1
+ 2.1.2
+ 1.0
+ 8.2.0
+ 0.6.5
+ 0.9.0
+ 15.2
+ 2.3.0
+ 2.9.9
+ 1.5.1
1.14
-
+
diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java
new file mode 100644
index 0000000000..4e071d3384
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java
@@ -0,0 +1,33 @@
+package com.baeldung.retrofit.basic;
+
+import java.util.List;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+
+public interface GitHubBasicApi {
+
+ /**
+ * List GitHub repositories of user
+ * @param user GitHub Account
+ * @return GitHub repositories
+ */
+ @GET("users/{user}/repos")
+ Call> listRepos(@Path("user") String user);
+
+ /**
+ * List Contributors of a GitHub Repository
+ * @param user GitHub Account
+ * @param repo GitHub Repository
+ * @return GitHub Repository Contributors
+ */
+ @GET("repos/{user}/{repo}/contributors")
+ Call> listRepoContributors(
+ @Path("user") String user,
+ @Path("repo") String repo);
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java
new file mode 100644
index 0000000000..54a130a67e
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java
@@ -0,0 +1,14 @@
+package com.baeldung.retrofit.basic;
+
+import java.io.IOException;
+import java.util.List;
+
+public class GitHubBasicApp {
+
+ public static void main(String[] args) throws IOException {
+ String userName = "eugenp";
+ List topContributors = new GitHubBasicService().getTopContributors(userName);
+ topContributors.stream().forEach(System.out::println);
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java
new file mode 100644
index 0000000000..fbfdd96567
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java
@@ -0,0 +1,54 @@
+package com.baeldung.retrofit.basic;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class GitHubBasicService {
+
+ private GitHubBasicApi gitHubApi;
+
+ public GitHubBasicService() {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl("https://api.github.com/")
+ .addConverterFactory(GsonConverterFactory.create())
+ .build();
+
+ gitHubApi = retrofit.create(GitHubBasicApi.class);
+ }
+
+ public List getTopContributors(String userName) throws IOException {
+ List repos = gitHubApi
+ .listRepos(userName)
+ .execute()
+ .body();
+
+ List topContributors = new ArrayList<>();
+ for(Repository repo : repos) {
+ List contributers = gitHubApi
+ .listRepoContributors(userName, repo.getName())
+ .execute()
+ .body();
+
+ List repoTopContributors = contributers.stream()
+ .filter(c -> c.getContributions() > 100)
+ .collect(Collectors.toList());
+ topContributors.addAll(repoTopContributors);
+ }
+
+ Collections.sort(topContributors, (a, b) -> b.getContributions() - a.getContributions());
+ return topContributors.stream()
+ .map(c -> c.getName())
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java b/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java
new file mode 100644
index 0000000000..b7b7869ff6
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java
@@ -0,0 +1,35 @@
+package com.baeldung.retrofit.models;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * GitHub Contributer
+ * @author hany
+ *
+ */
+public class Contributor {
+
+ @SerializedName("login")
+ private String name;
+
+ private Integer contributions;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public Integer getContributions() {
+ return contributions;
+ }
+ public void setContributions(Integer contributions) {
+ this.contributions = contributions;
+ }
+
+ @Override
+ public String toString() {
+ return "Contributer [name=" + name + ", contributions=" + contributions + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java b/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java
new file mode 100644
index 0000000000..61e4752ce7
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java
@@ -0,0 +1,32 @@
+package com.baeldung.retrofit.models;
+
+/**
+ * GitHub Repository
+ * @author hany
+ *
+ */
+public class Repository {
+
+ private String name;
+
+ private String description;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public String toString() {
+ return "Repository [name=" + name + ", description=" + description + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java
new file mode 100644
index 0000000000..4e40aff448
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java
@@ -0,0 +1,33 @@
+package com.baeldung.retrofit.rx;
+
+import java.util.List;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+import rx.Observable;
+
+public interface GitHubRxApi {
+
+ /**
+ * List GitHub repositories of user
+ * @param user GitHub Account
+ * @return GitHub repositories
+ */
+ @GET("users/{user}/repos")
+ Observable> listRepos(@Path("user") String user);
+
+ /**
+ * List Contributors of a GitHub Repository
+ * @param user GitHub Account
+ * @param repo GitHub Repository
+ * @return GitHub Repository Contributors
+ */
+ @GET("repos/{user}/{repo}/contributors")
+ Observable> listRepoContributors(
+ @Path("user") String user,
+ @Path("repo") String repo);
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java
new file mode 100644
index 0000000000..0e0d8b1a77
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.retrofit.rx;
+
+import java.io.IOException;
+
+public class GitHubRxApp {
+
+ public static void main(String[] args) throws IOException {
+ String userName = "eugenp";
+ new GitHubRxService().getTopContributors(userName)
+ .subscribe(System.out::println);
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java
new file mode 100644
index 0000000000..56d149d13e
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java
@@ -0,0 +1,33 @@
+package com.baeldung.retrofit.rx;
+
+import retrofit2.Retrofit;
+import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
+import retrofit2.converter.gson.GsonConverterFactory;
+import rx.Observable;
+
+public class GitHubRxService {
+
+ private GitHubRxApi gitHubApi;
+
+ public GitHubRxService() {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl("https://api.github.com/")
+ .addConverterFactory(GsonConverterFactory.create())
+ .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
+ .build();
+
+ gitHubApi = retrofit.create(GitHubRxApi.class);
+ }
+
+ public Observable getTopContributors(String userName) {
+ return gitHubApi.listRepos(userName)
+ .flatMap( repos -> Observable.from(repos))
+ .flatMap( repo -> gitHubApi.listRepoContributors(userName, repo.getName()) )
+ .flatMap( contributers -> Observable.from(contributers))
+ .filter( c -> c.getContributions() > 100)
+ .sorted( (a, b) -> b.getContributions() - a.getContributions() )
+ .map( c -> c.getName())
+ .distinct();
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiTest.java b/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiTest.java
new file mode 100644
index 0000000000..da554a551f
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.retrofit.basic;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.retrofit.basic.GitHubBasicApi;
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class GitHubBasicApiTest {
+
+ GitHubBasicApi gitHub;
+
+ @Before
+ public void init() {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl("https://api.github.com/")
+ .addConverterFactory(GsonConverterFactory.create())
+ .build();
+
+ gitHub = retrofit.create(GitHubBasicApi.class);
+ }
+
+ @Test
+ public void whenListRepos_thenExpectReposThatContainTutorials() {
+ try {
+ List repos = gitHub
+ .listRepos("eugenp")
+ .execute()
+ .body();
+
+ assertThat(repos)
+ .isNotEmpty()
+ .extracting(Repository::getName).contains("tutorials");
+ } catch (IOException e) {
+ fail("Can not communicate with GitHub API");
+ }
+ }
+
+ @Test
+ public void whenListRepoContributers_thenExpectContributorsThatContainEugenp() {
+ try {
+ List contributors = gitHub
+ .listRepoContributors("eugenp", "tutorials")
+ .execute()
+ .body();
+
+ assertThat(contributors)
+ .isNotEmpty()
+ .extracting(Contributor::getName).contains("eugenp");
+ } catch (IOException e) {
+ fail("Can not communicate with GitHub API");
+ }
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java b/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java
new file mode 100644
index 0000000000..c2fbd9bf60
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.retrofit.rx;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+import com.baeldung.retrofit.rx.GitHubRxApi;
+
+import retrofit2.Retrofit;
+import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class GitHubRxApiTest {
+
+ GitHubRxApi gitHub;
+
+ @Before
+ public void init() {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl("https://api.github.com/")
+ .addConverterFactory(GsonConverterFactory.create())
+ .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
+ .build();
+
+ gitHub = retrofit.create(GitHubRxApi.class);
+ }
+
+ @Test
+ public void whenListRepos_thenExpectReposThatContainTutorials() {
+ gitHub
+ .listRepos("eugenp")
+ .subscribe( repos -> {
+ assertThat(repos)
+ .isNotEmpty()
+ .extracting(Repository::getName).contains("tutorials");
+ });
+ }
+
+ @Test
+ public void whenListRepoContributers_thenExpectContributorsThatContainEugenp() {
+ gitHub
+ .listRepoContributors("eugenp", "tutorials")
+ .subscribe(contributors -> {
+ assertThat(contributors)
+ .isNotEmpty()
+ .extracting(Contributor::getName).contains("eugenp");
+ });
+ }
+
+}