Skip to content
This repository was archived by the owner on Apr 3, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ dependencies {
compile 'io.reactivex:rxjava:1.0.16'

compile 'net.danlew:android.joda:2.8.2'

testCompile 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:1.7.0'
testCompile "org.mockito:mockito-core:1.+"
}

publish {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
import com.alorma.github.sdk.bean.issue.IssueStoryEvent;
import com.alorma.github.sdk.services.client.BaseInfiniteCallback;
import com.alorma.github.sdk.services.client.GithubClient;
import com.alorma.gitskarios.core.util.DateParser;

import java.util.Collections;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import retrofit.RestAdapter;
import rx.Observable;
import rx.functions.Func1;
Expand Down Expand Up @@ -45,17 +45,17 @@ protected Observable<IssueStory> getApiObservable(RestAdapter restAdapter) {

private Observable<IssueStory> getIssueStory() {
return Observable.zip(getIssueObservable(), getIssueDetailsObservable(),
new Func2<Issue, List<IssueStoryDetail>, IssueStory>() {
@Override
public IssueStory call(Issue issue, List<IssueStoryDetail> details) {
IssueStory issueStory = new IssueStory();
issueStory.issue = issue;
issueStory.details = details;
Collections.sort(issueStory.details,
IssueStoryComparators.ISSUE_STORY_DETAIL_COMPARATOR);
return issueStory;
}
});
new Func2<Issue, List<IssueStoryDetail>, IssueStory>() {
@Override
public IssueStory call(Issue issue, List<IssueStoryDetail> details) {
IssueStory issueStory = new IssueStory();
issueStory.issue = issue;
issueStory.details = details;
Collections.sort(issueStory.details,
IssueStoryComparators.ISSUE_STORY_DETAIL_COMPARATOR);
return issueStory;
}
});
}

private Observable<Issue> getIssueObservable() {
Expand All @@ -74,60 +74,52 @@ private Observable<List<GithubComment>> getCommentsObs() {
@Override
public void execute() {
issueStoryService.comments(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num,
this);
this);
}

@Override
protected void executePaginated(int nextPage) {
issueStoryService.comments(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num,
this);
this);
}
});
}

private Observable<IssueStoryDetail> getCommentsDetailsObs() {
return getCommentsObs().flatMap(githubComments -> Observable.from(githubComments)
.map((Func1<GithubComment, IssueStoryDetail>) githubComment -> {
long time = getMilisFromDateClearDay(githubComment.created_at);
IssueStoryComment detail = new IssueStoryComment(githubComment);
detail.created_at = time;
return detail;
}));
.map((Func1<GithubComment, IssueStoryDetail>) githubComment -> {
long time = new DateParser().getMillisFromDateClearDay(githubComment.created_at);
IssueStoryComment detail = new IssueStoryComment(githubComment);
detail.created_at = time;
return detail;
}));
}

private Observable<List<IssueEvent>> getEventsObs() {
return Observable.create(new BaseInfiniteCallback<List<IssueEvent>>() {
@Override
public void execute() {
issueStoryService.events(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num,
this);
this);
}

@Override
protected void executePaginated(int nextPage) {
issueStoryService.events(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num,
nextPage, this);
nextPage, this);
}
});
}

private Observable<IssueStoryDetail> getEventDetailsObs() {
return getEventsObs().flatMap(issueEvents -> Observable.from(issueEvents)
.filter(issueEvent -> validEvent(issueEvent.event))
.map((Func1<IssueEvent, IssueStoryDetail>) issueEvent -> {
long time = getMilisFromDateClearDay(issueEvent.created_at);
IssueStoryEvent detail = new IssueStoryEvent(issueEvent);
detail.created_at = time;
return detail;
}));
}

private long getMilisFromDateClearDay(String createdAt) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");

DateTime dt = formatter.parseDateTime(createdAt);

return dt.minuteOfDay().roundFloorCopy().getMillis();
.filter(issueEvent -> validEvent(issueEvent.event))
.map((Func1<IssueEvent, IssueStoryDetail>) issueEvent -> {
long time = new DateParser().getMillisFromDateClearDay(issueEvent.created_at);
IssueStoryEvent detail = new IssueStoryEvent(issueEvent);
detail.created_at = time;
return detail;
}));
}

private boolean validEvent(String event) {
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/com/alorma/gitskarios/core/util/DateParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.alorma.gitskarios.core.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateParser {

public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";

public long getMillisFromDateClearDay(String date) {
if (date==null){
throw new NullPointerException("Date cannot be null :(");
}
try {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(sdf.parse(date));

calendar.set(Calendar.YEAR, 1970);
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);

return calendar.getTimeInMillis();
} catch (ParseException e) {
//TODO please, remove this clause :D
return 0;
}
}
}
30 changes: 30 additions & 0 deletions src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.alorma.gitskarios.core.util;

import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class DateParserTest {

DateParser dateParser = new DateParser();

@Before
public void init(){
dateParser = new DateParser();
}

@Test(expected = NullPointerException.class)
public void shouldLaunchANPE_whenPassingNull() throws Exception {
dateParser.getMillisFromDateClearDay(null);
}

@Test
public void shouldGiveGoodValue_whenPassingBerniesValue() throws Exception {
String berniesDate = "2016-02-21T18:22:06Z";

long result = dateParser.getMillisFromDateClearDay(berniesDate);

assertThat(result).isEqualTo(62526000);
}
}