From dd866ca6668b3e36db75d8feb09578352501740a Mon Sep 17 00:00:00 2001 From: David Hernando Sancha Date: Sun, 4 Feb 2018 02:33:25 +0100 Subject: [PATCH] Moving all java classes into Kotlin (#13) --- build.gradle | 10 -- github_code_review.iml | 20 +--- gradle/scripts/dependencies.build.gradle | 1 - gradle/scripts/kotlin.build.gradle | 1 - gradle/scripts/testing.build.gradle | 5 +- .../PullRequestRepositoryImpl.java | 27 ----- .../di/contracts/DiContainerAware.java | 19 --- .../di/impl/dagger/ApplicationContainer.java | 13 -- .../di/impl/dagger/ProjectContainer.java | 13 -- .../dagger/modules/ApplicationModule.java | 20 ---- .../di/impl/dagger/modules/AuthModule.java | 35 ------ .../di/impl/dagger/modules/IssueModule.java | 16 --- .../di/impl/dagger/modules/ReposModule.java | 25 ---- .../codereviews/di/scopes/ProjectScoped.java | 13 -- .../domain/issues/IssuesDomainContract.java | 13 -- .../issues/SwitchToIssueInteractor.java | 27 ----- .../PullRequestDomainContract.java | 21 ---- ...FindGithubRepoForRootFolderInteractor.java | 34 ------ .../RepositoriesDomainContract.java | 17 --- .../events/repos/GitChangeListener.java | 39 ------ .../ide/acl/entities/GitRemoteExt.java | 17 --- .../ide/acl/entities/GitRepositoryExt.java | 38 ------ .../ide/acl/entities/GithubConnectionExt.java | 21 ---- .../ide/acl/entities/ProjectExt.java | 21 ---- .../acl/services/GitRepositoryFinderImpl.java | 27 ----- .../GithubApiV3PullRequestLoader.java | 75 ------------ .../services/GithubRepositoryFinderImpl.java | 35 ------ .../integration/ApplicationDIComponent.java | 18 --- .../ide/integration/ProjectDIComponent.java | 31 ----- .../pullrequests/ApiV3PullRequestFetcher.java | 27 ----- .../PullRequestQueryParameters.java | 95 --------------- .../pullrequests/GithubDescriptionParser.java | 54 --------- .../pullrequestlist/PullRequestListModel.java | 25 ---- .../PullRequestListPresenter.java | 46 ------- .../columns/IssuesColumnInfo.java | 22 ---- .../columns/NumberColumnInfo.java | 35 ------ .../columns/StateColumnInfo.java | 17 --- .../columns/TitleColumnInfo.java | 17 --- .../pullrequests/PullRequestRepositoryImpl.kt | 21 ++++ .../di/contracts/DiContainerAware.kt | 18 +++ .../di/impl/dagger/ApplicationContainer.kt | 13 ++ .../di/impl/dagger/ProjectContainer.kt | 13 ++ .../di/impl/dagger/components/UiInjectors.kt} | 8 +- .../impl/dagger/modules/ApplicationModule.kt | 20 ++++ .../di/impl/dagger/modules/AuthModule.kt | 36 ++++++ .../di/impl/dagger/modules/IssueModule.kt | 16 +++ .../di/impl/dagger/modules/ReposModule.kt | 25 ++++ .../codereviews/di/scopes/ProjectScoped.kt | 8 ++ .../github/codereviews/domain/Interactor.kt | 0 .../domain/issues/IssuesDomainContract.kt | 11 ++ .../domain/issues/SwitchToIssueInteractor.kt | 16 +++ .../pullrequests/PullRequestDomainContract.kt | 20 ++++ .../FindGithubRepoForRootFolderInteractor.kt | 17 +++ .../RepositoriesDomainContract.kt | 13 ++ .../events/repos/GitChangeListener.kt | 26 ++++ .../ide/acl/entities/GitRemoteExt.kt | 11 ++ .../ide/acl/entities/GitRepositoryExt.kt | 28 +++++ .../ide/acl/entities/GithubConnectionExt.kt | 17 +++ .../ide/acl/entities/ProjectExt.kt | 17 +++ .../acl/services/GitRepositoryFinderImpl.kt | 19 +++ .../services/GithubApiV3PullRequestLoader.kt | 58 +++++++++ .../services/GithubRepositoryFinderImpl.kt | 19 +++ .../acl/services/tasks/IdeaTaskActivator.kt | 2 +- .../ide/integration/ApplicationDIComponent.kt | 14 +++ .../ide/integration/ProjectDIComponent.kt | 23 ++++ .../codereviews/apiv3/CodeReviewsFetcher.kt | 4 +- .../net/issues/ApiV3IssueFetcher.kt | 2 +- .../pullrequests/ApiV3PullRequestFetcher.kt | 19 +++ .../PullRequestQueryParameters.kt | 49 ++++++++ .../pullrequests/GithubDescriptionParser.kt | 50 ++++++++ .../toolwindow/ToolWindowContentPresenter.kt | 2 +- .../pullrequestlist/PullRequestListModel.kt | 13 ++ .../PullRequestListPresenter.kt | 32 +++++ .../columns/IssuesColumnInfo.kt | 17 +++ .../columns/NumberColumnInfo.kt | 26 ++++ .../columns/StateColumnInfo.kt | 11 ++ .../columns/TitleColumnInfo.kt | 11 ++ .../GithubDescriptionParserTest.java | 113 ------------------ .../services/tasks/IdeaTaskActivatorTest.kt | 6 +- .../net/issues/ApiV3IssueFetcherTest.kt | 6 +- .../GithubDescriptionParserTest.kt | 112 +++++++++++++++++ .../ToolWindowContentPresenterTest.kt | 4 +- .../PullRequestListRevieweeViewTest.kt | 0 83 files changed, 838 insertions(+), 1118 deletions(-) delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.java delete mode 100644 src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.java create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.kt rename src/main/{java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.java => kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.kt} (52%) create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.kt rename src/main/{java => kotlin}/com/duxtinto/intellij/plugin/github/codereviews/domain/Interactor.kt (100%) create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.kt create mode 100644 src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.kt delete mode 100644 src/test/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.java create mode 100644 src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.kt rename src/test/{java => kotlin}/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListRevieweeViewTest.kt (100%) diff --git a/build.gradle b/build.gradle index 0afa375..65fc965 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,6 @@ buildscript { } plugins { - id 'net.ltgt.apt-idea' version '0.13' id 'org.jetbrains.intellij' version '0.2.17' id "org.jetbrains.kotlin.jvm" version "1.2.21" id "org.jetbrains.kotlin.plugin.allopen" version "1.2.21" @@ -39,7 +38,6 @@ allprojects { sourceSets { main { - java.srcDir 'src/main/java' kotlin.srcDirs 'src/main/kotlin' resources.srcDir 'src/main/resources' } @@ -55,12 +53,4 @@ dependencies { "com.google.dagger:dagger:${project.versions.dagger}", "org.jsoup:jsoup:${project.versions.jsoup}", ) - - compileOnly "com.google.auto.value:auto-value:${project.versions.auto_value}" - - apt( - "com.google.dagger:dagger-compiler:${project.versions.dagger}", - "com.google.auto:auto-common:${project.versions.auto_common}", - "com.google.auto.value:auto-value:${project.versions.auto_value}", - ) } diff --git a/github_code_review.iml b/github_code_review.iml index e902d09..9ed8102 100644 --- a/github_code_review.iml +++ b/github_code_review.iml @@ -38,6 +38,7 @@ + @@ -50,19 +51,12 @@ - - - - - - - @@ -215,18 +209,6 @@ - - - - - - - - - - - - diff --git a/gradle/scripts/dependencies.build.gradle b/gradle/scripts/dependencies.build.gradle index c1b8636..cfae253 100644 --- a/gradle/scripts/dependencies.build.gradle +++ b/gradle/scripts/dependencies.build.gradle @@ -10,7 +10,6 @@ ext { guava : '23.6-jre', dagger : '2.14', auto_common : '0.9', - auto_value : '1.5', jsoup : '1.11.2', // Testing diff --git a/gradle/scripts/kotlin.build.gradle b/gradle/scripts/kotlin.build.gradle index a7b09f8..49199b5 100644 --- a/gradle/scripts/kotlin.build.gradle +++ b/gradle/scripts/kotlin.build.gradle @@ -6,7 +6,6 @@ dependencies { kapt( "com.google.dagger:dagger-compiler:${project.versions.dagger}", "com.google.auto:auto-common:${project.versions.auto_common}", - "com.google.auto.value:auto-value:${project.versions.auto_value}", ) } diff --git a/gradle/scripts/testing.build.gradle b/gradle/scripts/testing.build.gradle index a0e123e..c177195 100644 --- a/gradle/scripts/testing.build.gradle +++ b/gradle/scripts/testing.build.gradle @@ -2,10 +2,7 @@ apply plugin: 'org.junit.platform.gradle.plugin' sourceSets { test { - java.srcDirs += [ - 'src/test/java', - ] - java.srcDirs += [ + kotlin.srcDirs += [ 'src/commonTest/kotlin', 'src/test/kotlin', 'src/uiTest/kotlin' diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.java deleted file mode 100644 index 89d22bc..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.data.pullrequests; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.ApiV3PullRequestFetcher; -import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters; -import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters.State; - -import javax.annotation.Nonnull; -import javax.inject.Inject; -import java.io.IOException; -import java.util.List; - -public class PullRequestRepositoryImpl implements PullRequestDomainContract.Repository { - private final ApiV3PullRequestFetcher fetcher; - - @Inject - public PullRequestRepositoryImpl(@Nonnull PullRequestDomainContract.Fetcher fetcher) { - this.fetcher = (ApiV3PullRequestFetcher) fetcher; - } - - @Override - public List getAllOpenBy(@Nonnull String userName, @Nonnull String repoName) throws IOException { - PullRequestQueryParameters parameters = PullRequestQueryParameters.builder().setState(State.OPEN).build(); - return fetcher.fetchForRepository(userName, repoName, parameters); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.java deleted file mode 100644 index 0636d36..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.contracts; - -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ApplicationContainer; -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ProjectContainer; -import com.duxtinto.intellij.plugin.github.codereviews.ide.integration.ApplicationDIComponent; -import com.duxtinto.intellij.plugin.github.codereviews.ide.integration.ProjectDIComponent; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.NotNull; - -public interface DiContainerAware { - default ProjectContainer getProjectContainer(@NotNull Project project) { - return project.getComponent(ProjectDIComponent.class).getContainer(); - } - - default ApplicationContainer getGlobalContainer() { - return ApplicationManager.getApplication().getComponent(ApplicationDIComponent.class).getContainer(); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.java deleted file mode 100644 index de743d9..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger; - -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ApplicationModule; -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule; -import dagger.Component; - -import javax.inject.Singleton; - -@Singleton -@Component(modules = ApplicationModule.class) -public interface ApplicationContainer { - ProjectContainer projectContainer(ProjectModule projectModule); -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.java deleted file mode 100644 index 6f76ecb..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger; - -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.components.UiInjectors; -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule; -import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped; -import com.intellij.dvcs.repo.VcsRepositoryMappingListener; -import dagger.Subcomponent; - -@ProjectScoped -@Subcomponent(modules = ProjectModule.class) -public interface ProjectContainer extends UiInjectors { - VcsRepositoryMappingListener repositoryListener(); -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.java deleted file mode 100644 index d14f07a..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules; - -import com.intellij.openapi.application.Application; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.ui.content.ContentFactory; -import dagger.Module; -import dagger.Provides; - -@Module -public class ApplicationModule { - @Provides - public Application provideApplication() { - return ApplicationManager.getApplication(); - } - - @Provides - public ContentFactory provideContentFactory() { - return ContentFactory.SERVICE.getInstance(); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.java deleted file mode 100644 index 13361d7..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules; - -import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GithubConnectionExt; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt; -import com.intellij.openapi.progress.ProgressIndicator; -import dagger.Module; -import dagger.Provides; -import org.jetbrains.plugins.github.api.GithubConnection; -import org.jetbrains.plugins.github.util.AuthLevel; -import org.jetbrains.plugins.github.util.GithubAuthDataHolder; -import org.jetbrains.plugins.github.util.GithubUtil; - -import java.io.IOException; - -@Module -public class AuthModule { - @Provides - @ProjectScoped - public GithubAuthDataHolder provideGithubAuthDataHolder(ProjectExt project, ProgressIndicator progressIndicator) { - try { - // TODO: because of the exception handling here, it 'smells' to me that hidden inside a module is not the place for this call - return GithubUtil.getValidAuthDataHolderFromConfig(project.delegate(), AuthLevel.LOGGED, progressIndicator); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Provides - @ProjectScoped - public GithubConnectionExt provideGithubConnection(GithubAuthDataHolder authHolder) { - return GithubConnectionExt.create(new GithubConnection(authHolder.getAuthData(), true)); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.java deleted file mode 100644 index 8781857..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.issues.IssuesDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.tasks.IdeaTaskActivator; -import com.duxtinto.intellij.plugin.github.codereviews.net.issues.ApiV3IssueFetcher; -import dagger.Binds; -import dagger.Module; - -@Module -public abstract class IssueModule { - @Binds - public abstract IssuesDomainContract.Switcher provideIssuesDomainContractSwitcher(IdeaTaskActivator switcher); - - @Binds - public abstract IssuesDomainContract.Fetcher provideIssuesDomainContractFetcher(ApiV3IssueFetcher fetcher); -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.java deleted file mode 100644 index 265a056..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules; - -import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped; -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.events.repos.GitChangeListener; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GitRepositoryFinderImpl; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GithubRepositoryFinderImpl; -import com.intellij.dvcs.repo.VcsRepositoryMappingListener; -import dagger.Binds; -import dagger.Module; - -@Module -public abstract class ReposModule { - @Binds - @ProjectScoped - public abstract RepositoriesDomainContract.GitRepositoryFinder provideGitRepositoryFinder(GitRepositoryFinderImpl gitRepositoryFinder); - - @Binds - @ProjectScoped - public abstract RepositoriesDomainContract.GithubRepositoryFinder provideGithubRepositoryFinder(GithubRepositoryFinderImpl githubRepositoryFinder); - - @Binds - @ProjectScoped - public abstract VcsRepositoryMappingListener provideVcsRepositoryMappingListener(GitChangeListener changeListener); -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.java deleted file mode 100644 index 49c0eb4..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.scopes; - -import javax.inject.Scope; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; - -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Scope -@Documented -@Retention(RUNTIME) -public @interface ProjectScoped { -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.java deleted file mode 100644 index 314396c..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.domain.issues; - -import org.jetbrains.annotations.Nullable; - -public interface IssuesDomainContract { - interface Switcher { - void switchToIssue(IssueEntity issue); - } - interface Fetcher { - @Nullable - IssueEntity fetchIssueById(long id); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.java deleted file mode 100644 index 3d8bf65..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.domain.issues; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.Interactor; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class SwitchToIssueInteractor implements Interactor { - @Nonnull - private final IssuesDomainContract.Switcher issueSwitcher; - - @Inject - public SwitchToIssueInteractor( - @Nonnull IssuesDomainContract.Switcher issueSwitcher) { - this.issueSwitcher = checkNotNull(issueSwitcher); - } - - @Nullable - @Override - public Void run(IssueEntity issue) { - issueSwitcher.switchToIssue(issue); - return null; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.java deleted file mode 100644 index 5bbfad2..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests; - -import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters; - -import javax.annotation.Nonnull; -import java.io.IOException; -import java.util.List; - -public interface PullRequestDomainContract { - interface Fetcher { - List fetchForRepository(@Nonnull String userName, @Nonnull String repoName, PullRequestQueryParameters parameters) throws IOException; - } - - interface Repository { - List getAllOpenBy(@Nonnull String userName, @Nonnull String repoName) throws IOException; - } - - interface DescriptionParser { - PullRequestDescriptionEntity parse(String description); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.java deleted file mode 100644 index 35be8c6..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.domain.repositories; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.Interactor; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.inject.Inject; - -public class FindGithubRepoForRootFolderInteractor implements Interactor { - @Nonnull - private final RepositoriesDomainContract.GitRepositoryFinder gitRepositoryFinder; - @Nonnull - private final RepositoriesDomainContract.GithubRepositoryFinder githubRepositoryFinder; - - @Inject - public FindGithubRepoForRootFolderInteractor( - @Nonnull RepositoriesDomainContract.GitRepositoryFinder gitRepositoryFinder, - @Nonnull RepositoriesDomainContract.GithubRepositoryFinder githubRepositoryFinder) { - this.gitRepositoryFinder = gitRepositoryFinder; - this.githubRepositoryFinder = githubRepositoryFinder; - } - - @Override - @Nullable - public GithubRepositoryEntity run(Void request) { - GitRepositoryExt rootGitRepo = gitRepositoryFinder.findRootRepo(); - if (rootGitRepo == null) { - return null; - } - - return githubRepositoryFinder.find(rootGitRepo); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.java deleted file mode 100644 index 0fe175a..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.domain.repositories; - -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt; - -import javax.annotation.Nullable; - -public interface RepositoriesDomainContract { - interface GithubRepositoryFinder { - @Nullable - GithubRepositoryEntity find(GitRepositoryExt gitRepository); - } - - interface GitRepositoryFinder { - @Nullable - GitRepositoryExt findRootRepo(); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.java deleted file mode 100644 index 43e8df5..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.events.repos; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.GetAllOpenForRepoInteractor; -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.GithubRepositoryEntity; -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.FindGithubRepoForRootFolderInteractor; -import com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.PullRequestList; -import com.intellij.dvcs.repo.VcsRepositoryMappingListener; - -import javax.annotation.Nonnull; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class GitChangeListener implements VcsRepositoryMappingListener { - @Nonnull - private final FindGithubRepoForRootFolderInteractor githubRepoFinder; - @Nonnull - private final GetAllOpenForRepoInteractor pullRequestFetcher; - @Nonnull - private final PullRequestList.Presenter pullRequestsPresenter; - - @Inject - public GitChangeListener( - @Nonnull FindGithubRepoForRootFolderInteractor githubRepoFinder, - @Nonnull GetAllOpenForRepoInteractor pullRequestFetcher, - @Nonnull PullRequestList.Presenter pullRequestsPresenter) { - this.githubRepoFinder = checkNotNull(githubRepoFinder); - this.pullRequestFetcher = checkNotNull(pullRequestFetcher); - this.pullRequestsPresenter = checkNotNull(pullRequestsPresenter); - } - - @Override - public void mappingChanged() { - final GithubRepositoryEntity repo = githubRepoFinder.run(null); - if (repo != null) { - pullRequestsPresenter.displayPullRequests(pullRequestFetcher.run(repo)); - } - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.java deleted file mode 100644 index f6f87cb..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities; - -import com.google.common.collect.ForwardingObject; -import git4idea.repo.GitRemote; - -public class GitRemoteExt extends ForwardingObject{ - private final GitRemote delegate; - - public GitRemoteExt(GitRemote remote) { - this.delegate = remote; - } - - @Override - protected GitRemote delegate() { - return delegate; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.java deleted file mode 100644 index cc32826..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities; - -import com.google.common.collect.ForwardingObject; -import git4idea.repo.GitRepository; -import org.jetbrains.plugins.github.util.GithubUtil; - -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.stream.Collectors; - -public class GitRepositoryExt extends ForwardingObject { - @Nonnull - private final GitRepository delegate; - - private GitRepositoryExt(@Nonnull GitRepository delegate) { - this.delegate = delegate; - } - - public static GitRepositoryExt create(GitRepository delegate) { - return new GitRepositoryExt(delegate); - } - - @Override - public GitRepository delegate() { - return delegate; - } - - public boolean hasGithubRemote() { - return GithubUtil.isRepositoryOnGitHub(this.delegate()); - } - - @Nonnull - Collection getRemotes() { - return delegate.getRemotes().stream() - .map(GitRemoteExt::new) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.java deleted file mode 100644 index 78d0b13..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities; - -import com.google.common.collect.ForwardingObject; -import org.jetbrains.plugins.github.api.GithubConnection; - -public class GithubConnectionExt extends ForwardingObject { - private final GithubConnection delegate; - - private GithubConnectionExt(GithubConnection connection) { - this.delegate = connection; - } - - public static GithubConnectionExt create(GithubConnection delegate) { - return new GithubConnectionExt(delegate); - } - - @Override - public GithubConnection delegate() { - return delegate; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.java deleted file mode 100644 index a10623d..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities; - -import com.google.common.collect.ForwardingObject; -import com.intellij.openapi.project.Project; - -public class ProjectExt extends ForwardingObject{ - private final Project delegate; - - private ProjectExt(Project project) { - this.delegate = project; - } - - public static ProjectExt create(Project delegate) { - return new ProjectExt(delegate); - } - - @Override - public Project delegate() { - return delegate; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.java deleted file mode 100644 index d87889f..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt; -import git4idea.repo.GitRepository; -import org.jetbrains.plugins.github.util.GithubUtil; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.inject.Inject; - -public class GitRepositoryFinderImpl implements RepositoriesDomainContract.GitRepositoryFinder { - @Nonnull - private final ProjectExt project; - - @Inject - public GitRepositoryFinderImpl(@Nonnull ProjectExt project) { - this.project = project; - } - - @Nullable - public GitRepositoryExt findRootRepo() { - GitRepository repository = GithubUtil.getGitRepository(project.delegate(), null); - return (repository != null) ? GitRepositoryExt.create(repository) : null; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.java deleted file mode 100644 index 69c5316..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services; - -import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped; -import com.duxtinto.intellij.plugin.github.codereviews.domain.issues.IssueEntity; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.issues.GetAllClosableByInteractor; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.issues.GetAllClosableByRequest; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GithubConnectionExt; -import org.apache.http.Header; -import org.apache.http.message.BasicHeader; -import org.jetbrains.plugins.github.api.GithubConnection; -import org.jetbrains.plugins.github.api.data.GithubPullRequest; - -import javax.annotation.Nonnull; -import javax.inject.Inject; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; -import java.util.stream.Collectors; - -import static com.google.common.base.Preconditions.checkNotNull; - -@ProjectScoped -public class GithubApiV3PullRequestLoader { - private static final Header ACCEPT_V3_JSON_HTML_MARKUP = new BasicHeader("Accept", "application/vnd.github.v3.html+json"); - - @Nonnull - private final GithubConnectionExt connection; - @Nonnull - private final GetAllClosableByInteractor getClosableIssuesInteractor; - - @Inject - public GithubApiV3PullRequestLoader( - @Nonnull GithubConnectionExt connection, - @Nonnull GetAllClosableByInteractor getClosableIssues - ) { - this.connection = connection; - this.getClosableIssuesInteractor = checkNotNull(getClosableIssues); - } - - @Nonnull - public List loadAllPullRequests(@Nonnull String path) throws IOException { - return loadAll(connection, path, GithubPullRequest[].class, ACCEPT_V3_JSON_HTML_MARKUP) - .stream() - .map((idePullRequest) -> { - try { - return new PullRequestEntity( - idePullRequest.getNumber(), - getClosableIssues(idePullRequest.getBodyHtml()), - idePullRequest.getTitle(), - PullRequestEntity.State.Companion.fromString(idePullRequest.getState()), - new URL(idePullRequest.getHtmlUrl())); - } catch (MalformedURLException e) { - e.printStackTrace(); - return null; - } - } - ) - .collect(Collectors.toList()); - } - - private List getClosableIssues(String pullRequestDescriptionText) { - return getClosableIssuesInteractor.run(new GetAllClosableByRequest(pullRequestDescriptionText)); - } - - @Nonnull - private List loadAll(@Nonnull GithubConnectionExt connection, - @Nonnull String path, - @Nonnull Class type, - @Nonnull Header... headers) throws IOException { - GithubConnection.PagedRequest request = new GithubConnection.ArrayPagedRequest<>(path, type, headers); - return request.getAll(connection.delegate()); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.java deleted file mode 100644 index 5d1d8e1..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.GithubRepositoryEntity; -import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt; -import com.intellij.openapi.util.Pair; -import git4idea.repo.GitRemote; -import org.jetbrains.plugins.github.api.GithubFullPath; -import org.jetbrains.plugins.github.util.GithubUrlUtil; -import org.jetbrains.plugins.github.util.GithubUtil; - -import javax.annotation.Nullable; -import javax.inject.Inject; - -public class GithubRepositoryFinderImpl implements RepositoriesDomainContract.GithubRepositoryFinder { - @Inject - public GithubRepositoryFinderImpl() { - } - - @Override - @Nullable - public GithubRepositoryEntity find(GitRepositoryExt repository) { - Pair remote = GithubUtil.findGithubRemote(repository.delegate()); - if (remote == null) { - return null; - } - - GithubFullPath path = GithubUrlUtil.getUserAndRepositoryFromRemoteUrl(remote.getSecond()); - if (path == null) { - return null; - } - - return new GithubRepositoryEntity(path.getRepository(), path.getUser()); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.java deleted file mode 100644 index 5f47f1b..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.integration; - -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ApplicationContainer; -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.DaggerApplicationContainer; -import com.intellij.openapi.components.ApplicationComponent; - -public class ApplicationDIComponent implements ApplicationComponent { - private ApplicationContainer container; - - @Override - public void initComponent() { - container = DaggerApplicationContainer.create(); - } - - public ApplicationContainer getContainer() { - return container; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.java deleted file mode 100644 index 5178c5a..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ide.integration; - -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ProjectContainer; -import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt; -import com.intellij.dvcs.repo.VcsRepositoryManager; -import com.intellij.openapi.components.ProjectComponent; -import com.intellij.openapi.project.Project; - -public class ProjectDIComponent implements ProjectComponent { - - private final ApplicationDIComponent applicationDI; - private final Project project; - - private ProjectContainer container; - - public ProjectDIComponent(ApplicationDIComponent applicationDI, Project project) { - this.applicationDI = applicationDI; - this.project = project; - } - - @Override - public void initComponent() { - container = applicationDI.getContainer().projectContainer(new ProjectModule(ProjectExt.create(project))); - project.getMessageBus().connect().subscribe(VcsRepositoryManager.VCS_REPOSITORY_MAPPING_UPDATED, container.repositoryListener()); - } - - public ProjectContainer getContainer() { - return container; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.java deleted file mode 100644 index 90a7a35..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GithubApiV3PullRequestLoader; - -import javax.annotation.Nonnull; -import javax.inject.Inject; -import java.io.IOException; -import java.util.List; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class ApiV3PullRequestFetcher implements PullRequestDomainContract.Fetcher { - private final GithubApiV3PullRequestLoader apiLoader; - - @Inject - public ApiV3PullRequestFetcher(@Nonnull GithubApiV3PullRequestLoader apiLoader) { - this.apiLoader = checkNotNull(apiLoader); - } - - @Override - public List fetchForRepository(@Nonnull String userName, @Nonnull String repoName, PullRequestQueryParameters parameters) throws IOException { - String path = "/repos/" + userName + "/" + repoName + "/pulls?" + parameters.toQueryString(); - return apiLoader.loadAllPullRequests(path); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.java deleted file mode 100644 index 5c88ca7..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests; - -import com.google.auto.value.AutoValue; - -@AutoValue -public abstract class PullRequestQueryParameters { - abstract State state(); - abstract String head(); // Format: user:ref-name - abstract String base(); - abstract Sort sort(); - abstract Direction direction(); - abstract int pageSize(); - - public static Builder builder() { - return new AutoValue_PullRequestQueryParameters - .Builder() - .setState(State.OPEN) - .setHead("") - .setBase("") - .setSort(Sort.CREATED) - .setDirection(Direction.DESC) - .setPageSize(100); - } - - public String toQueryString() { - return "per_page=" + this.pageSize() + - "&state=" + this.state() + - (!this.head().isEmpty() ? "&head=" + this.head() : "") + - (!this.base().isEmpty() ? "&base=" + this.base() : "") + - "&sort=" + this.sort() + - "&direction=" + this.direction(); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder setState(State state); - public abstract Builder setHead(String head); - public abstract Builder setBase(String base); - public abstract Builder setSort(Sort sort); - public abstract Builder setDirection(Direction direction); - public abstract Builder setPageSize(int size); - public abstract PullRequestQueryParameters build(); - } - - public enum State { - OPEN("open"), - CLOSED("closed"), - ALL("all"); - - private final String state; - - State(String state) { - this.state = state; - } - - @Override - public String toString() { - return state; - } - } - - public enum Sort { - CREATED("created"), - UPDATED("updated"), - POPULARITY("popularity"), - LONG_RUNNING("long-runing"); // age, filtering by pulls updated in the last month - - private final String sort; - - Sort(String sort) { - this.sort = sort; - } - - @Override - public String toString() { - return sort; - } - } - - public enum Direction { - ASC("asc"), - DESC("desc"); - - private final String direction; - - Direction(String direction) { - this.direction = direction; - } - - @Override - public String toString() { - return direction; - } - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.java deleted file mode 100644 index 6a412dd..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.services.pullrequests; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDescriptionEntity; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Element; - -import javax.inject.Inject; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public class GithubDescriptionParser implements PullRequestDomainContract.DescriptionParser { - private Pattern closingKeywordPattern = Pattern.compile("(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)"); - private Pattern issueNumberPattern = Pattern.compile("^#(\\d*)$", Pattern.CASE_INSENSITIVE); - - @Inject - public GithubDescriptionParser() { - } - - @Override - public PullRequestDescriptionEntity parse(String description) { - Set closableIssues = new HashSet<>(); - for (Element issueLink : getClosingIssueLinksFrom(description)) { - closableIssues.add(getIssueNumber(issueLink)); - } - - return new PullRequestDescriptionEntity(closableIssues); - } - - private Iterable getClosingIssueLinksFrom(String description) { - return Jsoup.parseBodyFragment(description).select(".issue-keyword") - .stream() - .filter(this::isAValidClosingIssueElement) - .map(Element::nextElementSibling) - .collect(Collectors.toList()); - } - - private boolean isAValidClosingIssueElement(Element keyword) { - return closingKeywordPattern.matcher(keyword.ownText()).find() && - keyword.nextElementSibling().is("a.issue-link") && - issueNumberPattern.matcher(keyword.nextElementSibling().html()).find(); - } - - private Long getIssueNumber(Element link) { - Matcher matcher = issueNumberPattern.matcher(link.html()); - if (!matcher.find()) { - throw new RuntimeException("Closable issues should have the format '#(\\d*)': " + link.html()); - } - return Long.valueOf(matcher.group(1)); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.java deleted file mode 100644 index a55e4c7..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; -import com.intellij.util.ui.ListTableModel; - -import java.util.List; - -public class PullRequestListModel implements PullRequestList.Model { - private ListTableModel tableModel; - - public PullRequestListModel(ColumnInfo[] columns) { - this.tableModel = new ListTableModel<>(columns); - } - - @Override - public ListTableModel getTableModel() { - return tableModel; - } - - @Override - public void setPullRequests(List pullRequests) { - tableModel.setItems(pullRequests); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.java deleted file mode 100644 index 9e8f303..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist; - -import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped; -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; - -import javax.annotation.Nonnull; -import javax.inject.Inject; -import javax.inject.Named; -import java.util.List; - -import static com.google.common.base.Preconditions.checkNotNull; - -@ProjectScoped -public class PullRequestListPresenter implements PullRequestList.Presenter { - private PullRequestList.View view; - private final PullRequestList.Model model; - - @Inject - public PullRequestListPresenter(@Nonnull @Named("default") ColumnInfo[] columnInfos) { - checkNotNull(columnInfos); - - this.model = new PullRequestListModel(columnInfos); - } - - @Override - public void displayPullRequests(List pullRequests) { - updateModel(pullRequests); - if (view != null) { - view.render(model); - } - } - - @Override - public PullRequestList.Model getModel() { - return model; - } - - private void updateModel(List pullRequests) { - model.setPullRequests(pullRequests); - } - - public void setView(@Nonnull PullRequestList.View view) { - this.view = checkNotNull(view); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.java deleted file mode 100644 index bece817..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; -import org.jetbrains.annotations.Nullable; - -import java.util.stream.Collectors; - -public class IssuesColumnInfo extends ColumnInfo { - public IssuesColumnInfo() { - super("issues"); - } - - @Nullable - @Override - public String valueOf(PullRequestEntity pullRequest) { - return pullRequest.getCloseableIssues() - .stream() - .map(issue -> String.valueOf(issue.getNumber())) - .collect(Collectors.joining(",")); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.java deleted file mode 100644 index 474a19a..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; -import java.awt.*; - -public class NumberColumnInfo extends ColumnInfo { - public NumberColumnInfo() { - super("number"); - } - - @Nullable - @Override - public Long valueOf(PullRequestEntity pullRequest) { - return pullRequest.getNumber(); - } - - @Nullable - @Override - public TableCellRenderer getRenderer(PullRequestEntity pullRequest) { - return new DefaultTableCellRenderer() { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - JLabel cellContent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - cellContent.setText(""+String.valueOf(value)+""); - return cellContent; - } - }; - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.java deleted file mode 100644 index c5d9fc5..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; -import org.jetbrains.annotations.Nullable; - -public class StateColumnInfo extends ColumnInfo { - public StateColumnInfo() { - super("state"); - } - - @Nullable - @Override - public String valueOf(PullRequestEntity pullRequest) { - return pullRequest.getState().toString(); - } -} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.java b/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.java deleted file mode 100644 index fade629..0000000 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity; -import com.intellij.util.ui.ColumnInfo; -import org.jetbrains.annotations.Nullable; - -public class TitleColumnInfo extends ColumnInfo { - public TitleColumnInfo() { - super("title"); - } - - @Nullable - @Override - public String valueOf(PullRequestEntity pullRequest) { - return pullRequest.getTitle(); - } -} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.kt new file mode 100644 index 0000000..256f949 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/data/pullrequests/PullRequestRepositoryImpl.kt @@ -0,0 +1,21 @@ +package com.duxtinto.intellij.plugin.github.codereviews.data.pullrequests + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.ApiV3PullRequestFetcher +import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters +import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters.State +import javax.inject.Inject +import java.io.IOException + +class PullRequestRepositoryImpl @Inject +constructor(fetcher: PullRequestDomainContract.Fetcher) + : PullRequestDomainContract.Repository { + private val fetcher: ApiV3PullRequestFetcher = fetcher as ApiV3PullRequestFetcher + + @Throws(IOException::class) + override fun getAllOpenBy(userName: String, repoName: String): List { + val parameters = PullRequestQueryParameters(state = State.OPEN) + return fetcher.fetchForRepository(userName, repoName, parameters) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.kt new file mode 100644 index 0000000..b7ac7e8 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/contracts/DiContainerAware.kt @@ -0,0 +1,18 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.contracts + +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ApplicationContainer +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ProjectContainer +import com.duxtinto.intellij.plugin.github.codereviews.ide.integration.ApplicationDIComponent +import com.duxtinto.intellij.plugin.github.codereviews.ide.integration.ProjectDIComponent +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project + +interface DiContainerAware { + + val globalContainer: ApplicationContainer + get() = ApplicationManager.getApplication().getComponent(ApplicationDIComponent::class.java).container + + fun getProjectContainer(project: Project): ProjectContainer { + return project.getComponent(ProjectDIComponent::class.java).container + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.kt new file mode 100644 index 0000000..e643331 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ApplicationContainer.kt @@ -0,0 +1,13 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger + +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ApplicationModule +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule +import dagger.Component + +import javax.inject.Singleton + +@Singleton +@Component(modules = [ApplicationModule::class]) +interface ApplicationContainer { + fun projectContainer(projectModule: ProjectModule): ProjectContainer +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.kt new file mode 100644 index 0000000..209018a --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/ProjectContainer.kt @@ -0,0 +1,13 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger + +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.components.UiInjectors +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule +import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped +import com.intellij.dvcs.repo.VcsRepositoryMappingListener +import dagger.Subcomponent + +@ProjectScoped +@Subcomponent(modules = [ProjectModule::class]) +interface ProjectContainer : UiInjectors { + fun repositoryListener(): VcsRepositoryMappingListener +} diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.java b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.kt similarity index 52% rename from src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.java rename to src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.kt index 5b3018e..e52d219 100644 --- a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.java +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/components/UiInjectors.kt @@ -1,7 +1,7 @@ -package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.components; +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.components -import com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.ToolWindowFactory; +import com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.ToolWindowFactory -public interface UiInjectors { - void inject(ToolWindowFactory factory); +interface UiInjectors { + fun inject(factory: ToolWindowFactory) } diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.kt new file mode 100644 index 0000000..c5036cd --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ApplicationModule.kt @@ -0,0 +1,20 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules + +import com.intellij.openapi.application.Application +import com.intellij.openapi.application.ApplicationManager +import com.intellij.ui.content.ContentFactory +import dagger.Module +import dagger.Provides + +@Module +class ApplicationModule { + @Provides + fun provideApplication(): Application { + return ApplicationManager.getApplication() + } + + @Provides + fun provideContentFactory(): ContentFactory { + return ContentFactory.SERVICE.getInstance() + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.kt new file mode 100644 index 0000000..a78adc2 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/AuthModule.kt @@ -0,0 +1,36 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules + +import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GithubConnectionExt +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt +import com.intellij.openapi.progress.ProgressIndicator +import dagger.Module +import dagger.Provides +import org.jetbrains.plugins.github.api.GithubConnection +import org.jetbrains.plugins.github.util.AuthLevel +import org.jetbrains.plugins.github.util.GithubAuthDataHolder +import org.jetbrains.plugins.github.util.GithubUtil + +import java.io.IOException + +@Module +class AuthModule { + @Provides + @ProjectScoped + fun provideGithubAuthDataHolder(project: ProjectExt, progressIndicator: ProgressIndicator): GithubAuthDataHolder { + try { + // TODO: because of the exception handling here, it 'smells' to me that hidden inside a module is not the place for this call + return GithubUtil.getValidAuthDataHolderFromConfig(project.delegate(), AuthLevel.LOGGED, progressIndicator) + } catch (e: IOException) { + e.printStackTrace() + throw RuntimeException(e) + } + + } + + @Provides + @ProjectScoped + fun provideGithubConnection(authHolder: GithubAuthDataHolder): GithubConnectionExt { + return GithubConnectionExt.create(GithubConnection(authHolder.authData, true)) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.kt new file mode 100644 index 0000000..a6ce03d --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/IssueModule.kt @@ -0,0 +1,16 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules + +import com.duxtinto.intellij.plugin.github.codereviews.domain.issues.IssuesDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.tasks.IdeaTaskActivator +import com.duxtinto.intellij.plugin.github.codereviews.net.issues.ApiV3IssueFetcher +import dagger.Binds +import dagger.Module + +@Module +abstract class IssueModule { + @Binds + abstract fun provideIssuesDomainContractSwitcher(switcher: IdeaTaskActivator): IssuesDomainContract.Switcher + + @Binds + abstract fun provideIssuesDomainContractFetcher(fetcher: ApiV3IssueFetcher): IssuesDomainContract.Fetcher +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.kt new file mode 100644 index 0000000..214996c --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/impl/dagger/modules/ReposModule.kt @@ -0,0 +1,25 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules + +import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.events.repos.GitChangeListener +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GitRepositoryFinderImpl +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GithubRepositoryFinderImpl +import com.intellij.dvcs.repo.VcsRepositoryMappingListener +import dagger.Binds +import dagger.Module + +@Module +abstract class ReposModule { + @Binds + @ProjectScoped + abstract fun provideGitRepositoryFinder(gitRepositoryFinder: GitRepositoryFinderImpl): RepositoriesDomainContract.GitRepositoryFinder + + @Binds + @ProjectScoped + abstract fun provideGithubRepositoryFinder(githubRepositoryFinder: GithubRepositoryFinderImpl): RepositoriesDomainContract.GithubRepositoryFinder + + @Binds + @ProjectScoped + abstract fun provideVcsRepositoryMappingListener(changeListener: GitChangeListener): VcsRepositoryMappingListener +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.kt new file mode 100644 index 0000000..c58a35d --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/di/scopes/ProjectScoped.kt @@ -0,0 +1,8 @@ +package com.duxtinto.intellij.plugin.github.codereviews.di.scopes + +import javax.inject.Scope + +@Scope +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class ProjectScoped diff --git a/src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/Interactor.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/Interactor.kt similarity index 100% rename from src/main/java/com/duxtinto/intellij/plugin/github/codereviews/domain/Interactor.kt rename to src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/Interactor.kt diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.kt new file mode 100644 index 0000000..c06530e --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/IssuesDomainContract.kt @@ -0,0 +1,11 @@ +package com.duxtinto.intellij.plugin.github.codereviews.domain.issues + +interface IssuesDomainContract { + interface Switcher { + fun switchToIssue(issue: IssueEntity) + } + + interface Fetcher { + fun fetchIssueById(id: Long): IssueEntity? + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.kt new file mode 100644 index 0000000..3b9107e --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/issues/SwitchToIssueInteractor.kt @@ -0,0 +1,16 @@ +package com.duxtinto.intellij.plugin.github.codereviews.domain.issues + +import com.duxtinto.intellij.plugin.github.codereviews.domain.Interactor +import javax.inject.Inject + +import com.google.common.base.Preconditions.checkNotNull + +class SwitchToIssueInteractor + @Inject + constructor(private val issueSwitcher: IssuesDomainContract.Switcher) + : Interactor { + + override fun run(request: IssueEntity) { + issueSwitcher.switchToIssue(request) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.kt new file mode 100644 index 0000000..dbfb1ec --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/pullrequests/PullRequestDomainContract.kt @@ -0,0 +1,20 @@ +package com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests + +import com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests.PullRequestQueryParameters +import java.io.IOException + +interface PullRequestDomainContract { + interface Fetcher { + @Throws(IOException::class) + fun fetchForRepository(userName: String, repoName: String, parameters: PullRequestQueryParameters): List + } + + interface Repository { + @Throws(IOException::class) + fun getAllOpenBy(userName: String, repoName: String): List + } + + interface DescriptionParser { + fun parse(description: String): PullRequestDescriptionEntity + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.kt new file mode 100644 index 0000000..c020b17 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/FindGithubRepoForRootFolderInteractor.kt @@ -0,0 +1,17 @@ +package com.duxtinto.intellij.plugin.github.codereviews.domain.repositories + +import com.duxtinto.intellij.plugin.github.codereviews.domain.Interactor +import javax.inject.Inject + +class FindGithubRepoForRootFolderInteractor + @Inject + constructor( + private val gitRepositoryFinder: RepositoriesDomainContract.GitRepositoryFinder, + private val githubRepositoryFinder: RepositoriesDomainContract.GithubRepositoryFinder) + : Interactor { + + override fun run(request: Unit): GithubRepositoryEntity? { + val rootGitRepo = gitRepositoryFinder.findRootRepo() ?: return null + return githubRepositoryFinder.find(rootGitRepo) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.kt new file mode 100644 index 0000000..1149263 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/domain/repositories/RepositoriesDomainContract.kt @@ -0,0 +1,13 @@ +package com.duxtinto.intellij.plugin.github.codereviews.domain.repositories + +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt + +interface RepositoriesDomainContract { + interface GithubRepositoryFinder { + fun find(gitRepository: GitRepositoryExt): GithubRepositoryEntity? + } + + interface GitRepositoryFinder { + fun findRootRepo(): GitRepositoryExt? + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.kt new file mode 100644 index 0000000..1564f80 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/events/repos/GitChangeListener.kt @@ -0,0 +1,26 @@ +package com.duxtinto.intellij.plugin.github.codereviews.events.repos + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.GetAllOpenForRepoInteractor +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.GithubRepositoryEntity +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.FindGithubRepoForRootFolderInteractor +import com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.PullRequestList +import com.intellij.dvcs.repo.VcsRepositoryMappingListener +import javax.inject.Inject + +import com.google.common.base.Preconditions.checkNotNull + +class GitChangeListener + @Inject + constructor( + private val githubRepoFinder: FindGithubRepoForRootFolderInteractor, + private val pullRequestFetcher: GetAllOpenForRepoInteractor, + private val pullRequestsPresenter: PullRequestList.Presenter) + : VcsRepositoryMappingListener { + + override fun mappingChanged() { + val repo = githubRepoFinder.run(Unit) + if (repo != null) { + pullRequestsPresenter.displayPullRequests(pullRequestFetcher.run(repo)!!) + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.kt new file mode 100644 index 0000000..97881b3 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRemoteExt.kt @@ -0,0 +1,11 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities + +import com.google.common.collect.ForwardingObject +import git4idea.repo.GitRemote + +class GitRemoteExt(private val delegate: GitRemote) : ForwardingObject() { + + override fun delegate(): GitRemote { + return delegate + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.kt new file mode 100644 index 0000000..cb15b06 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GitRepositoryExt.kt @@ -0,0 +1,28 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities + +import com.google.common.collect.ForwardingObject +import git4idea.repo.GitRepository +import org.jetbrains.plugins.github.util.GithubUtil +import java.util.stream.Collectors + +class GitRepositoryExt private constructor(private val delegate: GitRepository) : ForwardingObject() { + + internal val remotes: Collection + get() = delegate + .remotes + .map { GitRemoteExt(it) } + + public override fun delegate(): GitRepository { + return delegate + } + + fun hasGithubRemote(): Boolean { + return GithubUtil.isRepositoryOnGitHub(this.delegate()) + } + + companion object { + fun create(delegate: GitRepository): GitRepositoryExt { + return GitRepositoryExt(delegate) + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.kt new file mode 100644 index 0000000..13df4aa --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/GithubConnectionExt.kt @@ -0,0 +1,17 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities + +import com.google.common.collect.ForwardingObject +import org.jetbrains.plugins.github.api.GithubConnection + +class GithubConnectionExt private constructor(private val delegate: GithubConnection) : ForwardingObject() { + + public override fun delegate(): GithubConnection { + return delegate + } + + companion object { + fun create(delegate: GithubConnection): GithubConnectionExt { + return GithubConnectionExt(delegate) + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.kt new file mode 100644 index 0000000..98feafb --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/entities/ProjectExt.kt @@ -0,0 +1,17 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities + +import com.google.common.collect.ForwardingObject +import com.intellij.openapi.project.Project + +class ProjectExt private constructor(private val delegate: Project) : ForwardingObject() { + + public override fun delegate(): Project { + return delegate + } + + companion object { + fun create(delegate: Project): ProjectExt { + return ProjectExt(delegate) + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.kt new file mode 100644 index 0000000..f459cc3 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GitRepositoryFinderImpl.kt @@ -0,0 +1,19 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services + +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt +import git4idea.repo.GitRepository +import org.jetbrains.plugins.github.util.GithubUtil +import javax.inject.Inject + +class GitRepositoryFinderImpl + @Inject + constructor(private val project: ProjectExt) + : RepositoriesDomainContract.GitRepositoryFinder { + + override fun findRootRepo(): GitRepositoryExt? { + val repository = GithubUtil.getGitRepository(project.delegate(), null) + return if (repository != null) GitRepositoryExt.create(repository) else null + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.kt new file mode 100644 index 0000000..d7c5375 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubApiV3PullRequestLoader.kt @@ -0,0 +1,58 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services + +import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped +import com.duxtinto.intellij.plugin.github.codereviews.domain.issues.IssueEntity +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.issues.GetAllClosableByInteractor +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.issues.GetAllClosableByRequest +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GithubConnectionExt +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.codereviews.GithubApiV3CodeReviewLoader.Companion.ACCEPT_V3_JSON_HTML_MARKUP +import org.apache.http.Header +import org.apache.http.message.BasicHeader +import org.jetbrains.plugins.github.api.GithubConnection +import org.jetbrains.plugins.github.api.data.GithubPullRequest +import javax.inject.Inject +import java.io.IOException +import java.net.MalformedURLException +import java.net.URL +import java.util.stream.Collectors + +import com.google.common.base.Preconditions.checkNotNull + +@ProjectScoped +class GithubApiV3PullRequestLoader + @Inject + constructor( + private val connection: GithubConnectionExt, + private val getClosableIssues: GetAllClosableByInteractor) { + + @Throws(IOException::class) + fun loadAllPullRequests(path: String): List { + return loadAll(connection, path, Array::class.java, ACCEPT_V3_JSON_HTML_MARKUP) + .map { + PullRequestEntity( + number = it.number, + closeableIssues = getClosableIssues(it.bodyHtml), + title = it.title, + state = PullRequestEntity.State.fromString(it.state), + url = URL(it.htmlUrl)) + } + } + + private fun getClosableIssues(pullRequestDescriptionText: String): List { + return getClosableIssues.run(GetAllClosableByRequest(pullRequestDescriptionText)) + } + + @Throws(IOException::class) + private fun loadAll(connection: GithubConnectionExt, + path: String, + type: Class>, + vararg headers: Header): List { + val request = GithubConnection.ArrayPagedRequest(path, type, *headers) + return request.getAll(connection.delegate()) + } + + companion object { + private val ACCEPT_V3_JSON_HTML_MARKUP = BasicHeader("Accept", "application/vnd.github.v3.html+json") + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.kt new file mode 100644 index 0000000..2445430 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/GithubRepositoryFinderImpl.kt @@ -0,0 +1,19 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services + +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.GithubRepositoryEntity +import com.duxtinto.intellij.plugin.github.codereviews.domain.repositories.RepositoriesDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.GitRepositoryExt +import org.jetbrains.plugins.github.util.GithubUrlUtil +import org.jetbrains.plugins.github.util.GithubUtil +import javax.inject.Inject + +class GithubRepositoryFinderImpl @Inject +constructor() : RepositoriesDomainContract.GithubRepositoryFinder { + + override fun find(gitRepository: GitRepositoryExt): GithubRepositoryEntity? { + val remote = GithubUtil.findGithubRemote(gitRepository.delegate()) ?: return null + val path = GithubUrlUtil.getUserAndRepositoryFromRemoteUrl(remote.getSecond()) ?: return null + + return GithubRepositoryEntity(path.repository, path.user) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivator.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivator.kt index cc9c43d..1f0ab95 100644 --- a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivator.kt +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivator.kt @@ -16,7 +16,7 @@ class IdeaTaskActivator : IssuesDomainContract.Switcher { override fun switchToIssue(issue: IssueEntity) { - val repository: GithubRepositoryEntity = rootRepoFinder.run(null) ?: return + val repository: GithubRepositoryEntity = rootRepoFinder.run(Unit) ?: return val task = taskManager .getIssues(generateQuery(repository, issue)) .find { diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.kt new file mode 100644 index 0000000..dbf787a --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ApplicationDIComponent.kt @@ -0,0 +1,14 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.integration + +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ApplicationContainer +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.DaggerApplicationContainer +import com.intellij.openapi.components.ApplicationComponent + +class ApplicationDIComponent : ApplicationComponent { + lateinit var container: ApplicationContainer + private set + + override fun initComponent() { + container = DaggerApplicationContainer.create() + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.kt new file mode 100644 index 0000000..c69cd69 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/integration/ProjectDIComponent.kt @@ -0,0 +1,23 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ide.integration + +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.ProjectContainer +import com.duxtinto.intellij.plugin.github.codereviews.di.impl.dagger.modules.ProjectModule +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.entities.ProjectExt +import com.intellij.dvcs.repo.VcsRepositoryManager +import com.intellij.dvcs.repo.VcsRepositoryMappingListener +import com.intellij.openapi.components.ProjectComponent +import com.intellij.openapi.project.Project + +class ProjectDIComponent( + private val applicationDI: ApplicationDIComponent, + private val project: Project) + : ProjectComponent { + + lateinit var container: ProjectContainer + private set + + override fun initComponent() { + container = applicationDI.container.projectContainer(ProjectModule(ProjectExt.create(project))) + project.messageBus.connect().subscribe(VcsRepositoryManager.VCS_REPOSITORY_MAPPING_UPDATED, container.repositoryListener()) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/codereviews/apiv3/CodeReviewsFetcher.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/codereviews/apiv3/CodeReviewsFetcher.kt index 1b38b6b..288b427 100644 --- a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/codereviews/apiv3/CodeReviewsFetcher.kt +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/codereviews/apiv3/CodeReviewsFetcher.kt @@ -18,13 +18,13 @@ class CodeReviewsFetcher : CodeReviewsDataContract.Fetcher { override fun fetchAllByPullRequestId(id: Long): List { - return githubRootRepoFinder.run(null)?.let { + return githubRootRepoFinder.run(Unit)?.let { loader.loadAllForPullRequest(it, id).map { transformer.toEntity(it) } } ?: listOf() } override fun fetchAllReviewComments(review: CodeReviewEntity): List { - return githubRootRepoFinder.run(null)?.let { + return githubRootRepoFinder.run(Unit)?.let { loader.loadAllReviewComments(it, review).map { commentTransformer.toEntity(it) } } ?: listOf() } diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcher.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcher.kt index 0a3eb95..3304947 100644 --- a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcher.kt +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcher.kt @@ -13,6 +13,6 @@ class ApiV3IssueFetcher private val apiV3Loader: GithubApiV3IssueLoader) : IssuesDomainContract.Fetcher { override fun fetchIssueById(id: Long): IssueEntity? { - return githubRootRepoFinder.run(null)?.let { apiV3Loader.loadIssueById(it, id) } + return githubRootRepoFinder.run(Unit)?.let { apiV3Loader.loadIssueById(it, id) } } } \ No newline at end of file diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.kt new file mode 100644 index 0000000..6420774 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/ApiV3PullRequestFetcher.kt @@ -0,0 +1,19 @@ +package com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.duxtinto.intellij.plugin.github.codereviews.ide.acl.services.GithubApiV3PullRequestLoader +import javax.inject.Inject +import java.io.IOException + +import com.google.common.base.Preconditions.checkNotNull + +class ApiV3PullRequestFetcher @Inject +constructor(private val apiLoader: GithubApiV3PullRequestLoader) : PullRequestDomainContract.Fetcher { + + @Throws(IOException::class) + override fun fetchForRepository(userName: String, repoName: String, parameters: PullRequestQueryParameters): List { + val path = "/repos/" + userName + "/" + repoName + "/pulls?" + parameters.toQueryString() + return apiLoader.loadAllPullRequests(path) + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.kt new file mode 100644 index 0000000..857cdeb --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/pullrequests/PullRequestQueryParameters.kt @@ -0,0 +1,49 @@ +package com.duxtinto.intellij.plugin.github.codereviews.net.pullrequests + +data class PullRequestQueryParameters( + val state: State = State.OPEN, + val head: String = "", + val base: String = "", + val sort: Sort = Sort.CREATED, + val direction: Direction = Direction.DESC, + val pageSize: Int = 100) { + + fun toQueryString(): String { + return "per_page=" + this.pageSize + + "&state=" + this.state + + if (!head.isEmpty()) "&head=" + this.head else "" + + if (!base.isEmpty()) "&base=" + this.base else "" + + "&sort=" + sort + + "&direction=" + direction + } + + enum class State(private val state: String) { + OPEN("open"), + CLOSED("closed"), + ALL("all"); + + override fun toString(): String { + return state + } + } + + enum class Sort(private val sort: String) { + CREATED("created"), + UPDATED("updated"), + POPULARITY("popularity"), + LONG_RUNNING("long-runing"); + + override fun toString(): String { + return sort + } + } + + enum class Direction(private val direction: String) { + ASC("asc"), + DESC("desc"); + + override fun toString(): String { + return direction + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.kt new file mode 100644 index 0000000..c01adfe --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParser.kt @@ -0,0 +1,50 @@ +package com.duxtinto.intellij.plugin.github.codereviews.services.pullrequests + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDescriptionEntity +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDomainContract +import org.jsoup.Jsoup +import org.jsoup.nodes.Element + +import javax.inject.Inject +import java.util.HashSet +import java.util.regex.Matcher +import java.util.regex.Pattern +import java.util.stream.Collectors + +class GithubDescriptionParser + @Inject + constructor() + : PullRequestDomainContract.DescriptionParser { + private val closingKeywordPattern = Pattern.compile("(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)") + private val issueNumberPattern = Pattern.compile("^#(\\d*)$", Pattern.CASE_INSENSITIVE) + + override fun parse(description: String): PullRequestDescriptionEntity { + val closableIssues = getClosingIssueLinksFrom(description) + .map { getIssueNumber(it) } + .toSet() + + return PullRequestDescriptionEntity(closableIssues) + } + + private fun getClosingIssueLinksFrom(description: String): Iterable { + return Jsoup + .parseBodyFragment(description) + .select(".issue-keyword") + .filter { isAValidClosingIssueElement(it) } + .map { it.nextElementSibling() } + } + + private fun isAValidClosingIssueElement(keyword: Element): Boolean { + return closingKeywordPattern.matcher(keyword.ownText()).find() && + keyword.nextElementSibling().`is`("a.issue-link") && + issueNumberPattern.matcher(keyword.nextElementSibling().html()).find() + } + + private fun getIssueNumber(link: Element): Long { + val matcher = issueNumberPattern.matcher(link.html()) + if (!matcher.find()) { + throw RuntimeException("Closable issues should have the format '#(\\d*)': " + link.html()) + } + return matcher.group(1).toLong() + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenter.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenter.kt index 37ad322..f601dbf 100644 --- a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenter.kt +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenter.kt @@ -32,7 +32,7 @@ class ToolWindowContentPresenter } private fun presentPullRequests() { - githubRepoFinder.run(null)?.let { + githubRepoFinder.run(Unit)?.let { pullRequestFetcher.run(it)?.let { revieweePresenter.presentPullRequests(it) } diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.kt new file mode 100644 index 0000000..2d75c58 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListModel.kt @@ -0,0 +1,13 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo +import com.intellij.util.ui.ListTableModel + +class PullRequestListModel(columns: Array>) : PullRequestList.Model { + override val tableModel: ListTableModel = ListTableModel(*columns) + + override fun setPullRequests(pullRequests: List) { + tableModel.items = pullRequests + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.kt new file mode 100644 index 0000000..1b65289 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListPresenter.kt @@ -0,0 +1,32 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist + +import com.duxtinto.intellij.plugin.github.codereviews.di.scopes.ProjectScoped +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo +import javax.inject.Inject +import javax.inject.Named + +import com.google.common.base.Preconditions.checkNotNull + +@ProjectScoped +class PullRequestListPresenter + @Inject + constructor(@Named("default") columnInfos: Array>) + : PullRequestList.Presenter { + + override val model: PullRequestList.Model = PullRequestListModel(columnInfos) + private var view: PullRequestList.View? = null + + override fun displayPullRequests(pullRequests: List) { + updateModel(pullRequests) + view?.render(model) + } + + private fun updateModel(pullRequests: List) { + model.setPullRequests(pullRequests) + } + + override fun setView(view: PullRequestList.View) { + this.view = view + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.kt new file mode 100644 index 0000000..7fa3c33 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/IssuesColumnInfo.kt @@ -0,0 +1,17 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo + +import java.util.stream.Collectors + +class IssuesColumnInfo : ColumnInfo("issues") { + + override fun valueOf(pullRequest: PullRequestEntity): String? { + return pullRequest + .closeableIssues + .joinToString(",") { + (number) -> number.toString() + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.kt new file mode 100644 index 0000000..52e1ff0 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/NumberColumnInfo.kt @@ -0,0 +1,26 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo + +import javax.swing.* +import javax.swing.table.DefaultTableCellRenderer +import javax.swing.table.TableCellRenderer +import java.awt.* + +class NumberColumnInfo : ColumnInfo("number") { + + override fun valueOf(pullRequest: PullRequestEntity): Long? { + return pullRequest.number + } + + override fun getRenderer(pullRequest: PullRequestEntity?): TableCellRenderer? { + return object : DefaultTableCellRenderer() { + override fun getTableCellRendererComponent(table: JTable?, value: Any, isSelected: Boolean, hasFocus: Boolean, row: Int, column: Int): Component { + val cellContent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column) as JLabel + cellContent.text = "" + value.toString() + "" + return cellContent + } + } + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.kt new file mode 100644 index 0000000..85ba1bf --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/StateColumnInfo.kt @@ -0,0 +1,11 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo + +class StateColumnInfo : ColumnInfo("state") { + + override fun valueOf(pullRequest: PullRequestEntity): String? { + return pullRequest.state.toString() + } +} diff --git a/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.kt b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.kt new file mode 100644 index 0000000..c298b51 --- /dev/null +++ b/src/main/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/columns/TitleColumnInfo.kt @@ -0,0 +1,11 @@ +package com.duxtinto.intellij.plugin.github.codereviews.ui.toolwindow.pullrequestlist.columns + +import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestEntity +import com.intellij.util.ui.ColumnInfo + +class TitleColumnInfo : ColumnInfo("title") { + + override fun valueOf(pullRequest: PullRequestEntity): String? { + return pullRequest.title + } +} diff --git a/src/test/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.java b/src/test/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.java deleted file mode 100644 index 36c8bde..0000000 --- a/src/test/java/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.duxtinto.intellij.plugin.github.codereviews.services.pullrequests; - -import com.duxtinto.intellij.plugin.github.codereviews.domain.pullrequests.PullRequestDescriptionEntity; -import mockit.Expectations; -import mockit.Tested; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -class GithubDescriptionParserTest { - - private static final String ISSUES_ENDPOINT = "https://github.com/duxtinto/dummy/issues"; - - @Tested - private GithubDescriptionParser sutParser; - - @Test - @DisplayName("parsing a description without any 'closing issue' keywords should return an empty map") - void parseDescriptionWithoutClosingIssueKeywords() { - // Act - final PullRequestDescriptionEntity description = sutParser.parse("This is a normal description"); - - // Assert - assertThat(description.getClosableIssues()).isEmpty(); - } - - @ParameterizedTest(name = "keyword: {0}") - @MethodSource("closingKeywordProvider") - @DisplayName("parsing a description with a 'closing issue' keyword, should return map of just one element") - void parseDescriptionThatClosesAnIssue(String keyword) { - // Arrange - String descriptionHtml = "

" + - generateClosingIssueHtml(keyword, ISSUES_ENDPOINT, 3L) + - "

"; - - // Act - final PullRequestDescriptionEntity description = sutParser.parse(descriptionHtml); - - // Assert - assertThat(description.getClosableIssues()) - .hasSize(1) - .contains(3L); - } - - @Test - @DisplayName("parsing a description should ignore any non-'closing issue' keyword") - void parseDescriptionWithNonClosingKeyword() { - // Arrange - String descriptionHtml = "

" + - generateClosingIssueHtml("destroy", ISSUES_ENDPOINT, 3L) + - "

"; - - // Act - final PullRequestDescriptionEntity description = sutParser.parse(descriptionHtml); - - // Assert - assertThat(description.getClosableIssues()).isEmpty(); - } - - @Test - @DisplayName("parsing a description should ignore any issue link which text doesn't uses the right issue number format") - void parseDescriptionContainingIssueLinkWithWrongNumberFormat() { - // Arrange - String descriptionHtml = "

" + - "closes" + - "3" + - "

"; - - // Act - final PullRequestDescriptionEntity description = sutParser.parse(descriptionHtml); - - // Assert - assertThat(description.getClosableIssues()).isEmpty(); - } - - /** - * @link https://help.github.com/articles/closing-issues-using-keywords/ - */ - private static Stream closingKeywordProvider() { - return Stream.of("close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"); - } - - @Test - @DisplayName("parsing a description with more than one 'closing issue' keyword, should find them all") - void parseDescriptionThatClosesTwoIssues() throws MalformedURLException { - // Arrange - String descriptionHtml = "

" + - generateClosingIssueHtml("closes", ISSUES_ENDPOINT, 3L) + - " , " + - generateClosingIssueHtml("fix", ISSUES_ENDPOINT, 2L) + - "

"; - - // Act - final PullRequestDescriptionEntity description = sutParser.parse(descriptionHtml); - - // Assert - assertThat(description.getClosableIssues()) - .hasSize(2) - .contains(3L, 2L); - } - - private String generateClosingIssueHtml(String keyword, String issuesEndpoint, long number) { - return "" + keyword + "" + - "#" + number + ""; - } -} diff --git a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivatorTest.kt b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivatorTest.kt index 63d1b24..0c6804c 100644 --- a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivatorTest.kt +++ b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ide/acl/services/tasks/IdeaTaskActivatorTest.kt @@ -29,7 +29,7 @@ internal class IdeaTaskActivatorTest { object : Expectations() { init { - rootRepoFinder.run(null) + rootRepoFinder.run(Unit) result = repository issueTask.number @@ -69,7 +69,7 @@ internal class IdeaTaskActivatorTest { object : Expectations() { init { - rootRepoFinder.run(null) + rootRepoFinder.run(Unit) result = null } } @@ -92,7 +92,7 @@ internal class IdeaTaskActivatorTest { object : Expectations() { init { - rootRepoFinder.run(null) + rootRepoFinder.run(Unit) result = repository taskManager.getIssues(anyString) diff --git a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcherTest.kt b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcherTest.kt index 3296aee..f292f2a 100644 --- a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcherTest.kt +++ b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/net/issues/ApiV3IssueFetcherTest.kt @@ -29,7 +29,7 @@ internal class ApiV3IssueFetcherTest { object : Expectations() { init { - rootRepositoryFinder.run(null) + rootRepositoryFinder.run(Unit) result = remoteRepository apiLoader.loadIssueById(remoteRepository, expectedIssue.number) @@ -50,7 +50,7 @@ internal class ApiV3IssueFetcherTest { // Arrange object : Expectations() { init { - rootRepositoryFinder.run(null) + rootRepositoryFinder.run(Unit) result = null } } @@ -70,7 +70,7 @@ internal class ApiV3IssueFetcherTest { object : Expectations() { init { - rootRepositoryFinder.run(null) + rootRepositoryFinder.run(Unit) result = remoteRepository apiLoader.loadIssueById(remoteRepository, 182) diff --git a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.kt b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.kt new file mode 100644 index 0000000..746fccd --- /dev/null +++ b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/services/pullrequests/GithubDescriptionParserTest.kt @@ -0,0 +1,112 @@ +package com.duxtinto.intellij.plugin.github.codereviews.services.pullrequests + +import mockit.Tested +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.MethodSource +import java.net.MalformedURLException +import java.util.stream.Stream + +internal class GithubDescriptionParserTest { + + @Tested + private lateinit var sutParser: GithubDescriptionParser + + @Test + @DisplayName("parsing a description without any 'closing issue' keywords should return an empty map") + fun parseDescriptionWithoutClosingIssueKeywords() { + // Act + val (closableIssues) = sutParser.parse("This is a normal description") + + // Assert + assertThat(closableIssues).isEmpty() + } + + @ParameterizedTest(name = "keyword: {0}") + @MethodSource("closingKeywordProvider") + @DisplayName("parsing a description with a 'closing issue' keyword, should return map of just one element") + fun parseDescriptionThatClosesAnIssue(keyword: String) { + // Arrange + val descriptionHtml = "

" + + generateClosingIssueHtml(keyword, ISSUES_ENDPOINT, 3L) + + "

" + + // Act + val (closableIssues) = sutParser.parse(descriptionHtml) + + // Assert + assertThat(closableIssues) + .hasSize(1) + .contains(3L) + } + + @Test + @DisplayName("parsing a description should ignore any non-'closing issue' keyword") + fun parseDescriptionWithNonClosingKeyword() { + // Arrange + val descriptionHtml = "

" + + generateClosingIssueHtml("destroy", ISSUES_ENDPOINT, 3L) + + "

" + + // Act + val (closableIssues) = sutParser.parse(descriptionHtml) + + // Assert + assertThat(closableIssues).isEmpty() + } + + @Test + @DisplayName("parsing a description should ignore any issue link which text doesn't uses the right issue number format") + fun parseDescriptionContainingIssueLinkWithWrongNumberFormat() { + // Arrange + val descriptionHtml = "

" + + "closes" + + "3" + + "

" + + // Act + val (closableIssues) = sutParser.parse(descriptionHtml) + + // Assert + assertThat(closableIssues).isEmpty() + } + + @Test + @DisplayName("parsing a description with more than one 'closing issue' keyword, should find them all") + @Throws(MalformedURLException::class) + fun parseDescriptionThatClosesTwoIssues() { + // Arrange + val descriptionHtml = "

" + + generateClosingIssueHtml("closes", ISSUES_ENDPOINT, 3L) + + " , " + + generateClosingIssueHtml("fix", ISSUES_ENDPOINT, 2L) + + "

" + + // Act + val (closableIssues) = sutParser.parse(descriptionHtml) + + // Assert + assertThat(closableIssues) + .hasSize(2) + .contains(3L, 2L) + } + + private fun generateClosingIssueHtml(keyword: String, issuesEndpoint: String, number: Long): String { + return "" + keyword + "" + + "#" + number + "" + } + + companion object { + private val ISSUES_ENDPOINT = "https://github.com/duxtinto/dummy/issues" + + /** + * @link https://help.github.com/articles/closing-issues-using-keywords/ + */ + @JvmStatic + private fun closingKeywordProvider(): Stream { + return Stream.of("close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved") + } + } +} diff --git a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenterTest.kt b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenterTest.kt index 2a9aad6..a1df6d7 100644 --- a/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenterTest.kt +++ b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/ToolWindowContentPresenterTest.kt @@ -64,7 +64,7 @@ internal class ToolWindowContentPresenterTest { contentFactory.createContent(reviewerView.content, "Reviewer", anyBoolean) result = reviewerContent - githubRepoFinder.run(null) + githubRepoFinder.run(Unit) result = null } } @@ -92,7 +92,7 @@ internal class ToolWindowContentPresenterTest { object : Expectations() { init { - githubRepoFinder.run(null) + githubRepoFinder.run(Unit) result = repository pullRequestFetcher.run(repository) diff --git a/src/test/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListRevieweeViewTest.kt b/src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListRevieweeViewTest.kt similarity index 100% rename from src/test/java/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListRevieweeViewTest.kt rename to src/test/kotlin/com/duxtinto/intellij/plugin/github/codereviews/ui/toolwindow/pullrequestlist/PullRequestListRevieweeViewTest.kt