diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..330a520 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: java +jdk: oraclejdk7 +before_install: + - chmod +x gradlew +script: +- ./gradlew clean build +after_success: +- ./gradlew jacocoTestReport coveralls +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ \ No newline at end of file diff --git a/README.md b/README.md index b327a2d..9a21ca0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Build Status](https://travis-ci.org/Gitteroid/GitterJavaSDK.svg?branch=dev)](https://travis-ci.org/Gitteroid/GitterJavaSDK) # Gitter.im Java SDK :+1: **_Fully compatible with Android_** diff --git a/build.gradle b/build.gradle index 5084d01..a540c78 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,12 @@ buildscript { repositories { jcenter() mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.6.3" } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..30d399d Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a0c50a0..3825625 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-all.zip diff --git a/library/core/src/test/java/com/amatkivskiy/gitter/sdk/test/GitterApiClientBuilderTest.java b/library/core/src/test/java/com/amatkivskiy/gitter/sdk/GitterApiClientBuilderTest.java similarity index 97% rename from library/core/src/test/java/com/amatkivskiy/gitter/sdk/test/GitterApiClientBuilderTest.java rename to library/core/src/test/java/com/amatkivskiy/gitter/sdk/GitterApiClientBuilderTest.java index cf44792..da66edb 100644 --- a/library/core/src/test/java/com/amatkivskiy/gitter/sdk/test/GitterApiClientBuilderTest.java +++ b/library/core/src/test/java/com/amatkivskiy/gitter/sdk/GitterApiClientBuilderTest.java @@ -1,4 +1,4 @@ -package com.amatkivskiy.gitter.sdk.test; +package com.amatkivskiy.gitter.sdk; import com.amatkivskiy.gitter.sdk.api.builder.GitterApiBuilder; import org.junit.Assert; diff --git a/library/rx/build.gradle b/library/rx/build.gradle index a9b2a93..ddf78a2 100644 --- a/library/rx/build.gradle +++ b/library/rx/build.gradle @@ -1,5 +1,7 @@ apply plugin: 'java' apply plugin: 'com.novoda.bintray-release' +apply plugin: 'jacoco' +apply plugin: 'com.github.kt3k.coveralls' buildscript { repositories { @@ -15,6 +17,13 @@ repositories { maven { url "https://dl.bintray.com/amatkivskiy/maven/"} } +jacocoTestReport { + reports { + xml.enabled = true // coveralls plugin depends on xml format report + html.enabled = true + } +} + publish { groupId = 'com.github.amatkivskiy' artifactId = 'gitter.sdk.rx' @@ -27,7 +36,12 @@ publish { } dependencies { - compile 'com.github.amatkivskiy:gitter.sdk.core:1.5' -// compile project(':library:core') +// compile 'com.github.amatkivskiy:gitter.sdk.core:1.5' + compile project(':library:core') compile 'io.reactivex:rxjava:1.1.0' + + testCompile 'org.mockito:mockito-core:2.1.0-RC.1' + testCompile 'junit:junit:4.12' + testCompile 'org.hamcrest:hamcrest-core:1.3' + testCompile 'com.squareup.okhttp3:mockwebserver:3.2.0' } diff --git a/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestBuilder.java b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestBuilder.java new file mode 100644 index 0000000..1a6cea7 --- /dev/null +++ b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestBuilder.java @@ -0,0 +1,16 @@ +package com.amatkivskiy.gitter.sdk.rx; + +import com.amatkivskiy.gitter.sdk.rx.client.RxGitterApiClient; + +public class TestBuilder extends RxGitterApiClient.Builder { + private final String baseUrl; + + public TestBuilder(String baseUrl) { + this.baseUrl = baseUrl; + } + + @Override + protected String getFullEndpointUrl() { + return this.baseUrl + apiVersion + "/"; + } +} diff --git a/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestUtils.java b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestUtils.java new file mode 100644 index 0000000..97fd308 --- /dev/null +++ b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/TestUtils.java @@ -0,0 +1,53 @@ +package com.amatkivskiy.gitter.sdk.rx; + +import java.io.IOException; + +import okhttp3.HttpUrl; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okio.Buffer; +import rx.observers.TestSubscriber; + +public class TestUtils { + public static MockWebServer setupMockWebServer() throws IOException { + MockWebServer server = new MockWebServer(); + server.start(); + + return server; + } + + public static MockResponse createMockedResponse(String fileName) throws IOException { + Buffer buffer = new Buffer().readFrom(ClassLoader.getSystemClassLoader().getResourceAsStream(fileName)); + return new MockResponse().setBody(buffer); + } + + public static MockResponse createEmptyMockedResponse() throws IOException { + return new MockResponse().setBody(""); + } + + public static HttpUrl getRequestUrl(MockWebServer webServer) throws InterruptedException { + String path = webServer.takeRequest().getPath(); + HttpUrl requestUrl = new HttpUrl.Builder().host(webServer.getHostName()) + .port(webServer.getPort()) + .scheme("https") + .build(); + + return HttpUrl.parse(requestUrl + path); + } + + public static void assertSuccessfulResult(TestSubscriber subscriber) { + subscriber.awaitTerminalEvent(); + subscriber.assertNoErrors(); + subscriber.assertCompleted(); + } + + public static void assertErrorResult(TestSubscriber subscriber, Class exceptionClass) { + subscriber.awaitTerminalEvent(); + subscriber.assertNotCompleted(); + subscriber.assertError(exceptionClass); + } + + public static T getOnNextEvent(TestSubscriber testSubscriber) { + return testSubscriber.getOnNextEvents().get(0); + } +} \ No newline at end of file diff --git a/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/room/GetRoomUsersTest.java b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/room/GetRoomUsersTest.java new file mode 100644 index 0000000..4f626fe --- /dev/null +++ b/library/rx/src/test/java/com/amatkivskiy/gitter/sdk/rx/room/GetRoomUsersTest.java @@ -0,0 +1,111 @@ +package com.amatkivskiy.gitter.sdk.rx.room; + +import com.amatkivskiy.gitter.sdk.model.response.UserResponse; +import com.amatkivskiy.gitter.sdk.rx.TestBuilder; +import com.amatkivskiy.gitter.sdk.rx.client.RxGitterApiClient; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.util.List; + +import okhttp3.HttpUrl; +import okhttp3.mockwebserver.MockWebServer; +import retrofit.RetrofitError; +import rx.observers.TestSubscriber; + +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.assertErrorResult; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.assertSuccessfulResult; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.createEmptyMockedResponse; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.createMockedResponse; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.getOnNextEvent; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.getRequestUrl; +import static com.amatkivskiy.gitter.sdk.rx.TestUtils.setupMockWebServer; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +public class GetRoomUsersTest { + private MockWebServer mockWebServer; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private RxGitterApiClient gitterApiClient; + + @Before + public void setUp() throws Exception { + // Setup mocked WebsServer to received requests from RxGitterApiClient + this.mockWebServer = setupMockWebServer(); + + // To redirect all requests to our mocked WebServer we need to pass its server URL. + String url = this.mockWebServer.url("").toString(); + this.gitterApiClient = new TestBuilder(url) + .withAccountToken("can_be_any_string") + .build(); + } + + @Test + public void testGetRoomUsersResponseCorrect() throws Exception { + // ARRANGE + String roomId = "test_room_id"; + this.mockWebServer.enqueue(createMockedResponse("room/room_users_response.json")); + TestSubscriber> testSubscriber = TestSubscriber.create(); + + // ACT + this.gitterApiClient.getRoomUsers(roomId).subscribe(testSubscriber); + + // ASSERT + // Assert RxGitterApiClient pass correct params in the request URL + HttpUrl url = getRequestUrl(this.mockWebServer); + // check number of path segments in url + assertThat(url.pathSegments().size(), is(5)); + // get room id path segment + assertThat(url.pathSegments().get(3), is(roomId)); + + // check received users + assertSuccessfulResult(testSubscriber); + List users = getOnNextEvent(testSubscriber); + assertThat(users.size(), is(30)); + + // check whether individual user is parsed correctly + UserResponse user = users.get(12); + + assertThat(user.id, is("554b2e8a15522ed4b3e00c38")); + assertThat(user.username, is("amatkivskiy")); + assertThat(user.displayName, is("Andriy Matkivskiy")); + assertThat(user.url, is("/amatkivskiy")); + assertThat(user.avatarUrlSmall, is("https://avatars1.githubusercontent.com/u/3864884?v=3&s=60")); + assertThat(user.avatarUrlMedium, is("https://avatars1.githubusercontent.com/u/3864884?v=3&s=128")); + assertThat(user.v, is(6)); + assertThat(user.gv, is("3")); + } + + @Test + public void testGetRoomUsersEmptyHttpResponseReturnsNull() throws Exception { + // ARRANGE + this.mockWebServer.enqueue(createEmptyMockedResponse()); + TestSubscriber> testSubscriber = TestSubscriber.create(); + + // ACT + this.gitterApiClient.getRoomUsers("roomId").subscribe(testSubscriber); + + // ASSERT + assertSuccessfulResult(testSubscriber); + assertThat(getOnNextEvent(testSubscriber), is(nullValue())); + } + + @Test + public void testNullRoomIdFails() throws Exception { + // ARRANGE + TestSubscriber> testSubscriber = TestSubscriber.create(); + + // ACT + this.gitterApiClient.getRoomUsers(null).subscribe(testSubscriber); + + // ASSERT + assertErrorResult(testSubscriber, RetrofitError.class); + } +} diff --git a/library/rx/src/test/resources/room/room_users_response.json b/library/rx/src/test/resources/room/room_users_response.json new file mode 100644 index 0000000..b418b2e --- /dev/null +++ b/library/rx/src/test/resources/room/room_users_response.json @@ -0,0 +1,332 @@ +[ + { + "id": "5298e319ed5ab0b3bf04c984", + "username": "mydigitalself", + "displayName": "Mike Bartlett", + "url": "/mydigitalself", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/mydigitalself", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/1491887?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/1491887?v=3&s=128", + "staff": true, + "role": "admin", + "v": 45, + "gv": "3" + }, + { + "id": "5298e787ed5ab0b3bf04c99c", + "username": "barisbalic", + "displayName": "Baris Balic", + "url": "/barisbalic", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/barisbalic", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/196469?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/196469?v=3&s=128", + "v": 12, + "gv": "3" + }, + { + "id": "52f27b485e986b0712ef6065", + "username": "haggen", + "displayName": "Arthur Corenzan", + "url": "/haggen", + "avatarUrl": "https://avatars-03.gitter.im/gh/uv/3/haggen", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/270076?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/270076?v=3&s=128", + "v": 5, + "gv": "3" + }, + { + "id": "5387c328048862e761fa31d6", + "username": "serapath", + "displayName": "Alexander Praetorius", + "url": "/serapath", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/serapath", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/1771897?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/1771897?v=3&s=128", + "v": 11, + "gv": "3" + }, + { + "id": "53f9134c163965c9bc2000bb", + "username": "doowb", + "displayName": "Brian Woodward", + "url": "/doowb", + "avatarUrl": "https://avatars-03.gitter.im/gh/uv/3/doowb", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/995160?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/995160?v=3&s=128", + "v": 4, + "gv": "3" + }, + { + "id": "540a150e163965c9bc202eaf", + "username": "abhisekp", + "displayName": "Abhisek Pattnaik", + "url": "/abhisekp", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/abhisekp", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/1029200?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/1029200?v=3&s=128", + "v": 30, + "gv": "3" + }, + { + "id": "543d7fd1db8155e6700cb700", + "username": "remram44", + "displayName": "Remi Rampin", + "url": "/remram44", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/remram44", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/426784?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/426784?v=3&s=128", + "v": 7, + "gv": "3" + }, + { + "id": "54a7442adb8155e6700e5260", + "username": "sahas-", + "displayName": "Sahas", + "url": "/sahas-", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/sahas-", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/10361685?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/10361685?v=3&s=128", + "v": 5, + "gv": "3" + }, + { + "id": "54f8640215522ed4b3dcd893", + "username": "bobmulder", + "displayName": "Bob Mulder", + "url": "/bobmulder", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/bobmulder", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/5465074?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/5465074?v=3&s=128", + "v": 4, + "gv": "3" + }, + { + "id": "551ed22b15522ed4b3de51d3", + "username": "gmc", + "displayName": "Greg Christy", + "url": "/gmc", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/gmc", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/502871?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/502871?v=3&s=128", + "v": 5, + "gv": "3" + }, + { + "id": "553d437215522ed4b3df8c50", + "username": "MadLittleMods", + "displayName": "Eric Eastwood", + "url": "/MadLittleMods", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/MadLittleMods", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/558581?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/558581?v=3&s=128", + "online": true, + "staff": true, + "role": "admin", + "v": 9, + "gv": "3" + }, + { + "id": "55449ed215522ed4b3dfd461", + "username": "Odonno", + "displayName": "David Bottiau", + "url": "/Odonno", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/Odonno", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/6053067?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/6053067?v=3&s=128", + "v": 17, + "gv": "3" + }, + { + "id": "554b2e8a15522ed4b3e00c38", + "username": "amatkivskiy", + "displayName": "Andriy Matkivskiy", + "url": "/amatkivskiy", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/amatkivskiy", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/3864884?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/3864884?v=3&s=128", + "v": 6, + "gv": "3" + }, + { + "id": "555e610f15522ed4b3e0c169", + "username": "terrysahaidak", + "displayName": "Terry Sahaidak", + "url": "/terrysahaidak", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/terrysahaidak", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/7809008?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/7809008?v=3&s=128", + "v": 12, + "gv": "3" + }, + { + "id": "5586719a15522ed4b3e23add", + "username": "evaristoc", + "displayName": "evaristoc", + "url": "/evaristoc", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/evaristoc", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/5592713?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/5592713?v=3&s=128", + "v": 292, + "gv": "3" + }, + { + "id": "55b89b6a0fc9f982beab5f78", + "username": "The-Seth", + "displayName": "The-Seth", + "url": "/The-Seth", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/The-Seth", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/9784443?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/9784443?v=3&s=128", + "v": 9, + "gv": "3" + }, + { + "id": "56ddb135e610378809c572c7", + "username": "adqm", + "displayName": "adam j hartz", + "url": "/adqm", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/adqm", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/549404?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/549404?v=3&s=128", + "v": 20, + "gv": "3" + }, + { + "id": "56df3bc9e610378809c5add3", + "username": "herohamp", + "displayName": "Hampton", + "url": "/herohamp", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/herohamp", + "avatarUrlSmall": "https://avatars1.githubusercontent.com/u/8162992?v=3&s=60", + "avatarUrlMedium": "https://avatars1.githubusercontent.com/u/8162992?v=3&s=128", + "v": 39, + "gv": "3" + }, + { + "id": "56e6574085d51f252ab8a59d", + "username": "Chovin", + "displayName": "Chovin", + "url": "/Chovin", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/Chovin", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/17536161?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/17536161?v=3&s=128", + "v": 4, + "gv": "3" + }, + { + "id": "56f73f5b85d51f252abb02e7", + "username": "meetmangukiya", + "displayName": "Meet Mangukiya", + "url": "/meetmangukiya", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/meetmangukiya", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/7620533?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/7620533?v=3&s=128", + "v": 51, + "gv": "3" + }, + { + "id": "570463de187bb6f0eade0dc5", + "username": "Hektve87", + "displayName": "Hector David", + "url": "/Hektve87", + "avatarUrl": "https://avatars-02.gitter.im/gh/uv/3/Hektve87", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/17058552?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/17058552?v=3&s=128", + "v": 6, + "gv": "3" + }, + { + "id": "577ed5bfc2f0db084a21f87b", + "username": "THEozmic", + "displayName": "Michael Ozoemena", + "url": "/THEozmic", + "avatarUrl": "https://avatars-05.gitter.im/gh/uv/3/THEozmic", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/15184445?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/15184445?v=3&s=128", + "v": 1, + "gv": "3" + }, + { + "id": "5790af89c2f0db084a2401f8", + "username": "veriga", + "displayName": "Veriga Mykola", + "url": "/veriga", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/veriga", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/18630870?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/18630870?v=3&s=128", + "v": 1, + "gv": "3" + }, + { + "id": "579faf0f40f3a6eec05d7ac9", + "username": "popcorntimece_twitter", + "displayName": "Popcorn Time CE", + "url": "/popcorntimece_twitter", + "avatarUrl": "https://avatars-04.gitter.im/g/u/popcorntimece_twitter", + "avatarUrlSmall": "https://pbs.twimg.com/profile_images/700092818174431232/fQCnNXZc_bigger.png", + "avatarUrlMedium": "https://pbs.twimg.com/profile_images/700092818174431232/fQCnNXZc.png" + }, + { + "id": "57a79ed240f3a6eec05e5adc", + "username": "AlexBB07", + "displayName": "AlexB", + "url": "/AlexBB07", + "avatarUrl": "https://avatars-02.gitter.im/gh/uv/3/AlexBB07", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/20892571?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/20892571?v=3&s=128", + "v": 5, + "gv": "3" + }, + { + "id": "57a9d2db40f3a6eec05e9b85", + "username": "imMitul__twitter", + "displayName": "Mitul", + "url": "/imMitul__twitter", + "avatarUrl": "https://avatars-05.gitter.im/g/u/imMitul__twitter", + "avatarUrlSmall": "https://pbs.twimg.com/profile_images/754648953568788480/BRheH0AQ_bigger.jpg", + "avatarUrlMedium": "https://pbs.twimg.com/profile_images/754648953568788480/BRheH0AQ.jpg" + }, + { + "id": "57b4c4f440f3a6eec0600070", + "username": "rossbernet", + "displayName": "Ross Bernet", + "url": "/rossbernet", + "avatarUrl": "https://avatars-04.gitter.im/gh/uv/3/rossbernet", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/8103418?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/8103418?v=3&s=128", + "gv": "3" + }, + { + "id": "57bb379640f3a6eec060c27d", + "username": "120hits", + "displayName": "Rohit Shrestha", + "url": "/120hits", + "avatarUrl": "https://avatars-03.gitter.im/gh/uv/3/120hits", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/21145922?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/21145922?v=3&s=128", + "v": 1, + "gv": "3" + }, + { + "id": "57bf2cc940f3a6eec0615293", + "username": "ryanbailey123", + "displayName": "Ryan Francis Bailey", + "url": "/ryanbailey123", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/ryanbailey123", + "avatarUrlSmall": "https://avatars2.githubusercontent.com/u/7109227?v=3&s=60", + "avatarUrlMedium": "https://avatars2.githubusercontent.com/u/7109227?v=3&s=128", + "v": 4, + "gv": "3" + }, + { + "id": "57c136cc40f3a6eec0619455", + "username": "ReignCloud", + "displayName": "ReignCloud", + "url": "/ReignCloud", + "avatarUrl": "https://avatars-01.gitter.im/gh/uv/3/ReignCloud", + "avatarUrlSmall": "https://avatars0.githubusercontent.com/u/21213610?v=3&s=60", + "avatarUrlMedium": "https://avatars0.githubusercontent.com/u/21213610?v=3&s=128", + "v": 2, + "gv": "3" + } +] \ No newline at end of file