From 1f352598b306c7c98d7ef644e4fe81eb6c5ac968 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 12:51:04 +0100 Subject: [PATCH 001/196] fix: auth is possibly undefined --- src/services/bitbucket/BitbucketService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 56618d0fd..a07b842aa 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -45,7 +45,7 @@ export class BitbucketService implements ICVSService { let username: string; let password: string | undefined; - if (argumentsProvider.auth?.includes(':')) { + if (argumentsProvider.auth && argumentsProvider.auth.includes(':')) { username = argumentsProvider.auth.split(':')[0]; password = argumentsProvider.auth.split(':')[1]; } else { From 572371bbe6dd7fe423388d448e9ba65b75124948 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 13:01:29 +0100 Subject: [PATCH 002/196] feat: add options for filtering in CollaborationInspector --- src/inspectors/CollaborationInspector.ts | 9 +++++---- src/inspectors/ICollaborationInspector.ts | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index d44cb7391..4f7b7cc47 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -1,7 +1,8 @@ -import { injectable, inject } from 'inversify'; +import { inject, injectable } from 'inversify'; import { ProjectIssueBrowserService as ContentRepositoryBrowserService } from '../model'; import { Types } from '../types'; -import { ICollaborationInspector } from './ICollaborationInspector'; +import { ListGetterOptions } from './common/ListGetterOptions'; +import { ICollaborationInspector, PullRequestState } from './ICollaborationInspector'; @injectable() export class CollaborationInspector implements ICollaborationInspector { @@ -11,8 +12,8 @@ export class CollaborationInspector implements ICollaborationInspector { this.service = service; } - async getPullRequests(owner: string, repo: string) { - return this.service.getPullRequests(owner, repo); + async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>) { + return this.service.getPullRequests(owner, repo, options); } async getPullRequest(owner: string, repo: string, prNumber: number) { diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 03b36e5e1..40a044231 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,8 +1,9 @@ -import { Paginated } from './common/Paginated'; import { PullCommits, PullFiles, PullRequest } from '../services/git/model'; +import { ListGetterOptions } from './common/ListGetterOptions'; +import { Paginated } from './common/Paginated'; export interface ICollaborationInspector { - getPullRequests(owner: string, repo: string): Promise>; + getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; From 7d2ecb518b9c76a03e60adfbd13774bbc1dd0c8d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 15:57:01 +0100 Subject: [PATCH 003/196] fix: use different interfaces for GitHub PR and Bitbucket PR --- src/inspectors/CollaborationInspector.ts | 10 ++++++++-- src/inspectors/ICollaborationInspector.ts | 8 +++++++- src/services/git/ICVSService.ts | 11 +++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index 4f7b7cc47..753791000 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -1,8 +1,10 @@ import { inject, injectable } from 'inversify'; import { ProjectIssueBrowserService as ContentRepositoryBrowserService } from '../model'; +import { GitHubPullRequestState } from '../services/git/IGitHubService'; import { Types } from '../types'; import { ListGetterOptions } from './common/ListGetterOptions'; -import { ICollaborationInspector, PullRequestState } from './ICollaborationInspector'; +import { ICollaborationInspector } from './ICollaborationInspector'; +import { BitbucketPullRequestState } from '../services/git/ICVSService'; @injectable() export class CollaborationInspector implements ICollaborationInspector { @@ -12,7 +14,11 @@ export class CollaborationInspector implements ICollaborationInspector { this.service = service; } - async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>) { + async getPullRequests( + owner: string, + repo: string, + options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, + ) { return this.service.getPullRequests(owner, repo, options); } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 40a044231..5e1b3ac7e 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,9 +1,15 @@ import { PullCommits, PullFiles, PullRequest } from '../services/git/model'; import { ListGetterOptions } from './common/ListGetterOptions'; import { Paginated } from './common/Paginated'; +import { GitHubPullRequestState } from '../services/git/IGitHubService'; +import { BitbucketPullRequestState } from '../services/git/ICVSService'; export interface ICollaborationInspector { - getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; + getPullRequests( + owner: string, + repo: string, + options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, + ): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index 0b427b83c..943ddb94c 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -1,13 +1,13 @@ import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; -import { PullRequest, PullRequestReview, Commit, Contributor, ContributorStats, Issue, Directory, File, Symlink, PullFiles } from './model'; import { Paginated } from '../../inspectors/common/Paginated'; import { GitHubPullRequestState } from './IGitHubService'; +import { Commit, Contributor, ContributorStats, Directory, File, Issue, PullFiles, PullRequest, PullRequestReview, Symlink } from './model'; export interface ICVSService { getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState }>, + options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, ): Promise>; getPullRequestReviews(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; @@ -19,3 +19,10 @@ export interface ICVSService { getIssue(owner: string, repo: string, issueNumber: number): Promise; getRepoContent(owner: string, repo: string, path: string): Promise; } + +export enum BitbucketPullRequestState { + open = 'OPEN', + closed = 'MERGED', + declined = 'DECLINED', + superseded = 'SUPERSEDED', +} From 98999f71d1b9e139a05ccbc5063b27f1a5f0c96d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 16:08:06 +0100 Subject: [PATCH 004/196] test: add test when the state is provided --- .../bitbucket/BitbucketService.spec.ts | 19 +++++++++++++++++++ test/helpers/bitbucketNock.ts | 11 +++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index dce94b046..7541373c4 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -7,6 +7,9 @@ import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getP import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueResponse'; import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueCommentsResponse'; +import { GitHubPullRequestState } from '../git/IGitHubService'; +import { BitbucketPullRequestState } from '../git/ICVSService'; +import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; describe('Bitbucket Service', () => { let service: BitbucketService; @@ -62,4 +65,20 @@ describe('Bitbucket Service', () => { const response = await service.getIssueComments('pypy', 'pypy', 3086); expect(response).toMatchObject(getIssueCommentsResponse); }); + + it('returns declined pull requests in own interface', async () => { + const state: ListGetterOptions<{ state?: BitbucketPullRequestState }> = { + filter: { + state: BitbucketPullRequestState.declined, + }, + }; + + nock(bitbucketNock.url) + .get('/users/pypy') + .reply(200); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state.filter!.state); + + const response = await service.getPullRequests('pypy', 'pypy', state); + expect(response).toMatchObject(getPullRequestsResponse); + }); }); diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 1724275f0..96d6834e5 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -11,10 +11,13 @@ export class BitbucketNock { this.url = 'https://api.bitbucket.org/2.0'; } - getApiResponse(resource: string, id?: number, value?: string): nock.Scope { + getApiResponse(resource: string, id?: number, value?: string, state?: string): nock.Scope { let url = `${this.url}/repositories/${this.user}/${this.repoName}/${resource}`; let response; + let params = {}; + const persist = true; + if (value !== undefined) { switch (value) { case 'comments': @@ -34,6 +37,9 @@ export class BitbucketNock { response = new PullRequest().pullRequest; } else { response = new PullRequests().pullrequests; + if (state) { + params = { state: state }; + } } break; case 'issues': @@ -50,9 +56,6 @@ export class BitbucketNock { } } - const params = {}; - const persist = true; - return BitbucketNock.get(url, params, persist).reply(200, response); } From 74fe66267ec93efab10c0f131065aae254cee83d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 16:09:07 +0100 Subject: [PATCH 005/196] fix: add BitbucketPullRequestState because of CollaborationInspector to the options --- src/services/git/GitHubService.ts | 53 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index d12d31873..a1ff0f72a 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -1,40 +1,39 @@ -import { injectable, inject } from 'inversify'; -import { - PullRequest, - Contributor, - PullRequestReview, - Commit, - ContributorStats, - Directory, - File, - Issue, - PullFiles, - PullCommits, - IssueComment, - Symlink, - RepoContentType, -} from './model'; -import { ICVSService } from './ICVSService'; -import { Paginated } from '../../inspectors/common/Paginated'; -import { +import Octokit, { IssuesListForRepoResponseItem, PullsListResponseItem, PullsListReviewsResponseItem, ReposGetContributorsStatsResponseItem, } from '@octokit/rest'; -import { isArray } from 'util'; -import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; -import Octokit from '@octokit/rest'; import { grey } from 'colors'; -import { inspect } from 'util'; import Debug from 'debug'; -import { delay } from '../../lib/delay'; -import { Types } from '../../types'; +import { inject, injectable } from 'inversify'; +import { inspect, isArray } from 'util'; +import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; +import { Paginated } from '../../inspectors/common/Paginated'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; import { ArgumentsProvider } from '../../inversify.config'; +import { delay } from '../../lib/delay'; +import { ErrorFactory } from '../../lib/errors'; import { ICache } from '../../scanner/cache/ICache'; import { InMemoryCache } from '../../scanner/cache/InMemoryCache'; +import { Types } from '../../types'; +import { ICVSService, BitbucketPullRequestState } from './ICVSService'; +import { + Commit, + Contributor, + ContributorStats, + Directory, + File, + Issue, + IssueComment, + PullCommits, + PullFiles, + PullRequest, + PullRequestReview, + RepoContentType, + Symlink, +} from './model'; import { GitHubPullRequestState } from './IGitHubService'; -import { ErrorFactory } from '../../lib/errors'; const debug = Debug('cli:services:git:github-service'); @injectable() @@ -71,7 +70,7 @@ export class GitHubService implements ICVSService { async getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState }>, + options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { From 90b995b15b90509ab64de7d200d57970ec2dd170 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 19 Nov 2019 16:09:36 +0100 Subject: [PATCH 006/196] fix: add filtering to the getPullRequests() --- src/services/bitbucket/BitbucketService.ts | 77 +++++++++++++--------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index a07b842aa..25cbe20ae 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -25,7 +25,9 @@ import { Directory, File, } from '../git/model'; -import { ICVSService } from '../git/ICVSService'; +import { ICVSService, BitbucketPullRequestState } from '../git/ICVSService'; +import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() @@ -73,46 +75,59 @@ export class BitbucketService implements ICVSService { return this.unwrap(this.client.repositories.get(params)); } - async getPullRequests(owner: string, repo: string): Promise> { + async getPullRequests( + owner: string, + repo: string, + options?: ListGetterOptions<{ state?: BitbucketPullRequestState }>, + ): Promise> { const params: Bitbucket.Params.PullrequestsList = { repo_slug: repo, username: owner, }; + let state; + if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { + state = options.filter.state; + Object.assign(params, { state: state }); + } + const response = >>await this.client.pullrequests.list(params); const url = 'www.bitbucket.org'; - const values = response.data.values.map(async (val) => ({ - user: { - id: val.author.uuid, - login: val.author.nickname, - url: val.author.links.html.href, - }, - url: val.links.html.href, - body: val.description, - createdAt: val.created_on, - updatedAt: val.updated_on, - //TODO - closedAt: null, - //TODO - mergedAt: null, - state: val.state, - id: val.id, - base: { - repo: { - url: val.destination.repository.links.html.href, - name: val.destination.repository.name, - id: val.destination.repository.uuid, - owner: { - login: val.destination.repository.full_name.split('/').shift(), - id: (await this.client.users.get({ username: `${val.destination.repository.full_name.split('/').shift()}` })).data.uuid - ? (await this.client.users.get({ username: `${val.destination.repository.full_name.split('/').shift()}` })).data.uuid - : 'undefined', - url: url.concat(`/${val.destination.repository.full_name.split('/').shift()}`), + const values = response.data.values.map(async (val) => { + const ownerId = ( + (await this.client.users.get({ username: `${val.destination.repository.full_name.split('/').shift()}` })).data.uuid + ); + return { + user: { + id: val.author.uuid, + login: val.author.nickname, + url: val.author.links.html.href, + }, + url: val.links.html.href, + body: val.description, + createdAt: val.created_on, + updatedAt: val.updated_on, + //TODO + closedAt: null, + //TODO + mergedAt: null, + state: val.state, + id: val.id, + base: { + repo: { + url: val.destination.repository.links.html.href, + name: val.destination.repository.name, + id: val.destination.repository.uuid, + owner: { + login: val.destination.repository.full_name.split('/').shift(), + id: ownerId ? ownerId : 'undefined', + url: url.concat(`/${val.destination.repository.full_name.split('/').shift()}`), + }, }, }, - }, - })); + }; + }); const pagination = this.getPagination(response.data); From d461ad774a1565d3e77d4bc80bc55482d24d338b Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:23:43 +0100 Subject: [PATCH 007/196] fix: return CollaborationInspector and IssueTrackingInspector (not undefined), --- .../projectComponent/projectComponentContextBinding.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contexts/projectComponent/projectComponentContextBinding.ts b/src/contexts/projectComponent/projectComponentContextBinding.ts index a8d83c3f2..55e171378 100644 --- a/src/contexts/projectComponent/projectComponentContextBinding.ts +++ b/src/contexts/projectComponent/projectComponentContextBinding.ts @@ -34,8 +34,8 @@ const createProjectComponentContainer = (projectComponent: ProjectComponent, roo projectComponent: projectComponent, packageInspector: ctx.container.get(Types.IPackageInspector), gitInspector, - issueTrackingInspector: undefined, - collaborationInspector: undefined, + issueTrackingInspector: ctx.container.get(Types.IIssueTrackingInspector),, + collaborationInspector: ctx.container.get(Types.ICollaborationInspector), fileInspector: ctx.container.get(Types.IFileInspector), }; }; From b23c98362c8b7583f283a328061c149ef570f3da Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:24:45 +0100 Subject: [PATCH 008/196] fix: bind CollaborationInspector and IssueTrackingInspector, fix: interface of TestPracticeContext --- src/inversify.config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 946743d09..a5341292c 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -29,6 +29,7 @@ import { FileSystemService } from './services/FileSystemService'; import { GitHubService } from './services/git/GitHubService'; import { Types } from './types'; import { BitbucketService } from './services/bitbucket/BitbucketService'; +import { ICollaborationInspector } from './inspectors/ICollaborationInspector'; export const createRootContainer = (args: ArgumentsProvider): Container => { const container = new Container(); @@ -41,6 +42,8 @@ export const createRootContainer = (args: ArgumentsProvider): Container => { container.bind(FileSystemService).toSelf(); container.bind(GitHubService).toSelf(); container.bind(BitbucketService).toSelf(); + container.bind(Types.ICollaborationInspector).to(CollaborationInspector); + container.bind(Types.IIssueTrackingInspector).to(IssueTrackingInspector); // register practices practices.forEach((practice) => { container.bind(Types.Practice).toConstantValue(ScannerUtils.initPracticeWithMetadata(practice)); @@ -127,7 +130,7 @@ export interface TestPracticeContext extends PracticeContext { packageInspector: IPackageInspector; fileInspector: IFileInspector; issueTrackingInspector: IssueTrackingInspector; - collaborationInspector: CollaborationInspector; + collaborationInspector: ICollaborationInspector; } export interface ArgumentsProvider { From 7a712263772b6e1e365a69b3d0a5454f2ac7d3bd Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:25:27 +0100 Subject: [PATCH 009/196] fix: add BitbucketService to the type --- src/model.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/model.ts b/src/model.ts index b64713c6e..7b750cae9 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1,4 +1,5 @@ import { GitHubService } from './services/git/GitHubService'; +import { BitbucketService } from './services/bitbucket/BitbucketService'; // New model starts here @@ -203,4 +204,4 @@ export enum GitFLow { Git = 'Git', } -export type ProjectIssueBrowserService = GitHubService; +export type ProjectIssueBrowserService = GitHubService | BitbucketService; From cf555bfa6effb38c9e0c2a77bc8fa628e4226f5b Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:27:44 +0100 Subject: [PATCH 010/196] fix: remove comma --- src/contexts/projectComponent/projectComponentContextBinding.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contexts/projectComponent/projectComponentContextBinding.ts b/src/contexts/projectComponent/projectComponentContextBinding.ts index 55e171378..2ee8cfa4c 100644 --- a/src/contexts/projectComponent/projectComponentContextBinding.ts +++ b/src/contexts/projectComponent/projectComponentContextBinding.ts @@ -34,7 +34,7 @@ const createProjectComponentContainer = (projectComponent: ProjectComponent, roo projectComponent: projectComponent, packageInspector: ctx.container.get(Types.IPackageInspector), gitInspector, - issueTrackingInspector: ctx.container.get(Types.IIssueTrackingInspector),, + issueTrackingInspector: ctx.container.get(Types.IIssueTrackingInspector), collaborationInspector: ctx.container.get(Types.ICollaborationInspector), fileInspector: ctx.container.get(Types.IFileInspector), }; From 70e796a10d8ecd2d123e9a504f1c640a2de47cb7 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:28:15 +0100 Subject: [PATCH 011/196] feat: add new practice --- src/practices/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/practices/index.ts b/src/practices/index.ts index 915b6ca84..4a6401aa5 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -20,6 +20,7 @@ import { JavaGitignoreCorrectlySetPractice } from './Java/JavaGitignoreCorrectly import { DependenciesVersionPractice } from './JavaScript/DependenciesVersionPractice'; import { ESLintWithoutErrorsPractice } from './JavaScript/ESLintWithoutErrorsPractice'; import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrectlySetPractice'; +import { DoesPullRequests } from './LanguageIndependent/DoesPullRequests'; // register practices here export const practices = [ @@ -45,4 +46,5 @@ export const practices = [ JsGitignoreCorrectlySetPractice, JavaGitignoreCorrectlySetPractice, TsGitignoreCorrectlySetPractice, + DoesPullRequests, ]; From f6bc1c2d03beb805f90c41c5066b735a77f1fb76 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 11:46:26 +0100 Subject: [PATCH 012/196] WIP: implement Does PullRequest practice --- .../LanguageIndependent/DoesPullRequests.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/practices/LanguageIndependent/DoesPullRequests.ts diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts new file mode 100644 index 000000000..35af6acc3 --- /dev/null +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -0,0 +1,49 @@ +import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { sharedSubpath } from '../../detectors/utils'; +import { PracticeEvaluationResult, PracticeImpact } from '../../model'; +import { ReporterUtils } from '../../reporters/ReporterUtils'; +import { GitServiceUtils } from '../../services/git/GitServiceUtils'; +import { DxPractice } from '../DxPracticeDecorator'; +import { IPractice } from '../IPractice'; + +@DxPractice({ + id: 'LanguageIndependent.DoesPullRequests', + name: 'Do PullRequests', + impact: PracticeImpact.medium, + suggestion: 'Do pull requests. It helps you catch the bad code before it is merged into the main codebase.', + reportOnlyOnce: true, + url: 'https://developerexperience.io/practices/pull-requests', +}) +export class DoesPullRequests implements IPractice { + async isApplicable(): Promise { + return true; + } + + async evaluate(ctx: PracticeContext): Promise { + if (ctx.fileInspector === undefined || ctx.collaborationInspector === undefined) { + return PracticeEvaluationResult.unknown; + } + const paths = []; + let repoName; + paths.push(ctx.projectComponent.path); + + //reused code from CLIReporter -> refactor it + const componentsSharedSubpath = sharedSubpath(paths); + if (ctx.projectComponent.repositoryPath) { + repoName = ReporterUtils.getPathOrRepoUrl( + ctx.projectComponent.repositoryPath, + ctx.projectComponent.path.replace(componentsSharedSubpath, ''), + ); + } else { + repoName = ctx.projectComponent.path; + } + const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); + + const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); + if (pullRequests.items.length > 0) { + return PracticeEvaluationResult.practicing; + } + + return PracticeEvaluationResult.notPracticing; + } +} From 63fe746956d7e5424f5598ac4fcfad738c4b0fc6 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 12:57:13 +0100 Subject: [PATCH 013/196] fix: return repoCommits in own interface --- src/services/git/GitHubService.ts | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index d12d31873..56914e0fe 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -174,9 +174,35 @@ export class GitHubService implements ICVSService { * * The response will include a verification object that describes the result of verifying the commit's signature. * To see the included fields in the verification object see https://octokit.github.io/rest.js/#pagination. + * + * Sha can be SHA or branch name. */ - async getRepoCommits(owner: string, repo: string) { - return this.unwrap(this.client.repos.listCommits({ owner, repo })); + async getRepoCommits(owner: string, repo: string, sha?: string) { + let url = 'GET /repos/:owner/:repo/commits'; + if (sha !== undefined) { + url = `${url}?state=${sha}`; + } + + const response = await this.paginate(url, owner, repo); + + const items = response.map((val) => ({ + sha: val.sha, + url: val.url, + message: val.commit.message, + author: { + name: val.commit.author.name, + email: val.commit.author.email, + date: val.commit.author.date, + }, + tree: { + sha: val.commit.tree.sha, + url: val.commit.tree.url, + }, + verified: val.commit.verification.verified, + })); + const pagination = this.getPagination(response.length); + + return { items, ...pagination }; } /** From dccf3ebe6efb21816503ddebb51ebf8dca6ac850 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 13:05:37 +0100 Subject: [PATCH 014/196] feat: add getRepoCommits into CollaborationInspector --- src/inspectors/CollaborationInspector.ts | 4 ++++ src/inspectors/ICollaborationInspector.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index d44cb7391..02d520aa9 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -26,4 +26,8 @@ export class CollaborationInspector implements ICollaborationInspector { async getPullCommits(owner: string, repo: string, prNumber: number) { return this.service.getPullCommits(owner, repo, prNumber); } + + async getRepoCommits(owner: string, repo: string, sha?: string) { + return this.service.getRepoCommits(owner, repo, sha); + } } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 03b36e5e1..cb326b57c 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,11 +1,12 @@ import { Paginated } from './common/Paginated'; -import { PullCommits, PullFiles, PullRequest } from '../services/git/model'; +import { PullCommits, PullFiles, PullRequest, Commit } from '../services/git/model'; export interface ICollaborationInspector { getPullRequests(owner: string, repo: string): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; + getRepoCommits(owner: string, repo: string, sha?: string): Promise>; } export enum PullRequestState { From 648f0663b664eef2a15efcd6a25d267bd4e99bee Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 13:36:02 +0100 Subject: [PATCH 015/196] fix: add getRepoCommits() into interface, fix: add return type --- src/services/bitbucket/BitbucketService.ts | 2 +- src/services/git/GitHubService.ts | 2 +- src/services/git/ICVSService.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 56618d0fd..a432d0e00 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -282,7 +282,7 @@ export class BitbucketService implements ICVSService { throw new Error('Method not implemented yet.'); } - async getRepoCommits(owner: string, repo: string) { + async getRepoCommits(owner: string, repo: string): Promise> { throw new Error('Method not implemented yet.'); } diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 56914e0fe..cb0981d32 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -177,7 +177,7 @@ export class GitHubService implements ICVSService { * * Sha can be SHA or branch name. */ - async getRepoCommits(owner: string, repo: string, sha?: string) { + async getRepoCommits(owner: string, repo: string, sha?: string): Promise> { let url = 'GET /repos/:owner/:repo/commits'; if (sha !== undefined) { url = `${url}?state=${sha}`; diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index 0b427b83c..0dd754814 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -12,6 +12,7 @@ export interface ICVSService { getPullRequestReviews(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; + getRepoCommits(owner: string, repo: string, sha?: string): Promise>; getCommit(owner: string, repo: string, commitSha: string): Promise; getContributors(owner: string, repo: string): Promise>; getContributorsStats(owner: string, repo: string): Promise>; From 1948193d0871c6f42a9d9f4013bff909e3ce4f7c Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 14:03:40 +0100 Subject: [PATCH 016/196] feat: Detect parcticing/notPracticing based on date of commit and date of PR minus 30 days --- src/practices/LanguageIndependent/DoesPullRequests.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 35af6acc3..f7d4e96c4 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -40,7 +40,12 @@ export class DoesPullRequests implements IPractice { const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); - if (pullRequests.items.length > 0) { + const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); + + const prDate = new Date(repoCommits.items[0].author.date).getTime(); + const commitDate = new Date(pullRequests.items[0].createdAt).getTime(); + + if (prDate - 1000 * 60 * 60 * 24 * 30 < commitDate) { return PracticeEvaluationResult.practicing; } From 4213929d60000a267b6040b8d25c04fcf6ef0d01 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 14:51:04 +0100 Subject: [PATCH 017/196] fix: condition, fix: define branch - master --- src/practices/LanguageIndependent/DoesPullRequests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index f7d4e96c4..610c92ce9 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -40,12 +40,12 @@ export class DoesPullRequests implements IPractice { const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); - const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); + const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName, 'master'); const prDate = new Date(repoCommits.items[0].author.date).getTime(); const commitDate = new Date(pullRequests.items[0].createdAt).getTime(); - if (prDate - 1000 * 60 * 60 * 24 * 30 < commitDate) { + if (prDate > commitDate - 1000 * 60 * 60 * 24 * 30) { return PracticeEvaluationResult.practicing; } From 005b88bbe4fc89990eed40981e3166b61e8ce32a Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 16:13:16 +0100 Subject: [PATCH 018/196] fix: remove ambiguous binding --- src/inversify.config.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/inversify.config.ts b/src/inversify.config.ts index a5341292c..eb6d877e6 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -75,8 +75,6 @@ export const createTestContainer = ( container.bind(Types.IProjectFilesBrowser).toConstantValue(vfss); container.bind(Types.IContentRepositoryBrowser).to(GitHubService); container.bind(Types.IFileInspector).to(FileInspector); - container.bind(Types.IIssueTrackingInspector).to(IssueTrackingInspector); - container.bind(Types.ICollaborationInspector).to(CollaborationInspector); container.bind(Types.IPackageInspector).to(JavaScriptPackageInspector); const scanningStrategyDetector = container.get(ScanningStrategyDetector); From ccb1d701486b68ded06449776c69b863c0073f1b Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 16:14:02 +0100 Subject: [PATCH 019/196] WIP: testing --- src/services/git/GitHubService.spec.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index d3bbf80c1..780ef633c 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -105,11 +105,12 @@ describe('GitHub Service', () => { expect(response).toMatchObject(getPullsReviewsServiceResponse); }); - it('returns commits in own interface', async () => { - new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + it.only('returns commits in own interface', async () => { + //new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const response = await service.getRepoCommits('octocat', 'Hello-World'); + console.log(response); - expect(response.data).toMatchObject(getRepoCommitsResponse); + expect(response).toMatchObject(getRepoCommitsResponse); }); it('returns commits in own interface', async () => { From 7ff57d6b0f8e576969f20ca758391c62e3676481 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 17:08:01 +0100 Subject: [PATCH 020/196] fix: getRepoCommits() test --- src/services/git/GitHubService.spec.ts | 9 +-- .../getRepoCommitsServiceResponse.mock.ts | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index 780ef633c..88f3dd500 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -25,6 +25,8 @@ import { GitHubNock } from '../../../test/helpers/gitHubNock'; import { getRepoCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; import { File } from './model'; import { GitHubPullRequestState } from './IGitHubService'; +import util from 'util'; +import { getRepoCommitsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; describe('GitHub Service', () => { let service: GitHubService; @@ -105,12 +107,11 @@ describe('GitHub Service', () => { expect(response).toMatchObject(getPullsReviewsServiceResponse); }); - it.only('returns commits in own interface', async () => { - //new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + it('returns commits in own interface', async () => { + new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const response = await service.getRepoCommits('octocat', 'Hello-World'); - console.log(response); - expect(response).toMatchObject(getRepoCommitsResponse); + expect(response).toMatchObject(getRepoCommitsServiceResponse); }); it('returns commits in own interface', async () => { diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts new file mode 100644 index 000000000..d517032e8 --- /dev/null +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts @@ -0,0 +1,57 @@ +import { Paginated } from '../../../../inspectors/common/Paginated'; +import { Commit } from '../../model'; + +export const getRepoCommitsServiceResponse: Paginated = { + items: [ + { + sha: '7fd1a60b01f91b314f59955a4e4d4e80d8edf11d', + url: 'https://api.github.com/repos/octocat/Hello-World/commits/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d', + message: 'Merge pull request #6 from Spaceghost/patch-1\n' + '\n' + 'New line at end of file.', + author: { + name: 'The Octocat', + email: 'octocat@nowhere.com', + date: '2012-03-06T23:06:50Z', + }, + tree: { + sha: 'b4eecafa9be2f2006ce1b709d6857b07069b4608', + url: 'https://api.github.com/repos/octocat/Hello-World/git/trees/b4eecafa9be2f2006ce1b709d6857b07069b4608', + }, + verified: false, + }, + { + sha: '762941318ee16e59dabbacb1b4049eec22f0d303', + url: 'https://api.github.com/repos/octocat/Hello-World/commits/762941318ee16e59dabbacb1b4049eec22f0d303', + message: 'New line at end of file. --Signed off by Spaceghost', + author: { + name: 'Johnneylee Jack Rollins', + email: 'johnneylee.rollins@gmail.com', + date: '2011-09-14T04:42:41Z', + }, + tree: { + sha: 'b4eecafa9be2f2006ce1b709d6857b07069b4608', + url: 'https://api.github.com/repos/octocat/Hello-World/git/trees/b4eecafa9be2f2006ce1b709d6857b07069b4608', + }, + verified: false, + }, + { + sha: '553c2077f0edc3d5dc5d17262f6aa498e69d6f8e', + url: 'https://api.github.com/repos/octocat/Hello-World/commits/553c2077f0edc3d5dc5d17262f6aa498e69d6f8e', + message: 'first commit', + author: { + name: 'cameronmcefee', + email: 'cameron@github.com', + date: '2011-01-26T19:06:08Z', + }, + tree: { + sha: 'fcf4a9bba6857422971d67147517eb5edfdbf48d', + url: 'https://api.github.com/repos/octocat/Hello-World/git/trees/fcf4a9bba6857422971d67147517eb5edfdbf48d', + }, + verified: false, + }, + ], + totalCount: 3, + hasNextPage: false, + hasPreviousPage: false, + page: 1, + perPage: 3, +}; From 94733533d2cba5c7d5f463e106c355a786233bd4 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 17:11:30 +0100 Subject: [PATCH 021/196] fix: remove unnecessary name of branch --- src/practices/LanguageIndependent/DoesPullRequests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 610c92ce9..232a4a480 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -40,7 +40,7 @@ export class DoesPullRequests implements IPractice { const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); - const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName, 'master'); + const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); const prDate = new Date(repoCommits.items[0].author.date).getTime(); const commitDate = new Date(pullRequests.items[0].createdAt).getTime(); From fb2e3237f9678d6566a83f5613803713d2f8b830 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 17:11:52 +0100 Subject: [PATCH 022/196] test: add test for DoesPR practice --- .../DoesPullRequests.spec.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/practices/LanguageIndependent/DoesPullRequests.spec.ts diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts new file mode 100644 index 000000000..748f999c1 --- /dev/null +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -0,0 +1,37 @@ +import { createTestContainer, TestContainerContext } from '../../inversify.config'; +import { PracticeEvaluationResult } from '../../model'; +import { DoesPullRequests } from './DoesPullRequests'; +import nock from 'nock'; +import { GitHubNock } from '../../../test/helpers/gitHubNock'; +import { getRepoCommitsResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; + +describe('DoesPullRequests', () => { + let practice: DoesPullRequests; + let containerCtx: TestContainerContext; + + beforeEach(async () => { + nock.cleanAll(); + }); + + beforeAll(() => { + containerCtx = createTestContainer(); + containerCtx.container.bind('DoesPullRequests').to(DoesPullRequests); + practice = containerCtx.container.get('DoesPullRequests'); + }); + + afterEach(async () => { + containerCtx.virtualFileSystemService.clearFileSystem(); + containerCtx.practiceContext.fileInspector!.purgeCache(); + }); + + it('return practicing if there is at least one PR which is newer than last commit in master minus 30 days', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ + { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, + ]); + new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + }); +}); From 99585fe2ba96471d1885b6a32bdf21518983c5f2 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 10:29:27 +0100 Subject: [PATCH 023/196] fix: use moment.js to convert days to milliseconds --- package.json | 1 + src/practices/LanguageIndependent/DoesPullRequests.ts | 5 ++++- yarn.lock | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 228fd0e00..2f059a96f 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "js-yaml": "3.13.1", "lodash": "4.17.15", "memfs": "2.16.1", + "moment": "^2.24.0", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 232a4a480..f13c4dd36 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -5,6 +5,7 @@ import { ReporterUtils } from '../../reporters/ReporterUtils'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; +import moment from 'moment'; @DxPractice({ id: 'LanguageIndependent.DoesPullRequests', @@ -45,7 +46,9 @@ export class DoesPullRequests implements IPractice { const prDate = new Date(repoCommits.items[0].author.date).getTime(); const commitDate = new Date(pullRequests.items[0].createdAt).getTime(); - if (prDate > commitDate - 1000 * 60 * 60 * 24 * 30) { + const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); + + if (prDate > commitDate - daysInMilliseconds) { return PracticeEvaluationResult.practicing; } diff --git a/yarn.lock b/yarn.lock index f0ca0b7c6..49f27ed95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5914,6 +5914,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" From 69932c3255e733a59030e874cff553f85b8bdbe2 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 11:18:13 +0100 Subject: [PATCH 024/196] fix: change date of PR so it can for testing practicing Does PR practice --- .../getPullsServiceResponse.mock.ts | 8 ++++---- test/helpers/gitHubNock.ts | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts index 2a97899fd..0f5c257f1 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts @@ -19,12 +19,12 @@ export const getPullsServiceResponse: Paginated = { }, }, body: 'Please pull these awesome changes', - closedAt: '2011-01-26T19:01:12Z', - createdAt: '2011-01-26T19:01:12Z', + closedAt: '2012-03-06T23:06:50Z', + createdAt: '2012-03-06T23:06:50Z', id: 1, - mergedAt: '2011-01-26T19:01:12Z', + mergedAt: '2012-03-06T23:06:50Z', state: 'open', - updatedAt: '2011-01-26T19:01:12Z', + updatedAt: '2012-03-06T23:06:50Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1347', user: { id: '1', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }, diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 8f8e86aa1..51f8aee98 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -190,9 +190,9 @@ export class Repository { has_downloads = true; archived = false; disabled = false; - pushed_at = '2011-01-26T19:06:43Z'; - created_at = '2011-01-26T19:01:12Z'; - updated_at = '2011-01-26T19:14:43Z'; + pushed_at = '2012-03-06T23:06:50Z'; + created_at = '2012-03-06T23:06:50Z'; + updated_at = '2012-03-06T23:06:50Z'; permissions = { admin: true, push: true, @@ -468,10 +468,10 @@ export class PullRequestItem { body: string; labels = []; milestone = null; - created_at = '2011-01-26T19:01:12Z'; - updated_at = '2011-01-26T19:01:12Z'; - closed_at = '2011-01-26T19:01:12Z'; - merged_at = '2011-01-26T19:01:12Z'; + created_at = '2012-03-06T23:06:50Z'; + updated_at = '2012-03-06T23:06:50Z'; + closed_at = '2012-03-06T23:06:50Z'; + merged_at = '2012-03-06T23:06:50Z'; merge_commit_sha = 'e5bd3914e2e596debea16f433f57875b5b90bcd6'; assignee = null; assignees = []; From 05c21072150eff75b8a544e923b9c9d40d2167fb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 11:18:43 +0100 Subject: [PATCH 025/196] test: add test for notPracticing practice --- .../LanguageIndependent/DoesPullRequests.spec.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index 748f999c1..f510df1d5 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -34,4 +34,13 @@ describe('DoesPullRequests', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.practicing); }); + + it('return notPracticing if there is no PR which is newer than last commit in master minus 30 days', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([]); + new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + }); }); From 483936740d8c8c3f9d144104f16019ecd7057990 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 11:19:14 +0100 Subject: [PATCH 026/196] fix: add condition so it doesn't fail if there are no PRs --- .../LanguageIndependent/DoesPullRequests.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index f13c4dd36..92364f4a9 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -43,12 +43,21 @@ export class DoesPullRequests implements IPractice { const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); - const prDate = new Date(repoCommits.items[0].author.date).getTime(); - const commitDate = new Date(pullRequests.items[0].createdAt).getTime(); + let prDate, commitDate; + + if (pullRequests.items.length > 0) { + prDate = new Date(pullRequests.items[0].createdAt).getTime(); + } else { + return PracticeEvaluationResult.notPracticing; + } + + if (repoCommits.items.length > 0) { + commitDate = new Date(repoCommits.items[0].author.date).getTime(); + } const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); - if (prDate > commitDate - daysInMilliseconds) { + if (prDate > commitDate - daysInMilliseconds) { return PracticeEvaluationResult.practicing; } From 219838495437cbc4eadb6c01f704940c5ae8e55f Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 14:05:13 +0100 Subject: [PATCH 027/196] fix: move getPathOrRepoUrl from ReporterUtils to GitServiceUtils --- src/reporters/ReporterUtils.ts | 18 +++--------------- src/services/git/GitServiceUtils.ts | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/reporters/ReporterUtils.ts b/src/reporters/ReporterUtils.ts index 760bb1ac7..22aeaba94 100644 --- a/src/reporters/ReporterUtils.ts +++ b/src/reporters/ReporterUtils.ts @@ -1,22 +1,10 @@ -import { PracticeWithContextForReporter } from './IReporter'; import _ from 'lodash'; -import { ProjectComponent, PracticeEvaluationResult, PracticeImpact, PracticeMetadata } from '../model'; -import { DXScoreResult, DXScoreOverallResult } from './model'; import { assertNever } from '../lib/assertNever'; -import { GitServiceUtils } from '../services/git/GitServiceUtils'; -import gitUrlParse from 'git-url-parse'; +import { PracticeEvaluationResult, PracticeImpact, PracticeMetadata, ProjectComponent } from '../model'; +import { PracticeWithContextForReporter } from './IReporter'; +import { DXScoreOverallResult, DXScoreResult } from './model'; export class ReporterUtils { - static getPathOrRepoUrl = (url: string, path?: string | undefined, branch = 'master') => { - const parsedUrl = gitUrlParse(url); - - if (parsedUrl.protocol === 'file') { - return url; - } - - return GitServiceUtils.getUrlToRepo(url, path, branch); - }; - static getComponentsWithPractices(practicesAndComponents: PracticeWithContextForReporter[]) { const result: { component: ProjectComponent; diff --git a/src/services/git/GitServiceUtils.ts b/src/services/git/GitServiceUtils.ts index fdc3f7138..2b94bf5c3 100644 --- a/src/services/git/GitServiceUtils.ts +++ b/src/services/git/GitServiceUtils.ts @@ -1,6 +1,8 @@ import gitUrlParse from 'git-url-parse'; import { GitService } from './model'; import { assertNever } from '../../lib/assertNever'; +import { ReporterUtils } from '../../reporters/ReporterUtils'; +import { sharedSubpath } from '../../detectors/utils'; export class GitServiceUtils { static getUrlToRepo = (url: string, path?: string | undefined, branch = 'master') => { @@ -36,4 +38,22 @@ export class GitServiceUtils { return assertNever(service); } }; + + static getRepoName = (repositoryPath: string | undefined, path: string): string => { + if (repositoryPath) { + return GitServiceUtils.getPathOrRepoUrl(repositoryPath); + } else { + return path; + } + }; + + static getPathOrRepoUrl = (url: string, path?: string | undefined, branch = 'master') => { + const parsedUrl = gitUrlParse(url); + + if (parsedUrl.protocol === 'file') { + return url; + } + + return GitServiceUtils.getUrlToRepo(url, path, branch); + }; } From 8f9d5c1eca42bf16eef594e3740ff31e382f2010 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 14:06:51 +0100 Subject: [PATCH 028/196] fix: change dates --- .../getPullServiceResponse.mock.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index 6efc602c1..0a9b278c5 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -14,12 +14,12 @@ export const getPullServiceResponse: PullRequest = { }, }, body: '', - closedAt: '2011-01-26T19:01:12Z', - createdAt: '2011-01-26T19:01:12Z', + closedAt: '2012-03-06T23:06:50Z', + createdAt: '2012-03-06T23:06:50Z', id: 1, - mergedAt: '2011-01-26T19:01:12Z', + mergedAt: '2012-03-06T23:06:50Z', state: 'closed', - updatedAt: '2011-01-26T19:01:12Z', + updatedAt: '2012-03-06T23:06:50Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; From d22e8e5677c8f3c25545f16c928574a2fbb0b1dd Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 14:07:23 +0100 Subject: [PATCH 029/196] refactor: use method instead of duplicating code --- .../LanguageIndependent/DoesPullRequests.ts | 14 +------------- src/reporters/CLIReporter.ts | 8 ++------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 92364f4a9..cff1e9910 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -24,20 +24,8 @@ export class DoesPullRequests implements IPractice { if (ctx.fileInspector === undefined || ctx.collaborationInspector === undefined) { return PracticeEvaluationResult.unknown; } - const paths = []; - let repoName; - paths.push(ctx.projectComponent.path); - //reused code from CLIReporter -> refactor it - const componentsSharedSubpath = sharedSubpath(paths); - if (ctx.projectComponent.repositoryPath) { - repoName = ReporterUtils.getPathOrRepoUrl( - ctx.projectComponent.repositoryPath, - ctx.projectComponent.path.replace(componentsSharedSubpath, ''), - ); - } else { - repoName = ctx.projectComponent.path; - } + const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); diff --git a/src/reporters/CLIReporter.ts b/src/reporters/CLIReporter.ts index 6cec9c778..adaa26b1a 100644 --- a/src/reporters/CLIReporter.ts +++ b/src/reporters/CLIReporter.ts @@ -4,6 +4,7 @@ import { PracticeImpact, PracticeMetadata, PracticeEvaluationResult } from '../m import { IReporter, PracticeWithContextForReporter } from './IReporter'; import { sharedSubpath } from '../detectors/utils'; import { ReporterUtils } from './ReporterUtils'; +import { GitServiceUtils } from '../services/git/GitServiceUtils'; @injectable() export class CLIReporter implements IReporter { @@ -19,14 +20,9 @@ export class CLIReporter implements IReporter { lines.push(bold(blue('| |'))); let repoName; - const componentsSharedSubpath = sharedSubpath(componentsWithPractices.map((c) => c.component.path)); for (const cwp of componentsWithPractices) { - if (cwp.component.repositoryPath) { - repoName = ReporterUtils.getPathOrRepoUrl(cwp.component.repositoryPath, cwp.component.path.replace(componentsSharedSubpath, '')); - } else { - repoName = cwp.component.path; - } + repoName = GitServiceUtils.getRepoName(cwp.component.repositoryPath, cwp.component.path); lines.push(bold(blue('----------------------------'))); lines.push(''); From e0a43f5afcbd46cb1a1c6342e6ac09f04519685d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 14:09:45 +0100 Subject: [PATCH 030/196] fix: remove unnecessary condition --- src/practices/LanguageIndependent/DoesPullRequests.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index cff1e9910..4de02dbf8 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -31,7 +31,7 @@ export class DoesPullRequests implements IPractice { const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); - let prDate, commitDate; + let prDate; if (pullRequests.items.length > 0) { prDate = new Date(pullRequests.items[0].createdAt).getTime(); @@ -39,13 +39,11 @@ export class DoesPullRequests implements IPractice { return PracticeEvaluationResult.notPracticing; } - if (repoCommits.items.length > 0) { - commitDate = new Date(repoCommits.items[0].author.date).getTime(); - } + const commitDate = new Date(repoCommits.items[0].author.date).getTime(); const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); - if (prDate > commitDate - daysInMilliseconds) { + if (prDate > commitDate - daysInMilliseconds) { return PracticeEvaluationResult.practicing; } From b6abf172f9d39e7a7732b12d8684ecd7113c91c6 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Thu, 21 Nov 2019 14:56:20 +0100 Subject: [PATCH 031/196] Update src/practices/LanguageIndependent/DoesPullRequests.ts Co-Authored-By: Prokop Simek --- src/practices/LanguageIndependent/DoesPullRequests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 4de02dbf8..e393cf60a 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -13,7 +13,7 @@ import moment from 'moment'; impact: PracticeImpact.medium, suggestion: 'Do pull requests. It helps you catch the bad code before it is merged into the main codebase.', reportOnlyOnce: true, - url: 'https://developerexperience.io/practices/pull-requests', + url: 'https://dxkb.io/p/pull-requests', }) export class DoesPullRequests implements IPractice { async isApplicable(): Promise { From b7cb704fa538589e8e4ad7fc40e8a55bab2c93d1 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Thu, 21 Nov 2019 14:57:06 +0100 Subject: [PATCH 032/196] Update src/practices/LanguageIndependent/DoesPullRequests.ts Co-Authored-By: Prokop Simek --- src/practices/LanguageIndependent/DoesPullRequests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index e393cf60a..29f10a0cb 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -15,7 +15,7 @@ import moment from 'moment'; reportOnlyOnce: true, url: 'https://dxkb.io/p/pull-requests', }) -export class DoesPullRequests implements IPractice { +export class DoesPullRequestsPractice implements IPractice { async isApplicable(): Promise { return true; } From 2bd8bd9c4f407690db5c8f3839ca64ab1c77a5ab Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 15:15:23 +0100 Subject: [PATCH 033/196] fix: refactor code --- src/practices/LanguageIndependent/DoesPullRequests.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 29f10a0cb..388b078a1 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -31,16 +31,12 @@ export class DoesPullRequestsPractice implements IPractice { const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); - let prDate; - - if (pullRequests.items.length > 0) { - prDate = new Date(pullRequests.items[0].createdAt).getTime(); - } else { + if (pullRequests.items.length === 0) { return PracticeEvaluationResult.notPracticing; } + const prDate = new Date(pullRequests.items[0].createdAt).getTime(); const commitDate = new Date(repoCommits.items[0].author.date).getTime(); - const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); if (prDate > commitDate - daysInMilliseconds) { From c96061d556d055cfb8f72b3c63c58c8a7a9d6328 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 21 Nov 2019 15:46:10 +0100 Subject: [PATCH 034/196] fix: rename practice --- src/practices/LanguageIndependent/DoesPullRequests.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index f510df1d5..7cd14ff7e 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -1,12 +1,12 @@ import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; -import { DoesPullRequests } from './DoesPullRequests'; +import { DoesPullRequestsPractice } from './DoesPullRequests'; import nock from 'nock'; import { GitHubNock } from '../../../test/helpers/gitHubNock'; import { getRepoCommitsResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; describe('DoesPullRequests', () => { - let practice: DoesPullRequests; + let practice: DoesPullRequestsPractice; let containerCtx: TestContainerContext; beforeEach(async () => { @@ -15,7 +15,7 @@ describe('DoesPullRequests', () => { beforeAll(() => { containerCtx = createTestContainer(); - containerCtx.container.bind('DoesPullRequests').to(DoesPullRequests); + containerCtx.container.bind('DoesPullRequests').to(DoesPullRequestsPractice); practice = containerCtx.container.get('DoesPullRequests'); }); From a19410f90f438d27306f0b0910f84df7a5c12638 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Thu, 21 Nov 2019 16:27:17 +0100 Subject: [PATCH 035/196] fix: move inspectors to language component context instead of overall container --- src/contexts/language/languageContextBinding.ts | 14 ++++++++++++++ src/inversify.config.ts | 7 ++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/contexts/language/languageContextBinding.ts b/src/contexts/language/languageContextBinding.ts index 5f9b826d1..44d531d6e 100644 --- a/src/contexts/language/languageContextBinding.ts +++ b/src/contexts/language/languageContextBinding.ts @@ -8,6 +8,8 @@ import { bindProjectComponentContext } from '../projectComponent/projectComponen import { JavaPackageInspector } from '../../inspectors/package/JavaPackageInspector'; import { JavaComponentDetector } from '../../detectors/Java/JavaComponentDetector'; import { LanguageContext } from './LanguageContext'; +import { CollaborationInspector } from '../../inspectors/CollaborationInspector'; +import { IssueTrackingInspector } from '../../inspectors/IssueTrackingInspector'; export const bindLanguageContext = (container: Container) => { container.bind(Types.LanguageContextFactory).toFactory( @@ -28,6 +30,7 @@ const createLanguageContainer = (languageAtPath: LanguageAtPath, rootContainer: bindComponentDetectors(container); bindProjectComponentContext(container); bindPackageInspectors(languageAtPath, container); + bindCollaborationInspectors(container); container.bind(LanguageContext).toSelf(); return container; @@ -89,6 +92,17 @@ const bindComponentDetectors = (container: Container) => { }); }; +const bindCollaborationInspectors = (container: Container) => { + container + .bind(Types.ICollaborationInspector) + .to(CollaborationInspector) + .inSingletonScope(); + container + .bind(Types.IIssueTrackingInspector) + .to(IssueTrackingInspector) + .inSingletonScope(); +}; + export const DETECT_LANGUAGE_TAG = 'language'; /** * Language tag for Project Component Detector. Determines which language this detector supports diff --git a/src/inversify.config.ts b/src/inversify.config.ts index eb6d877e6..a36aa3e26 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -30,6 +30,7 @@ import { GitHubService } from './services/git/GitHubService'; import { Types } from './types'; import { BitbucketService } from './services/bitbucket/BitbucketService'; import { ICollaborationInspector } from './inspectors/ICollaborationInspector'; +import { IIssueTrackingInspector } from './inspectors/IIssueTrackingInspector'; export const createRootContainer = (args: ArgumentsProvider): Container => { const container = new Container(); @@ -42,8 +43,6 @@ export const createRootContainer = (args: ArgumentsProvider): Container => { container.bind(FileSystemService).toSelf(); container.bind(GitHubService).toSelf(); container.bind(BitbucketService).toSelf(); - container.bind(Types.ICollaborationInspector).to(CollaborationInspector); - container.bind(Types.IIssueTrackingInspector).to(IssueTrackingInspector); // register practices practices.forEach((practice) => { container.bind(Types.Practice).toConstantValue(ScannerUtils.initPracticeWithMetadata(practice)); @@ -76,6 +75,8 @@ export const createTestContainer = ( container.bind(Types.IContentRepositoryBrowser).to(GitHubService); container.bind(Types.IFileInspector).to(FileInspector); container.bind(Types.IPackageInspector).to(JavaScriptPackageInspector); + container.bind(Types.ICollaborationInspector).to(CollaborationInspector); + container.bind(Types.IIssueTrackingInspector).to(IssueTrackingInspector); const scanningStrategyDetector = container.get(ScanningStrategyDetector); const fileSystemService = container.get(FileSystemService); @@ -127,7 +128,7 @@ export interface TestContainerContext { export interface TestPracticeContext extends PracticeContext { packageInspector: IPackageInspector; fileInspector: IFileInspector; - issueTrackingInspector: IssueTrackingInspector; + issueTrackingInspector: IIssueTrackingInspector; collaborationInspector: ICollaborationInspector; } From bb374f0f69e8d357df41e5a53370b7a94aaef6f2 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 13:54:34 +0100 Subject: [PATCH 036/196] fix: if the PR is updated, count with that date, not with the createdAt date --- .../LanguageIndependent/DoesPullRequests.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 388b078a1..6abf91a3d 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -28,6 +28,7 @@ export class DoesPullRequestsPractice implements IPractice { const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); + //TODO add filtering const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); @@ -35,8 +36,15 @@ export class DoesPullRequestsPractice implements IPractice { return PracticeEvaluationResult.notPracticing; } - const prDate = new Date(pullRequests.items[0].createdAt).getTime(); - const commitDate = new Date(repoCommits.items[0].author.date).getTime(); + const latestPRUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); + const descendingSortedPrDates = latestPRUpdate.sort((prA, prB) => prB - prA); + + const descendingSortedCommitDate = repoCommits.items.sort( + (commitA, commitB) => new Date(commitB.author.date).getTime() - new Date(commitA.author.date).getTime(), + ); + + const prDate = descendingSortedPrDates[0]; + const commitDate = new Date(descendingSortedCommitDate[0].author.date).getTime(); const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); if (prDate > commitDate - daysInMilliseconds) { From be35088c513dc7a95d3b793332c64d5c8c241f2c Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:32:00 +0100 Subject: [PATCH 037/196] feature: add possibility to define createdAt and updatedAt date --- test/helpers/gitHubNock.ts | 74 +++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 51f8aee98..86d048b16 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -26,19 +26,62 @@ export class GitHubNock { } getPulls( - pulls: { number: number; state: string; title: string; body: string; head: string; base: string }[], + pulls: { + number: number; + state: string; + title: string; + body: string; + head: string; + base: string; + created_at?: string; + updated_at?: string; + }[], queryState?: string, persist = true, ): PullRequestItem[] { - const responseBody = pulls.map( - ({ number, state, title, body, head, base }) => - new PullRequestItem(number, state, title, body, new BranchItem(head, this.repository), new BranchItem(base, this.repository)), - ); + // eslint-disable-next-line @typescript-eslint/camelcase + const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { + // eslint-disable-next-line @typescript-eslint/camelcase + console.log(created_at, '44'); + // eslint-disable-next-line @typescript-eslint/camelcase + if (!created_at) { + // eslint-disable-next-line @typescript-eslint/camelcase + created_at = '2000-03-06T23:06:50Z'; + } + // eslint-disable-next-line @typescript-eslint/camelcase + if (!updated_at) { + // eslint-disable-next-line @typescript-eslint/camelcase + updated_at = created_at; + } + console.log(created_at, '50'); + return new PullRequestItem( + number, + state, + title, + body, + new BranchItem(head, this.repository), + new BranchItem(base, this.repository), + created_at, + updated_at, + ); + }); return this.getPullsInternal(undefined, queryState, responseBody, persist); } - getPull(number: number, state: string, title: string, body: string, head: string, base: string, persist = true): PullRequest { + getPull( + number: number, + state: string, + title: string, + body: string, + head: string, + base: string, + persist = true, + // eslint-disable-next-line @typescript-eslint/camelcase + created_at: string, + // eslint-disable-next-line @typescript-eslint/camelcase + updated_at: string, + ): PullRequest { const responseBody = new PullRequest( number, state, @@ -46,6 +89,8 @@ export class GitHubNock { body, new BranchItem(head, this.repository), new BranchItem(base, this.repository), + created_at, + updated_at, ); return this.getPullsInternal(number, undefined, responseBody, persist); @@ -468,7 +513,7 @@ export class PullRequestItem { body: string; labels = []; milestone = null; - created_at = '2012-03-06T23:06:50Z'; + created_at: string; updated_at = '2012-03-06T23:06:50Z'; closed_at = '2012-03-06T23:06:50Z'; merged_at = '2012-03-06T23:06:50Z'; @@ -491,7 +536,16 @@ export class PullRequestItem { }; author_association = 'OWNER'; - constructor(number: number, state: string, title: string, body: string, head: BranchItem, base: BranchItem) { + constructor( + number: number, + state: string, + title: string, + body: string, + head: BranchItem, + base: BranchItem, + createdAt: string, + updatedAt: string, + ) { this.number = number; this.base = base; this.head = head; @@ -518,6 +572,10 @@ export class PullRequestItem { this.title = title; this.user = this.head.user; this.body = body; + // eslint-disable-next-line @typescript-eslint/camelcase + this.created_at = createdAt; + // eslint-disable-next-line @typescript-eslint/camelcase + this.updated_at = updatedAt; this._links = { self: { href: this.url }, html: { href: this.html_url }, From ae095e3cc3eaaee123a148db98dc060a256c48f0 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:32:45 +0100 Subject: [PATCH 038/196] fix: remove console.log() --- test/helpers/gitHubNock.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 86d048b16..3f50c904a 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -41,8 +41,6 @@ export class GitHubNock { ): PullRequestItem[] { // eslint-disable-next-line @typescript-eslint/camelcase const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { - // eslint-disable-next-line @typescript-eslint/camelcase - console.log(created_at, '44'); // eslint-disable-next-line @typescript-eslint/camelcase if (!created_at) { // eslint-disable-next-line @typescript-eslint/camelcase @@ -53,7 +51,6 @@ export class GitHubNock { // eslint-disable-next-line @typescript-eslint/camelcase updated_at = created_at; } - console.log(created_at, '50'); return new PullRequestItem( number, state, From f6da9ecefa418994f2e5679348eb285a0ebd8847 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:35:30 +0100 Subject: [PATCH 039/196] test: add test for testing when there is a PR, but older than 30 days than the last commit in master --- .vscode/settings.json | 3 ++- .../DoesPullRequests.spec.ts | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9bd35b459..4b78dd8b4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,5 +27,6 @@ "language": "typescriptreact", "autoFix": true } - ] + ], + "typescript.tsdk": "node_modules/typescript/lib", } diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index 7cd14ff7e..18df7e77a 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -43,4 +43,24 @@ describe('DoesPullRequests', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); }); + + it('return notPracticing if there is PR older than 30 days than the last commit in master', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ + { + number: 1348, + state: 'opened', + title: 'new-feature', + body: '', + head: 'new-topic', + base: 'master', + // eslint-disable-next-line @typescript-eslint/camelcase + created_at: '2000-03-06T23:06:50Z', + }, + ]); + new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + }); }); From a589a045c7ce83406b16d7d335d1e8f27c541004 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:35:52 +0100 Subject: [PATCH 040/196] fix: use different date as default --- test/helpers/gitHubNock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 3f50c904a..4eec8d86a 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -44,7 +44,7 @@ export class GitHubNock { // eslint-disable-next-line @typescript-eslint/camelcase if (!created_at) { // eslint-disable-next-line @typescript-eslint/camelcase - created_at = '2000-03-06T23:06:50Z'; + created_at = '2012-03-06T23:06:50Z'; } // eslint-disable-next-line @typescript-eslint/camelcase if (!updated_at) { From a7773a58cc702bc45879e930f906e498a4473198 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:50:22 +0100 Subject: [PATCH 041/196] fix: optional created_at and updated_at --- test/helpers/gitHubNock.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 4eec8d86a..430fa2613 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -75,10 +75,20 @@ export class GitHubNock { base: string, persist = true, // eslint-disable-next-line @typescript-eslint/camelcase - created_at: string, + created_at?: string, // eslint-disable-next-line @typescript-eslint/camelcase - updated_at: string, + updated_at?: string, ): PullRequest { + // eslint-disable-next-line @typescript-eslint/camelcase + if (!created_at) { + // eslint-disable-next-line @typescript-eslint/camelcase + created_at = '2012-03-06T23:06:50Z'; + } + // eslint-disable-next-line @typescript-eslint/camelcase + if (!updated_at) { + // eslint-disable-next-line @typescript-eslint/camelcase + updated_at = created_at; + } const responseBody = new PullRequest( number, state, From 3801a6d2511ce3c7c8a1947db74a63e1349ad1a7 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:50:57 +0100 Subject: [PATCH 042/196] fix: increase coverage by adding some tests --- .../LanguageIndependent/DoesPullRequests.spec.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index 18df7e77a..282758cd6 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -63,4 +63,16 @@ describe('DoesPullRequests', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); }); + + it('return true as it is always applicable', async () => { + const applicable = await practice.isApplicable(); + expect(applicable).toEqual(true); + }); + + it('return unknown if there is no collaborationInspector', async () => { + containerCtx.practiceContext.collaborationInspector = undefined; + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.unknown); + }); }); From 535e1c70fba290bdede062e2d7c9cfe033b7321d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 15:56:29 +0100 Subject: [PATCH 043/196] fix: remove unused imports --- src/practices/LanguageIndependent/DoesPullRequests.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 6abf91a3d..4edad5624 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -1,11 +1,9 @@ +import moment from 'moment'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; -import { sharedSubpath } from '../../detectors/utils'; import { PracticeEvaluationResult, PracticeImpact } from '../../model'; -import { ReporterUtils } from '../../reporters/ReporterUtils'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; -import moment from 'moment'; @DxPractice({ id: 'LanguageIndependent.DoesPullRequests', @@ -36,9 +34,9 @@ export class DoesPullRequestsPractice implements IPractice { return PracticeEvaluationResult.notPracticing; } - const latestPRUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); - const descendingSortedPrDates = latestPRUpdate.sort((prA, prB) => prB - prA); + const latestPRsUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); + const descendingSortedPrDates = latestPRsUpdate.sort((prA, prB) => prB - prA); const descendingSortedCommitDate = repoCommits.items.sort( (commitA, commitB) => new Date(commitB.author.date).getTime() - new Date(commitA.author.date).getTime(), ); From 2b67091caaf6329ff7ee67dde82947327f8d1e89 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 17:03:31 +0100 Subject: [PATCH 044/196] fix: use own definition of PR -> implement getPRState() to get the state specific for services --- src/inspectors/CollaborationInspector.ts | 16 +++------ src/inspectors/ICollaborationInspector.ts | 8 +---- src/inspectors/IssueTrackingInspector.ts | 6 ++-- src/model.ts | 4 ++- .../bitbucket/BitbucketService.spec.ts | 10 +++--- src/services/bitbucket/BitbucketService.ts | 8 +++-- src/services/git/CSVServicesUtils.ts | 36 +++++++++++++++++++ src/services/git/Git.ts | 19 +++++----- src/services/git/GitHubService.spec.ts | 9 ++--- src/services/git/GitHubService.ts | 8 +++-- src/services/git/ICVSService.ts | 13 +++---- 11 files changed, 84 insertions(+), 53 deletions(-) create mode 100644 src/services/git/CSVServicesUtils.ts diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index 753791000..c29b05910 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -1,24 +1,18 @@ import { inject, injectable } from 'inversify'; -import { ProjectIssueBrowserService as ContentRepositoryBrowserService } from '../model'; -import { GitHubPullRequestState } from '../services/git/IGitHubService'; import { Types } from '../types'; import { ListGetterOptions } from './common/ListGetterOptions'; -import { ICollaborationInspector } from './ICollaborationInspector'; -import { BitbucketPullRequestState } from '../services/git/ICVSService'; +import { ICollaborationInspector, PullRequestState } from './ICollaborationInspector'; +import { CSVService } from '../model'; @injectable() export class CollaborationInspector implements ICollaborationInspector { - private service: ContentRepositoryBrowserService; + private service: CSVService; - constructor(@inject(Types.IContentRepositoryBrowser) service: ContentRepositoryBrowserService) { + constructor(@inject(Types.IContentRepositoryBrowser) service: CSVService) { this.service = service; } - async getPullRequests( - owner: string, - repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, - ) { + async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>) { return this.service.getPullRequests(owner, repo, options); } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 5e1b3ac7e..40a044231 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,15 +1,9 @@ import { PullCommits, PullFiles, PullRequest } from '../services/git/model'; import { ListGetterOptions } from './common/ListGetterOptions'; import { Paginated } from './common/Paginated'; -import { GitHubPullRequestState } from '../services/git/IGitHubService'; -import { BitbucketPullRequestState } from '../services/git/ICVSService'; export interface ICollaborationInspector { - getPullRequests( - owner: string, - repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, - ): Promise>; + getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; diff --git a/src/inspectors/IssueTrackingInspector.ts b/src/inspectors/IssueTrackingInspector.ts index db3a6e5a1..b58ff6aae 100644 --- a/src/inspectors/IssueTrackingInspector.ts +++ b/src/inspectors/IssueTrackingInspector.ts @@ -4,13 +4,13 @@ import { IIssueTrackingInspector } from './IIssueTrackingInspector'; import { Paginated } from './common/Paginated'; import { Issue, IssueComment } from '../services/git/model'; import { Types } from '../types'; -import { ProjectIssueBrowserService } from '../model'; +import { CSVService } from '../model'; @injectable() export class IssueTrackingInspector implements IIssueTrackingInspector { - private service: ProjectIssueBrowserService; + private service: CSVService; - constructor(@inject(Types.IContentRepositoryBrowser) service: ProjectIssueBrowserService) { + constructor(@inject(Types.IContentRepositoryBrowser) service: CSVService) { this.service = service; } diff --git a/src/model.ts b/src/model.ts index b64713c6e..a94be6ed6 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1,4 +1,6 @@ import { GitHubService } from './services/git/GitHubService'; +import { BitbucketService } from './services/bitbucket/BitbucketService'; +import { CSVServicesUtils } from './services/git/CSVServicesUtils'; // New model starts here @@ -203,4 +205,4 @@ export enum GitFLow { Git = 'Git', } -export type ProjectIssueBrowserService = GitHubService; +export type CSVService = GitHubService | BitbucketService; diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 7541373c4..14c5eaa96 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -1,5 +1,5 @@ import nock from 'nock'; -import { BitbucketNock } from '../../../test/helpers/bitbucketNock'; +import { BitbucketNock, PullRequest } from '../../../test/helpers/bitbucketNock'; import { BitbucketService } from './BitbucketService'; import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; @@ -10,6 +10,7 @@ import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockF import { GitHubPullRequestState } from '../git/IGitHubService'; import { BitbucketPullRequestState } from '../git/ICVSService'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; describe('Bitbucket Service', () => { let service: BitbucketService; @@ -67,17 +68,16 @@ describe('Bitbucket Service', () => { }); it('returns declined pull requests in own interface', async () => { - const state: ListGetterOptions<{ state?: BitbucketPullRequestState }> = { + const state: ListGetterOptions<{ state?: PullRequestState }> = { filter: { - state: BitbucketPullRequestState.declined, + state: PullRequestState.closed, }, }; nock(bitbucketNock.url) .get('/users/pypy') .reply(200); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state.filter!.state); - + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, 'MERGED'); const response = await service.getPullRequests('pypy', 'pypy', state); expect(response).toMatchObject(getPullRequestsResponse); }); diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 25cbe20ae..e31006498 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -25,9 +25,10 @@ import { Directory, File, } from '../git/model'; -import { ICVSService, BitbucketPullRequestState } from '../git/ICVSService'; +import { ICVSService, BitbucketPullRequestState, CSVService } from '../git/ICVSService'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { CSVServicesUtils } from '../git/CSVServicesUtils'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() @@ -78,7 +79,7 @@ export class BitbucketService implements ICVSService { async getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: BitbucketPullRequestState }>, + options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { const params: Bitbucket.Params.PullrequestsList = { repo_slug: repo, @@ -87,7 +88,8 @@ export class BitbucketService implements ICVSService { let state; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { - state = options.filter.state; + state = CSVServicesUtils.getPRState(options.filter.state, CSVService.bitbucket); + console.log(state); Object.assign(params, { state: state }); } diff --git a/src/services/git/CSVServicesUtils.ts b/src/services/git/CSVServicesUtils.ts new file mode 100644 index 000000000..f3204e671 --- /dev/null +++ b/src/services/git/CSVServicesUtils.ts @@ -0,0 +1,36 @@ +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { BitbucketPullRequestState, CSVService } from './ICVSService'; +import { GitHubPullRequestState } from './IGitHubService'; + +export class CSVServicesUtils { + static getPRState = ( + state: PullRequestState | undefined, + service: CSVService, + ): GitHubPullRequestState | BitbucketPullRequestState | undefined => { + if (service === CSVService.github) { + switch (state) { + case PullRequestState.open: + return GitHubPullRequestState.open; + case PullRequestState.closed: + return GitHubPullRequestState.closed; + case PullRequestState.all: + return GitHubPullRequestState.all; + case undefined: + return undefined; + } + } + + if (service === CSVService.bitbucket) { + switch (state) { + case PullRequestState.open: + return BitbucketPullRequestState.open; + case PullRequestState.closed: + return BitbucketPullRequestState.closed; + case PullRequestState.all: + return BitbucketPullRequestState.open && BitbucketPullRequestState.closed && BitbucketPullRequestState.declined; + case undefined: + return undefined; + } + } + }; +} diff --git a/src/services/git/Git.ts b/src/services/git/Git.ts index 3d472ed95..4518bb5fd 100644 --- a/src/services/git/Git.ts +++ b/src/services/git/Git.ts @@ -1,21 +1,20 @@ -import { Repository } from '../../model'; -import { isArray } from 'util'; import { inject, injectable } from 'inversify'; -import { ErrorFactory } from '../../lib/errors/ErrorFactory'; import * as nodePath from 'path'; -import { Metadata, MetadataType, IProjectFilesBrowserService } from '../model'; +import { isArray } from 'util'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { ErrorFactory } from '../../lib/errors/ErrorFactory'; +import { CSVService, Repository } from '../../model'; import { Types } from '../../types'; -import { ProjectIssueBrowserService as ContentRepositoryBrowserService } from '../../model'; -import { Directory, File, Symlink } from './model'; +import { IProjectFilesBrowserService, Metadata, MetadataType } from '../model'; import { GitServiceUtils } from './GitServiceUtils'; -import { GitHubPullRequestState } from './IGitHubService'; +import { Directory, File, Symlink } from './model'; @injectable() export class Git implements IProjectFilesBrowserService { private repository: Repository; - private service: ContentRepositoryBrowserService; + private service: CSVService; - constructor(repository: Repository, @inject(Types.IContentRepositoryBrowser) service: ContentRepositoryBrowserService) { + constructor(repository: Repository, @inject(Types.IContentRepositoryBrowser) service: CSVService) { this.repository = repository; this.service = service; } @@ -116,7 +115,7 @@ export class Git implements IProjectFilesBrowserService { async getPullRequestCount(): Promise { const params = GitServiceUtils.getOwnerAndRepoName(this.repository.url); - return this.service.getPullRequests(params.owner, params.repoName, { filter: { state: GitHubPullRequestState.all } }).then((r) => { + return this.service.getPullRequests(params.owner, params.repoName, { filter: { state: PullRequestState.all } }).then((r) => { if (!r) { throw ErrorFactory.newInternalError('Could not get pull requests'); } diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index d3bbf80c1..1534f459b 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -21,10 +21,11 @@ import { getPullsFilesResponse } from './__MOCKS__/gitHubServiceMockFolder/getPu import { getPullsFilesServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullFilesServiceResponse.mock'; import { getPullCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock'; import { getPullCommitsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullCommitsServiceResponse.mock'; -import { GitHubNock } from '../../../test/helpers/gitHubNock'; +import { GitHubNock, PullRequest } from '../../../test/helpers/gitHubNock'; import { getRepoCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; import { File } from './model'; import { GitHubPullRequestState } from './IGitHubService'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; describe('GitHub Service', () => { let service: GitHubService; @@ -70,7 +71,7 @@ describe('GitHub Service', () => { 'open', ); - const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: GitHubPullRequestState.open } }); + const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.open } }); expect(response.items.map((item) => item.state)).toMatchObject(['open']); }); @@ -80,7 +81,7 @@ describe('GitHub Service', () => { 'closed', ); - const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: GitHubPullRequestState.closed } }); + const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.closed } }); expect(response.items.map((item) => item.state)).toMatchObject(['closed']); }); @@ -93,7 +94,7 @@ describe('GitHub Service', () => { 'all', ); - const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: GitHubPullRequestState.all } }); + const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.all } }); expect(response.items.map((item) => item.state)).toMatchObject(['open', 'closed']); }); }); diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index a1ff0f72a..0f962832a 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -17,7 +17,7 @@ import { ErrorFactory } from '../../lib/errors'; import { ICache } from '../../scanner/cache/ICache'; import { InMemoryCache } from '../../scanner/cache/InMemoryCache'; import { Types } from '../../types'; -import { ICVSService, BitbucketPullRequestState } from './ICVSService'; +import { ICVSService, BitbucketPullRequestState, CSVService } from './ICVSService'; import { Commit, Contributor, @@ -34,6 +34,7 @@ import { Symlink, } from './model'; import { GitHubPullRequestState } from './IGitHubService'; +import { CSVServicesUtils } from './CSVServicesUtils'; const debug = Debug('cli:services:git:github-service'); @injectable() @@ -70,11 +71,12 @@ export class GitHubService implements ICVSService { async getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, + options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { - url = `${url}?state=${options.filter.state}`; + const state = CSVServicesUtils.getPRState(options.filter.state, CSVService.github); + url = `${url}?state=${state}`; } const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index 943ddb94c..ac3430c03 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -1,14 +1,10 @@ import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { Paginated } from '../../inspectors/common/Paginated'; -import { GitHubPullRequestState } from './IGitHubService'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; import { Commit, Contributor, ContributorStats, Directory, File, Issue, PullFiles, PullRequest, PullRequestReview, Symlink } from './model'; export interface ICVSService { - getPullRequests( - owner: string, - repo: string, - options?: ListGetterOptions<{ state?: GitHubPullRequestState | BitbucketPullRequestState }>, - ): Promise>; + getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; getPullRequestReviews(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; @@ -20,6 +16,11 @@ export interface ICVSService { getRepoContent(owner: string, repo: string, path: string): Promise; } +export enum CSVService { + github = 'GitHub', + bitbucket = 'Bitbucket', +} + export enum BitbucketPullRequestState { open = 'OPEN', closed = 'MERGED', From f54425dcf8d27945298c5c5f93186f6d7c6aa1e3 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 22 Nov 2019 19:24:48 +0100 Subject: [PATCH 045/196] fix: get the info about user only once as it is always the same --- src/services/bitbucket/BitbucketService.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index e31006498..0a10aaffd 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -95,11 +95,10 @@ export class BitbucketService implements ICVSService { const response = >>await this.client.pullrequests.list(params); const url = 'www.bitbucket.org'; + const ownerId = (await this.client.users.get({ username: owner })).data.uuid; + const urlOwner = url.concat(`/${owner}`); const values = response.data.values.map(async (val) => { - const ownerId = ( - (await this.client.users.get({ username: `${val.destination.repository.full_name.split('/').shift()}` })).data.uuid - ); return { user: { id: val.author.uuid, @@ -122,9 +121,9 @@ export class BitbucketService implements ICVSService { name: val.destination.repository.name, id: val.destination.repository.uuid, owner: { - login: val.destination.repository.full_name.split('/').shift(), - id: ownerId ? ownerId : 'undefined', - url: url.concat(`/${val.destination.repository.full_name.split('/').shift()}`), + login: owner, + id: ownerId, + url: urlOwner, }, }, }, From 29f0cbccef06a3dd7a328dfc59c7bfc86c8f7228 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sun, 24 Nov 2019 14:17:58 +0000 Subject: [PATCH 046/196] feat(cli): --init command creates a yaml config file --- package.json | 4 +++- src/index.ts | 3 +++ src/init.configurator.ts | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/init.configurator.ts diff --git a/package.json b/package.json index 6d3b29da5..71458eaff 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@octokit/rest": "16.35.0", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", + "@types/yaml": "^1.2.0", "axios": "0.19.0", "bitbucket": "1.15.2", "colors": "1.4.0", @@ -56,7 +57,8 @@ "tslib": "1.10.0", "typescript": "3.7.2", "update-notifier": "3.0.1", - "xml2js": "0.4.22" + "xml2js": "0.4.22", + "yaml": "^1.7.2" }, "devDependencies": { "@semantic-release/changelog": "3.0.5", diff --git a/src/index.ts b/src/index.ts index d5293f9be..b7b720a7b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import { ServiceError, ErrorCode } from './lib/errors'; import updateNotifier from 'update-notifier'; import { ScanningStrategyDetectorUtils } from './detectors/utils/ScanningStrategyDetectorUtils'; import { PracticeImpact } from './model'; +import { initialize } from './init.configurator'; class DXScannerCommand extends Command { static description = 'Scan your project for possible DX recommendations.'; @@ -52,6 +53,8 @@ class DXScannerCommand extends Command { const container = createRootContainer({ uri: scanPath, auth: authorization, json, fail, recursive: flags.recursive }); const scanner = container.get(Scanner); + flags.init ? initialize(scanPath, container) : undefined; + let scanResult: ScanResult; try { scanResult = await scanner.scan(); diff --git a/src/init.configurator.ts b/src/init.configurator.ts new file mode 100644 index 000000000..3c71aeb28 --- /dev/null +++ b/src/init.configurator.ts @@ -0,0 +1,33 @@ +import * as fs from 'fs'; +import { Container } from 'inversify'; +import { Types } from './types'; +import { PracticeMetadata } from './model'; +import { ErrorFactory } from './lib/errors'; + +export const initialize = (scanPath: string, container: Container) => { + const yamlPath = `${scanPath}/.dxscannerrc.yaml`; + // check if .dxscannerrc.yaml already exists + const yamlExists: boolean = fs.existsSync(yamlPath); + if (!yamlExists) { + createYAML(yamlPath, container); + } +}; + +export const createYAML = (yamlPath: string, container: Container) => { + let yamlInitContent = `# practices:`; + const initializedPractices: ContainerPracticeMetadata[] = container.getAll(Types.Practice); + for (const practice of initializedPractices) { + const dataObject = practice.getMetadata(); + console.log(dataObject.id); + yamlInitContent += `\n# ${dataObject.id}: ${dataObject.impact}`; + } + fs.writeFile(yamlPath, yamlInitContent, (err) => { + if (err) { + throw ErrorFactory.newInternalError(err.message); + } + }); +}; + +export interface ContainerPracticeMetadata { + getMetadata(): PracticeMetadata; +} From 927a78425bf31dda61caa11179b0f49d11dc45d1 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sun, 24 Nov 2019 14:25:02 +0000 Subject: [PATCH 047/196] removed a console.log and removed export for createYAML --- src/init.configurator.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/init.configurator.ts b/src/init.configurator.ts index 3c71aeb28..4dd169f7a 100644 --- a/src/init.configurator.ts +++ b/src/init.configurator.ts @@ -13,12 +13,11 @@ export const initialize = (scanPath: string, container: Container) => { } }; -export const createYAML = (yamlPath: string, container: Container) => { +const createYAML = (yamlPath: string, container: Container) => { let yamlInitContent = `# practices:`; const initializedPractices: ContainerPracticeMetadata[] = container.getAll(Types.Practice); for (const practice of initializedPractices) { const dataObject = practice.getMetadata(); - console.log(dataObject.id); yamlInitContent += `\n# ${dataObject.id}: ${dataObject.impact}`; } fs.writeFile(yamlPath, yamlInitContent, (err) => { From 88edb72943f8c2889bf0a654f3c162b08f859819 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sun, 24 Nov 2019 14:32:37 +0000 Subject: [PATCH 048/196] fix(cli): added an action start and stop to --init --- src/init.configurator.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/init.configurator.ts b/src/init.configurator.ts index 4dd169f7a..2ba8a7906 100644 --- a/src/init.configurator.ts +++ b/src/init.configurator.ts @@ -3,14 +3,17 @@ import { Container } from 'inversify'; import { Types } from './types'; import { PracticeMetadata } from './model'; import { ErrorFactory } from './lib/errors'; +import { cli } from 'cli-ux'; export const initialize = (scanPath: string, container: Container) => { + cli.action.start(`Initializing configuration: ${scanPath}`); const yamlPath = `${scanPath}/.dxscannerrc.yaml`; // check if .dxscannerrc.yaml already exists const yamlExists: boolean = fs.existsSync(yamlPath); if (!yamlExists) { createYAML(yamlPath, container); } + cli.action.stop(); }; const createYAML = (yamlPath: string, container: Container) => { From 44a03dc4e0b0bcdbf10630a0c33b77fd3c93507e Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Mon, 25 Nov 2019 08:25:24 +0100 Subject: [PATCH 049/196] chore: exit process after init cmd --- src/init.configurator.ts | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/init.configurator.ts b/src/init.configurator.ts index 2ba8a7906..3e3af4232 100644 --- a/src/init.configurator.ts +++ b/src/init.configurator.ts @@ -14,6 +14,7 @@ export const initialize = (scanPath: string, container: Container) => { createYAML(yamlPath, container); } cli.action.stop(); + process.exit(0); }; const createYAML = (yamlPath: string, container: Container) => { diff --git a/yarn.lock b/yarn.lock index f0ca0b7c6..ad0d94adc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -883,6 +883,11 @@ dependencies: "@types/node" "*" +"@types/yaml@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.2.0.tgz#4ed577fc4ebbd6b829b28734e56d10c9e6984e09" + integrity sha512-GW8b9qM+ebgW3/zjzPm0I1NxMvLaz/YKT9Ph6tTb+Fkeyzd9yLTvQ6ciQ2MorTRmb/qXmfjMerRpG4LviixaqQ== + "@types/yargs-parser@*": version "13.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.0.0.tgz#453743c5bbf9f1bed61d959baab5b06be029b2d0" From 2ddd5859ea3cc4796ee7f43630841dbc88245f5d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 10:02:13 +0100 Subject: [PATCH 050/196] fix: stringify undefined value --- .../bitbucket/BitbucketService.spec.ts | 18 ++++++++---------- src/services/bitbucket/BitbucketService.ts | 3 +-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 14c5eaa96..4b19fa5d2 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -1,16 +1,14 @@ import nock from 'nock'; -import { BitbucketNock, PullRequest } from '../../../test/helpers/bitbucketNock'; -import { BitbucketService } from './BitbucketService'; -import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; -import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; -import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits'; -import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; -import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueResponse'; -import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueCommentsResponse'; -import { GitHubPullRequestState } from '../git/IGitHubService'; -import { BitbucketPullRequestState } from '../git/ICVSService'; +import { BitbucketNock } from '../../../test/helpers/bitbucketNock'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueCommentsResponse'; +import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueResponse'; +import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; +import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits'; +import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; +import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; +import { BitbucketService } from './BitbucketService'; describe('Bitbucket Service', () => { let service: BitbucketService; diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 0a10aaffd..b7b615e71 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -89,13 +89,12 @@ export class BitbucketService implements ICVSService { let state; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { state = CSVServicesUtils.getPRState(options.filter.state, CSVService.bitbucket); - console.log(state); Object.assign(params, { state: state }); } const response = >>await this.client.pullrequests.list(params); const url = 'www.bitbucket.org'; - const ownerId = (await this.client.users.get({ username: owner })).data.uuid; + const ownerId = String((await this.client.users.get({ username: owner })).data.uuid); const urlOwner = url.concat(`/${owner}`); const values = response.data.values.map(async (val) => { From 0988936ccdf999a915b6692f99872aaa9508343c Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 25 Nov 2019 12:34:38 +0100 Subject: [PATCH 051/196] Update src/model.ts Co-Authored-By: Prokop Simek --- src/model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model.ts b/src/model.ts index a94be6ed6..806f575c4 100644 --- a/src/model.ts +++ b/src/model.ts @@ -205,4 +205,4 @@ export enum GitFLow { Git = 'Git', } -export type CSVService = GitHubService | BitbucketService; +export type VCSService = GitHubService | BitbucketService; From 0b28ccb0d57829d7e52f8706fce78284a87d987f Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 25 Nov 2019 12:34:48 +0100 Subject: [PATCH 052/196] Update src/services/bitbucket/BitbucketService.ts Co-Authored-By: Prokop Simek --- src/services/bitbucket/BitbucketService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index b7b615e71..95872635c 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -87,7 +87,7 @@ export class BitbucketService implements ICVSService { }; let state; - if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { + if (options?.filter?.state) { state = CSVServicesUtils.getPRState(options.filter.state, CSVService.bitbucket); Object.assign(params, { state: state }); } From 25511e206209fe9df5cd89221dc79f4b6eedb703 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 25 Nov 2019 12:34:56 +0100 Subject: [PATCH 053/196] Update src/services/bitbucket/BitbucketService.ts Co-Authored-By: Prokop Simek --- src/services/bitbucket/BitbucketService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 95872635c..392dcbbce 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -89,7 +89,7 @@ export class BitbucketService implements ICVSService { let state; if (options?.filter?.state) { state = CSVServicesUtils.getPRState(options.filter.state, CSVService.bitbucket); - Object.assign(params, { state: state }); + params = { ...params, state } } const response = >>await this.client.pullrequests.list(params); From 388734f11f01102a68c05edf850d0f1f39dae0ab Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 25 Nov 2019 12:35:18 +0100 Subject: [PATCH 054/196] Update src/services/git/CSVServicesUtils.ts Co-Authored-By: Prokop Simek --- src/services/git/CSVServicesUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/git/CSVServicesUtils.ts b/src/services/git/CSVServicesUtils.ts index f3204e671..8ce433e94 100644 --- a/src/services/git/CSVServicesUtils.ts +++ b/src/services/git/CSVServicesUtils.ts @@ -15,7 +15,7 @@ export class CSVServicesUtils { return GitHubPullRequestState.closed; case PullRequestState.all: return GitHubPullRequestState.all; - case undefined: + default: return undefined; } } From ca12e1729ed39f29716a4a8c2351dabbd7d7cc66 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 25 Nov 2019 12:35:31 +0100 Subject: [PATCH 055/196] Update src/services/git/CSVServicesUtils.ts Co-Authored-By: Prokop Simek --- src/services/git/CSVServicesUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/git/CSVServicesUtils.ts b/src/services/git/CSVServicesUtils.ts index 8ce433e94..4f73e4f55 100644 --- a/src/services/git/CSVServicesUtils.ts +++ b/src/services/git/CSVServicesUtils.ts @@ -28,7 +28,7 @@ export class CSVServicesUtils { return BitbucketPullRequestState.closed; case PullRequestState.all: return BitbucketPullRequestState.open && BitbucketPullRequestState.closed && BitbucketPullRequestState.declined; - case undefined: + default: return undefined; } } From c8c2f0913bd5adf99bd84d8847eb4381104c4859 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 12:59:23 +0100 Subject: [PATCH 056/196] fix: rename CVS to VCS --- src/inspectors/CollaborationInspector.ts | 6 +++--- src/inspectors/IssueTrackingInspector.ts | 6 +++--- src/model.ts | 3 +-- src/services/git/CSVServicesUtils.ts | 10 +++++----- src/services/git/Git.ts | 6 +++--- src/services/git/GitHubService.ts | 9 ++++----- src/services/git/ICVSService.ts | 4 ++-- 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index c29b05910..f21554bf9 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -2,13 +2,13 @@ import { inject, injectable } from 'inversify'; import { Types } from '../types'; import { ListGetterOptions } from './common/ListGetterOptions'; import { ICollaborationInspector, PullRequestState } from './ICollaborationInspector'; -import { CSVService } from '../model'; +import { VCSService } from '../model'; @injectable() export class CollaborationInspector implements ICollaborationInspector { - private service: CSVService; + private service: VCSService; - constructor(@inject(Types.IContentRepositoryBrowser) service: CSVService) { + constructor(@inject(Types.IContentRepositoryBrowser) service: VCSService) { this.service = service; } diff --git a/src/inspectors/IssueTrackingInspector.ts b/src/inspectors/IssueTrackingInspector.ts index b58ff6aae..998832bd5 100644 --- a/src/inspectors/IssueTrackingInspector.ts +++ b/src/inspectors/IssueTrackingInspector.ts @@ -4,13 +4,13 @@ import { IIssueTrackingInspector } from './IIssueTrackingInspector'; import { Paginated } from './common/Paginated'; import { Issue, IssueComment } from '../services/git/model'; import { Types } from '../types'; -import { CSVService } from '../model'; +import { VCSService } from '../model'; @injectable() export class IssueTrackingInspector implements IIssueTrackingInspector { - private service: CSVService; + private service: VCSService; - constructor(@inject(Types.IContentRepositoryBrowser) service: CSVService) { + constructor(@inject(Types.IContentRepositoryBrowser) service: VCSService) { this.service = service; } diff --git a/src/model.ts b/src/model.ts index 806f575c4..c408821b1 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1,6 +1,5 @@ -import { GitHubService } from './services/git/GitHubService'; import { BitbucketService } from './services/bitbucket/BitbucketService'; -import { CSVServicesUtils } from './services/git/CSVServicesUtils'; +import { GitHubService } from './services/git/GitHubService'; // New model starts here diff --git a/src/services/git/CSVServicesUtils.ts b/src/services/git/CSVServicesUtils.ts index 4f73e4f55..8d7f3ece9 100644 --- a/src/services/git/CSVServicesUtils.ts +++ b/src/services/git/CSVServicesUtils.ts @@ -1,13 +1,13 @@ import { PullRequestState } from '../../inspectors/ICollaborationInspector'; -import { BitbucketPullRequestState, CSVService } from './ICVSService'; +import { BitbucketPullRequestState, VCSService } from './ICVSService'; import { GitHubPullRequestState } from './IGitHubService'; -export class CSVServicesUtils { +export class VCSServicesUtils { static getPRState = ( state: PullRequestState | undefined, - service: CSVService, + service: VCSService, ): GitHubPullRequestState | BitbucketPullRequestState | undefined => { - if (service === CSVService.github) { + if (service === VCSService.github) { switch (state) { case PullRequestState.open: return GitHubPullRequestState.open; @@ -20,7 +20,7 @@ export class CSVServicesUtils { } } - if (service === CSVService.bitbucket) { + if (service === VCSService.bitbucket) { switch (state) { case PullRequestState.open: return BitbucketPullRequestState.open; diff --git a/src/services/git/Git.ts b/src/services/git/Git.ts index 4518bb5fd..bdb78dbb0 100644 --- a/src/services/git/Git.ts +++ b/src/services/git/Git.ts @@ -3,7 +3,7 @@ import * as nodePath from 'path'; import { isArray } from 'util'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; import { ErrorFactory } from '../../lib/errors/ErrorFactory'; -import { CSVService, Repository } from '../../model'; +import { Repository, VCSService } from '../../model'; import { Types } from '../../types'; import { IProjectFilesBrowserService, Metadata, MetadataType } from '../model'; import { GitServiceUtils } from './GitServiceUtils'; @@ -12,9 +12,9 @@ import { Directory, File, Symlink } from './model'; @injectable() export class Git implements IProjectFilesBrowserService { private repository: Repository; - private service: CSVService; + private service: VCSService; - constructor(repository: Repository, @inject(Types.IContentRepositoryBrowser) service: CSVService) { + constructor(repository: Repository, @inject(Types.IContentRepositoryBrowser) service: VCSService) { this.repository = repository; this.service = service; } diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 0f962832a..e4cc35c1e 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -17,7 +17,8 @@ import { ErrorFactory } from '../../lib/errors'; import { ICache } from '../../scanner/cache/ICache'; import { InMemoryCache } from '../../scanner/cache/InMemoryCache'; import { Types } from '../../types'; -import { ICVSService, BitbucketPullRequestState, CSVService } from './ICVSService'; +import { VCSServicesUtils } from './CSVServicesUtils'; +import { IVCSService, VCSService } from './ICVSService'; import { Commit, Contributor, @@ -33,12 +34,10 @@ import { RepoContentType, Symlink, } from './model'; -import { GitHubPullRequestState } from './IGitHubService'; -import { CSVServicesUtils } from './CSVServicesUtils'; const debug = Debug('cli:services:git:github-service'); @injectable() -export class GitHubService implements ICVSService { +export class GitHubService implements IVCSService { private readonly client: Octokit; private cache: ICache; private callCount = 0; @@ -75,7 +74,7 @@ export class GitHubService implements ICVSService { ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { - const state = CSVServicesUtils.getPRState(options.filter.state, CSVService.github); + const state = VCSServicesUtils.getPRState(options.filter.state, VCSService.github); url = `${url}?state=${state}`; } const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index ac3430c03..594f355fe 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -3,7 +3,7 @@ import { Paginated } from '../../inspectors/common/Paginated'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; import { Commit, Contributor, ContributorStats, Directory, File, Issue, PullFiles, PullRequest, PullRequestReview, Symlink } from './model'; -export interface ICVSService { +export interface IVCSService { getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; getPullRequestReviews(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; @@ -16,7 +16,7 @@ export interface ICVSService { getRepoContent(owner: string, repo: string, path: string): Promise; } -export enum CSVService { +export enum VCSService { github = 'GitHub', bitbucket = 'Bitbucket', } From 1769b52896a4f898083c0ea0ef58583657d40d8e Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 13:00:09 +0100 Subject: [PATCH 057/196] fix: retype return type from getPRState() --- src/services/bitbucket/BitbucketService.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 392dcbbce..9854f7d8e 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -25,14 +25,14 @@ import { Directory, File, } from '../git/model'; -import { ICVSService, BitbucketPullRequestState, CSVService } from '../git/ICVSService'; +import { VCSService, IVCSService, BitbucketPullRequestState } from '../git/ICVSService'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; -import { CSVServicesUtils } from '../git/CSVServicesUtils'; +import { VCSServicesUtils } from '../git/CSVServicesUtils'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() -export class BitbucketService implements ICVSService { +export class BitbucketService implements IVCSService { private readonly client: Bitbucket; private cache: ICache; private callCount = 0; @@ -81,15 +81,17 @@ export class BitbucketService implements ICVSService { repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { - const params: Bitbucket.Params.PullrequestsList = { + let params: Bitbucket.Params.PullrequestsList = { repo_slug: repo, username: owner, }; let state; if (options?.filter?.state) { - state = CSVServicesUtils.getPRState(options.filter.state, CSVService.bitbucket); - params = { ...params, state } + state = VCSServicesUtils.getPRState(options.filter.state, VCSService.bitbucket); + if (state) { + params = { ...params, state }; + } } const response = >>await this.client.pullrequests.list(params); From 4a2d83d258a3894f3527e656216d79328cc10ca9 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 13:02:53 +0100 Subject: [PATCH 058/196] fix: rename files --- src/services/bitbucket/BitbucketService.ts | 4 ++-- src/services/git/GitHubService.ts | 4 ++-- src/services/git/{ICVSService.ts => IVCSService.ts} | 0 src/services/git/{CSVServicesUtils.ts => VCSServicesUtils.ts} | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename src/services/git/{ICVSService.ts => IVCSService.ts} (100%) rename src/services/git/{CSVServicesUtils.ts => VCSServicesUtils.ts} (94%) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 9854f7d8e..349529e3b 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -25,10 +25,10 @@ import { Directory, File, } from '../git/model'; -import { VCSService, IVCSService, BitbucketPullRequestState } from '../git/ICVSService'; +import { VCSService, IVCSService, BitbucketPullRequestState } from '../git/IVCSService'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; -import { VCSServicesUtils } from '../git/CSVServicesUtils'; +import { VCSServicesUtils } from '../git/VCSServicesUtils'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index e4cc35c1e..9144b890d 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -17,8 +17,8 @@ import { ErrorFactory } from '../../lib/errors'; import { ICache } from '../../scanner/cache/ICache'; import { InMemoryCache } from '../../scanner/cache/InMemoryCache'; import { Types } from '../../types'; -import { VCSServicesUtils } from './CSVServicesUtils'; -import { IVCSService, VCSService } from './ICVSService'; +import { VCSServicesUtils } from './VCSServicesUtils'; +import { IVCSService, VCSService } from './IVCSService'; import { Commit, Contributor, diff --git a/src/services/git/ICVSService.ts b/src/services/git/IVCSService.ts similarity index 100% rename from src/services/git/ICVSService.ts rename to src/services/git/IVCSService.ts diff --git a/src/services/git/CSVServicesUtils.ts b/src/services/git/VCSServicesUtils.ts similarity index 94% rename from src/services/git/CSVServicesUtils.ts rename to src/services/git/VCSServicesUtils.ts index 8d7f3ece9..647f83075 100644 --- a/src/services/git/CSVServicesUtils.ts +++ b/src/services/git/VCSServicesUtils.ts @@ -1,5 +1,5 @@ import { PullRequestState } from '../../inspectors/ICollaborationInspector'; -import { BitbucketPullRequestState, VCSService } from './ICVSService'; +import { BitbucketPullRequestState, VCSService } from './IVCSService'; import { GitHubPullRequestState } from './IGitHubService'; export class VCSServicesUtils { From 42a10e558adb233d60582a94cb0dca747be8f844 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 14:28:44 +0100 Subject: [PATCH 059/196] fix: use qs library --- package.json | 2 ++ src/services/git/GitHubService.ts | 6 ++++-- yarn.lock | 10 ++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bd86d2810..fc7c59c2e 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@octokit/rest": "16.35.0", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", + "@types/qs": "^6.9.0", "axios": "0.19.0", "bitbucket": "1.15.2", "colors": "1.4.0", @@ -48,6 +49,7 @@ "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", + "qs": "^6.9.1", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 9144b890d..48d5d1c87 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -17,7 +17,6 @@ import { ErrorFactory } from '../../lib/errors'; import { ICache } from '../../scanner/cache/ICache'; import { InMemoryCache } from '../../scanner/cache/InMemoryCache'; import { Types } from '../../types'; -import { VCSServicesUtils } from './VCSServicesUtils'; import { IVCSService, VCSService } from './IVCSService'; import { Commit, @@ -34,6 +33,8 @@ import { RepoContentType, Symlink, } from './model'; +import { VCSServicesUtils } from './VCSServicesUtils'; +import qs from 'qs'; const debug = Debug('cli:services:git:github-service'); @injectable() @@ -75,7 +76,8 @@ export class GitHubService implements IVCSService { let url = 'GET /repos/:owner/:repo/pulls'; if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { const state = VCSServicesUtils.getPRState(options.filter.state, VCSService.github); - url = `${url}?state=${state}`; + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true }); + url = `${url}${stateForUri}`; } const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); diff --git a/yarn.lock b/yarn.lock index eaf20aec1..33355313f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -843,6 +843,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/qs@^6.9.0": + version "6.9.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.0.tgz#2a5fa918786d07d3725726f7f650527e1cfeaffd" + integrity sha512-c4zji5CjWv1tJxIZkz1oUtGcdOlsH3aza28Nqmm+uNDWBRHoMsjooBEN4czZp1V3iXPihE/VRUOBqg+4Xq0W4g== + "@types/retry@^0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -7248,6 +7253,11 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== +qs@^6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" From 7f19213998a1dfc04b6248eed45b8e740f40c638 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 14:57:10 +0100 Subject: [PATCH 060/196] fix: return array of states --- src/services/git/VCSServicesUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/git/VCSServicesUtils.ts b/src/services/git/VCSServicesUtils.ts index 647f83075..c19239277 100644 --- a/src/services/git/VCSServicesUtils.ts +++ b/src/services/git/VCSServicesUtils.ts @@ -6,7 +6,7 @@ export class VCSServicesUtils { static getPRState = ( state: PullRequestState | undefined, service: VCSService, - ): GitHubPullRequestState | BitbucketPullRequestState | undefined => { + ): GitHubPullRequestState | BitbucketPullRequestState | BitbucketPullRequestState[] | undefined => { if (service === VCSService.github) { switch (state) { case PullRequestState.open: @@ -27,7 +27,7 @@ export class VCSServicesUtils { case PullRequestState.closed: return BitbucketPullRequestState.closed; case PullRequestState.all: - return BitbucketPullRequestState.open && BitbucketPullRequestState.closed && BitbucketPullRequestState.declined; + return [BitbucketPullRequestState.open, BitbucketPullRequestState.closed, BitbucketPullRequestState.declined]; default: return undefined; } From ab592ce40ec88c9a0e87107a50350694940b28f5 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 14:57:44 +0100 Subject: [PATCH 061/196] WIP: fix listing all PRs --- src/services/bitbucket/BitbucketService.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 349529e3b..622ca6c1d 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -88,8 +88,13 @@ export class BitbucketService implements IVCSService { let state; if (options?.filter?.state) { - state = VCSServicesUtils.getPRState(options.filter.state, VCSService.bitbucket); + state = VCSServicesUtils.getPRState(options.filter.state, VCSService.bitbucket); if (state) { + if (state.length > 1) { + state = state; + //params = { ...params, state }; + } + state = state; params = { ...params, state }; } } From fb46b95172576a5d7d4b9f05d25b07beb9a438d0 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Mon, 25 Nov 2019 14:13:53 +0000 Subject: [PATCH 062/196] fix(cli): using sync method to write files & practices are sorted alphabetically --- src/init.configurator.ts | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/init.configurator.ts b/src/init.configurator.ts index 3e3af4232..60b9f506f 100644 --- a/src/init.configurator.ts +++ b/src/init.configurator.ts @@ -1,13 +1,12 @@ import * as fs from 'fs'; import { Container } from 'inversify'; import { Types } from './types'; -import { PracticeMetadata } from './model'; -import { ErrorFactory } from './lib/errors'; import { cli } from 'cli-ux'; +import { IPracticeWithMetadata } from './practices/DxPracticeDecorator'; export const initialize = (scanPath: string, container: Container) => { - cli.action.start(`Initializing configuration: ${scanPath}`); const yamlPath = `${scanPath}/.dxscannerrc.yaml`; + cli.action.start(`Initializing configuration: ${yamlPath}`); // check if .dxscannerrc.yaml already exists const yamlExists: boolean = fs.existsSync(yamlPath); if (!yamlExists) { @@ -19,18 +18,13 @@ export const initialize = (scanPath: string, container: Container) => { const createYAML = (yamlPath: string, container: Container) => { let yamlInitContent = `# practices:`; - const initializedPractices: ContainerPracticeMetadata[] = container.getAll(Types.Practice); - for (const practice of initializedPractices) { + // get Metadata and sort it alphabetically using id + const sortedInitializedPractices = container + .getAll(Types.Practice) + .sort((a, b) => a.getMetadata().id.localeCompare(b.getMetadata().id)); + for (const practice of sortedInitializedPractices) { const dataObject = practice.getMetadata(); yamlInitContent += `\n# ${dataObject.id}: ${dataObject.impact}`; } - fs.writeFile(yamlPath, yamlInitContent, (err) => { - if (err) { - throw ErrorFactory.newInternalError(err.message); - } - }); + fs.writeFileSync(yamlPath, yamlInitContent); }; - -export interface ContainerPracticeMetadata { - getMetadata(): PracticeMetadata; -} From caef75b3f4eeade797b7a5f59e497677dcea7ba4 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 25 Nov 2019 15:17:36 +0100 Subject: [PATCH 063/196] fix: disable camel case in whole file instead of each line --- test/helpers/gitHubNock.ts | 88 +++----------------------------------- 1 file changed, 6 insertions(+), 82 deletions(-) diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 430fa2613..f77f72e49 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ import nock from 'nock'; import * as nodePath from 'path'; @@ -39,16 +40,12 @@ export class GitHubNock { queryState?: string, persist = true, ): PullRequestItem[] { - // eslint-disable-next-line @typescript-eslint/camelcase const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { - // eslint-disable-next-line @typescript-eslint/camelcase if (!created_at) { - // eslint-disable-next-line @typescript-eslint/camelcase created_at = '2012-03-06T23:06:50Z'; } - // eslint-disable-next-line @typescript-eslint/camelcase + if (!updated_at) { - // eslint-disable-next-line @typescript-eslint/camelcase updated_at = created_at; } return new PullRequestItem( @@ -74,19 +71,16 @@ export class GitHubNock { head: string, base: string, persist = true, - // eslint-disable-next-line @typescript-eslint/camelcase + created_at?: string, - // eslint-disable-next-line @typescript-eslint/camelcase + updated_at?: string, ): PullRequest { - // eslint-disable-next-line @typescript-eslint/camelcase if (!created_at) { - // eslint-disable-next-line @typescript-eslint/camelcase created_at = '2012-03-06T23:06:50Z'; } - // eslint-disable-next-line @typescript-eslint/camelcase + if (!updated_at) { - // eslint-disable-next-line @typescript-eslint/camelcase updated_at = created_at; } const responseBody = new PullRequest( @@ -261,92 +255,49 @@ export class Repository { this.id = id; this.name = name; this.owner = owner; - // eslint-disable-next-line @typescript-eslint/camelcase this.full_name = `${this.owner.login}/${this.name}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.html_url = `${this.owner.html_url}/${this.name}`; this.url = `https://api.github.com/repos/${this.full_name}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.archive_url = `${this.url}/{archive_format}{/ref}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.assignees_url = `${this.url}/assignees{/user}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.blobs_url = `${this.url}/git/blobs{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.branches_url = `${this.url}/branches{/branch}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.collaborators_url = `${this.url}/collaborators{/collaborator}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.comments_url = `${this.url}/comments{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.commits_url = `${this.url}/commits{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.compare_url = `${this.url}/compare/{base}...{head}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.contents_url = `${this.url}/contents/{+path}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.contributors_url = `${this.url}/contributors`; - // eslint-disable-next-line @typescript-eslint/camelcase this.deployments_url = `${this.url}/deployments`; - // eslint-disable-next-line @typescript-eslint/camelcase this.downloads_url = `${this.url}/downloads`; - // eslint-disable-next-line @typescript-eslint/camelcase this.events_url = `${this.url}/events`; - // eslint-disable-next-line @typescript-eslint/camelcase this.forks_url = `${this.url}/forks`; - // eslint-disable-next-line @typescript-eslint/camelcase this.git_commits_url = `${this.url}/git/commits{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.git_refs_url = `${this.url}/git/refs{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.git_tags_url = `${this.url}/git/tags{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.git_url = `git:github.com/${this.full_name}.git`; - // eslint-disable-next-line @typescript-eslint/camelcase this.issue_comment_url = `${this.url}/issues/comments{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.issue_events_url = `${this.url}/issues/events{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.issues_url = `${this.url}/issues{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.keys_url = `${this.url}/keys{/key_id}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.labels_url = `${this.url}/labels{/name}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.languages_url = `${this.url}/languages`; - // eslint-disable-next-line @typescript-eslint/camelcase this.merges_url = `${this.url}/merges`; - // eslint-disable-next-line @typescript-eslint/camelcase this.milestones_url = `${this.url}/milestones{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.notifications_url = `${this.url}/notifications{?since,all,participating}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.pulls_url = `${this.url}/pulls{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.releases_url = `${this.url}/releases{/id}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.ssh_url = `git@github.com:${this.full_name}.git`; - // eslint-disable-next-line @typescript-eslint/camelcase this.stargazers_url = `${this.url}/stargazers`; - // eslint-disable-next-line @typescript-eslint/camelcase this.statuses_url = `${this.url}/statuses/{sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.subscribers_url = `${this.url}/subscribers`; - // eslint-disable-next-line @typescript-eslint/camelcase this.subscription_url = `${this.url}/subscription`; - // eslint-disable-next-line @typescript-eslint/camelcase this.tags_url = `${this.url}/tags`; - // eslint-disable-next-line @typescript-eslint/camelcase this.teams_url = `${this.url}/teams`; - // eslint-disable-next-line @typescript-eslint/camelcase this.trees_url = `${this.url}/git/trees{/sha}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.clone_url = `https://github.com/${this.full_name}.git`; - // eslint-disable-next-line @typescript-eslint/camelcase this.mirror_url = `git:git.example.com/${this.full_name}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.hooks_url = `${this.url}/hooks`; - // eslint-disable-next-line @typescript-eslint/camelcase this.svn_url = `https://svn.github.com/${this.full_name}`; } } @@ -385,11 +336,8 @@ class RepoContent { this.sha = sha; this.size = 0; this.url = repository.contents_url.replace('{+path}', `${this.path}?ref=${ref}`); - // eslint-disable-next-line @typescript-eslint/camelcase this.html_url = `${repository.html_url}/${gitType}/${ref}/${this.path}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.git_url = gitPattern.replace('{/sha}', `/${this.sha}`); - // eslint-disable-next-line @typescript-eslint/camelcase this.download_url = downloadable ? `https://raw.githubusercontent.com/${repository.owner.login}/${repository.name}/${ref}/${this.path}` : null; @@ -454,28 +402,17 @@ export class UserItem { constructor(id: string, login: string) { this.login = login; this.id = id; - // eslint-disable-next-line @typescript-eslint/camelcase - this.avatar_url = `https://avatars3.githubusercontent.com/u/${this.id}`; + this.avatar_url = `https://avatars3.githubusercontent.cm/u/${this.id}`; this.url = `https://api.github.com/users/${this.login}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.html_url = `https://github.com/${this.login}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.followers_url = `${this.url}/followers`; - // eslint-disable-next-line @typescript-eslint/camelcase this.following_url = `${this.url}/following{/other_user}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.gists_url = `${this.url}/gists{/gist_id}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.starred_url = `${this.url}/starred{/owner}{/repo}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.subscriptions_url = `${this.url}/subscriptions`; - // eslint-disable-next-line @typescript-eslint/camelcase this.organizations_url = `${this.url}/orgs`; - // eslint-disable-next-line @typescript-eslint/camelcase this.repos_url = `${this.url}/repos`; - // eslint-disable-next-line @typescript-eslint/camelcase this.events_url = `${this.url}/events{/privacy}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.received_events_url = `${this.url}/received_events`; } } @@ -557,40 +494,27 @@ export class PullRequestItem { this.base = base; this.head = head; this.url = this.base.repo.pulls_url.replace('{/number}', `/${this.number}`); - // eslint-disable-next-line @typescript-eslint/camelcase this.commits_url = `${this.url}/commits`; - // eslint-disable-next-line @typescript-eslint/camelcase this.review_comments_url = `${this.url}/comments`; - // eslint-disable-next-line @typescript-eslint/camelcase this.review_comment_url = `${this.base.repo.pulls_url.replace('{/number}', '')}/comments{/number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.issue_url = this.base.repo.issues_url.replace('{/number}', `/${this.number}`); - // eslint-disable-next-line @typescript-eslint/camelcase this.comments_url = `${this.issue_url}/comments`; - // eslint-disable-next-line @typescript-eslint/camelcase this.html_url = `${this.base.repo.html_url}/pull/${this.number}`; - // eslint-disable-next-line @typescript-eslint/camelcase this.diff_url = `${this.html_url}.diff`; - // eslint-disable-next-line @typescript-eslint/camelcase this.patch_url = `${this.html_url}.patch`; - // eslint-disable-next-line @typescript-eslint/camelcase this.statuses_url = this.head.repo.statuses_url.replace('{sha}', this.head.ref); this.state = state; this.title = title; this.user = this.head.user; this.body = body; - // eslint-disable-next-line @typescript-eslint/camelcase this.created_at = createdAt; - // eslint-disable-next-line @typescript-eslint/camelcase this.updated_at = updatedAt; this._links = { self: { href: this.url }, html: { href: this.html_url }, issue: { href: this.issue_url }, comments: { href: this.comments_url }, - // eslint-disable-next-line @typescript-eslint/camelcase review_comments: { href: this.review_comments_url }, - // eslint-disable-next-line @typescript-eslint/camelcase review_comment: { href: this.review_comment_url }, commits: { href: this.commits_url }, statuses: { href: this.statuses_url }, From 43c8eaf33e4b596638d6a5a0a4a78e0adc3c59b9 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 26 Nov 2019 22:10:18 +0100 Subject: [PATCH 064/196] fix: revert changes --- .../getPullsServiceResponse.mock.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts index 0f5c257f1..2a97899fd 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts @@ -19,12 +19,12 @@ export const getPullsServiceResponse: Paginated = { }, }, body: 'Please pull these awesome changes', - closedAt: '2012-03-06T23:06:50Z', - createdAt: '2012-03-06T23:06:50Z', + closedAt: '2011-01-26T19:01:12Z', + createdAt: '2011-01-26T19:01:12Z', id: 1, - mergedAt: '2012-03-06T23:06:50Z', + mergedAt: '2011-01-26T19:01:12Z', state: 'open', - updatedAt: '2012-03-06T23:06:50Z', + updatedAt: '2011-01-26T19:01:12Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1347', user: { id: '1', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }, From 43d3f16189c90933029ec3ed41dc2732ad951b51 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 26 Nov 2019 22:13:30 +0100 Subject: [PATCH 065/196] fix: revert changes --- .../getPullServiceResponse.mock.ts | 8 ++++---- test/helpers/gitHubNock.ts | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index 0a9b278c5..6efc602c1 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -14,12 +14,12 @@ export const getPullServiceResponse: PullRequest = { }, }, body: '', - closedAt: '2012-03-06T23:06:50Z', - createdAt: '2012-03-06T23:06:50Z', + closedAt: '2011-01-26T19:01:12Z', + createdAt: '2011-01-26T19:01:12Z', id: 1, - mergedAt: '2012-03-06T23:06:50Z', + mergedAt: '2011-01-26T19:01:12Z', state: 'closed', - updatedAt: '2012-03-06T23:06:50Z', + updatedAt: '2011-01-26T19:01:12Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index f77f72e49..13e59eca0 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -236,9 +236,9 @@ export class Repository { has_downloads = true; archived = false; disabled = false; - pushed_at = '2012-03-06T23:06:50Z'; - created_at = '2012-03-06T23:06:50Z'; - updated_at = '2012-03-06T23:06:50Z'; + pushed_at = '2011-01-26T19:06:43Z'; + created_at = '2011-01-26T19:01:12Z'; + updated_at = '2011-01-26T19:14:43Z'; permissions = { admin: true, push: true, @@ -458,9 +458,9 @@ export class PullRequestItem { labels = []; milestone = null; created_at: string; - updated_at = '2012-03-06T23:06:50Z'; - closed_at = '2012-03-06T23:06:50Z'; - merged_at = '2012-03-06T23:06:50Z'; + updated_at = '2011-01-26T19:01:12Z'; + closed_at = '2011-01-26T19:01:12Z'; + merged_at = '2011-01-26T19:01:12Z'; merge_commit_sha = 'e5bd3914e2e596debea16f433f57875b5b90bcd6'; assignee = null; assignees = []; From 98b444c1feb43612371e97913adefd8abb2ae89e Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 26 Nov 2019 22:37:20 +0100 Subject: [PATCH 066/196] fix: revert changes and fix tests --- .../gitHubServiceMockFolder/getPullServiceResponse.mock.ts | 4 ++-- .../gitHubServiceMockFolder/getPullsServiceResponse.mock.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index 6efc602c1..bfe0a105c 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -15,11 +15,11 @@ export const getPullServiceResponse: PullRequest = { }, body: '', closedAt: '2011-01-26T19:01:12Z', - createdAt: '2011-01-26T19:01:12Z', + createdAt: '2012-03-06T23:06:50Z', id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'closed', - updatedAt: '2011-01-26T19:01:12Z', + updatedAt: '2012-03-06T23:06:50Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts index 2a97899fd..98f60c4a2 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts @@ -20,11 +20,11 @@ export const getPullsServiceResponse: Paginated = { }, body: 'Please pull these awesome changes', closedAt: '2011-01-26T19:01:12Z', - createdAt: '2011-01-26T19:01:12Z', + createdAt: '2012-03-06T23:06:50Z', id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'open', - updatedAt: '2011-01-26T19:01:12Z', + updatedAt: '2012-03-06T23:06:50Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1347', user: { id: '1', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }, From 89765c29cd07aa0a7e2247b0dbbcb9aba8e9e0ba Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 26 Nov 2019 22:43:58 +0100 Subject: [PATCH 067/196] fix: revert changes --- .../gitHubServiceMockFolder/getPullServiceResponse.mock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index bfe0a105c..93451e502 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -19,7 +19,7 @@ export const getPullServiceResponse: PullRequest = { id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'closed', - updatedAt: '2012-03-06T23:06:50Z', + updatedAt: '2011-01-26T19:01:12Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; From e8ae9ac9350a9f490efd71153653128d61d4c5e2 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 26 Nov 2019 22:53:25 +0100 Subject: [PATCH 068/196] fix: revert change --- .../gitHubServiceMockFolder/getPullsServiceResponse.mock.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts index 98f60c4a2..cf3d152b5 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts @@ -31,5 +31,7 @@ export const getPullsServiceResponse: Paginated = { ], page: 1, perPage: 1, + + totalCount: 1, }; From 741e491dd96f844c22b3d7aa5a6701cee4c18c57 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 27 Nov 2019 08:59:41 +0100 Subject: [PATCH 069/196] fix: revert change --- .../gitHubServiceMockFolder/getPullServiceResponse.mock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index 93451e502..bfe0a105c 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -19,7 +19,7 @@ export const getPullServiceResponse: PullRequest = { id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'closed', - updatedAt: '2011-01-26T19:01:12Z', + updatedAt: '2012-03-06T23:06:50Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; From 04374714923f3fb2294562cb19986d2e04ce6eee Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 27 Nov 2019 09:27:13 +0100 Subject: [PATCH 070/196] fix: revert changes and fix tets --- .../gitHubServiceMockFolder/getPullServiceResponse.mock.ts | 4 ++-- .../gitHubServiceMockFolder/getPullsServiceResponse.mock.ts | 4 ++-- test/helpers/gitHubNock.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts index bfe0a105c..6efc602c1 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock.ts @@ -15,11 +15,11 @@ export const getPullServiceResponse: PullRequest = { }, body: '', closedAt: '2011-01-26T19:01:12Z', - createdAt: '2012-03-06T23:06:50Z', + createdAt: '2011-01-26T19:01:12Z', id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'closed', - updatedAt: '2012-03-06T23:06:50Z', + updatedAt: '2011-01-26T19:01:12Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1', user: { id: '583231', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }; diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts index cf3d152b5..97d8c3658 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock.ts @@ -20,11 +20,11 @@ export const getPullsServiceResponse: Paginated = { }, body: 'Please pull these awesome changes', closedAt: '2011-01-26T19:01:12Z', - createdAt: '2012-03-06T23:06:50Z', + createdAt: '2011-01-26T19:01:12Z', id: 1, mergedAt: '2011-01-26T19:01:12Z', state: 'open', - updatedAt: '2012-03-06T23:06:50Z', + updatedAt: '2011-01-26T19:01:12Z', url: 'https://api.github.com/repos/octocat/Hello-World/pulls/1347', user: { id: '1', login: 'octocat', url: 'https://api.github.com/users/octocat' }, }, diff --git a/test/helpers/gitHubNock.ts b/test/helpers/gitHubNock.ts index 13e59eca0..3471cb511 100644 --- a/test/helpers/gitHubNock.ts +++ b/test/helpers/gitHubNock.ts @@ -42,7 +42,7 @@ export class GitHubNock { ): PullRequestItem[] { const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { if (!created_at) { - created_at = '2012-03-06T23:06:50Z'; + created_at = '2011-01-26T19:01:12Z'; } if (!updated_at) { @@ -77,7 +77,7 @@ export class GitHubNock { updated_at?: string, ): PullRequest { if (!created_at) { - created_at = '2012-03-06T23:06:50Z'; + created_at = '2011-01-26T19:01:12Z'; } if (!updated_at) { From 1c660ef7941553938a6675db1cdd79dde7ddf9c1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 27 Nov 2019 10:34:35 +0100 Subject: [PATCH 071/196] fix: tests --- .../getRepoCommitsResponse.mock.ts | 10 +++++----- .../getRepoCommitsServiceResponse.mock.ts | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts index 33c2401b2..3737c385a 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts @@ -9,12 +9,12 @@ export const getRepoCommitsResponse = [ author: { name: 'The Octocat', email: 'octocat@nowhere.com', - date: '2012-03-06T23:06:50Z', + date: '2011-01-14T04:42:41Z', }, committer: { name: 'The Octocat', email: 'octocat@nowhere.com', - date: '2012-03-06T23:06:50Z', + date: '2011-01-14T04:42:41Z', }, message: 'Merge pull request #6 from Spaceghost/patch-1\n\nNew line at end of file.', tree: { @@ -55,12 +55,12 @@ export const getRepoCommitsResponse = [ author: { name: 'Johnneylee Jack Rollins', email: 'johnneylee.rollins@gmail.com', - date: '2011-09-14T04:42:41Z', + date: '2011-01-14T04:42:41Z', }, committer: { name: 'Johnneylee Jack Rollins', email: 'johnneylee.rollins@gmail.com', - date: '2011-09-14T04:42:41Z', + date: '2011-01-14T04:42:41Z', }, message: 'New line at end of file. --Signed off by Spaceghost', tree: { @@ -96,7 +96,7 @@ export const getRepoCommitsResponse = [ author: { name: 'cameronmcefee', email: 'cameron@github.com', - date: '2011-01-26T19:06:08Z', + date: '2011-01-14T04:42:41Z', }, committer: { name: 'cameronmcefee', diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts index d517032e8..95f6737b2 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock.ts @@ -10,7 +10,7 @@ export const getRepoCommitsServiceResponse: Paginated = { author: { name: 'The Octocat', email: 'octocat@nowhere.com', - date: '2012-03-06T23:06:50Z', + date: '2011-01-14T04:42:41Z', }, tree: { sha: 'b4eecafa9be2f2006ce1b709d6857b07069b4608', @@ -25,7 +25,7 @@ export const getRepoCommitsServiceResponse: Paginated = { author: { name: 'Johnneylee Jack Rollins', email: 'johnneylee.rollins@gmail.com', - date: '2011-09-14T04:42:41Z', + date: '2011-01-14T04:42:41Z', }, tree: { sha: 'b4eecafa9be2f2006ce1b709d6857b07069b4608', @@ -40,7 +40,7 @@ export const getRepoCommitsServiceResponse: Paginated = { author: { name: 'cameronmcefee', email: 'cameron@github.com', - date: '2011-01-26T19:06:08Z', + date: '2011-01-14T04:42:41Z', }, tree: { sha: 'fcf4a9bba6857422971d67147517eb5edfdbf48d', From dca57074ff1d125868ca68ce033ee100e06ca212 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 12:57:13 +0100 Subject: [PATCH 072/196] fix: return repoCommits in own interface --- src/services/git/GitHubService.ts | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index d12d31873..56914e0fe 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -174,9 +174,35 @@ export class GitHubService implements ICVSService { * * The response will include a verification object that describes the result of verifying the commit's signature. * To see the included fields in the verification object see https://octokit.github.io/rest.js/#pagination. + * + * Sha can be SHA or branch name. */ - async getRepoCommits(owner: string, repo: string) { - return this.unwrap(this.client.repos.listCommits({ owner, repo })); + async getRepoCommits(owner: string, repo: string, sha?: string) { + let url = 'GET /repos/:owner/:repo/commits'; + if (sha !== undefined) { + url = `${url}?state=${sha}`; + } + + const response = await this.paginate(url, owner, repo); + + const items = response.map((val) => ({ + sha: val.sha, + url: val.url, + message: val.commit.message, + author: { + name: val.commit.author.name, + email: val.commit.author.email, + date: val.commit.author.date, + }, + tree: { + sha: val.commit.tree.sha, + url: val.commit.tree.url, + }, + verified: val.commit.verification.verified, + })); + const pagination = this.getPagination(response.length); + + return { items, ...pagination }; } /** From fba7af940fdf1cf199cc526d0826cf91be3f3ba5 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 13:05:37 +0100 Subject: [PATCH 073/196] feat: add getRepoCommits into CollaborationInspector --- src/inspectors/CollaborationInspector.ts | 4 ++++ src/inspectors/ICollaborationInspector.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index d44cb7391..02d520aa9 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -26,4 +26,8 @@ export class CollaborationInspector implements ICollaborationInspector { async getPullCommits(owner: string, repo: string, prNumber: number) { return this.service.getPullCommits(owner, repo, prNumber); } + + async getRepoCommits(owner: string, repo: string, sha?: string) { + return this.service.getRepoCommits(owner, repo, sha); + } } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 03b36e5e1..cb326b57c 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,11 +1,12 @@ import { Paginated } from './common/Paginated'; -import { PullCommits, PullFiles, PullRequest } from '../services/git/model'; +import { PullCommits, PullFiles, PullRequest, Commit } from '../services/git/model'; export interface ICollaborationInspector { getPullRequests(owner: string, repo: string): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; + getRepoCommits(owner: string, repo: string, sha?: string): Promise>; } export enum PullRequestState { From 8b544ef1c4c69087b9d22ea10478dbf8f910ffeb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 20 Nov 2019 13:36:02 +0100 Subject: [PATCH 074/196] fix: add getRepoCommits() into interface, fix: add return type --- src/services/bitbucket/BitbucketService.ts | 2 +- src/services/git/GitHubService.ts | 2 +- src/services/git/ICVSService.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 56618d0fd..a432d0e00 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -282,7 +282,7 @@ export class BitbucketService implements ICVSService { throw new Error('Method not implemented yet.'); } - async getRepoCommits(owner: string, repo: string) { + async getRepoCommits(owner: string, repo: string): Promise> { throw new Error('Method not implemented yet.'); } diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 56914e0fe..cb0981d32 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -177,7 +177,7 @@ export class GitHubService implements ICVSService { * * Sha can be SHA or branch name. */ - async getRepoCommits(owner: string, repo: string, sha?: string) { + async getRepoCommits(owner: string, repo: string, sha?: string): Promise> { let url = 'GET /repos/:owner/:repo/commits'; if (sha !== undefined) { url = `${url}?state=${sha}`; diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index 0b427b83c..0dd754814 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -12,6 +12,7 @@ export interface ICVSService { getPullRequestReviews(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; getPullRequest(owner: string, repo: string, prNumber: number): Promise; + getRepoCommits(owner: string, repo: string, sha?: string): Promise>; getCommit(owner: string, repo: string, commitSha: string): Promise; getContributors(owner: string, repo: string): Promise>; getContributorsStats(owner: string, repo: string): Promise>; From d253ac0bbe66ab20617056db2cec2ded2a5123e1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 27 Nov 2019 21:21:08 +0100 Subject: [PATCH 075/196] feature: add new practice - correct commit message --- .../CorrectCommitMessages.ts | 70 +++++++++++++++++++ src/practices/index.ts | 2 + 2 files changed, 72 insertions(+) create mode 100644 src/practices/LanguageIndependent/CorrectCommitMessages.ts diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts new file mode 100644 index 000000000..1338fd09d --- /dev/null +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -0,0 +1,70 @@ +import { IPractice } from '../IPractice'; +import { PracticeEvaluationResult, PracticeImpact } from '../../model'; +import { DxPractice } from '../DxPracticeDecorator'; +import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { GitServiceUtils } from '../../services/git/GitServiceUtils'; +import { intersection } from 'lodash'; + +@DxPractice({ + id: 'LanguageIndependent.CorrectCommitMessages', + name: 'Write Commit Messages by Convention', + impact: PracticeImpact.small, + suggestion: '', + reportOnlyOnce: true, + url: 'https://www.conventionalcommits.org/en/v1.0.0/', +}) +export class CorrectCommitMessagesPractice implements IPractice { + async isApplicable(): Promise { + return true; + } + + async evaluate(ctx: PracticeContext): Promise { + if (!ctx.fileInspector || !ctx.collaborationInspector) { + return PracticeEvaluationResult.unknown; + } + const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); + const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); + + const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); + const messages = repoCommits.items.map((val) => val.message); + + const conventionalElements = [ + 'build', + 'ci', + 'chore', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test', + 'Update', + 'Merge', + ]; + const elements: string[] = []; + //const messages = ['fix(core): test', 'chore: test2', 'Merge pr']; + + messages.forEach((message) => { + let element; + element = message.split(':'); + + if (element.length > 1) { + element = element[0].split('('); + elements.push(element[0]); + } else { + const element = message.split(' '); + elements.push(element[0]); + } + }); + + if (elements.length < 1) { + return PracticeEvaluationResult.notPracticing; + } + + const isCorrectCommit = elements.every((element) => conventionalElements.includes(element)); + + return isCorrectCommit ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; + } +} diff --git a/src/practices/index.ts b/src/practices/index.ts index aed48be3e..147be3f4b 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -22,6 +22,7 @@ import { ESLintWithoutErrorsPractice } from './JavaScript/ESLintWithoutErrorsPra import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrectlySetPractice'; import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; +import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessages'; // register practices here export const practices = [ @@ -49,4 +50,5 @@ export const practices = [ JavaGitignoreCorrectlySetPractice, TsGitignoreCorrectlySetPractice, DoesPullRequestsPractice, + CorrectCommitMessagesPractice, ]; From 8a36035cd1eded5ff6351da0f52f723483ca94b9 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 27 Nov 2019 21:21:23 +0100 Subject: [PATCH 076/196] test: add tests --- .../CorrectCommitMessages.spec.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts new file mode 100644 index 000000000..0e5b6c49d --- /dev/null +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts @@ -0,0 +1,48 @@ +import { createTestContainer, TestContainerContext } from '../../inversify.config'; +import { PracticeEvaluationResult } from '../../model'; +import nock from 'nock'; +import { GitHubNock } from '../../../test/helpers/gitHubNock'; +import { getRepoCommitsResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; +import { CorrectCommitMessagesPractice } from './CorrectCommitMessages'; +import { CollaborationInspector } from '../../inspectors/CollaborationInspector'; +import { GitHubService } from '../../services/git/GitHubService'; + +describe('DoesPullRequests', () => { + let practice: CorrectCommitMessagesPractice; + let containerCtx: TestContainerContext; + const MockedCollaborationInspector = >(CollaborationInspector); + let mockCollaborationInspector: CollaborationInspector; + const MockedGithubService = >(GitHubService); + + beforeEach(async () => { + nock.cleanAll(); + }); + + beforeAll(() => { + containerCtx = createTestContainer(); + containerCtx.container.bind('CorrectCommitMessagesPractice').to(CorrectCommitMessagesPractice); + practice = containerCtx.container.get('CorrectCommitMessagesPractice'); + mockCollaborationInspector = new MockedCollaborationInspector(); + }); + + afterEach(async () => { + containerCtx.virtualFileSystemService.clearFileSystem(); + containerCtx.practiceContext.fileInspector!.purgeCache(); + }); + + // it('return practicing if the commit messages are correct', async () => { + // containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + // new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + + // const evaluated = await practice.evaluate(containerCtx.practiceContext); + // expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + // }); + + it('return not practicing if the commit messages are incorrect', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + }); +}); From 2e04ac9108b5b0fb03c19c492d5f6bbeda5bff2a Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 28 Nov 2019 22:41:01 +0100 Subject: [PATCH 077/196] feat: install parse-commit-message and add typings for that library --- package.json | 1 + typings/parse-commit-message.ts | 29 ++++++++++++++++++++++++++ yarn.lock | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 typings/parse-commit-message.ts diff --git a/package.json b/package.json index 20f3ac2d0..27980e36b 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", + "parse-commit-message": "^3.2.3", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", diff --git a/typings/parse-commit-message.ts b/typings/parse-commit-message.ts new file mode 100644 index 000000000..3d41e04d0 --- /dev/null +++ b/typings/parse-commit-message.ts @@ -0,0 +1,29 @@ +declare module 'parse-commit-message' { + let parser: { + validate(commits: string[] | string, ret: boolean): boolean; + validateCommit(commit: object, ret: boolean): boolean; + parseCommit(commit: string): Commit; + }; + export = parser; +} + +type Header = { + type: string; + scope?: string | null; + subject: string; +}; + +type Commit = { + header: Header; + body?: string | null; + footer?: string | null; + increment?: string | boolean; + isBreaking?: boolean; + mentions?: Array; +}; + +type Mention = { + handle: string; + mention: string; + index: number; +}; diff --git a/yarn.lock b/yarn.lock index a96d50442..9011240f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1997,6 +1997,13 @@ collapse-white-space@^1.0.2: resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== +collect-mentions@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-mentions/-/collect-mentions-1.0.2.tgz#30734fcb33cbf8999cf7fd6d9c3133045f0b4dcc" + integrity sha512-/jRhzWp5bkZnvgtR+agXT0RvYKBXOl4uG+eKA6ip3tp1x+jRAV36jW2TceKutOeuEPjHKaQ6DJjeh5zvZF0fWQ== + dependencies: + mentions-regex "^2.0.3" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2464,6 +2471,11 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2896,6 +2908,11 @@ eslint@6.6.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.0.84: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -5726,6 +5743,11 @@ memfs@2.16.1: fast-extend "0.0.2" fs-monkey "^0.3.3" +mentions-regex@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/mentions-regex/-/mentions-regex-2.0.3.tgz#442717a0048e53c2d2e2ae5e63a4e54a55ca9603" + integrity sha1-RCcXoASOU8LS4q5eY6TlSlXKlgM= + meow@^3.6.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -5902,6 +5924,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mixin-deep@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-2.0.1.tgz#9a6946bef4a368401b784970ae3caaaa6bab02fa" + integrity sha512-imbHQNRglyaplMmjBLL3V5R6Bfq5oM+ivds3SKgc6oRtzErEnBUUc5No11Z2pilkUvl42gJvi285xTNswcKCMA== + mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -6871,6 +6898,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-commit-message@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/parse-commit-message/-/parse-commit-message-3.2.3.tgz#96a0b2e3fb295aece355d3a8bd326b6a6f555372" + integrity sha512-JujCvCYUrjhmaRHb2AuzR9mAos9JE/5+ZftAaFoGtPhoJ9KNQcgx6JtrWGmGFkVjfky5qTBRjzJeFZla1Po0/A== + dependencies: + collect-mentions "^1.0.2" + dedent "^0.7.0" + esm "^3.0.84" + mixin-deep "^2.0.0" + parse-entities@^1.0.2, parse-entities@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" From cf4b5cb521cdf160871a1e4864d00522833987ea Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 28 Nov 2019 22:41:42 +0100 Subject: [PATCH 078/196] fix: use parser-commit-message instead of manual parsing --- .../CorrectCommitMessages.spec.ts | 21 +++++++--- .../CorrectCommitMessages.ts | 42 ++----------------- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts index 0e5b6c49d..33cadfabc 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts @@ -7,11 +7,12 @@ import { CorrectCommitMessagesPractice } from './CorrectCommitMessages'; import { CollaborationInspector } from '../../inspectors/CollaborationInspector'; import { GitHubService } from '../../services/git/GitHubService'; -describe('DoesPullRequests', () => { +describe('CorrectCommitMessages', () => { let practice: CorrectCommitMessagesPractice; let containerCtx: TestContainerContext; const MockedCollaborationInspector = >(CollaborationInspector); let mockCollaborationInspector: CollaborationInspector; + let mockGithubService: GitHubService; const MockedGithubService = >(GitHubService); beforeEach(async () => { @@ -23,6 +24,7 @@ describe('DoesPullRequests', () => { containerCtx.container.bind('CorrectCommitMessagesPractice').to(CorrectCommitMessagesPractice); practice = containerCtx.container.get('CorrectCommitMessagesPractice'); mockCollaborationInspector = new MockedCollaborationInspector(); + mockGithubService = new GitHubService({ uri: '.' }); }); afterEach(async () => { @@ -30,14 +32,21 @@ describe('DoesPullRequests', () => { containerCtx.practiceContext.fileInspector!.purgeCache(); }); - // it('return practicing if the commit messages are correct', async () => { - // containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - // new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); + // it('return practicing if the commit messages are correct', async () => { + // // containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + // // new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); - // const evaluated = await practice.evaluate(containerCtx.practiceContext); - // expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + // const getRepoCommits = (mockCollaborationInspector.getRepoCommits = async (owner: string, repo: string, sha?: string) => { + // return mockGithubService.getRepoCommits(owner, repo, sha); // }); + // const response = await getRepoCommits('pypy', 'pypy'); + // console.log(response); + + // const evaluated = await practice.evaluate(containerCtx.practiceContext); + // expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + // }); + it('return not practicing if the commit messages are incorrect', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts index 1338fd09d..5b534f338 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -3,7 +3,7 @@ import { PracticeEvaluationResult, PracticeImpact } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; -import { intersection } from 'lodash'; +import * as parser from 'parse-commit-message'; @DxPractice({ id: 'LanguageIndependent.CorrectCommitMessages', @@ -22,49 +22,15 @@ export class CorrectCommitMessagesPractice implements IPractice { if (!ctx.fileInspector || !ctx.collaborationInspector) { return PracticeEvaluationResult.unknown; } + const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); const messages = repoCommits.items.map((val) => val.message); - const conventionalElements = [ - 'build', - 'ci', - 'chore', - 'docs', - 'feat', - 'fix', - 'perf', - 'refactor', - 'revert', - 'style', - 'test', - 'Update', - 'Merge', - ]; - const elements: string[] = []; - //const messages = ['fix(core): test', 'chore: test2', 'Merge pr']; - - messages.forEach((message) => { - let element; - element = message.split(':'); - - if (element.length > 1) { - element = element[0].split('('); - elements.push(element[0]); - } else { - const element = message.split(' '); - elements.push(element[0]); - } - }); - - if (elements.length < 1) { - return PracticeEvaluationResult.notPracticing; - } - - const isCorrectCommit = elements.every((element) => conventionalElements.includes(element)); + const areCorrectMessages = parser.validate(messages, false); - return isCorrectCommit ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; + return areCorrectMessages ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; } } From c3e960000a10063b6ca204d7a03fe27c57716939 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 29 Nov 2019 11:41:09 +0100 Subject: [PATCH 079/196] test: add test for correct commit message --- .../CorrectCommitMessages.spec.ts | 54 ++++++++++--------- .../CorrectCommitMessages.ts | 8 +-- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts index 33cadfabc..07ab4dc6a 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts @@ -1,19 +1,15 @@ +import nock from 'nock'; +import { CollaborationInspector } from '../../inspectors/CollaborationInspector'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; -import nock from 'nock'; -import { GitHubNock } from '../../../test/helpers/gitHubNock'; -import { getRepoCommitsResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; +import { getRepoCommitsServiceResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; import { CorrectCommitMessagesPractice } from './CorrectCommitMessages'; -import { CollaborationInspector } from '../../inspectors/CollaborationInspector'; -import { GitHubService } from '../../services/git/GitHubService'; describe('CorrectCommitMessages', () => { let practice: CorrectCommitMessagesPractice; let containerCtx: TestContainerContext; const MockedCollaborationInspector = >(CollaborationInspector); let mockCollaborationInspector: CollaborationInspector; - let mockGithubService: GitHubService; - const MockedGithubService = >(GitHubService); beforeEach(async () => { nock.cleanAll(); @@ -24,7 +20,6 @@ describe('CorrectCommitMessages', () => { containerCtx.container.bind('CorrectCommitMessagesPractice').to(CorrectCommitMessagesPractice); practice = containerCtx.container.get('CorrectCommitMessagesPractice'); mockCollaborationInspector = new MockedCollaborationInspector(); - mockGithubService = new GitHubService({ uri: '.' }); }); afterEach(async () => { @@ -32,26 +27,33 @@ describe('CorrectCommitMessages', () => { containerCtx.practiceContext.fileInspector!.purgeCache(); }); - // it('return practicing if the commit messages are correct', async () => { - // // containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - // // new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); - - // const getRepoCommits = (mockCollaborationInspector.getRepoCommits = async (owner: string, repo: string, sha?: string) => { - // return mockGithubService.getRepoCommits(owner, repo, sha); - // }); - - // const response = await getRepoCommits('pypy', 'pypy'); - // console.log(response); - - // const evaluated = await practice.evaluate(containerCtx.practiceContext); - // expect(evaluated).toEqual(PracticeEvaluationResult.practicing); - // }); + it('return practicing if the commit messages are correct', async () => { + mockCollaborationInspector.getRepoCommits = async () => { + getRepoCommitsServiceResponse.items.forEach((item) => { + item.message = 'fix: correct commit message'; + }); + return getRepoCommitsServiceResponse; + }; + + const evaluated = await practice.evaluate({ + ...containerCtx.practiceContext, + collaborationInspector: mockCollaborationInspector, + }); + expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + }); it('return not practicing if the commit messages are incorrect', async () => { - containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); - - const evaluated = await practice.evaluate(containerCtx.practiceContext); + mockCollaborationInspector.getRepoCommits = async () => { + getRepoCommitsServiceResponse.items.forEach((item) => { + item.message = 'Incorrect commit message'; + }); + return getRepoCommitsServiceResponse; + }; + + const evaluated = await practice.evaluate({ + ...containerCtx.practiceContext, + collaborationInspector: mockCollaborationInspector, + }); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); }); }); diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts index 5b534f338..8938022d0 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -1,9 +1,9 @@ -import { IPractice } from '../IPractice'; -import { PracticeEvaluationResult, PracticeImpact } from '../../model'; -import { DxPractice } from '../DxPracticeDecorator'; +import * as parser from 'parse-commit-message'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { PracticeEvaluationResult, PracticeImpact } from '../../model'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; -import * as parser from 'parse-commit-message'; +import { DxPractice } from '../DxPracticeDecorator'; +import { IPractice } from '../IPractice'; @DxPractice({ id: 'LanguageIndependent.CorrectCommitMessages', From af4ecee2c32922db7a1c7971a234b305f38c456d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 29 Nov 2019 13:01:44 +0100 Subject: [PATCH 080/196] test: test for present collaborationInspector and isAppliacable() --- .../CorrectCommitMessages.spec.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts index 07ab4dc6a..d1527ef2c 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts @@ -27,7 +27,7 @@ describe('CorrectCommitMessages', () => { containerCtx.practiceContext.fileInspector!.purgeCache(); }); - it('return practicing if the commit messages are correct', async () => { + it('returns practicing if the commit messages are correct', async () => { mockCollaborationInspector.getRepoCommits = async () => { getRepoCommitsServiceResponse.items.forEach((item) => { item.message = 'fix: correct commit message'; @@ -42,7 +42,7 @@ describe('CorrectCommitMessages', () => { expect(evaluated).toEqual(PracticeEvaluationResult.practicing); }); - it('return not practicing if the commit messages are incorrect', async () => { + it('returns not practicing if the commit messages are incorrect', async () => { mockCollaborationInspector.getRepoCommits = async () => { getRepoCommitsServiceResponse.items.forEach((item) => { item.message = 'Incorrect commit message'; @@ -56,4 +56,14 @@ describe('CorrectCommitMessages', () => { }); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); }); + + it('returns unknown if there is no collaborationInspector', async () => { + const evaluated = await practice.evaluate({ ...containerCtx.practiceContext, collaborationInspector: undefined }); + expect(evaluated).toEqual(PracticeEvaluationResult.unknown); + }); + + it('returns always true, as it is always applicable', async () => { + const response = await practice.isApplicable(); + expect(response).toBe(true); + }); }); From 5e98e0fafd4b63d6c88b699b85c12b04ecc00b85 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sat, 30 Nov 2019 12:56:13 +0000 Subject: [PATCH 081/196] fix(cli): added more conditions to check for existing files for --init --- src/init.configurator.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/init.configurator.ts b/src/init.configurator.ts index 60b9f506f..468181336 100644 --- a/src/init.configurator.ts +++ b/src/init.configurator.ts @@ -5,12 +5,15 @@ import { cli } from 'cli-ux'; import { IPracticeWithMetadata } from './practices/DxPracticeDecorator'; export const initialize = (scanPath: string, container: Container) => { - const yamlPath = `${scanPath}/.dxscannerrc.yaml`; - cli.action.start(`Initializing configuration: ${yamlPath}`); + const filePath = `${scanPath}/.dxscannerrc`; + cli.action.start(`Initializing configuration: ${filePath}.yaml`); // check if .dxscannerrc.yaml already exists - const yamlExists: boolean = fs.existsSync(yamlPath); - if (!yamlExists) { - createYAML(yamlPath, container); + const fileExists: boolean = fs.existsSync(`${filePath}`); + const yamlExists: boolean = fs.existsSync(`${filePath}.yaml`); + const ymlExists: boolean = fs.existsSync(`${filePath}.yml`); + const jsonExists: boolean = fs.existsSync(`${filePath}.json`); + if (!yamlExists && !fileExists && !ymlExists && !jsonExists) { + createYAML(`${filePath}.yaml`, container); } cli.action.stop(); process.exit(0); From 4fe1f2a50ae890e711d2e6944b4128031ef420ea Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sat, 30 Nov 2019 13:01:25 +0000 Subject: [PATCH 082/196] added jest tests for init configurator --- src/init.configurator.spec.ts | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/init.configurator.spec.ts diff --git a/src/init.configurator.spec.ts b/src/init.configurator.spec.ts new file mode 100644 index 000000000..5689c406e --- /dev/null +++ b/src/init.configurator.spec.ts @@ -0,0 +1,47 @@ +import { createTestContainer, TestContainerContext } from './inversify.config'; +import { initialize } from './init.configurator'; +import * as fs from 'fs'; + +describe('Init Configurator', () => { + let containerCtx: TestContainerContext; + + const setProperty = (object: NodeJS.Process, property: string | number | symbol, value: jest.Mock) => { + const originalProperty = Object.getOwnPropertyDescriptor(object, property); + Object.defineProperty(object, property, { value }); + return originalProperty; + }; + + beforeEach(async () => { + containerCtx = createTestContainer({ uri: '.' }); + }); + + it('Creates a .yaml config file', () => { + const mockExit = jest.fn(); + // mock fs + const mockExistFs = jest.spyOn(fs, 'existsSync'); + const mockWriteFs = jest.spyOn(fs, 'writeFileSync'); + mockExistFs.mockReturnValue(false); + // avoid indefinite test run + setProperty(process, 'exit', mockExit); + initialize('.', containerCtx.container); + expect(mockExit).toHaveBeenCalledWith(0); + // test + expect(mockWriteFs).toHaveBeenCalled(); + mockExit.mockRestore(); + }); + + it('Does not create a .yaml config if a similar file exists', () => { + const mockExit = jest.fn(); + // mock fs + const mockExistFs = jest.spyOn(fs, 'existsSync'); + const mockWriteFs = jest.spyOn(fs, 'writeFileSync'); + mockExistFs.mockReturnValue(true); + // avoid indefinite test run + setProperty(process, 'exit', mockExit); + initialize('.', containerCtx.container); + expect(mockExit).toHaveBeenCalledWith(0); + // test + expect(mockWriteFs).not.toHaveBeenCalled(); + mockExit.mockRestore(); + }); +}); From 4fa1b85ccc7aaa7145f2fb14ce9b34147b2d6aa1 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sat, 30 Nov 2019 14:04:09 +0100 Subject: [PATCH 083/196] feat: collect data from practices --- .../DependenciesVersionMajorLevel.ts | 43 ++++++++++--------- src/practices/PracticeBase.ts | 26 +++++++++++ 2 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 src/practices/PracticeBase.ts diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts index 8b5845adf..8e7038bb7 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts @@ -4,7 +4,7 @@ import { Package } from '../../inspectors/IPackageInspector'; import { PackageInspectorBase, SemverLevel } from '../../inspectors/package/PackageInspectorBase'; import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; -import { IPractice } from '../IPractice'; +import { PracticeBase } from '../PracticeBase'; @DxPractice({ id: 'JavaScript.DependenciesVersionMajorLevel', @@ -14,7 +14,7 @@ import { IPractice } from '../IPractice'; reportOnlyOnce: true, url: 'https://renovatebot.com/', }) -export class DependenciesVersionMajorLevel implements IPractice { +export class DependenciesVersionMajorLevel extends PracticeBase { async isApplicable(ctx: PracticeContext): Promise { return ( ctx.projectComponent.language === ProgrammingLanguage.JavaScript || ctx.projectComponent.language === ProgrammingLanguage.TypeScript @@ -22,22 +22,20 @@ export class DependenciesVersionMajorLevel implements IPractice { } async evaluate(ctx: PracticeContext): Promise { - if (ctx.fileInspector === undefined || ctx.packageInspector === undefined) { + if (!ctx.fileInspector || !ctx.packageInspector) { return PracticeEvaluationResult.unknown; } const pkgs = ctx.packageInspector.packages; - if (pkgs === undefined) { + if (!pkgs) { return PracticeEvaluationResult.unknown; } - const result = await DependenciesVersionMajorLevel.runNcu(pkgs); - const practiceEvaluationResult = DependenciesVersionMajorLevel.isPracticing(result, SemverLevel.major, pkgs); - - return practiceEvaluationResult || PracticeEvaluationResult.practicing; + const result = await this.runNcu(pkgs); + return this.isPracticing(result, SemverLevel.major, pkgs); } - static async runNcu(pkgs: Package[] | undefined) { + async runNcu(pkgs: Package[] | undefined) { const fakePkgJson: { dependencies: { [key: string]: string } } = { dependencies: {} }; pkgs && @@ -45,30 +43,33 @@ export class DependenciesVersionMajorLevel implements IPractice { fakePkgJson.dependencies[p.name] = p.requestedVersion.value; }); - const result = await ncu.run({ + const pkgsToBeUpdated = await ncu.run({ packageData: JSON.stringify(fakePkgJson), }); - return result; + return pkgsToBeUpdated; } - static isPracticing( - result: { [key: string]: string }, - semverVersion: SemverLevel, - pkgs: Package[], - ): PracticeEvaluationResult | undefined { - for (const packageName in result) { - const parsedVersion = PackageInspectorBase.semverToPackageVersion(result[packageName]); + isPracticing(pkgsWithNewVersion: { [key: string]: string }, semverLevel: SemverLevel, pkgs: Package[]): PracticeEvaluationResult { + // packages with Major level to be updated + const pkgsToUpdate: { name: string; newVersion: string; currentVersion: string }[] = []; + + for (const packageName in pkgsWithNewVersion) { + const parsedVersion = PackageInspectorBase.semverToPackageVersion(pkgsWithNewVersion[packageName]); if (parsedVersion) { for (const pkg of pkgs) { if (pkg.name === packageName) { - if (parsedVersion[semverVersion] > pkg.lockfileVersion[semverVersion]) { - return PracticeEvaluationResult.notPracticing; + if (parsedVersion[semverLevel] > pkg.lockfileVersion[semverLevel]) { + pkgsToUpdate.push({ name: pkg.name, newVersion: parsedVersion.value, currentVersion: pkg.lockfileVersion.value }); } } } } } - return undefined; + + this.data.detail = 'any'; + + if (pkgsToUpdate.length > 0) return PracticeEvaluationResult.notPracticing; + return PracticeEvaluationResult.practicing; } } diff --git a/src/practices/PracticeBase.ts b/src/practices/PracticeBase.ts new file mode 100644 index 000000000..0b8c71d13 --- /dev/null +++ b/src/practices/PracticeBase.ts @@ -0,0 +1,26 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { IPractice } from './IPractice'; +import { ErrorFactory } from '../lib/errors'; +import { PracticeEvaluationResult } from '../model'; +import { PracticeContext } from '../contexts/practice/PracticeContext'; + +export abstract class PracticeBase implements IPractice { + data: T; + + constructor() { + this.data = {}; + } + + async isApplicable(ctx: PracticeContext): Promise { + return true; + } + + async evaluate(ctx: PracticeContext): Promise { + throw ErrorFactory.newInternalError('Method not implemented.'); + } +} + +type PracticeBaseData = { + detail?: string; +}; From 33c761a6702c3a15c70fbf2218a18bacc69071e9 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sat, 30 Nov 2019 15:41:31 +0100 Subject: [PATCH 084/196] refactor: move to Scanner.ts and write add passing tests --- src/index.ts | 6 +++-- src/init.configurator.spec.ts | 47 ----------------------------------- src/init.configurator.ts | 33 ------------------------ src/scanner/Scanner.spec.ts | 29 ++++++++++++++++++--- src/scanner/Scanner.ts | 33 ++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 86 deletions(-) delete mode 100644 src/init.configurator.spec.ts delete mode 100644 src/init.configurator.ts diff --git a/src/index.ts b/src/index.ts index b7b720a7b..c67e1cc89 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,6 @@ import { ServiceError, ErrorCode } from './lib/errors'; import updateNotifier from 'update-notifier'; import { ScanningStrategyDetectorUtils } from './detectors/utils/ScanningStrategyDetectorUtils'; import { PracticeImpact } from './model'; -import { initialize } from './init.configurator'; class DXScannerCommand extends Command { static description = 'Scan your project for possible DX recommendations.'; @@ -53,7 +52,10 @@ class DXScannerCommand extends Command { const container = createRootContainer({ uri: scanPath, auth: authorization, json, fail, recursive: flags.recursive }); const scanner = container.get(Scanner); - flags.init ? initialize(scanPath, container) : undefined; + if (flags.init) { + await scanner.init(); + process.exit(0); + } let scanResult: ScanResult; try { diff --git a/src/init.configurator.spec.ts b/src/init.configurator.spec.ts deleted file mode 100644 index 5689c406e..000000000 --- a/src/init.configurator.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { createTestContainer, TestContainerContext } from './inversify.config'; -import { initialize } from './init.configurator'; -import * as fs from 'fs'; - -describe('Init Configurator', () => { - let containerCtx: TestContainerContext; - - const setProperty = (object: NodeJS.Process, property: string | number | symbol, value: jest.Mock) => { - const originalProperty = Object.getOwnPropertyDescriptor(object, property); - Object.defineProperty(object, property, { value }); - return originalProperty; - }; - - beforeEach(async () => { - containerCtx = createTestContainer({ uri: '.' }); - }); - - it('Creates a .yaml config file', () => { - const mockExit = jest.fn(); - // mock fs - const mockExistFs = jest.spyOn(fs, 'existsSync'); - const mockWriteFs = jest.spyOn(fs, 'writeFileSync'); - mockExistFs.mockReturnValue(false); - // avoid indefinite test run - setProperty(process, 'exit', mockExit); - initialize('.', containerCtx.container); - expect(mockExit).toHaveBeenCalledWith(0); - // test - expect(mockWriteFs).toHaveBeenCalled(); - mockExit.mockRestore(); - }); - - it('Does not create a .yaml config if a similar file exists', () => { - const mockExit = jest.fn(); - // mock fs - const mockExistFs = jest.spyOn(fs, 'existsSync'); - const mockWriteFs = jest.spyOn(fs, 'writeFileSync'); - mockExistFs.mockReturnValue(true); - // avoid indefinite test run - setProperty(process, 'exit', mockExit); - initialize('.', containerCtx.container); - expect(mockExit).toHaveBeenCalledWith(0); - // test - expect(mockWriteFs).not.toHaveBeenCalled(); - mockExit.mockRestore(); - }); -}); diff --git a/src/init.configurator.ts b/src/init.configurator.ts deleted file mode 100644 index 468181336..000000000 --- a/src/init.configurator.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as fs from 'fs'; -import { Container } from 'inversify'; -import { Types } from './types'; -import { cli } from 'cli-ux'; -import { IPracticeWithMetadata } from './practices/DxPracticeDecorator'; - -export const initialize = (scanPath: string, container: Container) => { - const filePath = `${scanPath}/.dxscannerrc`; - cli.action.start(`Initializing configuration: ${filePath}.yaml`); - // check if .dxscannerrc.yaml already exists - const fileExists: boolean = fs.existsSync(`${filePath}`); - const yamlExists: boolean = fs.existsSync(`${filePath}.yaml`); - const ymlExists: boolean = fs.existsSync(`${filePath}.yml`); - const jsonExists: boolean = fs.existsSync(`${filePath}.json`); - if (!yamlExists && !fileExists && !ymlExists && !jsonExists) { - createYAML(`${filePath}.yaml`, container); - } - cli.action.stop(); - process.exit(0); -}; - -const createYAML = (yamlPath: string, container: Container) => { - let yamlInitContent = `# practices:`; - // get Metadata and sort it alphabetically using id - const sortedInitializedPractices = container - .getAll(Types.Practice) - .sort((a, b) => a.getMetadata().id.localeCompare(b.getMetadata().id)); - for (const practice of sortedInitializedPractices) { - const dataObject = practice.getMetadata(); - yamlInitContent += `\n# ${dataObject.id}: ${dataObject.impact}`; - } - fs.writeFileSync(yamlPath, yamlInitContent); -}; diff --git a/src/scanner/Scanner.spec.ts b/src/scanner/Scanner.spec.ts index 59310c485..ff24985a8 100644 --- a/src/scanner/Scanner.spec.ts +++ b/src/scanner/Scanner.spec.ts @@ -1,15 +1,21 @@ -import { Container } from 'inversify'; -import { createRootContainer } from '../inversify.config'; +import { createRootContainer, createTestContainer, TestContainerContext } from '../inversify.config'; import { Scanner } from './Scanner'; +import { FileSystemService } from '../services/FileSystemService'; describe('Scanner', () => { - let rootContainer: Container; + let containerCtx: TestContainerContext; beforeEach(() => { - rootContainer = createRootContainer({ uri: '.' }); + containerCtx = createTestContainer({ uri: '.' }); + }); + + afterEach(async () => { + containerCtx.virtualFileSystemService.clearFileSystem(); + containerCtx.practiceContext.fileInspector!.purgeCache(); }); it('Can be instantiated from container', () => { + const rootContainer = createRootContainer({ uri: '.' }); const scanner = rootContainer.get(Scanner); expect(scanner).toBeDefined(); }); @@ -19,4 +25,19 @@ describe('Scanner', () => { we have to wait for other components to be finished to write the integration tests. (Scanner class is a integration point) */ + + describe('#init', () => { + it('configuration can be initialized', async () => { + containerCtx.container.rebind(FileSystemService).toConstantValue(containerCtx.virtualFileSystemService); + const scanner = containerCtx.container.get(Scanner); + + let exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.yaml'); + expect(exists).toEqual(false); + + await scanner.init(); + + exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.yaml'); + expect(exists).toEqual(true); + }); + }); }); diff --git a/src/scanner/Scanner.ts b/src/scanner/Scanner.ts index c1ba07911..b72ef0dcd 100644 --- a/src/scanner/Scanner.ts +++ b/src/scanner/Scanner.ts @@ -28,12 +28,14 @@ import { ScannerUtils } from './ScannerUtils'; import _ from 'lodash'; import { sharedSubpath } from '../detectors/utils'; import { cli } from 'cli-ux'; +import { FileSystemService } from '../services/FileSystemService'; @injectable() export class Scanner { private readonly scanStrategyDetector: ScanningStrategyDetector; private readonly scannerContextFactory: ScannerContextFactory; private readonly reporter: IReporter; + private readonly fileSystemService: FileSystemService; private readonly practices: IPracticeWithMetadata[]; private readonly argumentsProvider: ArgumentsProvider; private readonly scanDebug: debug.Debugger; @@ -44,6 +46,7 @@ export class Scanner { @inject(ScanningStrategyDetector) scanStrategyDetector: ScanningStrategyDetector, @inject(Types.ScannerContextFactory) scannerContextFactory: ScannerContextFactory, @inject(Types.IReporter) reporter: IReporter, + @inject(FileSystemService) fileSystemService: FileSystemService, // inject all practices registered under Types.Practice in inversify config @multiInject(Types.Practice) practices: IPracticeWithMetadata[], @inject(Types.ArgumentsProvider) argumentsProvider: ArgumentsProvider, @@ -51,6 +54,7 @@ export class Scanner { this.scanStrategyDetector = scanStrategyDetector; this.scannerContextFactory = scannerContextFactory; this.reporter = reporter; + this.fileSystemService = fileSystemService; this.practices = practices; this.argumentsProvider = argumentsProvider; this.scanDebug = debug('scanner'); @@ -79,6 +83,24 @@ export class Scanner { return { shouldExitOnEnd: this.shouldExitOnEnd }; } + /** + * Initialize Scanner configuration + */ + async init(): Promise { + const filePath = `.dxscannerrc`; + cli.action.start(`Initializing configuration: ${filePath}.yaml`); + // check if .dxscannerrc.yaml already exists + const fileExists: boolean = await this.fileSystemService.exists(`${filePath}`); + const yamlExists: boolean = await this.fileSystemService.exists(`${filePath}.yaml`); + const ymlExists: boolean = await this.fileSystemService.exists(`${filePath}.yml`); + const jsonExists: boolean = await this.fileSystemService.exists(`${filePath}.json`); + + if (!yamlExists && !fileExists && !ymlExists && !jsonExists) { + await this.createConfiguration(); + } + cli.action.stop(); + } + /** * Clone a repository if the input is remote repository */ @@ -285,6 +307,17 @@ export class Scanner { } return relevantComponents; } + + private async createConfiguration() { + let yamlInitContent = `# practices:`; + // get Metadata and sort it alphabetically using id + const sortedInitializedPractices = this.practices.sort((a, b) => a.getMetadata().id.localeCompare(b.getMetadata().id)); + for (const practice of sortedInitializedPractices) { + const dataObject = practice.getMetadata(); + yamlInitContent += `\n# ${dataObject.id}: ${dataObject.impact}`; + } + await this.fileSystemService.createFile(`/.dxscannerrc.yaml`, yamlInitContent); + } } interface ProjectComponentAndLangContext { From 3ec4cc020cf3668f87a3a4df1a6e52de4dedf2d5 Mon Sep 17 00:00:00 2001 From: ryzzaki Date: Sat, 30 Nov 2019 15:48:28 +0000 Subject: [PATCH 085/196] added a test for Scanner.ts --- src/scanner/Scanner.spec.ts | 20 ++++++++++++++++++++ src/scanner/Scanner.ts | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/scanner/Scanner.spec.ts b/src/scanner/Scanner.spec.ts index ff24985a8..2cbee24d3 100644 --- a/src/scanner/Scanner.spec.ts +++ b/src/scanner/Scanner.spec.ts @@ -39,5 +39,25 @@ describe('Scanner', () => { exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.yaml'); expect(exists).toEqual(true); }); + + it('configuration file is not created if a similar file exists', async () => { + containerCtx.container.rebind(FileSystemService).toConstantValue(containerCtx.virtualFileSystemService); + const scanner = containerCtx.container.get(Scanner); + + containerCtx.virtualFileSystemService.setFileSystem({ + '/.dxscannerrc.json': '', + }); + + let exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.json'); + expect(exists).toEqual(true); + + exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.yaml'); + expect(exists).toEqual(false); + + await scanner.init(); + + exists = await containerCtx.virtualFileSystemService.exists('/.dxscannerrc.yaml'); + expect(exists).toEqual(false); + }); }); }); diff --git a/src/scanner/Scanner.ts b/src/scanner/Scanner.ts index b72ef0dcd..5725f9b94 100644 --- a/src/scanner/Scanner.ts +++ b/src/scanner/Scanner.ts @@ -87,7 +87,7 @@ export class Scanner { * Initialize Scanner configuration */ async init(): Promise { - const filePath = `.dxscannerrc`; + const filePath = `/.dxscannerrc`; cli.action.start(`Initializing configuration: ${filePath}.yaml`); // check if .dxscannerrc.yaml already exists const fileExists: boolean = await this.fileSystemService.exists(`${filePath}`); From e5c1c89c0f0bcd1fdcb0b9e694f3c8624201465d Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sat, 30 Nov 2019 17:55:27 +0100 Subject: [PATCH 086/196] refactor: type definitions added to correct folders and changed tsconfig --- tsconfig.json | 11 +++++++---- .../gradle-to-js/index.d.ts | 9 --------- types/npm-check-updates/index.d.ts | 8 ++++++++ 3 files changed, 15 insertions(+), 13 deletions(-) rename typings/npm-check-updates.ts => types/gradle-to-js/index.d.ts (72%) create mode 100644 types/npm-check-updates/index.d.ts diff --git a/tsconfig.json b/tsconfig.json index ef82b9519..d081f257c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,9 +41,12 @@ /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - "paths": {"*": ["./typings/*"]}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + "paths": { + // "@reporters/*": ["src/reporters/*"], + // "@services/*": ["src/services/*"] + }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - "typeRoots": ["typings", "node_modules/@types"], /* List of folders to include type definitions from. */ + "typeRoots": ["./types", "node_modules/@types"], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ @@ -61,6 +64,6 @@ "preserveConstEnums": true, "forceConsistentCasingInFileNames": true }, - "include": ["src/**/*", "typings/**/*", "test/helpers/**/*", "test/**/*"], - "exclude": ["node_modules", "lib"] + "include": ["src/**/*", "test/helpers/**/*", "test/**/*"], + "exclude": ["node_modules", "lib", "types"] } diff --git a/typings/npm-check-updates.ts b/types/gradle-to-js/index.d.ts similarity index 72% rename from typings/npm-check-updates.ts rename to types/gradle-to-js/index.d.ts index 163f380b5..978514202 100644 --- a/typings/npm-check-updates.ts +++ b/types/gradle-to-js/index.d.ts @@ -1,12 +1,3 @@ -interface NCUParams { - packageData: string; -} - -declare module 'npm-check-updates' { - let ncu: { run(params: NCUParams): Promise<{ [key: string]: string }> }; - export = ncu; -} - declare module 'gradle-to-js' { export function parseText(text: string): Promise; export function parseFile(filePath: string): Promise; diff --git a/types/npm-check-updates/index.d.ts b/types/npm-check-updates/index.d.ts new file mode 100644 index 000000000..955b88cf8 --- /dev/null +++ b/types/npm-check-updates/index.d.ts @@ -0,0 +1,8 @@ +interface NCUParams { + packageData: string; +} + +declare module 'npm-check-updates' { + let ncu: { run(params: NCUParams): Promise<{ [key: string]: string }> }; + export = ncu; +} From a860e4f0c2479f315023ac0c90b9db580bca024d Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sat, 30 Nov 2019 18:23:08 +0100 Subject: [PATCH 087/196] chore: add module aliases --- package.json | 14 +++++++++++++- .../JavaScriptComponentDetector.spec.ts | 2 +- src/detectors/ScanningStrategyDetector.spec.ts | 2 +- src/index.ts | 1 + src/inspectors/CollaborationInspector.spec.ts | 2 +- src/inspectors/IssueTrackingInspector.spec.ts | 2 +- .../DependenciesVersionMajorLevel.spec.ts | 2 +- .../DependenciesVersionMinorPatchLevel.spec.ts | 2 +- src/reporters/CLIReporter.spec.ts | 2 +- src/reporters/JSONReporter.spec.ts | 2 +- src/reporters/ReporterUtils.spec.ts | 2 +- src/scanner/Scanner.ts | 6 +++--- src/scanner/ScannerUtils.spec.ts | 2 +- src/services/bitbucket/BitbucketService.spec.ts | 2 +- src/services/git/Git.spec.ts | 2 +- src/services/git/GitHubService.spec.ts | 2 +- .../getContributorsStatsResponse.mock.ts | 2 +- .../getIssueCommentsResponse.mock.ts | 2 +- .../getIssueResponse.mock.ts | 2 +- .../getIssuesResponse.mock.ts | 2 +- .../getPullRequestsReviewsResponse.mock.ts | 2 +- .../getPullsCommitsResponse.mock.ts | 2 +- .../getRepoCommitsResponse.mock.ts | 2 +- .../test}/factories/PracticeWithContextFactory.ts | 6 +++--- {test => src/test}/helpers/bitbucketNock.ts | 2 +- {test => src/test}/helpers/gitHubNock.ts | 0 {test => src/test}/helpers/mockPackage.ts | 2 +- tsconfig.json | 15 +++++++++++---- yarn.lock | 5 +++++ 29 files changed, 58 insertions(+), 33 deletions(-) rename {test => src/test}/factories/PracticeWithContextFactory.ts (86%) rename {test => src/test}/helpers/bitbucketNock.ts (99%) rename {test => src/test}/helpers/gitHubNock.ts (100%) rename {test => src/test}/helpers/mockPackage.ts (87%) diff --git a/package.json b/package.json index e3e155c89..51c19cfd9 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "js-yaml": "3.13.1", "lodash": "4.17.15", "memfs": "2.16.1", + "module-alias": "^2.2.2", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", @@ -109,5 +110,16 @@ "developer experience", "dxheroes", "code analysis" - ] + ], + "_moduleAliases": { + "@contexts": "lib/contexts", + "@detectors": "lib/detectors", + "@inspectors": "lib/inspectors", + "@libs": "lib/libs", + "@practices": "lib/practices", + "@reporters": "lib/reporters", + "@core": "lib/scanner", + "@services": "lib/services", + "@test": "lib/test" +} } diff --git a/src/detectors/JavaScript/JavaScriptComponentDetector.spec.ts b/src/detectors/JavaScript/JavaScriptComponentDetector.spec.ts index dc3b061a0..88c8ad3fa 100644 --- a/src/detectors/JavaScript/JavaScriptComponentDetector.spec.ts +++ b/src/detectors/JavaScript/JavaScriptComponentDetector.spec.ts @@ -1,7 +1,7 @@ import { JavaScriptComponentDetector } from './JavaScriptComponentDetector'; import { ProgrammingLanguage, ProjectComponentPlatform } from '../../model'; import { JavaScriptPackageInspector } from '../../inspectors/package/JavaScriptPackageInspector'; -import { mockPackage } from '../../../test/helpers/mockPackage'; +import { mockPackage } from '../../test/helpers/mockPackage'; jest.mock('../../inspectors/package/JavaScriptPackageInspector'); describe('JavaScriptComponentDetector', () => { diff --git a/src/detectors/ScanningStrategyDetector.spec.ts b/src/detectors/ScanningStrategyDetector.spec.ts index 8ebf966d1..5bd48b2af 100644 --- a/src/detectors/ScanningStrategyDetector.spec.ts +++ b/src/detectors/ScanningStrategyDetector.spec.ts @@ -2,7 +2,7 @@ import { ServiceType, AccessType } from './ScanningStrategyDetector'; import git from 'simple-git/promise'; import nock from 'nock'; import { createTestContainer } from '../inversify.config'; -import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { GitHubNock } from '../test/helpers/gitHubNock'; jest.mock('simple-git/promise'); describe('ScanningStrategyDetector', () => { diff --git a/src/index.ts b/src/index.ts index d5293f9be..2c47d5fd9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import 'reflect-metadata'; +import 'module-alias/register'; import { createRootContainer } from './inversify.config'; import { Scanner, ScanResult } from './scanner/Scanner'; import { Command, flags } from '@oclif/command'; diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index c0c33dcf5..ca3328ca5 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -8,7 +8,7 @@ import { getPullCommitsServiceResponse } from '../services/git/__MOCKS__/gitHubS import nock from 'nock'; import { TestContainerContext } from '../inversify.config'; import { createTestContainer } from '../inversify.config'; -import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { GitHubNock } from '../test/helpers/gitHubNock'; describe('Collaboration Inspector', () => { let inspector: CollaborationInspector; diff --git a/src/inspectors/IssueTrackingInspector.spec.ts b/src/inspectors/IssueTrackingInspector.spec.ts index 7cc2fee99..d588ca442 100644 --- a/src/inspectors/IssueTrackingInspector.spec.ts +++ b/src/inspectors/IssueTrackingInspector.spec.ts @@ -7,7 +7,7 @@ import { getIssueResponse } from '../services/git/__MOCKS__/gitHubServiceMockFol import { getIssueServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssueServiceResponse.mock'; import nock from 'nock'; import { TestContainerContext, createTestContainer } from '../inversify.config'; -import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { GitHubNock } from '../test/helpers/gitHubNock'; describe('Issue Tracking Inspector', () => { let inspector: IssueTrackingInspector; diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts index 15b31f5a3..f1329478f 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts @@ -3,7 +3,7 @@ import { DependenciesVersionMajorLevel } from './DependenciesVersionMajorLevel'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import ncu from 'npm-check-updates'; import { JavaScriptPackageInspector } from '../../inspectors/package/JavaScriptPackageInspector'; -import { mockPackage } from '../../../test/helpers/mockPackage'; +import { mockPackage } from '../../test/helpers/mockPackage'; jest.mock('npm-check-updates'); describe('DependenciesVersionPractice of Major Level', () => { diff --git a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts index 7c7716c90..e361075c1 100644 --- a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts @@ -1,5 +1,5 @@ import ncu from 'npm-check-updates'; -import { mockPackage } from '../../../test/helpers/mockPackage'; +import { mockPackage } from '../../test/helpers/mockPackage'; import { JavaScriptPackageInspector } from '../../inspectors/package/JavaScriptPackageInspector'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; diff --git a/src/reporters/CLIReporter.spec.ts b/src/reporters/CLIReporter.spec.ts index 948080c8c..990c44dcb 100644 --- a/src/reporters/CLIReporter.spec.ts +++ b/src/reporters/CLIReporter.spec.ts @@ -1,5 +1,5 @@ import { CLIReporter } from './CLIReporter'; -import { practiceWithContextFactory } from '../../test/factories/PracticeWithContextFactory'; +import { practiceWithContextFactory } from '../test/factories/PracticeWithContextFactory'; import { PracticeEvaluationResult, PracticeImpact } from '../model'; describe('CLIReporter', () => { diff --git a/src/reporters/JSONReporter.spec.ts b/src/reporters/JSONReporter.spec.ts index d1369e625..4863f4348 100644 --- a/src/reporters/JSONReporter.spec.ts +++ b/src/reporters/JSONReporter.spec.ts @@ -1,5 +1,5 @@ import { JSONReporter } from './JSONReporter'; -import { practiceWithContextFactory } from '../../test/factories/PracticeWithContextFactory'; +import { practiceWithContextFactory } from '../test/factories/PracticeWithContextFactory'; import { PracticeEvaluationResult } from '../model'; describe('JSONReporter', () => { diff --git a/src/reporters/ReporterUtils.spec.ts b/src/reporters/ReporterUtils.spec.ts index 7cf963b7b..774eb8a4d 100644 --- a/src/reporters/ReporterUtils.spec.ts +++ b/src/reporters/ReporterUtils.spec.ts @@ -1,6 +1,6 @@ import { PracticeEvaluationResult, PracticeImpact } from '../model'; import { ReporterUtils } from './ReporterUtils'; -import { practiceWithContextFactory } from '../../test/factories/PracticeWithContextFactory'; +import { practiceWithContextFactory } from '../test/factories/PracticeWithContextFactory'; describe('ReporterUtils', () => { const practicingHighImpactPracticeWithCtx = practiceWithContextFactory(); diff --git a/src/scanner/Scanner.ts b/src/scanner/Scanner.ts index efe87e89e..cd76f8f58 100644 --- a/src/scanner/Scanner.ts +++ b/src/scanner/Scanner.ts @@ -9,7 +9,7 @@ import util, { inspect } from 'util'; import { LanguageContext } from '../contexts/language/LanguageContext'; import { PracticeContext } from '../contexts/practice/PracticeContext'; import { ProjectComponentContext } from '../contexts/projectComponent/ProjectComponentContext'; -import { ScannerContext } from '../contexts/scanner/ScannerContext'; +import { ScannerContext } from '@contexts/scanner/ScannerContext'; import { ScanningStrategy, ScanningStrategyDetector, ServiceType } from '../detectors/ScanningStrategyDetector'; import { ArgumentsProvider } from '../inversify.config'; import { @@ -22,12 +22,12 @@ import { PracticeImpact, } from '../model'; import { IPracticeWithMetadata } from '../practices/DxPracticeDecorator'; -import { IReporter } from '../reporters/IReporter'; import { ScannerContextFactory, Types } from '../types'; -import { ScannerUtils } from './ScannerUtils'; +import { ScannerUtils } from '@core/ScannerUtils'; import _ from 'lodash'; import { sharedSubpath } from '../detectors/utils'; import { cli } from 'cli-ux'; +import { IReporter } from '@reporters/IReporter'; @injectable() export class Scanner { diff --git a/src/scanner/ScannerUtils.spec.ts b/src/scanner/ScannerUtils.spec.ts index c7566a8fd..689c4d2a4 100644 --- a/src/scanner/ScannerUtils.spec.ts +++ b/src/scanner/ScannerUtils.spec.ts @@ -16,7 +16,7 @@ import { TypeScriptUsedPractice } from '../practices/JavaScript/TypeScriptUsedPr import { PracticeWithContextForReporter } from '../reporters/IReporter'; import { ScannerUtils } from './ScannerUtils'; import { FirstTestPractice, InvalidTestPractice, SecondTestPractice } from './__MOCKS__'; -import { practiceWithContextFactory } from '../../test/factories/PracticeWithContextFactory'; +import { practiceWithContextFactory } from '../test/factories/PracticeWithContextFactory'; describe('ScannerUtils', () => { const notPracticingHighImpactPracticeWithCtx: PracticeWithContextForReporter[] = []; diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 89eeaf456..4316721b5 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -1,5 +1,5 @@ import nock from 'nock'; -import { BitbucketNock } from '../../../test/helpers/bitbucketNock'; +import { BitbucketNock } from '../../test/helpers/bitbucketNock'; import { BitbucketService } from './BitbucketService'; import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; diff --git a/src/services/git/Git.spec.ts b/src/services/git/Git.spec.ts index 51f83f90b..3652863d5 100644 --- a/src/services/git/Git.spec.ts +++ b/src/services/git/Git.spec.ts @@ -1,5 +1,5 @@ import { Git } from './Git'; -import { GitHubNock } from '../../../test/helpers/gitHubNock'; +import { GitHubNock } from '../../test/helpers/gitHubNock'; import nock from 'nock'; import { GitHubService } from './GitHubService'; diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index d3bbf80c1..ea7751e8e 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -21,7 +21,7 @@ import { getPullsFilesResponse } from './__MOCKS__/gitHubServiceMockFolder/getPu import { getPullsFilesServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullFilesServiceResponse.mock'; import { getPullCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock'; import { getPullCommitsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullCommitsServiceResponse.mock'; -import { GitHubNock } from '../../../test/helpers/gitHubNock'; +import { GitHubNock } from '../../test/helpers/gitHubNock'; import { getRepoCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; import { File } from './model'; import { GitHubPullRequestState } from './IGitHubService'; diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getContributorsStatsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getContributorsStatsResponse.mock.ts index 6f0115520..f1c697441 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getContributorsStatsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getContributorsStatsResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getContributorsStatsResponse = [ diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock.ts index 8594d3867..43ecd40d2 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getIssueCommentsResponse = [ diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueResponse.mock.ts index 06be47407..f3fdcf064 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssueResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getIssueResponse = { diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock.ts index c4454d376..ccd5b6654 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getIssuesResponse = [ diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullRequestsReviewsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullRequestsReviewsResponse.mock.ts index af0ab4a80..24b7cd3b0 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullRequestsReviewsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullRequestsReviewsResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getPullRequestsReviewsResponse = [ diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock.ts index cfea6f0e6..c550b4f25 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getPullCommitsResponse = [ diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts index 33c2401b2..15a11c8e7 100644 --- a/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock.ts @@ -1,4 +1,4 @@ -import { UserItem } from '../../../../../test/helpers/gitHubNock'; +import { UserItem } from '../../../../test/helpers/gitHubNock'; /* eslint-disable @typescript-eslint/camelcase */ export const getRepoCommitsResponse = [ diff --git a/test/factories/PracticeWithContextFactory.ts b/src/test/factories/PracticeWithContextFactory.ts similarity index 86% rename from test/factories/PracticeWithContextFactory.ts rename to src/test/factories/PracticeWithContextFactory.ts index f89f2e06a..326c2deae 100644 --- a/test/factories/PracticeWithContextFactory.ts +++ b/src/test/factories/PracticeWithContextFactory.ts @@ -1,4 +1,4 @@ -import { PracticeWithContextForReporter } from '../../src/reporters/IReporter'; +import { PracticeWithContextForReporter } from '@reporters/IReporter'; import { ProgrammingLanguage, ProjectComponentFramework, @@ -6,8 +6,8 @@ import { ProjectComponentPlatform, PracticeImpact, PracticeEvaluationResult, -} from '../../src/model'; -import { DeepPartial } from '../../src/lib/deepPartial'; +} from '../../model'; +import { DeepPartial } from '../../lib/deepPartial'; import _ from 'lodash'; import path from 'path'; diff --git a/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts similarity index 99% rename from test/helpers/bitbucketNock.ts rename to src/test/helpers/bitbucketNock.ts index 40b2f567b..e00c1ff2d 100644 --- a/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/camelcase */ import nock from 'nock'; -import { BitbucketCommit } from '../../src/services/bitbucket/BitbucketService'; +import { BitbucketCommit } from '../../services/bitbucket/BitbucketService'; export class BitbucketNock { user: string; diff --git a/test/helpers/gitHubNock.ts b/src/test/helpers/gitHubNock.ts similarity index 100% rename from test/helpers/gitHubNock.ts rename to src/test/helpers/gitHubNock.ts diff --git a/test/helpers/mockPackage.ts b/src/test/helpers/mockPackage.ts similarity index 87% rename from test/helpers/mockPackage.ts rename to src/test/helpers/mockPackage.ts index 58a2377d6..13811bdee 100644 --- a/test/helpers/mockPackage.ts +++ b/src/test/helpers/mockPackage.ts @@ -1,4 +1,4 @@ -import { DependencyType, Package } from '../../src/inspectors/IPackageInspector'; +import { DependencyType, Package } from '../../inspectors/IPackageInspector'; export const mockPackage = (name: string, value = '1.0.0', dependencyType: DependencyType = DependencyType.Runtime): Package => { const values = value.split('.'); diff --git a/tsconfig.json b/tsconfig.json index d081f257c..463add759 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,10 +40,17 @@ /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + "baseUrl": "./src", /* Base directory to resolve non-absolute module names. */ "paths": { - // "@reporters/*": ["src/reporters/*"], - // "@services/*": ["src/services/*"] + "@contexts/*": ["contexts/*"], + "@detectors/*": ["detectors/*"], + "@inspectors/*": ["inspectors/*"], + "@libs/*": ["libs/*"], + "@practices/*": ["practices/*"], + "@reporters/*": ["reporters/*"], + "@core/*": ["scanner/*"], + "@services/*": ["services/*"], + "@test/*": ["test/*"], }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ "typeRoots": ["./types", "node_modules/@types"], /* List of folders to include type definitions from. */ @@ -64,6 +71,6 @@ "preserveConstEnums": true, "forceConsistentCasingInFileNames": true }, - "include": ["src/**/*", "test/helpers/**/*", "test/**/*"], + "include": ["src/**/*", "src/test/**/*"], "exclude": ["node_modules", "lib", "types"] } diff --git a/yarn.lock b/yarn.lock index eaf20aec1..98bc0c624 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5914,6 +5914,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +module-alias@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" + integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" From 2ece3f38e0027e9e2fefab1239c0f233af0ff3be Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Dec 2019 00:31:17 +0000 Subject: [PATCH 088/196] chore(deps): update all non-major dependencies --- .nvmrc | 2 +- package.json | 26 +++---- yarn.lock | 188 ++++++++++++++++++++++++++++----------------------- 3 files changed, 117 insertions(+), 99 deletions(-) diff --git a/.nvmrc b/.nvmrc index 47c0a98a1..0fefb1351 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -12.13.0 +12.13.1 diff --git a/package.json b/package.json index e3e155c89..a11854505 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "colors": "1.4.0", "cross-env": "6.0.3", "debug": "4.1.1", - "eslint": "6.6.0", + "eslint": "6.7.2", "eslint-plugin-eslint-plugin": "2.1.0", "git-url-parse": "11.1.2", "glob": "7.1.6", @@ -44,46 +44,46 @@ "inversify": "5.0.1", "js-yaml": "3.13.1", "lodash": "4.17.15", - "memfs": "2.16.1", + "memfs": "2.17.1", "node-filter-async": "1.1.3", - "npm-check-updates": "3.2.1", - "oclif": "1.14.2", + "npm-check-updates": "3.2.2", + "oclif": "1.15.1", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", "toposort": "2.0.2", - "ts-node": "8.5.2", + "ts-node": "8.5.4", "tslib": "1.10.0", "typescript": "3.7.2", "update-notifier": "3.0.1", "xml2js": "0.4.22" }, "devDependencies": { - "@semantic-release/changelog": "3.0.5", + "@semantic-release/changelog": "3.0.6", "@semantic-release/git": "7.0.18", "@types/debug": "4.1.5", "@types/git-url-parse": "9.0.0", "@types/glob": "7.1.1", "@types/jest": "24.0.23", - "@types/lodash": "4.14.148", - "@types/node": "12.12.8", + "@types/lodash": "4.14.149", + "@types/node": "12.12.14", "@types/rimraf": "2.0.3", "@types/semver": "6.2.0", "@types/toposort": "2.0.3", "@types/update-notifier": "2.5.0", "@types/xml2js": "0.4.5", - "@typescript-eslint/eslint-plugin": "2.7.0", - "@typescript-eslint/parser": "2.7.0", + "@typescript-eslint/eslint-plugin": "2.9.0", + "@typescript-eslint/parser": "2.9.0", "codecov": "3.6.1", - "eslint-config-prettier": "6.6.0", + "eslint-config-prettier": "6.7.0", "eslint-plugin-prettier": "3.1.1", "jest": "24.9.0", "nock": "11.7.0", "prettier": "1.19.1", "rimraf": "3.0.0", "semantic-release": "15.13.31", - "semantic-release-slack-bot": "1.3.5", - "ts-jest": "24.1.0" + "semantic-release-slack-bot": "1.3.6", + "ts-jest": "24.2.0" }, "engineStrict": true, "engines": { diff --git a/yarn.lock b/yarn.lock index eaf20aec1..2464a445a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -585,10 +585,10 @@ universal-user-agent "^3.0.0" url-template "^2.0.8" -"@semantic-release/changelog@3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-3.0.5.tgz#37423eee40f550acb8e09ff1d951ba79263e3b2d" - integrity sha512-/U44eK5qL2olevbEi+GrJxq1lNGUABChqK58A3SkiDsZS6AoGO8CJHQ7OG0zx+spxwkY4TevZ85Whz/hYyO+5w== +"@semantic-release/changelog@3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-3.0.6.tgz#9d68d68bf732cbba1034c028bb6720091f783b2a" + integrity sha512-9TqPL/VarLLj6WkUqbIqFiY3nwPmLuKFHy9fe/LamAW5s4MEW/ig9zW9vzYGOUVtWdErGJ1J62E3Edkamh3xaQ== dependencies: "@semantic-release/error" "^2.1.0" aggregate-error "^3.0.0" @@ -813,10 +813,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== -"@types/lodash@4.14.148": - version "4.14.148" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.148.tgz#ffa2786721707b335c6aa1465e6d3d74016fbd3e" - integrity sha512-05+sIGPev6pwpHF7NZKfP3jcXhXsIVFnYyVRT4WOB0me62E8OlWfTN+sKyt2/rqN+ETxuHAtgTSK1v71F0yncg== +"@types/lodash@4.14.149": + version "4.14.149" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" + integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== "@types/minimatch@*": version "3.0.3" @@ -828,10 +828,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031" integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ== -"@types/node@12.12.8": - version "12.12.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.8.tgz#dab418655af39ce2fa99286a0bed21ef8072ac9d" - integrity sha512-XLla8N+iyfjvsa0KKV+BP/iGSoTmwxsu5Ci5sM33z9TjohF72DEz95iNvD6pPmemvbQgxAv/909G73gUn8QR7w== +"@types/node@12.12.14": + version "12.12.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" + integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -895,43 +895,44 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.7.0.tgz#dff176bdb73dfd7e2e43062452189bd1b9db6021" - integrity sha512-H5G7yi0b0FgmqaEUpzyBlVh0d9lq4cWG2ap0RKa6BkF3rpBb6IrAoubt1NWh9R2kRs/f0k6XwRDiDz3X/FqXhQ== +"@typescript-eslint/eslint-plugin@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.9.0.tgz#fa810282c0e45f6c2310b9c0dfcd25bff97ab7e9" + integrity sha512-98rfOt3NYn5Gr9wekTB8TexxN6oM8ZRvYuphPs1Atfsy419SDLYCaE30aJkRiiTCwGEY98vOhFsEVm7Zs4toQQ== dependencies: - "@typescript-eslint/experimental-utils" "2.7.0" - eslint-utils "^1.4.2" + "@typescript-eslint/experimental-utils" "2.9.0" + eslint-utils "^1.4.3" functional-red-black-tree "^1.0.1" - regexpp "^2.0.1" + regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz#58d790a3884df3041b5a5e08f9e5e6b7c41864b5" - integrity sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg== +"@typescript-eslint/experimental-utils@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.9.0.tgz#bbe99a8d9510240c055fc4b17230dd0192ba3c7f" + integrity sha512-0lOLFdpdJsCMqMSZT7l7W2ta0+GX8A3iefG3FovJjrX+QR8y6htFlFdU7aOVPL6pDvt6XcsOb8fxk5sq+girTw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.7.0" + "@typescript-eslint/typescript-estree" "2.9.0" eslint-scope "^5.0.0" -"@typescript-eslint/parser@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.7.0.tgz#b5e6a4944e2b68dba1e7fbfd5242e09ff552fd12" - integrity sha512-ctC0g0ZvYclxMh/xI+tyqP0EC2fAo6KicN9Wm2EIao+8OppLfxji7KAGJosQHSGBj3TcqUrA96AjgXuKa5ob2g== +"@typescript-eslint/parser@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.9.0.tgz#2e9cf438de119b143f642a3a406e1e27eb70b7cd" + integrity sha512-fJ+dNs3CCvEsJK2/Vg5c2ZjuQ860ySOAsodDPwBaVlrGvRN+iCNC8kUfLFL8cT49W4GSiLPa/bHiMjYXA7EhKQ== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.7.0" - "@typescript-eslint/typescript-estree" "2.7.0" + "@typescript-eslint/experimental-utils" "2.9.0" + "@typescript-eslint/typescript-estree" "2.9.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz#34fd98c77a07b40d04d5b4203eddd3abeab909f4" - integrity sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag== +"@typescript-eslint/typescript-estree@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.9.0.tgz#09138daf8f47d0e494ba7db9e77394e928803017" + integrity sha512-v6btSPXEWCP594eZbM+JCXuFoXWXyF/z8kaSBSdCb83DF+Y7+xItW29SsKtSULgLemqJBT+LpT+0ZqdfH7QVmA== dependencies: debug "^4.1.1" - glob "^7.1.4" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" is-glob "^4.0.1" lodash.unescape "4.0.1" semver "^6.3.0" @@ -2802,10 +2803,10 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.6.0.tgz#4e039f65af8245e32d8fba4a2f5b83ed7186852e" - integrity sha512-6RGaj7jD+HeuSVHoIT6A0WkBhVEk0ULg74kp2FAWIwkYrOERae0TjIO09Cw33oN//gJWmt7aFhVJErEVta7uvA== +eslint-config-prettier@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" + integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== dependencies: get-stdin "^6.0.0" @@ -2829,13 +2830,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== - dependencies: - eslint-visitor-keys "^1.0.0" - eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -2843,20 +2837,15 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" - integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== +eslint@6.7.2: + version "6.7.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" + integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -2873,7 +2862,7 @@ eslint@6.6.0: file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^11.7.0" + globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -2886,7 +2875,7 @@ eslint@6.6.0: minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" + optionator "^0.8.3" progress "^2.0.0" regexpp "^2.0.1" semver "^6.1.2" @@ -3133,7 +3122,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3556,7 +3545,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@7.1.6: +glob@7.1.6, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3598,11 +3587,18 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + globby@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" @@ -5718,10 +5714,10 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -memfs@2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.16.1.tgz#ef6ed9b24c7df07704758fce42431c3838291ffa" - integrity sha512-hOUIxeXPuDeryPx1h+WxkBWJwWmd8f1lYXBdUMFMLEhxGGlaP6ri30eW9K4cMpbuizNsAwQe2SK3KyRa9qodXw== +memfs@2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.17.1.tgz#bfcc11b6308214b4fb33eaca101132722d22e103" + integrity sha512-4kAcqibPAd8DN8/UIW/6OwvbhNq6MqwsQ0pxjo+2ZmxPlQAbn9TAepnRpdeYfw4Qq0Y+QqwE6wngLUowo2fcjg== dependencies: fast-extend "0.0.2" fs-monkey "^0.3.3" @@ -6184,10 +6180,10 @@ npm-cache-filename@~1.0.2: resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= -npm-check-updates@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-3.2.1.tgz#6bb73a5b8684e94b6093d1f189d176074eb4512b" - integrity sha512-gYXHGc9mAncGrEMjs2uRJgOdWRP5CR9iZ+HyUNf4eqjtdDV6jLvi2e19G5BEpdvc8fU73J+B5m8ALYB49du/EA== +npm-check-updates@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-3.2.2.tgz#20719e4627f8f6ab87274adfdb30fda22027bde1" + integrity sha512-smZLGQWYbNOQVL787LwxTKakhTll/GZ4EwlKRfskD+eTCSpxdwpbkUHbT0QxyCf1uZw86TXeAFGw8ETzmW3Fqw== dependencies: chalk "^2.4.2" cint "^8.2.1" @@ -6515,10 +6511,10 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -oclif@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-1.14.2.tgz#6599ab4bc28d884724e25bd1730b05925286657a" - integrity sha512-o5h/Ed8RiDRXC5OC8Qpm8XRKiA+wqCUj9ZC/ZOOvRnSmOaUus8moqG8Rg7i6UC/d5TUASpL7eeeTWM3gsSBexg== +oclif@1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/oclif/-/oclif-1.15.1.tgz#606e3009028361983e91f0385dad24806fe4a35c" + integrity sha512-SH0ry/pOPq2B4wp8CbHEFL/L3XWWm5BiIsJvbq+G6z/HSs8Csg7UAyBgxCSY0MBb4avv8803ljBO4MfcoUCaBA== dependencies: "@oclif/command" "^1.5.8" "@oclif/config" "^1.12.6" @@ -6594,7 +6590,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -6606,6 +6602,18 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -7529,6 +7537,11 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + registry-auth-token@^3.0.1, registry-auth-token@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -7903,10 +7916,10 @@ scoped-regex@^1.0.0: resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" integrity sha1-o0a7Gs1CB65wvXwMfKnlZra63bg= -semantic-release-slack-bot@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/semantic-release-slack-bot/-/semantic-release-slack-bot-1.3.5.tgz#06620afbda210da4d7e2637fc76102dc8bd05540" - integrity sha512-Wn0/WMWvHepcGfoExLKJiKWKhMxSX5qCoHfgiOCHyCMLVuif7VAS3OBfIxFhJqwIOrkZYTioYklypNMhC0xbvg== +semantic-release-slack-bot@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/semantic-release-slack-bot/-/semantic-release-slack-bot-1.3.6.tgz#d7e639e59f64aa0fd146ddfb0ff2837394965ea8" + integrity sha512-tf8r/gxyOXvqyYHmxL4oyzYdgQBVcxB7gw/pqnXcoB9y1zD6E5t1oC5a5Yiqgog0Prt33+WyOQEaa/zy3UrglA== dependencies: "@semantic-release/error" "^2.2.0" node-fetch "^2.3.0" @@ -8834,10 +8847,10 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== -ts-jest@24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.1.0.tgz#2eaa813271a2987b7e6c3fefbda196301c131734" - integrity sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ== +ts-jest@24.2.0: + version "24.2.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" + integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -8850,10 +8863,10 @@ ts-jest@24.1.0: semver "^5.5" yargs-parser "10.x" -ts-node@8.5.2: - version "8.5.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.5.2.tgz#434f6c893bafe501a30b32ac94ee36809ba2adce" - integrity sha512-W1DK/a6BGoV/D4x/SXXm6TSQx6q3blECUzd5TN+j56YEMX3yPVMpHsICLedUw3DvGF3aTQ8hfdR9AKMaHjIi+A== +ts-node@8.5.4: + version "8.5.4" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.5.4.tgz#a152add11fa19c221d0b48962c210cf467262ab2" + integrity sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw== dependencies: arg "^4.1.0" diff "^4.0.1" @@ -9378,6 +9391,11 @@ with-open-file@^0.1.6: p-try "^2.1.0" pify "^4.0.1" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" From 831a158ea107b5092bac8f749e19669a6833bfea Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 2 Dec 2019 12:29:04 +0000 Subject: [PATCH 089/196] chore(release): 1.22.0 [skip ci] # [1.22.0](https://github.com/dxheroes/dx-scanner/compare/v1.21.1...v1.22.0) (2019-12-02) ### Bug Fixes * **cli:** added an action start and stop to --init ([88edb72](https://github.com/dxheroes/dx-scanner/commit/88edb72)) * **cli:** added more conditions to check for existing files for --init ([5e98e0f](https://github.com/dxheroes/dx-scanner/commit/5e98e0f)) * **cli:** using sync method to write files & practices are sorted alphabetically ([fb46b95](https://github.com/dxheroes/dx-scanner/commit/fb46b95)) ### Features * **cli:** --init command creates a yaml config file ([29f0cbc](https://github.com/dxheroes/dx-scanner/commit/29f0cbc)) --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dc1814e7..385b10d9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [1.22.0](https://github.com/dxheroes/dx-scanner/compare/v1.21.1...v1.22.0) (2019-12-02) + + +### Bug Fixes + +* **cli:** added an action start and stop to --init ([88edb72](https://github.com/dxheroes/dx-scanner/commit/88edb72)) +* **cli:** added more conditions to check for existing files for --init ([5e98e0f](https://github.com/dxheroes/dx-scanner/commit/5e98e0f)) +* **cli:** using sync method to write files & practices are sorted alphabetically ([fb46b95](https://github.com/dxheroes/dx-scanner/commit/fb46b95)) + + +### Features + +* **cli:** --init command creates a yaml config file ([29f0cbc](https://github.com/dxheroes/dx-scanner/commit/29f0cbc)) + ## [1.21.1](https://github.com/dxheroes/dx-scanner/compare/v1.21.0...v1.21.1) (2019-11-28) diff --git a/package.json b/package.json index f2c56d1e4..9e23e44c7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.21.1", + "version": "1.22.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 6c8c259b166bbfb427eb1d0ba5bd076cd249de03 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Dec 2019 12:29:31 +0000 Subject: [PATCH 090/196] fix(deps): update dependency memfs to v3 --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 9e23e44c7..4c2435b5b 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "inversify": "5.0.1", "js-yaml": "3.13.1", "lodash": "4.17.15", - "memfs": "2.17.1", + "memfs": "3.0.1", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", diff --git a/yarn.lock b/yarn.lock index 55e87b4be..09c42c484 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3093,10 +3093,10 @@ fast-diff@^1.1.2, fast-diff@^1.2.0: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-extend@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/fast-extend/-/fast-extend-0.0.2.tgz#f5ec42cf40b9460f521a6387dfb52deeed671dbd" - integrity sha1-9exCz0C5Rg9SGmOH37Ut7u1nHb0= +fast-extend@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fast-extend/-/fast-extend-1.0.2.tgz#3b8a5b09cbc8ff3d6d47eaf397398c0a643e441b" + integrity sha512-XXA9RmlPatkFKUzqVZAFth18R4Wo+Xug/S+C7YlYA3xrXwfPlW3dqNwOb4hvQo7wZJ2cNDYhrYuPzVOfHy5/uQ== fast-glob@^2.0.2: version "2.2.7" @@ -3340,7 +3340,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-monkey@^0.3.3: +fs-monkey@0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-0.3.3.tgz#7960bb2b1fa2653731b9d0e2e84812a7e8b3664a" integrity sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw== @@ -5719,13 +5719,13 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -memfs@2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.17.1.tgz#bfcc11b6308214b4fb33eaca101132722d22e103" - integrity sha512-4kAcqibPAd8DN8/UIW/6OwvbhNq6MqwsQ0pxjo+2ZmxPlQAbn9TAepnRpdeYfw4Qq0Y+QqwE6wngLUowo2fcjg== +memfs@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.0.1.tgz#efd259d5ff448a7c0678198d43cee0d1f60b74e1" + integrity sha512-v8MPoino1vfmwl2LDbFAg5tgPd7EPvKLvcSkx/CDJGB3JCGyHZSasRtC63wmM+iHFXh4cooYCu+cWCd1dqh2+A== dependencies: - fast-extend "0.0.2" - fs-monkey "^0.3.3" + fast-extend "1.0.2" + fs-monkey "0.3.3" meow@^3.6.0, meow@^3.7.0: version "3.7.0" From 563a7eb11dfb342a56b4b84fa9df5392e8f04c67 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 14:13:33 +0100 Subject: [PATCH 091/196] fix: add BitbucketIssueState enum --- src/inspectors/IIssueTrackingInspector.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/inspectors/IIssueTrackingInspector.ts b/src/inspectors/IIssueTrackingInspector.ts index 3d67de54d..5b08d79be 100644 --- a/src/inspectors/IIssueTrackingInspector.ts +++ b/src/inspectors/IIssueTrackingInspector.ts @@ -7,6 +7,14 @@ export enum IssueState { all = 'all', } +export enum BitbucketIssueState { + new = 'new', + closed = 'closed', + duplicate = 'duplicate', + resolved = 'resolved', + invalid = 'invalid', +} + export interface IIssueTrackingInspector { getIssues(owner: string, repo: string): Promise>; getIssue(owner: string, repo: string, id: number): Promise; From e05ca5888bdb6e9078a71522706992035240d3f4 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 14:40:22 +0100 Subject: [PATCH 092/196] fix: add BitbucketPRState --- src/services/git/ICVSService.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/services/git/ICVSService.ts b/src/services/git/ICVSService.ts index 0b427b83c..3db777abb 100644 --- a/src/services/git/ICVSService.ts +++ b/src/services/git/ICVSService.ts @@ -19,3 +19,10 @@ export interface ICVSService { getIssue(owner: string, repo: string, issueNumber: number): Promise; getRepoContent(owner: string, repo: string, path: string): Promise; } + +export enum BitbucketPullRequestState { + open = 'OPEN', + closed = 'MERGED', + declined = 'DECLINED', + superseded = 'SUPERSEDED', +} From e2e6dc6ecf0ba969541936d6ae666ca2b05f79d0 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 14:42:03 +0100 Subject: [PATCH 093/196] fix: mergedAt and closedAt values, also fix tests for that --- src/services/bitbucket/BitbucketService.ts | 27 ++++++++++--------- .../getPullRequestResponse.ts | 2 +- .../getPullRequestsResponse.ts | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index f70b11103..cda16198a 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -25,7 +25,8 @@ import { Directory, File, } from '../git/model'; -import { ICVSService } from '../git/ICVSService'; +import { ICVSService, BitbucketPullRequestState } from '../git/ICVSService'; +import { BitbucketIssueState } from '../../inspectors/IIssueTrackingInspector'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() @@ -92,10 +93,8 @@ export class BitbucketService implements ICVSService { body: val.description, createdAt: val.created_on, updatedAt: val.updated_on, - //TODO - closedAt: null, - //TODO - mergedAt: null, + closedAt: val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, + mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, state: val.state, id: val.id, base: { @@ -141,10 +140,11 @@ export class BitbucketService implements ICVSService { body: response.data.summary.raw, createdAt: response.data.created_on, updatedAt: response.data.updated_on, - //TODO - closedAt: null, - //TODO - mergedAt: null, + closedAt: + response.data.state === BitbucketPullRequestState.closed || response.data.state === BitbucketPullRequestState.declined + ? response.data.updated_on + : null, + mergedAt: response.data.state === BitbucketPullRequestState.closed ? response.data.updated_on : null, state: response.data.state, id: response.data.id, base: { @@ -215,8 +215,7 @@ export class BitbucketService implements ICVSService { body: val.content.raw, createdAt: val.created_on, updatedAt: val.updated_on, - //TODO - closedAt: null, + closedAt: val.state === BitbucketIssueState.resolved || val.state === BitbucketIssueState.closed ? val.updated_on : null, state: val.state, id: val.repository.uuid, })); @@ -244,8 +243,10 @@ export class BitbucketService implements ICVSService { body: response.data.content.raw, createdAt: response.data.created_on, updatedAt: response.data.updated_on, - //TODO - closedAt: null, + closedAt: + response.data.state === BitbucketIssueState.resolved || response.data.state === BitbucketIssueState.closed + ? response.data.updated_on + : null, state: response.data.state, }; } diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts index 837421c54..c4a6d7d1f 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts @@ -10,7 +10,7 @@ export const getPullRequestResponse: PullRequest = { body: 'Added a floor() ufunc to micronumpy', createdAt: '2011-06-22T19:44:39.555192+00:00', updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, + closedAt: '2011-06-23T13:52:30.230741+00:00', mergedAt: null, state: 'DECLINED', id: 1, diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts index d8f68df38..5b1127aa6 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts @@ -13,7 +13,7 @@ export const getPullRequestsResponse: Paginated = { body: 'Added a floor() ufunc to micronumpy', createdAt: '2011-06-22T19:44:39.555192+00:00', updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, + closedAt: '2011-06-23T13:52:30.230741+00:00', mergedAt: null, state: 'DECLINED', id: 1, From 9f025d2d8f289a8d9d043905c952f923af73ede4 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 2 Dec 2019 14:47:22 +0100 Subject: [PATCH 094/196] fix: name of tests Co-Authored-By: Prokop Simek --- src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts index d1527ef2c..cbad5d263 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts @@ -5,7 +5,7 @@ import { PracticeEvaluationResult } from '../../model'; import { getRepoCommitsServiceResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; import { CorrectCommitMessagesPractice } from './CorrectCommitMessages'; -describe('CorrectCommitMessages', () => { +describe('CorrectCommitMessagesPractice', () => { let practice: CorrectCommitMessagesPractice; let containerCtx: TestContainerContext; const MockedCollaborationInspector = >(CollaborationInspector); From b804092603684b5bea2724b83699551022393c6d Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 2 Dec 2019 14:47:53 +0100 Subject: [PATCH 095/196] fix: version of parse-commit-message Co-Authored-By: Prokop Simek --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 27980e36b..ac3782372 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", - "parse-commit-message": "^3.2.3", + "parse-commit-message": "3.2.3", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", From 6710a7fd63288a148840a586f9bc1fd29f035078 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 2 Dec 2019 14:48:20 +0100 Subject: [PATCH 096/196] fix: url Co-Authored-By: Prokop Simek --- src/practices/LanguageIndependent/CorrectCommitMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts index 8938022d0..580136476 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -11,7 +11,7 @@ import { IPractice } from '../IPractice'; impact: PracticeImpact.small, suggestion: '', reportOnlyOnce: true, - url: 'https://www.conventionalcommits.org/en/v1.0.0/', + url: 'https://www.conventionalcommits.org/', }) export class CorrectCommitMessagesPractice implements IPractice { async isApplicable(): Promise { From a42909ed34525665e8a674697d8d01b4d5a53026 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Mon, 2 Dec 2019 14:48:38 +0100 Subject: [PATCH 097/196] fix: name of value Co-Authored-By: Prokop Simek --- src/practices/LanguageIndependent/CorrectCommitMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts index 580136476..00b65fd5a 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -31,6 +31,6 @@ export class CorrectCommitMessagesPractice implements IPractice { const areCorrectMessages = parser.validate(messages, false); - return areCorrectMessages ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; + return areMessagesCorrect ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; } } From c5bde8823332a380497b26b9b4913af6445942ac Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 14:58:22 +0100 Subject: [PATCH 098/196] fix: unify name --- src/practices/LanguageIndependent/CorrectCommitMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessages.ts index 00b65fd5a..57c03735e 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessages.ts @@ -29,7 +29,7 @@ export class CorrectCommitMessagesPractice implements IPractice { const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); const messages = repoCommits.items.map((val) => val.message); - const areCorrectMessages = parser.validate(messages, false); + const areMessagesCorrect = parser.validate(messages, false); return areMessagesCorrect ? PracticeEvaluationResult.practicing : PracticeEvaluationResult.notPracticing; } From 3769e648f7432f400578a68f83ae248854959869 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 14:59:55 +0100 Subject: [PATCH 099/196] fix: rename files --- ...itMessages.spec.ts => CorrectCommitMessagesPractice.spec.ts} | 2 +- ...orrectCommitMessages.ts => CorrectCommitMessagesPractice.ts} | 0 src/practices/index.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/practices/LanguageIndependent/{CorrectCommitMessages.spec.ts => CorrectCommitMessagesPractice.spec.ts} (99%) rename src/practices/LanguageIndependent/{CorrectCommitMessages.ts => CorrectCommitMessagesPractice.ts} (100%) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts similarity index 99% rename from src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts rename to src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts index cbad5d263..51bbf1784 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessages.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts @@ -3,7 +3,7 @@ import { CollaborationInspector } from '../../inspectors/CollaborationInspector' import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; import { getRepoCommitsServiceResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; -import { CorrectCommitMessagesPractice } from './CorrectCommitMessages'; +import { CorrectCommitMessagesPractice } from './CorrectCommitMessagesPractice'; describe('CorrectCommitMessagesPractice', () => { let practice: CorrectCommitMessagesPractice; diff --git a/src/practices/LanguageIndependent/CorrectCommitMessages.ts b/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.ts similarity index 100% rename from src/practices/LanguageIndependent/CorrectCommitMessages.ts rename to src/practices/LanguageIndependent/CorrectCommitMessagesPractice.ts diff --git a/src/practices/index.ts b/src/practices/index.ts index 147be3f4b..942a979ef 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -22,7 +22,7 @@ import { ESLintWithoutErrorsPractice } from './JavaScript/ESLintWithoutErrorsPra import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrectlySetPractice'; import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; -import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessages'; +import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessagesPractice'; // register practices here export const practices = [ From 20fec03d6ac892b5ac858f19c3c8b2f95e9f6030 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 15:52:52 +0100 Subject: [PATCH 100/196] fix: add moment to package.json --- package.json | 1 + yarn.lock | 37 ------------------------------------- 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/package.json b/package.json index 9e23e44c7..63ff4c0d2 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "js-yaml": "3.13.1", "lodash": "4.17.15", "memfs": "2.17.1", + "moment": "^2.24.0", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", diff --git a/yarn.lock b/yarn.lock index f5d4a548b..3130eb14a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,13 +2003,6 @@ collapse-white-space@^1.0.2: resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== -collect-mentions@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-mentions/-/collect-mentions-1.0.2.tgz#30734fcb33cbf8999cf7fd6d9c3133045f0b4dcc" - integrity sha512-/jRhzWp5bkZnvgtR+agXT0RvYKBXOl4uG+eKA6ip3tp1x+jRAV36jW2TceKutOeuEPjHKaQ6DJjeh5zvZF0fWQ== - dependencies: - mentions-regex "^2.0.3" - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2477,11 +2470,6 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2902,11 +2890,6 @@ eslint@6.7.2: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esm@^3.0.84: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -5744,11 +5727,6 @@ memfs@2.17.1: fast-extend "0.0.2" fs-monkey "^0.3.3" -mentions-regex@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/mentions-regex/-/mentions-regex-2.0.3.tgz#442717a0048e53c2d2e2ae5e63a4e54a55ca9603" - integrity sha1-RCcXoASOU8LS4q5eY6TlSlXKlgM= - meow@^3.6.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -5925,11 +5903,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mixin-deep@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-2.0.1.tgz#9a6946bef4a368401b784970ae3caaaa6bab02fa" - integrity sha512-imbHQNRglyaplMmjBLL3V5R6Bfq5oM+ivds3SKgc6oRtzErEnBUUc5No11Z2pilkUvl42gJvi285xTNswcKCMA== - mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -6911,16 +6884,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-commit-message@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/parse-commit-message/-/parse-commit-message-3.2.3.tgz#96a0b2e3fb295aece355d3a8bd326b6a6f555372" - integrity sha512-JujCvCYUrjhmaRHb2AuzR9mAos9JE/5+ZftAaFoGtPhoJ9KNQcgx6JtrWGmGFkVjfky5qTBRjzJeFZla1Po0/A== - dependencies: - collect-mentions "^1.0.2" - dedent "^0.7.0" - esm "^3.0.84" - mixin-deep "^2.0.0" - parse-entities@^1.0.2, parse-entities@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" From d5c6a08cbcdf3d71f23de1e79a7e98a76d04e800 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 16:17:03 +0100 Subject: [PATCH 101/196] fix: Add parse-commit-message --- package.json | 1 + yarn.lock | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/package.json b/package.json index 63ff4c0d2..9d974f9c9 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", + "parse-commit-message": "^3.2.3", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", diff --git a/yarn.lock b/yarn.lock index 3130eb14a..f5d4a548b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,6 +2003,13 @@ collapse-white-space@^1.0.2: resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== +collect-mentions@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-mentions/-/collect-mentions-1.0.2.tgz#30734fcb33cbf8999cf7fd6d9c3133045f0b4dcc" + integrity sha512-/jRhzWp5bkZnvgtR+agXT0RvYKBXOl4uG+eKA6ip3tp1x+jRAV36jW2TceKutOeuEPjHKaQ6DJjeh5zvZF0fWQ== + dependencies: + mentions-regex "^2.0.3" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2470,6 +2477,11 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2890,6 +2902,11 @@ eslint@6.7.2: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.0.84: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -5727,6 +5744,11 @@ memfs@2.17.1: fast-extend "0.0.2" fs-monkey "^0.3.3" +mentions-regex@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/mentions-regex/-/mentions-regex-2.0.3.tgz#442717a0048e53c2d2e2ae5e63a4e54a55ca9603" + integrity sha1-RCcXoASOU8LS4q5eY6TlSlXKlgM= + meow@^3.6.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -5903,6 +5925,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mixin-deep@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-2.0.1.tgz#9a6946bef4a368401b784970ae3caaaa6bab02fa" + integrity sha512-imbHQNRglyaplMmjBLL3V5R6Bfq5oM+ivds3SKgc6oRtzErEnBUUc5No11Z2pilkUvl42gJvi285xTNswcKCMA== + mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -6884,6 +6911,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-commit-message@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/parse-commit-message/-/parse-commit-message-3.2.3.tgz#96a0b2e3fb295aece355d3a8bd326b6a6f555372" + integrity sha512-JujCvCYUrjhmaRHb2AuzR9mAos9JE/5+ZftAaFoGtPhoJ9KNQcgx6JtrWGmGFkVjfky5qTBRjzJeFZla1Po0/A== + dependencies: + collect-mentions "^1.0.2" + dedent "^0.7.0" + esm "^3.0.84" + mixin-deep "^2.0.0" + parse-entities@^1.0.2, parse-entities@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" From dd8216d0a178d6f6603211e2309f9106442ddac6 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 16:23:08 +0100 Subject: [PATCH 102/196] fix: remove merge conflict --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index 0dab5c668..3fcf49d77 100644 --- a/package.json +++ b/package.json @@ -45,13 +45,8 @@ "inversify": "5.0.1", "js-yaml": "3.13.1", "lodash": "4.17.15", -<<<<<<< HEAD - "memfs": "2.17.1", - "moment": "^2.24.0", -======= "moment": "^2.24.0", "memfs": "2.17.1", ->>>>>>> 1295de90ab62c52c9f0ced81f020216f283a622e "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", From 6022e9e7e180b29d33bc29f8b7d3e705647cf662 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 2 Dec 2019 16:48:29 +0100 Subject: [PATCH 103/196] fix: add qs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37d70a6bd..8c847923d 100644 --- a/package.json +++ b/package.json @@ -48,9 +48,9 @@ "lodash": "4.17.15", "memfs": "2.17.1", "node-filter-async": "1.1.3", - "qs": "^6.9.1", "npm-check-updates": "3.2.2", "oclif": "1.15.1", + "qs": "^6.9.1", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", From 03eafcfac49844dc52e6576854578cffb905dd64 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 4 Dec 2019 14:14:46 +0100 Subject: [PATCH 104/196] fix: use axios because bitbucket client can't allow to get all pullrequests. Write tests for that. --- package.json | 2 +- .../bitbucket/BitbucketService.spec.ts | 29 +++- src/services/bitbucket/BitbucketService.ts | 28 ++-- .../getPullRequestResponse.ts | 2 +- .../getPullRequestsResponse.ts | 128 +++++++++++++++++- test/helpers/bitbucketNock.ts | 49 +++++-- yarn.lock | 2 +- 7 files changed, 205 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 8c847923d..b2be86086 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@types/js-yaml": "3.12.1", "@types/qs": "^6.9.0", "@types/yaml": "^1.2.0", - "axios": "0.19.0", + "axios": "^0.19.0", "bitbucket": "1.15.2", "colors": "1.4.0", "cross-env": "6.0.3", diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 2b8d649ae..96b8e3c78 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -7,10 +7,17 @@ import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/ge import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits'; import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; -import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; +import { + getOpenPullRequestsResponse, + getMergedPullRequestsResponse, + getAllPullrequestsResponse, +} from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; import { BitbucketService } from './BitbucketService'; import { getRepoCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommits'; import { getRepoCommit } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommit'; +import { BitbucketPullRequestState, VCSService } from '../git/IVCSService'; +import { VCSServicesUtils } from '../git/VCSServicesUtils'; +import util from 'util'; describe('Bitbucket Service', () => { let service: BitbucketService; @@ -29,7 +36,18 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests'); const response = await service.getPullRequests('pypy', 'pypy'); - expect(response).toMatchObject(getPullRequestsResponse); + expect(response).toMatchObject(getOpenPullRequestsResponse); + }); + + it('returns all pull requests in own interface', async () => { + const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); + nock(bitbucketNock.url) + .get('/users/pypy') + .reply(200); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); + + const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); + expect(response).toMatchObject(getAllPullrequestsResponse); }); it('returns pull request in own interface', async () => { @@ -67,7 +85,7 @@ describe('Bitbucket Service', () => { expect(response).toMatchObject(getIssueCommentsResponse); }); - it('returns declined pull requests in own interface', async () => { + it('returns merged pull requests in own interface', async () => { const state: ListGetterOptions<{ state?: PullRequestState }> = { filter: { state: PullRequestState.closed, @@ -77,9 +95,10 @@ describe('Bitbucket Service', () => { nock(bitbucketNock.url) .get('/users/pypy') .reply(200); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, 'MERGED'); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); + const response = await service.getPullRequests('pypy', 'pypy', state); - expect(response).toMatchObject(getPullRequestsResponse); + expect(response).toMatchObject(getMergedPullRequestsResponse); }); it('returns repo commits in own interface', async () => { diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 2701d2739..43f0af7b7 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -29,6 +29,8 @@ import { VCSService, IVCSService, BitbucketPullRequestState } from '../git/IVCSS import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; import { VCSServicesUtils } from '../git/VCSServicesUtils'; +import axios from 'axios'; +import qs from 'qs'; const debug = Debug('cli:services:git:bitbucket-service'); @injectable() @@ -81,28 +83,20 @@ export class BitbucketService implements IVCSService { repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { - let params: Bitbucket.Params.PullrequestsList = { - repo_slug: repo, - username: owner, - }; - let state; if (options?.filter?.state) { state = VCSServicesUtils.getPRState(options.filter.state, VCSService.bitbucket); - if (state) { - if (state.length > 1) { - state = state; - //params = { ...params, state }; - } - state = state; - params = { ...params, state }; - } + } + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + let apiUrl = `https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/pullrequests`; + if (stateForUri) { + apiUrl = apiUrl.concat(`${stateForUri}`); } - const response = >>await this.client.pullrequests.list(params); - const url = 'www.bitbucket.org'; + const ownerUrl = `www.bitbucket.org/${owner}`; const ownerId = String((await this.client.users.get({ username: owner })).data.uuid); - const urlOwner = url.concat(`/${owner}`); + + const response: DeepRequired> = await axios.get(apiUrl); const values = response.data.values.map(async (val) => { return { @@ -129,7 +123,7 @@ export class BitbucketService implements IVCSService { owner: { login: owner, id: ownerId, - url: urlOwner, + url: ownerUrl, }, }, }, diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts index 837421c54..28c97f017 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts @@ -12,7 +12,7 @@ export const getPullRequestResponse: PullRequest = { updatedAt: '2011-06-23T13:52:30.230741+00:00', closedAt: null, mergedAt: null, - state: 'DECLINED', + state: 'OPEN', id: 1, base: { repo: { diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts index d8f68df38..bd1f9f493 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts @@ -1,7 +1,7 @@ import { Paginated } from '../../../../inspectors/common/Paginated'; import { PullRequest } from '../../model'; -export const getPullRequestsResponse: Paginated = { +export const getOpenPullRequestsResponse: Paginated = { items: [ { user: { @@ -15,7 +15,40 @@ export const getPullRequestsResponse: Paginated = { updatedAt: '2011-06-23T13:52:30.230741+00:00', closedAt: null, mergedAt: null, - state: 'DECLINED', + state: 'OPEN', + id: 1, + base: { + repo: { + url: 'https://bitbucket.org/pypy/pypy', + name: 'pypy', + id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', + owner: { id: 'undefined', login: 'pypy', url: 'www.bitbucket.org/pypy' }, + }, + }, + }, + ], + totalCount: 1, + hasNextPage: true, + hasPreviousPage: false, + page: 1, + perPage: 1, +}; + +export const getMergedPullRequestsResponse: Paginated = { + items: [ + { + user: { + id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', + login: 'landtuna', + url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', + }, + url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', + body: 'Added a floor() ufunc to micronumpy', + createdAt: '2011-06-22T19:44:39.555192+00:00', + updatedAt: '2011-06-23T13:52:30.230741+00:00', + closedAt: null, + mergedAt: null, + state: 'MERGED', id: 1, base: { repo: { @@ -33,3 +66,94 @@ export const getPullRequestsResponse: Paginated = { page: 1, perPage: 1, }; + +export const getAllPullrequestsResponse: Paginated = { + items: [ + { + user: { + id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', + login: 'landtuna', + url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', + }, + url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', + body: 'Added a floor() ufunc to micronumpy', + createdAt: '2011-06-22T19:44:39.555192+00:00', + updatedAt: '2011-06-23T13:52:30.230741+00:00', + closedAt: null, + mergedAt: null, + state: 'OPEN', + id: 1, + base: { + repo: { + url: 'https://bitbucket.org/pypy/pypy', + name: 'pypy', + id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', + owner: { + login: 'pypy', + id: 'undefined', + url: 'www.bitbucket.org/pypy', + }, + }, + }, + }, + { + user: { + id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', + login: 'landtuna', + url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', + }, + url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', + body: 'Added a floor() ufunc to micronumpy', + createdAt: '2011-06-22T19:44:39.555192+00:00', + updatedAt: '2011-06-23T13:52:30.230741+00:00', + closedAt: null, + mergedAt: null, + state: 'MERGED', + id: 1, + base: { + repo: { + url: 'https://bitbucket.org/pypy/pypy', + name: 'pypy', + id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', + owner: { + login: 'pypy', + id: 'undefined', + url: 'www.bitbucket.org/pypy', + }, + }, + }, + }, + { + user: { + id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', + login: 'landtuna', + url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', + }, + url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', + body: 'Added a floor() ufunc to micronumpy', + createdAt: '2011-06-22T19:44:39.555192+00:00', + updatedAt: '2011-06-23T13:52:30.230741+00:00', + closedAt: null, + mergedAt: null, + state: 'DECLINED', + id: 1, + base: { + repo: { + url: 'https://bitbucket.org/pypy/pypy', + name: 'pypy', + id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', + owner: { + login: 'pypy', + id: 'undefined', + url: 'www.bitbucket.org/pypy', + }, + }, + }, + }, + ], + totalCount: 3, + hasNextPage: true, + hasPreviousPage: false, + page: 1, + perPage: 3, +}; diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index d103a8424..7d8cce0d8 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/camelcase */ import nock from 'nock'; +import qs from 'qs'; import { BitbucketCommit } from '../../src/services/bitbucket/BitbucketService'; +import { BitbucketPullRequestState } from '../../src/services/git/IVCSService'; export class BitbucketNock { user: string; @@ -12,13 +14,22 @@ export class BitbucketNock { this.url = 'https://api.bitbucket.org/2.0'; } - getApiResponse(resource: string, id?: number | string, value?: string, state?: string): nock.Scope { + getApiResponse( + resource: string, + id?: number | string, + value?: string, + state?: BitbucketPullRequestState | BitbucketPullRequestState[], + ): nock.Scope { let url = `${this.url}/repositories/${this.user}/${this.repoName}/${resource}`; let response; let params = {}; const persist = true; + if (state === undefined) { + state = BitbucketPullRequestState.open; + } + if (value !== undefined) { switch (value) { case 'comments': @@ -35,10 +46,30 @@ export class BitbucketNock { case 'pullrequests': if (id !== undefined) { url = url.concat(`/${id}`); - response = new PullRequest().pullRequest; + response = new PullRequest(state).pullRequest; } else { - response = new PullRequests().pullrequests; - if (state) { + if (typeof state !== 'string') { + const pullRequests: Bitbucket.Schema.Pullrequest[] = []; + state.forEach((state) => { + pullRequests.push(new PullRequest(state).pullRequest); + }); + + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + url = url.concat(`${stateForUri}`); + + response = new PullRequests(pullRequests).pullrequests; + + params = { state: state }; + } else if (state === BitbucketPullRequestState.open) { + const pullRequest = new PullRequest(state).pullRequest; + response = new PullRequests([pullRequest]).pullrequests; + } else { + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + url = url.concat(`${stateForUri}`); + + const pullRequest = new PullRequest(state).pullRequest; + response = new PullRequests([pullRequest]).pullrequests; + params = { state: state }; } } @@ -198,20 +229,22 @@ export class Issue { export class PullRequests { pullrequests: Bitbucket.Schema.PaginatedPullrequests; - constructor() { + constructor(pullRequests: (Bitbucket.Schema.Pullrequest & Bitbucket.Schema.Object)[]) { this.pullrequests = { page: 1, next: 'https://api.bitbucket.org/2.0/repositories/pypy/pypy/pullrequests?page=2', pagelen: 10, size: 20, - values: [new PullRequest().pullRequest], + values: pullRequests, }; } } export class PullRequest { pullRequest: Bitbucket.Schema.Pullrequest & Bitbucket.Schema.Object; - constructor() { + state: BitbucketPullRequestState; + constructor(state: BitbucketPullRequestState) { + this.state = state; this.pullRequest = { description: 'Added a floor() ufunc to micronumpy', links: { @@ -302,7 +335,7 @@ export class PullRequest { }, }, comment_count: 0, - state: 'DECLINED', + state: this.state, task_count: 0, participants: [], reason: 'already merged', diff --git a/yarn.lock b/yarn.lock index 9628ce850..3cd48c80a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1326,7 +1326,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axios@0.19.0: +axios@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== From 0ff00932eac83df027eb33f59bba7bc553a3ca57 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 4 Dec 2019 14:18:41 +0100 Subject: [PATCH 105/196] fix: rename interfaces - add mock to the end of the name --- test/helpers/bitbucketNock.ts | 50 +++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 7d8cce0d8..32ce78391 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -34,11 +34,11 @@ export class BitbucketNock { switch (value) { case 'comments': url = url.concat(`/${id}/${value}`); - response = new IssueComments().issueComments; + response = new IssueCommentsMock().issueComments; break; case 'commits': url = url.concat(`/${id}/${value}`); - response = new Commits().commits; + response = new CommitsMock().commits; break; } } else { @@ -46,29 +46,29 @@ export class BitbucketNock { case 'pullrequests': if (id !== undefined) { url = url.concat(`/${id}`); - response = new PullRequest(state).pullRequest; + response = new PullRequestMock(state).pullRequest; } else { if (typeof state !== 'string') { const pullRequests: Bitbucket.Schema.Pullrequest[] = []; state.forEach((state) => { - pullRequests.push(new PullRequest(state).pullRequest); + pullRequests.push(new PullRequestMock(state).pullRequest); }); const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); url = url.concat(`${stateForUri}`); - response = new PullRequests(pullRequests).pullrequests; + response = new PullRequestsMock(pullRequests).pullrequests; params = { state: state }; } else if (state === BitbucketPullRequestState.open) { - const pullRequest = new PullRequest(state).pullRequest; - response = new PullRequests([pullRequest]).pullrequests; + const pullRequest = new PullRequestMock(state).pullRequest; + response = new PullRequestsMock([pullRequest]).pullrequests; } else { const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); url = url.concat(`${stateForUri}`); - const pullRequest = new PullRequest(state).pullRequest; - response = new PullRequests([pullRequest]).pullrequests; + const pullRequest = new PullRequestMock(state).pullRequest; + response = new PullRequestsMock([pullRequest]).pullrequests; params = { state: state }; } @@ -77,17 +77,17 @@ export class BitbucketNock { case 'issues': if (id !== undefined) { url = url.concat(`/${id}`); - response = new Issue().issue; + response = new IssueMock().issue; } else { - response = new Issues().issues; + response = new IssuesMock().issues; } break; case 'commits': - response = new RepoCommits().repoCommits; + response = new RepoCommitsMock().repoCommits; break; case 'commit': url = url.concat(`/${id}`); - response = new RepoCommit().repoCommit; + response = new RepoCommitMock().repoCommit; break; default: throw Error('You passed wrong value or id'); @@ -113,7 +113,7 @@ export class BitbucketNock { } } -export class Issues { +export class IssuesMock { issues: Bitbucket.Schema.PaginatedIssues; constructor() { this.issues = { @@ -121,12 +121,12 @@ export class Issues { size: 3070, page: 1, next: 'https://api.bitbucket.org/2.0/repositories/pypy/pypy/issues?page=2', - values: [new Issue().issue], + values: [new IssueMock().issue], }; } } -export class Issue { +export class IssueMock { issue: Bitbucket.Schema.Issue; constructor() { this.issue = { @@ -226,7 +226,7 @@ export class Issue { } } -export class PullRequests { +export class PullRequestsMock { pullrequests: Bitbucket.Schema.PaginatedPullrequests; constructor(pullRequests: (Bitbucket.Schema.Pullrequest & Bitbucket.Schema.Object)[]) { @@ -240,7 +240,7 @@ export class PullRequests { } } -export class PullRequest { +export class PullRequestMock { pullRequest: Bitbucket.Schema.Pullrequest & Bitbucket.Schema.Object; state: BitbucketPullRequestState; constructor(state: BitbucketPullRequestState) { @@ -385,7 +385,7 @@ export class PullRequest { } } -export class Commits { +export class CommitsMock { // eslint-disable-next-line @typescript-eslint/no-explicit-any commits: any; constructor() { @@ -538,7 +538,7 @@ export class Commits { } } -export class IssueComment { +export class IssueCommentMock { issueComment: Bitbucket.Schema.IssueComment; constructor() { this.issueComment = { @@ -609,19 +609,19 @@ export class IssueComment { } } -export class IssueComments { +export class IssueCommentsMock { issueComments: Bitbucket.Schema.PaginatedIssueComments; constructor() { this.issueComments = { pagelen: 20, - values: [new IssueComment().issueComment], + values: [new IssueCommentMock().issueComment], page: 1, size: 14, }; } } -export class RepoCommit { +export class RepoCommitMock { repoCommit: Bitbucket.Schema.Commit; constructor() { this.repoCommit = { @@ -728,11 +728,11 @@ export class RepoCommit { } } -export class RepoCommits { +export class RepoCommitsMock { repoCommits: BitbucketCommit; constructor() { this.repoCommits = { - values: [new RepoCommit().repoCommit], + values: [new RepoCommitMock().repoCommit], pagelen: 20, page: 1, size: 14, From 3904444b0f7e7d04ac963707d12f512972305bb9 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Wed, 4 Dec 2019 16:31:16 +0100 Subject: [PATCH 106/196] Update src/services/bitbucket/BitbucketService.ts fix: use better syntax Co-Authored-By: Prokop Simek --- src/services/bitbucket/BitbucketService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 43f0af7b7..d1370b233 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -94,7 +94,7 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId = String((await this.client.users.get({ username: owner })).data.uuid); + const ownerId =`${await this.client.users.get({ username: owner })).data.uuid}`; const response: DeepRequired> = await axios.get(apiUrl); From 61453551b54d225d60355f1b17a4b367dc76755d Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 4 Dec 2019 16:52:02 +0100 Subject: [PATCH 107/196] refactor: use DRY --- src/services/bitbucket/BitbucketService.ts | 2 +- test/helpers/bitbucketNock.ts | 28 ++++++++++------------ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index d1370b233..36d73bc51 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -94,7 +94,7 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId =`${await this.client.users.get({ username: owner })).data.uuid}`; + const ownerId =`${(await this.client.users.get({ username: owner })).data.uuid}`; const response: DeepRequired> = await axios.get(apiUrl); diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 32ce78391..5070b5a3b 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -48,29 +48,25 @@ export class BitbucketNock { url = url.concat(`/${id}`); response = new PullRequestMock(state).pullRequest; } else { - if (typeof state !== 'string') { - const pullRequests: Bitbucket.Schema.Pullrequest[] = []; - state.forEach((state) => { - pullRequests.push(new PullRequestMock(state).pullRequest); - }); - - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); - url = url.concat(`${stateForUri}`); - - response = new PullRequestsMock(pullRequests).pullrequests; - - params = { state: state }; - } else if (state === BitbucketPullRequestState.open) { + if (state === BitbucketPullRequestState.open) { const pullRequest = new PullRequestMock(state).pullRequest; response = new PullRequestsMock([pullRequest]).pullrequests; } else { const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); url = url.concat(`${stateForUri}`); + params = { state: state }; - const pullRequest = new PullRequestMock(state).pullRequest; - response = new PullRequestsMock([pullRequest]).pullrequests; + if (typeof state !== 'string') { + const pullRequests: Bitbucket.Schema.Pullrequest[] = []; + state.forEach((state) => { + pullRequests.push(new PullRequestMock(state).pullRequest); + }); - params = { state: state }; + response = new PullRequestsMock(pullRequests).pullrequests; + } else { + const pullRequest = new PullRequestMock(state).pullRequest; + response = new PullRequestsMock([pullRequest]).pullrequests; + } } } break; From fa0d12938b4253d8ef85e337e3dbc309bb241bf5 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 09:51:28 +0100 Subject: [PATCH 108/196] fix: data of owner --- src/services/bitbucket/BitbucketService.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 36d73bc51..cd6a17745 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -94,7 +94,7 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId =`${(await this.client.users.get({ username: owner })).data.uuid}`; + const ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; const response: DeepRequired> = await axios.get(apiUrl); @@ -144,6 +144,9 @@ export class BitbucketService implements IVCSService { username: owner, }; + const ownerUrl = `www.bitbucket.org/${owner}`; + const ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; + const response = >>await this.client.pullrequests.get(params); response.data; @@ -169,9 +172,9 @@ export class BitbucketService implements IVCSService { name: response.data.destination.repository.name, id: response.data.destination.repository.uuid, owner: { - login: response.data.author.nickname, - id: response.data.author.uuid, - url: response.data.author.links.html.href, + login: owner, + id: ownerId, + url: ownerUrl, }, }, }, From 905fd111dfea276c2d5da5bf3a907862541b1ccc Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 09:59:04 +0100 Subject: [PATCH 109/196] feat: add mockBitbucketPullRequestResponse() --- test/helpers/bitbucketNock.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 5070b5a3b..7bd55f33e 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -3,6 +3,10 @@ import nock from 'nock'; import qs from 'qs'; import { BitbucketCommit } from '../../src/services/bitbucket/BitbucketService'; import { BitbucketPullRequestState } from '../../src/services/git/IVCSService'; +import { Paginated } from '../../src/inspectors/common/Paginated'; +import { getPullRequestResponse } from '../../src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; +import { PullRequest } from '../../src/services/git/model'; +import _ from 'lodash'; export class BitbucketNock { user: string; @@ -107,6 +111,32 @@ export class BitbucketNock { } return interceptor; } + + mockBitbucketPullRequestResponse(states: BitbucketPullRequestState | BitbucketPullRequestState[]): Paginated { + const pullRequests: PullRequest[] = []; + + const paginatedPullrequests: Paginated = { + items: [getPullRequestResponse], + hasNextPage: true, + hasPreviousPage: false, + page: 1, + perPage: typeof states === 'string' ? 1 : states.length, + totalCount: typeof states === 'string' ? 1 : states.length, + }; + + if (typeof states !== 'string') { + states.forEach((state) => { + const pullrequest = _.cloneDeep(getPullRequestResponse); + pullrequest.state = state; + pullRequests.push(pullrequest); + }); + paginatedPullrequests.items = pullRequests; + } else { + getPullRequestResponse.state = states; + paginatedPullrequests.items = [getPullRequestResponse]; + } + return paginatedPullrequests; + } } export class IssuesMock { From 1b6be4a71758f4866bef3b14fc23ccdae8b2cab1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 09:59:48 +0100 Subject: [PATCH 110/196] fix: fix tests and use mockBitbucketPullRequestResponse() --- .../bitbucket/BitbucketService.spec.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 96b8e3c78..2478275cd 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -2,22 +2,16 @@ import nock from 'nock'; import { BitbucketNock } from '../../../test/helpers/bitbucketNock'; import { ListGetterOptions } from '../../inspectors/common/ListGetterOptions'; import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { BitbucketPullRequestState, VCSService } from '../git/IVCSService'; +import { VCSServicesUtils } from '../git/VCSServicesUtils'; import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueCommentsResponse'; import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueResponse'; import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits'; import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; -import { - getOpenPullRequestsResponse, - getMergedPullRequestsResponse, - getAllPullrequestsResponse, -} from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; -import { BitbucketService } from './BitbucketService'; -import { getRepoCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommits'; import { getRepoCommit } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommit'; -import { BitbucketPullRequestState, VCSService } from '../git/IVCSService'; -import { VCSServicesUtils } from '../git/VCSServicesUtils'; -import util from 'util'; +import { getRepoCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommits'; +import { BitbucketService } from './BitbucketService'; describe('Bitbucket Service', () => { let service: BitbucketService; @@ -36,6 +30,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests'); const response = await service.getPullRequests('pypy', 'pypy'); + const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(BitbucketPullRequestState.open); expect(response).toMatchObject(getOpenPullRequestsResponse); }); @@ -47,10 +42,15 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); - expect(response).toMatchObject(getAllPullrequestsResponse); + const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(state); + + expect(response).toMatchObject(allPullrequestsResponse); }); it('returns pull request in own interface', async () => { + nock(bitbucketNock.url) + .get('/users/pypy') + .reply(200); bitbucketNock.getApiResponse('pullrequests', 1); const response = await service.getPullRequest('pypy', 'pypy', 1); @@ -98,6 +98,8 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); const response = await service.getPullRequests('pypy', 'pypy', state); + const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(BitbucketPullRequestState.closed); + expect(response).toMatchObject(getMergedPullRequestsResponse); }); From c3c5ab29a27ce115fd7e667c79882185d2c79362 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 10:00:07 +0100 Subject: [PATCH 111/196] fix: values of owner --- .../bitbucketServiceMockFolder/getPullRequestResponse.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts index 28c97f017..803941012 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts @@ -20,9 +20,9 @@ export const getPullRequestResponse: PullRequest = { name: 'pypy', id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', owner: { - login: 'landtuna', - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', + login: 'pypy', + id: 'undefined', + url: 'www.bitbucket.org/pypy', }, }, }, From 952bb79d858ef802b8c44bbc7298eb991a97091b Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 10:02:08 +0100 Subject: [PATCH 112/196] fix: delete unnecessary mock file --- .../getPullRequestsResponse.ts | 159 ------------------ 1 file changed, 159 deletions(-) delete mode 100644 src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts deleted file mode 100644 index bd1f9f493..000000000 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { Paginated } from '../../../../inspectors/common/Paginated'; -import { PullRequest } from '../../model'; - -export const getOpenPullRequestsResponse: Paginated = { - items: [ - { - user: { - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - login: 'landtuna', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', - }, - url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', - body: 'Added a floor() ufunc to micronumpy', - createdAt: '2011-06-22T19:44:39.555192+00:00', - updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, - mergedAt: null, - state: 'OPEN', - id: 1, - base: { - repo: { - url: 'https://bitbucket.org/pypy/pypy', - name: 'pypy', - id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', - owner: { id: 'undefined', login: 'pypy', url: 'www.bitbucket.org/pypy' }, - }, - }, - }, - ], - totalCount: 1, - hasNextPage: true, - hasPreviousPage: false, - page: 1, - perPage: 1, -}; - -export const getMergedPullRequestsResponse: Paginated = { - items: [ - { - user: { - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - login: 'landtuna', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', - }, - url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', - body: 'Added a floor() ufunc to micronumpy', - createdAt: '2011-06-22T19:44:39.555192+00:00', - updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, - mergedAt: null, - state: 'MERGED', - id: 1, - base: { - repo: { - url: 'https://bitbucket.org/pypy/pypy', - name: 'pypy', - id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', - owner: { id: 'undefined', login: 'pypy', url: 'www.bitbucket.org/pypy' }, - }, - }, - }, - ], - totalCount: 1, - hasNextPage: true, - hasPreviousPage: false, - page: 1, - perPage: 1, -}; - -export const getAllPullrequestsResponse: Paginated = { - items: [ - { - user: { - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - login: 'landtuna', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', - }, - url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', - body: 'Added a floor() ufunc to micronumpy', - createdAt: '2011-06-22T19:44:39.555192+00:00', - updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, - mergedAt: null, - state: 'OPEN', - id: 1, - base: { - repo: { - url: 'https://bitbucket.org/pypy/pypy', - name: 'pypy', - id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', - owner: { - login: 'pypy', - id: 'undefined', - url: 'www.bitbucket.org/pypy', - }, - }, - }, - }, - { - user: { - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - login: 'landtuna', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', - }, - url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', - body: 'Added a floor() ufunc to micronumpy', - createdAt: '2011-06-22T19:44:39.555192+00:00', - updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, - mergedAt: null, - state: 'MERGED', - id: 1, - base: { - repo: { - url: 'https://bitbucket.org/pypy/pypy', - name: 'pypy', - id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', - owner: { - login: 'pypy', - id: 'undefined', - url: 'www.bitbucket.org/pypy', - }, - }, - }, - }, - { - user: { - id: '{9d65d517-4898-47ac-9d2f-fd902d25d9f6}', - login: 'landtuna', - url: 'https://bitbucket.org/%7B9d65d517-4898-47ac-9d2f-fd902d25d9f6%7D/', - }, - url: 'https://bitbucket.org/pypy/pypy/pull-requests/1', - body: 'Added a floor() ufunc to micronumpy', - createdAt: '2011-06-22T19:44:39.555192+00:00', - updatedAt: '2011-06-23T13:52:30.230741+00:00', - closedAt: null, - mergedAt: null, - state: 'DECLINED', - id: 1, - base: { - repo: { - url: 'https://bitbucket.org/pypy/pypy', - name: 'pypy', - id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', - owner: { - login: 'pypy', - id: 'undefined', - url: 'www.bitbucket.org/pypy', - }, - }, - }, - }, - ], - totalCount: 3, - hasNextPage: true, - hasPreviousPage: false, - page: 1, - perPage: 3, -}; From 30458ce78eae571eae3b4581ce34b4ac4455ae51 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Wed, 4 Dec 2019 09:02:24 +0100 Subject: [PATCH 113/196] feat(CLIReporter): show detailed info (collected data) from practices --- .vscode/settings.json | 3 +- package.json | 2 ++ src/model.ts | 36 +++++++++---------- src/practices/IPractice.ts | 11 +++++- .../DependenciesVersionMajorLevel.ts | 25 +++++++------ .../DependenciesVersionMinorPatchLevel.ts | 16 ++++----- src/practices/PracticeBase.ts | 10 ++---- src/reporters/CLIReporter.ts | 26 ++++++++------ src/reporters/IReporter.ts | 3 +- src/reporters/ReporterData.ts | 17 +++++++++ src/scanner/Scanner.ts | 3 +- yarn.lock | 17 ++++++++- 12 files changed, 108 insertions(+), 61 deletions(-) create mode 100644 src/reporters/ReporterData.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 9bd35b459..ba1817c22 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,5 +27,6 @@ "language": "typescriptreact", "autoFix": true } - ] + ], + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/package.json b/package.json index e3e155c89..d9f3b8167 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@octokit/rest": "16.35.0", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", + "@types/table": "^4.0.7", "axios": "0.19.0", "bitbucket": "1.15.2", "colors": "1.4.0", @@ -51,6 +52,7 @@ "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", + "table": "^5.4.6", "toposort": "2.0.2", "ts-node": "8.5.2", "tslib": "1.10.0", diff --git a/src/model.ts b/src/model.ts index 505973724..022585de4 100644 --- a/src/model.ts +++ b/src/model.ts @@ -72,24 +72,24 @@ export interface Repository { authString?: string; } -export interface Project { - components: DeprecatedProjectComponent[]; -} - -/** - * @deprecated - */ -export interface DeprecatedProjectComponent { - githubUrl?: string; - path: string; - git?: GitInfo; - language: ProgrammingLanguage; - type: ProjectComponentType; - platform: ProjectComponentPlatform; - framework: ProjectComponentFramework; - packageManagement?: PackageManagement; - testing: TestingInfo; -} +// export interface Project { +// components: DeprecatedProjectComponent[]; +// } + +// /** +// * @deprecated +// */ +// export interface DeprecatedProjectComponent { +// githubUrl?: string; +// path: string; +// git?: GitInfo; +// language: ProgrammingLanguage; +// type: ProjectComponentType; +// platform: ProjectComponentPlatform; +// framework: ProjectComponentFramework; +// packageManagement?: PackageManagement; +// testing: TestingInfo; +// } export interface PracticeMetadata { id: string; diff --git a/src/practices/IPractice.ts b/src/practices/IPractice.ts index 9aa7e557a..e600b2fa9 100644 --- a/src/practices/IPractice.ts +++ b/src/practices/IPractice.ts @@ -1,7 +1,10 @@ import { PracticeEvaluationResult } from '../model'; import { PracticeContext } from '../contexts/practice/PracticeContext'; +import { ReportTable, ReportText } from '../reporters/ReporterData'; + +export interface IPractice { + data?: Partial & PracticeData; -export interface IPractice { /** * Returns true if this practice is applicable for the given project component * @@ -21,3 +24,9 @@ export interface IPractice { */ evaluate(ctx: PracticeContext): Promise; } + +export type PracticeData = { + details?: PracticeDetail[]; +}; + +export type PracticeDetail = ReportTable | ReportText; diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts index 8e7038bb7..2c6e2b2ba 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts @@ -22,17 +22,17 @@ export class DependenciesVersionMajorLevel extends PracticeBase { } async evaluate(ctx: PracticeContext): Promise { - if (!ctx.fileInspector || !ctx.packageInspector) { + if (!ctx.fileInspector || !ctx.packageInspector || !ctx.packageInspector.packages) { return PracticeEvaluationResult.unknown; } - const pkgs = ctx.packageInspector.packages; - if (!pkgs) { - return PracticeEvaluationResult.unknown; - } const result = await this.runNcu(pkgs); - return this.isPracticing(result, SemverLevel.major, pkgs); + const pkgsToUpdate = this.packagesToBeUpdated(result, SemverLevel.major, pkgs); + this.setData(pkgsToUpdate); + + if (pkgsToUpdate.length > 0) return PracticeEvaluationResult.notPracticing; + return PracticeEvaluationResult.practicing; } async runNcu(pkgs: Package[] | undefined) { @@ -50,9 +50,9 @@ export class DependenciesVersionMajorLevel extends PracticeBase { return pkgsToBeUpdated; } - isPracticing(pkgsWithNewVersion: { [key: string]: string }, semverLevel: SemverLevel, pkgs: Package[]): PracticeEvaluationResult { + packagesToBeUpdated(pkgsWithNewVersion: { [key: string]: string }, semverLevel: SemverLevel, pkgs: Package[]) { // packages with Major level to be updated - const pkgsToUpdate: { name: string; newVersion: string; currentVersion: string }[] = []; + const pkgsToUpdate: PkgToUpdate[] = []; for (const packageName in pkgsWithNewVersion) { const parsedVersion = PackageInspectorBase.semverToPackageVersion(pkgsWithNewVersion[packageName]); @@ -67,9 +67,12 @@ export class DependenciesVersionMajorLevel extends PracticeBase { } } - this.data.detail = 'any'; + return pkgsToUpdate; + } - if (pkgsToUpdate.length > 0) return PracticeEvaluationResult.notPracticing; - return PracticeEvaluationResult.practicing; + setData(pkgsToUpdate: PkgToUpdate[]): void { + this.data.details = [{ headers: ['Name', 'New', 'Current'], data: pkgsToUpdate }]; } } + +export type PkgToUpdate = { name: string; newVersion: string; currentVersion: string }; diff --git a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts index 516b7efb4..09079b094 100644 --- a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts +++ b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts @@ -4,6 +4,7 @@ import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; import { DependenciesVersionMajorLevel } from './DependenciesVersionMajorLevel'; import { SemverLevel } from '../../inspectors/package/PackageInspectorBase'; +import { flatten } from 'lodash'; @DxPractice({ id: 'JavaScript.DependenciesVersionMinorPatchLevel', @@ -21,24 +22,21 @@ export class DependenciesVersionMinorPatchLevel extends DependenciesVersionMajor } async evaluate(ctx: PracticeContext): Promise { - if (ctx.fileInspector === undefined || ctx.packageInspector === undefined) { + if (!ctx.fileInspector || !ctx.packageInspector || !ctx.packageInspector.packages) { return PracticeEvaluationResult.unknown; } const pkgs = ctx.packageInspector.packages; - if (pkgs === undefined) { - return PracticeEvaluationResult.unknown; - } - const result = await DependenciesVersionMajorLevel.runNcu(pkgs); + const result = await this.runNcu(pkgs); - const patchLevel = DependenciesVersionMajorLevel.isPracticing(result, SemverLevel.patch, pkgs); - const minorLevel = DependenciesVersionMajorLevel.isPracticing(result, SemverLevel.minor, pkgs); + const patchLevelPkgs = this.packagesToBeUpdated(result, SemverLevel.patch, pkgs); + const minorLevelPkgs = this.packagesToBeUpdated(result, SemverLevel.minor, pkgs); + this.setData(flatten([patchLevelPkgs, minorLevelPkgs])); - if (patchLevel === PracticeEvaluationResult.notPracticing || minorLevel === PracticeEvaluationResult.notPracticing) { + if (patchLevelPkgs.length > 0 || minorLevelPkgs.length > 0) { return PracticeEvaluationResult.notPracticing; } - return PracticeEvaluationResult.practicing; } } diff --git a/src/practices/PracticeBase.ts b/src/practices/PracticeBase.ts index 0b8c71d13..37d7d35a9 100644 --- a/src/practices/PracticeBase.ts +++ b/src/practices/PracticeBase.ts @@ -1,12 +1,12 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { IPractice } from './IPractice'; +import { IPractice, PracticeData } from './IPractice'; import { ErrorFactory } from '../lib/errors'; import { PracticeEvaluationResult } from '../model'; import { PracticeContext } from '../contexts/practice/PracticeContext'; -export abstract class PracticeBase implements IPractice { - data: T; +export abstract class PracticeBase implements IPractice { + data: Partial & PracticeData; constructor() { this.data = {}; @@ -20,7 +20,3 @@ export abstract class PracticeBase implements IPract throw ErrorFactory.newInternalError('Method not implemented.'); } } - -type PracticeBaseData = { - detail?: string; -}; diff --git a/src/reporters/CLIReporter.ts b/src/reporters/CLIReporter.ts index 198c4cc7a..b2d5892e3 100644 --- a/src/reporters/CLIReporter.ts +++ b/src/reporters/CLIReporter.ts @@ -4,6 +4,7 @@ import { PracticeImpact, PracticeMetadata, PracticeEvaluationResult } from '../m import { IReporter, PracticeWithContextForReporter } from './IReporter'; import { sharedSubpath } from '../detectors/utils'; import { ReporterUtils } from './ReporterUtils'; +import { PracticeDetail } from '../practices/IPractice'; @injectable() export class CLIReporter implements IReporter { @@ -108,8 +109,12 @@ export class CLIReporter implements IReporter { for (const practiceWithContext of practices) { lines.push(this.linesForPractice(practiceWithContext.practice, color)); + if (practiceWithContext.practice.data?.details) { + lines.push(practiceWithContext.practice.data.details.map((d) => this.renderDetail(d, (color = grey))).join(' ')); + } + if (practiceWithContext.practice.impact !== practiceWithContext.overridenImpact) { - lines.push(bold(this.changedImpact(practiceWithContext, (color = grey)))); + lines.push(bold(this.lineForChangedImpact(practiceWithContext, (color = grey)))); } } @@ -127,16 +132,15 @@ export class CLIReporter implements IReporter { return practiceLineTexts.join(' '); } - private changedImpact(practiceWithContext: PracticeWithContextForReporter, color: Color) { - const practiceLineTexts = [ - reset( - color( - ` You changed impact of ${bold(practiceWithContext.practice.name)} from ${underline( - practiceWithContext.practice.impact, - )} to ${underline(practiceWithContext.overridenImpact)}.`, - ), + private lineForChangedImpact(practiceWithContext: PracticeWithContextForReporter, color: Color) { + return reset( + color( + ` Impact changed from ${underline(practiceWithContext.practice.impact)} to ${underline(practiceWithContext.overridenImpact)}.`, ), - ]; - return practiceLineTexts.join(' '); + ); + } + + private renderDetail(detail: PracticeDetail, color: Color) { + return reset(color(`${detail}`)); } } diff --git a/src/reporters/IReporter.ts b/src/reporters/IReporter.ts index 7f5313e05..f89893068 100644 --- a/src/reporters/IReporter.ts +++ b/src/reporters/IReporter.ts @@ -6,6 +6,7 @@ import { PracticeMetadata, PracticeEvaluationResult, } from '../model'; +import { PracticeData } from '../practices/IPractice'; export interface IReporter { report(practicesAndComponents: PracticeWithContextForReporter[]): string | JSONReport; @@ -22,7 +23,7 @@ export interface ComponentReport extends ProjectComponent { export interface PracticeWithContextForReporter { component: ProjectComponent; - practice: PracticeMetadata; + practice: PracticeMetadata & { data?: PracticeData }; overridenImpact: PracticeImpact; evaluation: PracticeEvaluationResult; isOn: boolean; diff --git a/src/reporters/ReporterData.ts b/src/reporters/ReporterData.ts new file mode 100644 index 000000000..39cceea01 --- /dev/null +++ b/src/reporters/ReporterData.ts @@ -0,0 +1,17 @@ +import { table as tableLib, getBorderCharacters, TableUserConfig } from 'table'; + +export class ReporterData { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static table = (data: any[], userConfig?: TableUserConfig | undefined): string => { + return tableLib(data, { ...{ border: getBorderCharacters('norc') }, ...userConfig }); + }; +} + +export type ReportTable = { + headers: string[]; + data: Record[]; +}; + +export type ReportText = { + text: string; +}; diff --git a/src/scanner/Scanner.ts b/src/scanner/Scanner.ts index efe87e89e..bc806bba8 100644 --- a/src/scanner/Scanner.ts +++ b/src/scanner/Scanner.ts @@ -28,6 +28,7 @@ import { ScannerUtils } from './ScannerUtils'; import _ from 'lodash'; import { sharedSubpath } from '../detectors/utils'; import { cli } from 'cli-ux'; +import { PracticeData } from '../practices/IPractice'; @injectable() export class Scanner { @@ -182,7 +183,7 @@ export class Scanner { return { component: p.componentContext.projectComponent, - practice: p.practice.getMetadata(), + practice: { ...p.practice.getMetadata(), data: p.practice.data }, evaluation: p.evaluation, overridenImpact: (overridenImpact ? overridenImpact : p.practice.getMetadata().impact), isOn: p.isOn, diff --git a/yarn.lock b/yarn.lock index eaf20aec1..51fb9aef3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -866,6 +866,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/table@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@types/table/-/table-4.0.7.tgz#c21100d37d4924abbbde85414170260d4d7b0316" + integrity sha512-HKtXvBxU8U8evZCSlUi9HbfT/SFW7nSGCoiBEheB06jAhXeW6JbGh8biEAqIFG5rZo9f8xeJVdIn455sddmIcw== + "@types/toposort@2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/toposort/-/toposort-2.0.3.tgz#dc490842b77c3e910c8d727ff0bdb2fb124cb41b" @@ -1027,7 +1032,7 @@ ajv@^6.10.0, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5: +ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -8593,6 +8598,16 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^5.4.6: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + taketalk@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/taketalk/-/taketalk-1.0.0.tgz#b4d4f0deed206ae7df775b129ea2ca6de52f26dd" From 397c39194ec8731b420d3337144d8cb5a995f690 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Dec 2019 10:19:22 +0000 Subject: [PATCH 114/196] chore(release): 1.22.1 [skip ci] ## [1.22.1](https://github.com/dxheroes/dx-scanner/compare/v1.22.0...v1.22.1) (2019-12-06) ### Bug Fixes * **deps:** update dependency memfs to v3 ([6c8c259](https://github.com/dxheroes/dx-scanner/commit/6c8c259)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 385b10d9b..6c3a6692d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.22.1](https://github.com/dxheroes/dx-scanner/compare/v1.22.0...v1.22.1) (2019-12-06) + + +### Bug Fixes + +* **deps:** update dependency memfs to v3 ([6c8c259](https://github.com/dxheroes/dx-scanner/commit/6c8c259)) + # [1.22.0](https://github.com/dxheroes/dx-scanner/compare/v1.21.1...v1.22.0) (2019-12-02) diff --git a/package.json b/package.json index 4c2435b5b..bd8f5e46d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.22.0", + "version": "1.22.1", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 081584451ed57c8fc4c8e5fc416e31776fb0aa92 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 12:42:27 +0100 Subject: [PATCH 115/196] fix: typo --- src/services/bitbucket/BitbucketService.spec.ts | 6 +++--- test/helpers/bitbucketNock.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 2478275cd..7aafb9455 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -30,7 +30,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests'); const response = await service.getPullRequests('pypy', 'pypy'); - const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(BitbucketPullRequestState.open); + const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(BitbucketPullRequestState.open); expect(response).toMatchObject(getOpenPullRequestsResponse); }); @@ -42,7 +42,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); - const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(state); + const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(state); expect(response).toMatchObject(allPullrequestsResponse); }); @@ -98,7 +98,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); const response = await service.getPullRequests('pypy', 'pypy', state); - const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestResponse(BitbucketPullRequestState.closed); + const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(BitbucketPullRequestState.closed); expect(response).toMatchObject(getMergedPullRequestsResponse); }); diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 7bd55f33e..9b4190eb4 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -112,7 +112,7 @@ export class BitbucketNock { return interceptor; } - mockBitbucketPullRequestResponse(states: BitbucketPullRequestState | BitbucketPullRequestState[]): Paginated { + mockBitbucketPullRequestsResponse(states: BitbucketPullRequestState | BitbucketPullRequestState[]): Paginated { const pullRequests: PullRequest[] = []; const paginatedPullrequests: Paginated = { From c12b823e5c25686ac916137bee5933f45b60218f Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sat, 30 Nov 2019 22:07:54 +0100 Subject: [PATCH 116/196] chore: more reexports --- .vscode/settings.json | 3 +- bin/run | 2 +- package.json | 18 ++------ src/detectors/__MOCKS__/index.ts | 4 -- src/detectors/index.ts | 11 +++++ src/inspectors/CollaborationInspector.spec.ts | 14 ++++--- src/inspectors/IssueTrackingInspector.spec.ts | 14 ++++--- src/inspectors/common/index.ts | 2 + src/inspectors/index.ts | 11 +++++ .../JavaScriptPackageInspector.spec.ts | 2 +- src/inspectors/package/index.ts | 3 ++ src/inversify.config.ts | 32 +++++++------- .../JavaGitignoreCorrectlySetPractice.spec.ts | 2 +- src/reporters/index.ts | 5 +++ src/scanner/Scanner.ts | 16 +++---- src/scanner/index.ts | 5 +++ src/services/__MOCKS__/index.ts | 0 .../bitbucket/BitbucketService.spec.ts | 18 ++++---- src/services/bitbucket/index.ts | 1 + src/services/git/GitHubService.spec.ts | 42 +++++++++---------- .../bitbucketServiceMockFolder/index.ts | 8 ++++ .../gitHubServiceMockFolder/index.ts | 29 +++++++++++++ src/services/git/index.ts | 6 +++ src/services/index.ts | 4 ++ .../factories/PracticeWithContextFactory.ts | 2 +- tsconfig.json | 12 +----- 26 files changed, 165 insertions(+), 101 deletions(-) delete mode 100644 src/detectors/__MOCKS__/index.ts create mode 100644 src/detectors/index.ts create mode 100644 src/inspectors/common/index.ts create mode 100644 src/inspectors/index.ts create mode 100644 src/inspectors/package/index.ts create mode 100644 src/reporters/index.ts create mode 100644 src/scanner/index.ts delete mode 100644 src/services/__MOCKS__/index.ts create mode 100644 src/services/bitbucket/index.ts create mode 100644 src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts create mode 100644 src/services/git/__MOCKS__/gitHubServiceMockFolder/index.ts create mode 100644 src/services/git/index.ts create mode 100644 src/services/index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 9bd35b459..eb6040971 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,5 +27,6 @@ "language": "typescriptreact", "autoFix": true } - ] + ], + "typescript.preferences.importModuleSpecifier": "relative" } diff --git a/bin/run b/bin/run index fd0f21f6e..ee3701af0 100755 --- a/bin/run +++ b/bin/run @@ -10,6 +10,6 @@ if (dev) { require('ts-node').register({ project }); } -require(`../${dev ? 'src' : 'lib/src'}`) +require(`../${dev ? 'src' : 'lib'}`) .run() .catch(require('@oclif/errors/handle')); diff --git a/package.json b/package.json index 51c19cfd9..82208d476 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "rimraf lib && tsc -b", "build:watch": "yarn build -w", - "lint": "eslint --ext .ts 'src' 'test' 'typings'", + "lint": "eslint --ext .ts 'src' 'types'", "lint:fix": "yarn lint --fix", "prepack": "yarn build", "start": "./bin/run", @@ -45,7 +45,6 @@ "js-yaml": "3.13.1", "lodash": "4.17.15", "memfs": "2.16.1", - "module-alias": "^2.2.2", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.1", "oclif": "1.14.2", @@ -91,7 +90,7 @@ "node": "^12", "yarn": "^1" }, - "main": "lib/src/index.js", + "main": "lib/index.js", "bin": { "dx-scanner": "./bin/run", "dxscanner": "./bin/run", @@ -110,16 +109,5 @@ "developer experience", "dxheroes", "code analysis" - ], - "_moduleAliases": { - "@contexts": "lib/contexts", - "@detectors": "lib/detectors", - "@inspectors": "lib/inspectors", - "@libs": "lib/libs", - "@practices": "lib/practices", - "@reporters": "lib/reporters", - "@core": "lib/scanner", - "@services": "lib/services", - "@test": "lib/test" -} + ] } diff --git a/src/detectors/__MOCKS__/index.ts b/src/detectors/__MOCKS__/index.ts deleted file mode 100644 index f25d9a668..000000000 --- a/src/detectors/__MOCKS__/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './JavaScript/BackendJavaScriptDetector.mock'; -export * from './JavaScript/JavaScriptDetector.mock'; -export * from './JavaScript/packageJSONContents.mock'; -export * from './JavaScript/gitignoreContent.mock'; diff --git a/src/detectors/index.ts b/src/detectors/index.ts new file mode 100644 index 000000000..fd003e4f3 --- /dev/null +++ b/src/detectors/index.ts @@ -0,0 +1,11 @@ +export * from './Cpp/CppLanguageDetector'; +export * from './Golang/GolangLanguageDetector'; +export * from './Java/JavaComponentDetector'; +export * from './Java/JavaLanguageDetector'; +export * from './JavaScript/JavaScriptComponentDetector'; +export * from './JavaScript/JavaScriptLanguageDetector'; +export * from './PHP/PHPLanguageDetector'; +export * from './Python/PythonLanguageDetector'; +export * from './Ruby/RubyLanguageDetector'; +export * from './utils/ScanningStrategyDetectorUtils'; +export * from './ScanningStrategyDetector'; diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index ca3328ca5..15cae6f93 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -1,14 +1,16 @@ import { CollaborationInspector } from './CollaborationInspector'; -import { getPullsServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock'; -import { getPullServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullServiceResponse.mock'; -import { getPullsFilesResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullsFiles.mock'; -import { getPullsFilesServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullFilesServiceResponse.mock'; -import { getPullCommitsResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock'; -import { getPullCommitsServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getPullCommitsServiceResponse.mock'; import nock from 'nock'; import { TestContainerContext } from '../inversify.config'; import { createTestContainer } from '../inversify.config'; import { GitHubNock } from '../test/helpers/gitHubNock'; +import { + getPullsServiceResponse, + getPullServiceResponse, + getPullsFilesResponse, + getPullsFilesServiceResponse, + getPullCommitsResponse, + getPullCommitsServiceResponse, +} from '../services/git/__MOCKS__/gitHubServiceMockFolder'; describe('Collaboration Inspector', () => { let inspector: CollaborationInspector; diff --git a/src/inspectors/IssueTrackingInspector.spec.ts b/src/inspectors/IssueTrackingInspector.spec.ts index d588ca442..26ea260ef 100644 --- a/src/inspectors/IssueTrackingInspector.spec.ts +++ b/src/inspectors/IssueTrackingInspector.spec.ts @@ -1,13 +1,15 @@ import { IssueTrackingInspector } from './IssueTrackingInspector'; -import { getIssuesResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock'; -import { getIssuesServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssuesServiceResponse.mock'; -import { getIssueCommentsServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsServiceResponse.mock'; -import { getIssueCommentsResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock'; -import { getIssueResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssueResponse.mock'; -import { getIssueServiceResponse } from '../services/git/__MOCKS__/gitHubServiceMockFolder/getIssueServiceResponse.mock'; import nock from 'nock'; import { TestContainerContext, createTestContainer } from '../inversify.config'; import { GitHubNock } from '../test/helpers/gitHubNock'; +import { + getIssuesResponse, + getIssuesServiceResponse, + getIssueCommentsResponse, + getIssueCommentsServiceResponse, + getIssueResponse, + getIssueServiceResponse, +} from '../services/git/__MOCKS__/gitHubServiceMockFolder'; describe('Issue Tracking Inspector', () => { let inspector: IssueTrackingInspector; diff --git a/src/inspectors/common/index.ts b/src/inspectors/common/index.ts new file mode 100644 index 000000000..db616b9ea --- /dev/null +++ b/src/inspectors/common/index.ts @@ -0,0 +1,2 @@ +export * from './ListGetterOptions'; +export * from './Paginated'; diff --git a/src/inspectors/index.ts b/src/inspectors/index.ts new file mode 100644 index 000000000..9f8bcf507 --- /dev/null +++ b/src/inspectors/index.ts @@ -0,0 +1,11 @@ +export * from './common'; +export * from './package'; +export * from './CollaborationInspector'; +export * from './FileInspector'; +export * from './GitInspector'; +export * from './ICollaborationInspector'; +export * from './IFileInspector'; +export * from './IGitInspector'; +export * from './IIssueTrackingInspector'; +export * from './IPackageInspector'; +export * from './IssueTrackingInspector'; diff --git a/src/inspectors/package/JavaScriptPackageInspector.spec.ts b/src/inspectors/package/JavaScriptPackageInspector.spec.ts index 85dc792c8..cbf637c25 100644 --- a/src/inspectors/package/JavaScriptPackageInspector.spec.ts +++ b/src/inspectors/package/JavaScriptPackageInspector.spec.ts @@ -1,8 +1,8 @@ import { JavaScriptPackageInspector } from './JavaScriptPackageInspector'; import { DependencyType } from '../IPackageInspector'; -import { packageJSONContents } from '../../detectors/__MOCKS__'; import { TestContainerContext, createTestContainer } from '../../inversify.config'; import { DirectoryJSON } from 'memfs/lib/volume'; +import { packageJSONContents } from '../../detectors/__MOCKS__/JavaScript/packageJSONContents.mock'; describe('JavaScriptPackageInspector', () => { let inspector: JavaScriptPackageInspector; diff --git a/src/inspectors/package/index.ts b/src/inspectors/package/index.ts new file mode 100644 index 000000000..ee530124d --- /dev/null +++ b/src/inspectors/package/index.ts @@ -0,0 +1,3 @@ +export * from './JavaPackageInspector'; +export * from './JavaScriptPackageInspector'; +export * from './PackageInspectorBase'; diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 5b683decf..dc559bde8 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -1,15 +1,5 @@ import { Container } from 'inversify'; import { DirectoryJSON } from 'memfs/lib/volume'; -import { PracticeContext } from './contexts/practice/PracticeContext'; -import { bindScanningContext } from './contexts/scanner/scannerContextBinding'; -import { ScanningStrategyDetector } from './detectors/ScanningStrategyDetector'; -import { packageJSONContents } from './detectors/__MOCKS__'; -import { CollaborationInspector } from './inspectors/CollaborationInspector'; -import { FileInspector } from './inspectors/FileInspector'; -import { IFileInspector } from './inspectors/IFileInspector'; -import { IPackageInspector } from './inspectors/IPackageInspector'; -import { IssueTrackingInspector } from './inspectors/IssueTrackingInspector'; -import { JavaScriptPackageInspector } from './inspectors/package/JavaScriptPackageInspector'; import { ProgrammingLanguage, ProjectComponent, @@ -20,15 +10,23 @@ import { } from './model'; import { practices } from './practices'; import { IPracticeWithMetadata } from './practices/DxPracticeDecorator'; -import { CLIReporter } from './reporters/CLIReporter'; -import { IReporter } from './reporters/IReporter'; -import { JSONReporter } from './reporters/JSONReporter'; -import { Scanner } from './scanner/Scanner'; -import { ScannerUtils } from './scanner/ScannerUtils'; -import { FileSystemService } from './services/FileSystemService'; -import { GitHubService } from './services/git/GitHubService'; import { Types } from './types'; +import { IReporter, JSONReporter, CLIReporter } from './reporters'; +import { ScanningStrategyDetector } from './detectors'; +import { + FileInspector, + IssueTrackingInspector, + CollaborationInspector, + JavaScriptPackageInspector, + IFileInspector, + IPackageInspector, +} from './inspectors'; +import { bindScanningContext } from './contexts/scanner/scannerContextBinding'; +import { Scanner, ScannerUtils } from './scanner'; +import { FileSystemService, GitHubService } from './services'; import { BitbucketService } from './services/bitbucket/BitbucketService'; +import { PracticeContext } from './contexts/practice/PracticeContext'; +import { packageJSONContents } from './detectors/__MOCKS__/JavaScript/packageJSONContents.mock'; export const createRootContainer = (args: ArgumentsProvider): Container => { const container = new Container(); diff --git a/src/practices/Java/JavaGitignoreCorrectlySetPractice.spec.ts b/src/practices/Java/JavaGitignoreCorrectlySetPractice.spec.ts index 04420e5ca..46046538e 100644 --- a/src/practices/Java/JavaGitignoreCorrectlySetPractice.spec.ts +++ b/src/practices/Java/JavaGitignoreCorrectlySetPractice.spec.ts @@ -1,9 +1,9 @@ import { JavaGitignoreCorrectlySetPractice } from './JavaGitignoreCorrectlySetPractice'; -import { gitignoreContent } from '../../detectors/__MOCKS__/Java/gitignoreContent.mock'; import { PracticeEvaluationResult } from '../../model'; import { TestContainerContext, createTestContainer } from '../../inversify.config'; import { pomXMLContents } from '../../detectors/__MOCKS__/Java/pomXMLContents.mock'; import { buildGRADLEContents } from '../../detectors/__MOCKS__/Java/buildGRADLEContents.mock'; +import { gitignoreContent } from '../../detectors/__MOCKS__/Java/gitignoreContent.mock'; describe('JavaGitignoreCorrectlySetPractice', () => { let practice: JavaGitignoreCorrectlySetPractice; diff --git a/src/reporters/index.ts b/src/reporters/index.ts new file mode 100644 index 000000000..8052f0136 --- /dev/null +++ b/src/reporters/index.ts @@ -0,0 +1,5 @@ +export * from './CLIReporter'; +export * from './IReporter'; +export * from './JSONReporter'; +export * from './model'; +export * from './ReporterUtils'; diff --git a/src/scanner/Scanner.ts b/src/scanner/Scanner.ts index cd76f8f58..e809d768e 100644 --- a/src/scanner/Scanner.ts +++ b/src/scanner/Scanner.ts @@ -6,11 +6,6 @@ import path from 'path'; import git from 'simple-git/promise'; import url from 'url'; import util, { inspect } from 'util'; -import { LanguageContext } from '../contexts/language/LanguageContext'; -import { PracticeContext } from '../contexts/practice/PracticeContext'; -import { ProjectComponentContext } from '../contexts/projectComponent/ProjectComponentContext'; -import { ScannerContext } from '@contexts/scanner/ScannerContext'; -import { ScanningStrategy, ScanningStrategyDetector, ServiceType } from '../detectors/ScanningStrategyDetector'; import { ArgumentsProvider } from '../inversify.config'; import { LanguageAtPath, @@ -23,11 +18,16 @@ import { } from '../model'; import { IPracticeWithMetadata } from '../practices/DxPracticeDecorator'; import { ScannerContextFactory, Types } from '../types'; -import { ScannerUtils } from '@core/ScannerUtils'; +import { ScannerUtils } from '../scanner/ScannerUtils'; import _ from 'lodash'; -import { sharedSubpath } from '../detectors/utils'; import { cli } from 'cli-ux'; -import { IReporter } from '@reporters/IReporter'; +import { ScanningStrategyDetector, ScanningStrategy, ServiceType } from '../detectors'; +import { IReporter } from '../reporters'; +import { ScannerContext } from '../contexts/scanner/ScannerContext'; +import { sharedSubpath } from '../detectors/utils'; +import { LanguageContext } from '../contexts/language/LanguageContext'; +import { ProjectComponentContext } from '../contexts/projectComponent/ProjectComponentContext'; +import { PracticeContext } from '../contexts/practice/PracticeContext'; @injectable() export class Scanner { diff --git a/src/scanner/index.ts b/src/scanner/index.ts new file mode 100644 index 000000000..d00a6e022 --- /dev/null +++ b/src/scanner/index.ts @@ -0,0 +1,5 @@ +export * from './__MOCKS__'; +export * from './cache/ICache'; +export * from './cache/InMemoryCache'; +export * from './Scanner'; +export * from './ScannerUtils'; diff --git a/src/services/__MOCKS__/index.ts b/src/services/__MOCKS__/index.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 4316721b5..a50e1ea28 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -1,14 +1,16 @@ import nock from 'nock'; import { BitbucketNock } from '../../test/helpers/bitbucketNock'; import { BitbucketService } from './BitbucketService'; -import { getPullRequestsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestsResponse'; -import { getPullRequestResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse'; -import { getPullCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits'; -import { getIssuesResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssuesResponse'; -import { getIssueResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueResponse'; -import { getIssueCommentsResponse } from '../git/__MOCKS__/bitbucketServiceMockFolder/getIssueCommentsResponse'; -import { getRepoCommits } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommits'; -import { getRepoCommit } from '../git/__MOCKS__/bitbucketServiceMockFolder/getRepoCommit'; +import { + getPullRequestsResponse, + getPullRequestResponse, + getPullCommits, + getRepoCommits, + getRepoCommit, + getIssuesResponse, + getIssueResponse, + getIssueCommentsResponse, +} from '../../services/git/__MOCKS__/bitbucketServiceMockFolder'; describe('Bitbucket Service', () => { let service: BitbucketService; diff --git a/src/services/bitbucket/index.ts b/src/services/bitbucket/index.ts new file mode 100644 index 000000000..77d51fa5f --- /dev/null +++ b/src/services/bitbucket/index.ts @@ -0,0 +1 @@ +export * from './BitbucketService'; diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index ea7751e8e..94b883621 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -1,30 +1,30 @@ /* eslint-disable @typescript-eslint/camelcase */ import { GitHubService } from './GitHubService'; -import { getPullsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsServiceResponse.mock'; -import { getPullsReviewsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsReviewsServiceResponse.mock'; -import { getCommitServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getCommitServiceResponse.mock'; -import { getContributorsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getContributorsServiceResponse.mock'; -import { getContributorsStatsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getContributorsStatsServiceResponse.mock'; -import { - getRepoContentServiceResponseDir, - getRepoContentServiceResponseFile, -} from './__MOCKS__/gitHubServiceMockFolder/getRepoContentServiceResponse.mock'; -import { getIssuesServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getIssuesServiceResponse.mock'; -import { getPullRequestsReviewsResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullRequestsReviewsResponse.mock'; -import { getCommitResponse } from './__MOCKS__/gitHubServiceMockFolder/getCommitResponse.mock'; -import { getContributorsStatsResponse } from './__MOCKS__/gitHubServiceMockFolder/getContributorsStatsResponse.mock'; -import { getIssuesResponse } from './__MOCKS__/gitHubServiceMockFolder/getIssuesResponse.mock'; -import { getIssueCommentsResponse } from './__MOCKS__/gitHubServiceMockFolder/getIssueCommentsResponse.mock'; -import { getIssueCommentsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getIssueCommentsServiceResponse.mock'; import nock from 'nock'; -import { getPullsFilesResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsFiles.mock'; -import { getPullsFilesServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullFilesServiceResponse.mock'; -import { getPullCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullsCommitsResponse.mock'; -import { getPullCommitsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getPullCommitsServiceResponse.mock'; import { GitHubNock } from '../../test/helpers/gitHubNock'; -import { getRepoCommitsResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; import { File } from './model'; import { GitHubPullRequestState } from './IGitHubService'; +import { + getPullsServiceResponse, + getPullRequestsReviewsResponse, + getPullsReviewsServiceResponse, + getRepoCommitsResponse, + getCommitResponse, + getCommitServiceResponse, + getContributorsStatsResponse, + getRepoContentServiceResponseFile, + getRepoContentServiceResponseDir, + getIssuesResponse, + getIssuesServiceResponse, + getIssueCommentsResponse, + getPullsFilesResponse, + getPullsFilesServiceResponse, + getPullCommitsResponse, + getPullCommitsServiceResponse, + getContributorsServiceResponse, + getContributorsStatsServiceResponse, + getIssueCommentsServiceResponse, +} from './__MOCKS__/gitHubServiceMockFolder'; describe('GitHub Service', () => { let service: GitHubService; diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts new file mode 100644 index 000000000..2b8587ac4 --- /dev/null +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts @@ -0,0 +1,8 @@ +export * from './getRepoCommit'; +export * from './getRepoCommits'; +export * from './getPullCommits'; +export * from './getIssueResponse'; +export * from './getIssuesResponse'; +export * from './getPullRequestResponse'; +export * from './getPullRequestsResponse'; +export * from './getIssueCommentsResponse'; diff --git a/src/services/git/__MOCKS__/gitHubServiceMockFolder/index.ts b/src/services/git/__MOCKS__/gitHubServiceMockFolder/index.ts new file mode 100644 index 000000000..c719ca365 --- /dev/null +++ b/src/services/git/__MOCKS__/gitHubServiceMockFolder/index.ts @@ -0,0 +1,29 @@ +export * from './getCommitServiceResponse.mock'; +export * from './getPullsFiles.mock'; +export * from './getIssueResponse.mock'; +export * from './getIssuesResponse.mock'; +export * from './getCommitResponse.mock'; +export * from './getRepoCommitsResponse.mock'; +export * from './getPullServiceResponse.mock'; +export * from './getPullsServiceResponse.mock'; +export * from './getPullsCommitsResponse.mock'; +export * from './getIssueServiceResponse.mock'; +export * from './getIssuesServiceResponse.mock'; +export * from './getIssueCommentsResponse.mock'; +export * from './getCommitServiceResponse.mock'; +export * from './getPullFilesServiceResponse.mock'; +export * from './getContributorsStatsResponse.mock'; +export * from './getRepoContentServiceResponse.mock'; +export * from './getPullCommitsServiceResponse.mock'; +export * from './getPullFilesServiceResponse.mock'; +export * from './getPullRequestsReviewsResponse.mock'; +export * from './getPullServiceResponse.mock'; +export * from './getPullsCommitsResponse.mock'; +export * from './getPullsFiles.mock'; +export * from './getPullsReviewsServiceResponse.mock'; +export * from './getPullsServiceResponse.mock'; +export * from './getRepoCommitsResponse.mock'; +export * from './getRepoContentServiceResponse.mock'; +export * from './getContributorsServiceResponse.mock'; +export * from './getContributorsStatsServiceResponse.mock'; +export * from './getIssueCommentsServiceResponse.mock'; diff --git a/src/services/git/index.ts b/src/services/git/index.ts new file mode 100644 index 000000000..7bcf5d1f9 --- /dev/null +++ b/src/services/git/index.ts @@ -0,0 +1,6 @@ +export * from './GitHubService'; +export * from './GitInfoObtainer'; +export * from './GitServiceUtils'; +export * from './ICVSService'; +export * from './IGitHubService'; +export * from './IGitInfoObtainer'; diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 000000000..3c2a47019 --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1,4 @@ +export * from './bitbucket'; +export * from './git'; +export * from './FileSystemService'; +export * from './model'; diff --git a/src/test/factories/PracticeWithContextFactory.ts b/src/test/factories/PracticeWithContextFactory.ts index 326c2deae..4a8b869a9 100644 --- a/src/test/factories/PracticeWithContextFactory.ts +++ b/src/test/factories/PracticeWithContextFactory.ts @@ -1,4 +1,4 @@ -import { PracticeWithContextForReporter } from '@reporters/IReporter'; +import { PracticeWithContextForReporter } from '../../reporters/IReporter'; import { ProgrammingLanguage, ProjectComponentFramework, diff --git a/tsconfig.json b/tsconfig.json index 463add759..6b0383fba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,17 +41,7 @@ /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ "baseUrl": "./src", /* Base directory to resolve non-absolute module names. */ - "paths": { - "@contexts/*": ["contexts/*"], - "@detectors/*": ["detectors/*"], - "@inspectors/*": ["inspectors/*"], - "@libs/*": ["libs/*"], - "@practices/*": ["practices/*"], - "@reporters/*": ["reporters/*"], - "@core/*": ["scanner/*"], - "@services/*": ["services/*"], - "@test/*": ["test/*"], - }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ "typeRoots": ["./types", "node_modules/@types"], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ From c2855a65770beab20be7a842c9820f2ca41466ca Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Dec 2019 12:15:28 +0000 Subject: [PATCH 117/196] chore(release): 1.23.0 [skip ci] # [1.23.0](https://github.com/dxheroes/dx-scanner/compare/v1.22.1...v1.23.0) (2019-12-06) ### Bug Fixes * add BitbucketPullRequestState because of CollaborationInspector to the options ([74fe662](https://github.com/dxheroes/dx-scanner/commit/74fe662)) * add filtering to the getPullRequests() ([90b995b](https://github.com/dxheroes/dx-scanner/commit/90b995b)) * add qs ([6022e9e](https://github.com/dxheroes/dx-scanner/commit/6022e9e)) * auth is possibly undefined ([1f35259](https://github.com/dxheroes/dx-scanner/commit/1f35259)) * data of owner ([fa0d129](https://github.com/dxheroes/dx-scanner/commit/fa0d129)) * delete unnecessary mock file ([952bb79](https://github.com/dxheroes/dx-scanner/commit/952bb79)) * fix tests and use mockBitbucketPullRequestResponse() ([1b6be4a](https://github.com/dxheroes/dx-scanner/commit/1b6be4a)) * get the info about user only once as it is always the same ([f54425d](https://github.com/dxheroes/dx-scanner/commit/f54425d)) * rename CVS to VCS ([c8c2f09](https://github.com/dxheroes/dx-scanner/commit/c8c2f09)) * rename files ([4a2d83d](https://github.com/dxheroes/dx-scanner/commit/4a2d83d)) * rename interfaces - add mock to the end of the name ([0ff0093](https://github.com/dxheroes/dx-scanner/commit/0ff0093)) * return array of states ([7f19213](https://github.com/dxheroes/dx-scanner/commit/7f19213)) * retype return type from getPRState() ([1769b52](https://github.com/dxheroes/dx-scanner/commit/1769b52)) * stringify undefined value ([2ddd585](https://github.com/dxheroes/dx-scanner/commit/2ddd585)) * typo ([0815844](https://github.com/dxheroes/dx-scanner/commit/0815844)) * use axios because bitbucket client can't allow to get all pullrequests. Write tests for that. ([03eafcf](https://github.com/dxheroes/dx-scanner/commit/03eafcf)) * use different interfaces for GitHub PR and Bitbucket PR ([7d2ecb5](https://github.com/dxheroes/dx-scanner/commit/7d2ecb5)) * use own definition of PR -> implement getPRState() to get the state specific for services ([2b67091](https://github.com/dxheroes/dx-scanner/commit/2b67091)) * use qs library ([42a10e5](https://github.com/dxheroes/dx-scanner/commit/42a10e5)) * values of owner ([c3c5ab2](https://github.com/dxheroes/dx-scanner/commit/c3c5ab2)) ### Features * add mockBitbucketPullRequestResponse() ([905fd11](https://github.com/dxheroes/dx-scanner/commit/905fd11)) * add options for filtering in CollaborationInspector ([572371b](https://github.com/dxheroes/dx-scanner/commit/572371b)) --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c3a6692d..667244b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +# [1.23.0](https://github.com/dxheroes/dx-scanner/compare/v1.22.1...v1.23.0) (2019-12-06) + + +### Bug Fixes + +* add BitbucketPullRequestState because of CollaborationInspector to the options ([74fe662](https://github.com/dxheroes/dx-scanner/commit/74fe662)) +* add filtering to the getPullRequests() ([90b995b](https://github.com/dxheroes/dx-scanner/commit/90b995b)) +* add qs ([6022e9e](https://github.com/dxheroes/dx-scanner/commit/6022e9e)) +* auth is possibly undefined ([1f35259](https://github.com/dxheroes/dx-scanner/commit/1f35259)) +* data of owner ([fa0d129](https://github.com/dxheroes/dx-scanner/commit/fa0d129)) +* delete unnecessary mock file ([952bb79](https://github.com/dxheroes/dx-scanner/commit/952bb79)) +* fix tests and use mockBitbucketPullRequestResponse() ([1b6be4a](https://github.com/dxheroes/dx-scanner/commit/1b6be4a)) +* get the info about user only once as it is always the same ([f54425d](https://github.com/dxheroes/dx-scanner/commit/f54425d)) +* rename CVS to VCS ([c8c2f09](https://github.com/dxheroes/dx-scanner/commit/c8c2f09)) +* rename files ([4a2d83d](https://github.com/dxheroes/dx-scanner/commit/4a2d83d)) +* rename interfaces - add mock to the end of the name ([0ff0093](https://github.com/dxheroes/dx-scanner/commit/0ff0093)) +* return array of states ([7f19213](https://github.com/dxheroes/dx-scanner/commit/7f19213)) +* retype return type from getPRState() ([1769b52](https://github.com/dxheroes/dx-scanner/commit/1769b52)) +* stringify undefined value ([2ddd585](https://github.com/dxheroes/dx-scanner/commit/2ddd585)) +* typo ([0815844](https://github.com/dxheroes/dx-scanner/commit/0815844)) +* use axios because bitbucket client can't allow to get all pullrequests. Write tests for that. ([03eafcf](https://github.com/dxheroes/dx-scanner/commit/03eafcf)) +* use different interfaces for GitHub PR and Bitbucket PR ([7d2ecb5](https://github.com/dxheroes/dx-scanner/commit/7d2ecb5)) +* use own definition of PR -> implement getPRState() to get the state specific for services ([2b67091](https://github.com/dxheroes/dx-scanner/commit/2b67091)) +* use qs library ([42a10e5](https://github.com/dxheroes/dx-scanner/commit/42a10e5)) +* values of owner ([c3c5ab2](https://github.com/dxheroes/dx-scanner/commit/c3c5ab2)) + + +### Features + +* add mockBitbucketPullRequestResponse() ([905fd11](https://github.com/dxheroes/dx-scanner/commit/905fd11)) +* add options for filtering in CollaborationInspector ([572371b](https://github.com/dxheroes/dx-scanner/commit/572371b)) + ## [1.22.1](https://github.com/dxheroes/dx-scanner/compare/v1.22.0...v1.22.1) (2019-12-06) diff --git a/package.json b/package.json index c5bff921c..e5443f9ff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.22.1", + "version": "1.23.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 422f962c0228824a269c7c6abf1916f060ad0947 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 13:36:30 +0100 Subject: [PATCH 118/196] fix: define tests better --- src/services/bitbucket/BitbucketService.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 7aafb9455..84aa2e144 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -23,7 +23,7 @@ describe('Bitbucket Service', () => { bitbucketNock = new BitbucketNock('pypy', 'pypy'); }); - it('returns pull requests in own interface', async () => { + it('returns open pull requests in own interface', async () => { nock(bitbucketNock.url) .get('/users/pypy') .reply(200); @@ -47,7 +47,7 @@ describe('Bitbucket Service', () => { expect(response).toMatchObject(allPullrequestsResponse); }); - it('returns pull request in own interface', async () => { + it('returns specific pull request in own interface', async () => { nock(bitbucketNock.url) .get('/users/pypy') .reply(200); From cf4bf518b36169cedf5cb73f68e8fb6e1eb74be3 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 13:37:11 +0100 Subject: [PATCH 119/196] fix: add value closedAt and mergedAt dynamically --- test/helpers/bitbucketNock.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/helpers/bitbucketNock.ts b/test/helpers/bitbucketNock.ts index 9b4190eb4..a9944d8c0 100644 --- a/test/helpers/bitbucketNock.ts +++ b/test/helpers/bitbucketNock.ts @@ -127,12 +127,26 @@ export class BitbucketNock { if (typeof states !== 'string') { states.forEach((state) => { const pullrequest = _.cloneDeep(getPullRequestResponse); + pullrequest.state = state; + pullrequest.closedAt = + pullrequest.state === BitbucketPullRequestState.closed || pullrequest.state === BitbucketPullRequestState.declined + ? pullrequest.updatedAt + : null; + pullrequest.mergedAt = pullrequest.state === BitbucketPullRequestState.closed ? pullrequest.updatedAt : null; + pullRequests.push(pullrequest); }); + paginatedPullrequests.items = pullRequests; } else { getPullRequestResponse.state = states; + getPullRequestResponse.closedAt = + states === BitbucketPullRequestState.closed || states === BitbucketPullRequestState.declined + ? getPullRequestResponse.updatedAt + : null; + getPullRequestResponse.mergedAt = states === BitbucketPullRequestState.closed ? getPullRequestResponse.updatedAt : null; + paginatedPullrequests.items = [getPullRequestResponse]; } return paginatedPullrequests; From 71733fd0bb109395fd866e4aad02c5f5a1429ae3 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Fri, 6 Dec 2019 13:42:13 +0100 Subject: [PATCH 120/196] fix: type --- src/services/bitbucket/BitbucketService.spec.ts | 2 +- src/services/git/VCSServicesUtils.ts | 5 +---- .../git/__MOCKS__/bitbucketServiceMockFolder/index.ts | 1 - src/services/git/index.ts | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 16135d4fd..ddb6799fb 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -36,7 +36,7 @@ describe('Bitbucket Service', () => { }); it('returns all pull requests in own interface', async () => { - const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); + const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); nock(bitbucketNock.url) .get('/users/pypy') .reply(200); diff --git a/src/services/git/VCSServicesUtils.ts b/src/services/git/VCSServicesUtils.ts index c19239277..e2c2cd9cb 100644 --- a/src/services/git/VCSServicesUtils.ts +++ b/src/services/git/VCSServicesUtils.ts @@ -3,10 +3,7 @@ import { BitbucketPullRequestState, VCSService } from './IVCSService'; import { GitHubPullRequestState } from './IGitHubService'; export class VCSServicesUtils { - static getPRState = ( - state: PullRequestState | undefined, - service: VCSService, - ): GitHubPullRequestState | BitbucketPullRequestState | BitbucketPullRequestState[] | undefined => { + static getPRState = (state: PullRequestState | undefined, service: VCSService) => { if (service === VCSService.github) { switch (state) { case PullRequestState.open: diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts index 2b8587ac4..136875b31 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/index.ts @@ -4,5 +4,4 @@ export * from './getPullCommits'; export * from './getIssueResponse'; export * from './getIssuesResponse'; export * from './getPullRequestResponse'; -export * from './getPullRequestsResponse'; export * from './getIssueCommentsResponse'; diff --git a/src/services/git/index.ts b/src/services/git/index.ts index 7bcf5d1f9..5ddbbce13 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -1,6 +1,6 @@ export * from './GitHubService'; export * from './GitInfoObtainer'; export * from './GitServiceUtils'; -export * from './ICVSService'; +export * from './IVCSService'; export * from './IGitHubService'; export * from './IGitInfoObtainer'; From 71421c15fdea47914abc84b2d9d4554ba54efa20 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 13:45:52 +0100 Subject: [PATCH 121/196] fix: add yarnrc to ignore engines --- .yarnrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .yarnrc diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 000000000..f402100b9 --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +ignore-engines true \ No newline at end of file From 6868976fb14d550161a1b137a72b6fb3e6b28350 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Dec 2019 13:05:49 +0000 Subject: [PATCH 122/196] chore(release): 1.23.1 [skip ci] ## [1.23.1](https://github.com/dxheroes/dx-scanner/compare/v1.23.0...v1.23.1) (2019-12-06) ### Bug Fixes * add BitbucketIssueState enum ([563a7eb](https://github.com/dxheroes/dx-scanner/commit/563a7eb)) * add BitbucketPRState ([e05ca58](https://github.com/dxheroes/dx-scanner/commit/e05ca58)) * add value closedAt and mergedAt dynamically ([cf4bf51](https://github.com/dxheroes/dx-scanner/commit/cf4bf51)) * define tests better ([422f962](https://github.com/dxheroes/dx-scanner/commit/422f962)) * mergedAt and closedAt values, also fix tests for that ([e2e6dc6](https://github.com/dxheroes/dx-scanner/commit/e2e6dc6)) --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 667244b19..b4073d51a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [1.23.1](https://github.com/dxheroes/dx-scanner/compare/v1.23.0...v1.23.1) (2019-12-06) + + +### Bug Fixes + +* add BitbucketIssueState enum ([563a7eb](https://github.com/dxheroes/dx-scanner/commit/563a7eb)) +* add BitbucketPRState ([e05ca58](https://github.com/dxheroes/dx-scanner/commit/e05ca58)) +* add value closedAt and mergedAt dynamically ([cf4bf51](https://github.com/dxheroes/dx-scanner/commit/cf4bf51)) +* define tests better ([422f962](https://github.com/dxheroes/dx-scanner/commit/422f962)) +* mergedAt and closedAt values, also fix tests for that ([e2e6dc6](https://github.com/dxheroes/dx-scanner/commit/e2e6dc6)) + # [1.23.0](https://github.com/dxheroes/dx-scanner/compare/v1.22.1...v1.23.0) (2019-12-06) diff --git a/package.json b/package.json index e5443f9ff..56e8c5364 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.23.0", + "version": "1.23.1", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 7bbca3bc418024fd4d3e4c1d8b29bbf540b8f22c Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 15:29:04 +0100 Subject: [PATCH 123/196] fix: get all pullRequests --- src/practices/LanguageIndependent/DoesPullRequests.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.ts b/src/practices/LanguageIndependent/DoesPullRequests.ts index 4edad5624..14259c3ea 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.ts @@ -4,6 +4,7 @@ import { PracticeEvaluationResult, PracticeImpact } from '../../model'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; @DxPractice({ id: 'LanguageIndependent.DoesPullRequests', @@ -26,8 +27,9 @@ export class DoesPullRequestsPractice implements IPractice { const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); - //TODO add filtering - const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); + const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName, { + filter: { state: PullRequestState.all }, + }); const repoCommits = await ctx.collaborationInspector.getRepoCommits(ownerAndRepoName.owner, ownerAndRepoName.repoName); if (pullRequests.items.length === 0) { From 46a7a31c0c6035a7e262958ff132d5e69a8912ac Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 15:34:32 +0100 Subject: [PATCH 124/196] fix: add queryState to new GitHubNock() --- .../DoesPullRequests.spec.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index 282758cd6..df03cf1b8 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -4,6 +4,7 @@ import { DoesPullRequestsPractice } from './DoesPullRequests'; import nock from 'nock'; import { GitHubNock } from '../../../test/helpers/gitHubNock'; import { getRepoCommitsResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsResponse.mock'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; describe('DoesPullRequests', () => { let practice: DoesPullRequestsPractice; @@ -26,9 +27,10 @@ describe('DoesPullRequests', () => { it('return practicing if there is at least one PR which is newer than last commit in master minus 30 days', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ - { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, - ]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( + [{ number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }], + PullRequestState.all, + ); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); @@ -37,7 +39,7 @@ describe('DoesPullRequests', () => { it('return notPracticing if there is no PR which is newer than last commit in master minus 30 days', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([], PullRequestState.all); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); @@ -46,18 +48,21 @@ describe('DoesPullRequests', () => { it('return notPracticing if there is PR older than 30 days than the last commit in master', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ - { - number: 1348, - state: 'opened', - title: 'new-feature', - body: '', - head: 'new-topic', - base: 'master', - // eslint-disable-next-line @typescript-eslint/camelcase - created_at: '2000-03-06T23:06:50Z', - }, - ]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( + [ + { + number: 1348, + state: 'opened', + title: 'new-feature', + body: '', + head: 'new-topic', + base: 'master', + // eslint-disable-next-line @typescript-eslint/camelcase + created_at: '2000-03-06T23:06:50Z', + }, + ], + PullRequestState.all, + ); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); From 3187f0049140e4ef3a2991631e16b6d33274cb0f Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Fri, 6 Dec 2019 15:53:19 +0100 Subject: [PATCH 125/196] chore: remove invalid import --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 7a245b810..c67e1cc89 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,4 @@ import 'reflect-metadata'; -import 'module-alias/register'; import { createRootContainer } from './inversify.config'; import { Scanner, ScanResult } from './scanner/Scanner'; import { Command, flags } from '@oclif/command'; From e324c1fb83828986c8c036aecc76b7b973e53930 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 15:56:36 +0100 Subject: [PATCH 126/196] fix: use qs --- src/services/git/GitHubService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 8741fe2ed..bd86c7b3e 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -182,7 +182,8 @@ export class GitHubService implements IVCSService { async getRepoCommits(owner: string, repo: string, sha?: string): Promise> { let url = 'GET /repos/:owner/:repo/commits'; if (sha !== undefined) { - url = `${url}?state=${sha}`; + const stateForUri = qs.stringify({ state: sha }, { addQueryPrefix: true }); + url = `${url}${stateForUri}`; } const response = await this.paginate(url, owner, repo); From bcae6be63cee01286397d516d1cd90a9964ce1f3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Dec 2019 15:55:04 +0000 Subject: [PATCH 127/196] chore(release): 1.23.2 [skip ci] ## [1.23.2](https://github.com/dxheroes/dx-scanner/compare/v1.23.1...v1.23.2) (2019-12-06) ### Bug Fixes * type ([71733fd](https://github.com/dxheroes/dx-scanner/commit/71733fd)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4073d51a..29e4a1a0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.23.2](https://github.com/dxheroes/dx-scanner/compare/v1.23.1...v1.23.2) (2019-12-06) + + +### Bug Fixes + +* type ([71733fd](https://github.com/dxheroes/dx-scanner/commit/71733fd)) + ## [1.23.1](https://github.com/dxheroes/dx-scanner/compare/v1.23.0...v1.23.1) (2019-12-06) diff --git a/package.json b/package.json index 212484eb1..8798e6841 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.23.1", + "version": "1.23.2", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From bbf213666150139dec905cbf1d60c947801bf971 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 17:22:24 +0100 Subject: [PATCH 128/196] fix: use method to change the message of the repo commits --- .../CorrectCommitMessagesPractice.spec.ts | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts b/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts index 51bbf1784..2c4ad957b 100644 --- a/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts +++ b/src/practices/LanguageIndependent/CorrectCommitMessagesPractice.spec.ts @@ -4,6 +4,9 @@ import { createTestContainer, TestContainerContext } from '../../inversify.confi import { PracticeEvaluationResult } from '../../model'; import { getRepoCommitsServiceResponse } from '../../services/git/__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; import { CorrectCommitMessagesPractice } from './CorrectCommitMessagesPractice'; +import { Paginated } from '../../inspectors/common/Paginated'; +import { Commit } from '../../services/git/model'; +import _ from 'lodash'; describe('CorrectCommitMessagesPractice', () => { let practice: CorrectCommitMessagesPractice; @@ -29,10 +32,7 @@ describe('CorrectCommitMessagesPractice', () => { it('returns practicing if the commit messages are correct', async () => { mockCollaborationInspector.getRepoCommits = async () => { - getRepoCommitsServiceResponse.items.forEach((item) => { - item.message = 'fix: correct commit message'; - }); - return getRepoCommitsServiceResponse; + return changeRepoCommitsMessages('fix: correct commit message'); }; const evaluated = await practice.evaluate({ @@ -44,10 +44,7 @@ describe('CorrectCommitMessagesPractice', () => { it('returns not practicing if the commit messages are incorrect', async () => { mockCollaborationInspector.getRepoCommits = async () => { - getRepoCommitsServiceResponse.items.forEach((item) => { - item.message = 'Incorrect commit message'; - }); - return getRepoCommitsServiceResponse; + return changeRepoCommitsMessages('Incorrect commit message'); }; const evaluated = await practice.evaluate({ @@ -66,4 +63,27 @@ describe('CorrectCommitMessagesPractice', () => { const response = await practice.isApplicable(); expect(response).toBe(true); }); + + const changeRepoCommitsMessages = (message: string) => { + const paginatedRepoCommits: Paginated = { + items: getRepoCommitsServiceResponse.items, + hasNextPage: true, + hasPreviousPage: false, + page: 1, + perPage: getRepoCommitsServiceResponse.items.length, + totalCount: getRepoCommitsServiceResponse.items.length, + }; + if (getRepoCommitsServiceResponse.items.length > 1) { + const repoCommits: Commit[] = _.cloneDeep(getRepoCommitsServiceResponse.items); + repoCommits.forEach((repoCommit) => { + repoCommit.message = message; + repoCommits.push(repoCommit); + }); + + paginatedRepoCommits.items = repoCommits; + } else { + getRepoCommitsServiceResponse.items[0].message = message; + } + return paginatedRepoCommits; + }; }); From d6f7ae157fed498656ba04e2ee83ca696dcf34f2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Dec 2019 17:38:54 +0000 Subject: [PATCH 129/196] chore(release): 1.24.0 [skip ci] # [1.24.0](https://github.com/dxheroes/dx-scanner/compare/v1.23.2...v1.24.0) (2019-12-06) ### Bug Fixes * add BitbucketService to the type ([7a71226](https://github.com/dxheroes/dx-scanner/commit/7a71226)) * add condition so it doesn't fail if there are no PRs ([4839367](https://github.com/dxheroes/dx-scanner/commit/4839367)) * add getRepoCommits() into interface, ([8b544ef](https://github.com/dxheroes/dx-scanner/commit/8b544ef)) * add getRepoCommits() into interface, ([648f066](https://github.com/dxheroes/dx-scanner/commit/648f066)) * add moment to package.json ([20fec03](https://github.com/dxheroes/dx-scanner/commit/20fec03)) * Add parse-commit-message ([d5c6a08](https://github.com/dxheroes/dx-scanner/commit/d5c6a08)) * add queryState to new GitHubNock() ([46a7a31](https://github.com/dxheroes/dx-scanner/commit/46a7a31)) * add yarnrc to ignore engines ([71421c1](https://github.com/dxheroes/dx-scanner/commit/71421c1)) * bind CollaborationInspector and IssueTrackingInspector, ([b23c983](https://github.com/dxheroes/dx-scanner/commit/b23c983)) * change date of PR so it can for testing practicing Does PR practice ([69932c3](https://github.com/dxheroes/dx-scanner/commit/69932c3)) * change dates ([8f9d5c1](https://github.com/dxheroes/dx-scanner/commit/8f9d5c1)) * condition, ([4213929](https://github.com/dxheroes/dx-scanner/commit/4213929)) * disable camel case in whole file instead of each line ([caef75b](https://github.com/dxheroes/dx-scanner/commit/caef75b)) * get all pullRequests ([7bbca3b](https://github.com/dxheroes/dx-scanner/commit/7bbca3b)) * getRepoCommits() test ([7ff57d6](https://github.com/dxheroes/dx-scanner/commit/7ff57d6)) * if the PR is updated, count with that date, not with the createdAt date ([bb374f0](https://github.com/dxheroes/dx-scanner/commit/bb374f0)) * increase coverage by adding some tests ([3801a6d](https://github.com/dxheroes/dx-scanner/commit/3801a6d)) * move getPathOrRepoUrl from ReporterUtils to GitServiceUtils ([2198384](https://github.com/dxheroes/dx-scanner/commit/2198384)) * move inspectors to language component context instead of overall container ([a19410f](https://github.com/dxheroes/dx-scanner/commit/a19410f)) * name of tests ([9f025d2](https://github.com/dxheroes/dx-scanner/commit/9f025d2)) * name of value ([a42909e](https://github.com/dxheroes/dx-scanner/commit/a42909e)) * optional created_at and updated_at ([a7773a5](https://github.com/dxheroes/dx-scanner/commit/a7773a5)) * refactor code ([2bd8bd9](https://github.com/dxheroes/dx-scanner/commit/2bd8bd9)) * remove ambiguous binding ([005b88b](https://github.com/dxheroes/dx-scanner/commit/005b88b)) * remove comma ([cf555bf](https://github.com/dxheroes/dx-scanner/commit/cf555bf)) * remove console.log() ([ae095e3](https://github.com/dxheroes/dx-scanner/commit/ae095e3)) * remove merge conflict ([dd8216d](https://github.com/dxheroes/dx-scanner/commit/dd8216d)) * remove unnecessary condition ([e0a43f5](https://github.com/dxheroes/dx-scanner/commit/e0a43f5)) * remove unnecessary name of branch ([9473353](https://github.com/dxheroes/dx-scanner/commit/9473353)) * remove unused imports ([535e1c7](https://github.com/dxheroes/dx-scanner/commit/535e1c7)) * rename files ([3769e64](https://github.com/dxheroes/dx-scanner/commit/3769e64)) * rename practice ([c96061d](https://github.com/dxheroes/dx-scanner/commit/c96061d)) * return CollaborationInspector and IssueTrackingInspector (not undefined), ([d461ad7](https://github.com/dxheroes/dx-scanner/commit/d461ad7)) * return repoCommits in own interface ([dca5707](https://github.com/dxheroes/dx-scanner/commit/dca5707)) * return repoCommits in own interface ([63fe746](https://github.com/dxheroes/dx-scanner/commit/63fe746)) * revert change ([741e491](https://github.com/dxheroes/dx-scanner/commit/741e491)) * revert change ([e8ae9ac](https://github.com/dxheroes/dx-scanner/commit/e8ae9ac)) * revert changes ([89765c2](https://github.com/dxheroes/dx-scanner/commit/89765c2)) * revert changes ([43d3f16](https://github.com/dxheroes/dx-scanner/commit/43d3f16)) * revert changes ([43c8eaf](https://github.com/dxheroes/dx-scanner/commit/43c8eaf)) * revert changes and fix tests ([98b444c](https://github.com/dxheroes/dx-scanner/commit/98b444c)) * revert changes and fix tets ([0437471](https://github.com/dxheroes/dx-scanner/commit/0437471)) * tests ([1c660ef](https://github.com/dxheroes/dx-scanner/commit/1c660ef)) * unify name ([c5bde88](https://github.com/dxheroes/dx-scanner/commit/c5bde88)) * url ([6710a7f](https://github.com/dxheroes/dx-scanner/commit/6710a7f)) * use different date as default ([a589a04](https://github.com/dxheroes/dx-scanner/commit/a589a04)) * use method to change the message of the repo commits ([bbf2136](https://github.com/dxheroes/dx-scanner/commit/bbf2136)) * use moment.js to convert days to milliseconds ([99585fe](https://github.com/dxheroes/dx-scanner/commit/99585fe)) * use parser-commit-message instead of manual parsing ([cf4b5cb](https://github.com/dxheroes/dx-scanner/commit/cf4b5cb)) * use qs ([e324c1f](https://github.com/dxheroes/dx-scanner/commit/e324c1f)) * version of parse-commit-message ([b804092](https://github.com/dxheroes/dx-scanner/commit/b804092)) ### Features * add getRepoCommits into CollaborationInspector ([fba7af9](https://github.com/dxheroes/dx-scanner/commit/fba7af9)) * add getRepoCommits into CollaborationInspector ([dccf3eb](https://github.com/dxheroes/dx-scanner/commit/dccf3eb)) * add new practice ([70e796a](https://github.com/dxheroes/dx-scanner/commit/70e796a)) * Detect parcticing/notPracticing based on date of commit and date of PR minus 30 days ([1948193](https://github.com/dxheroes/dx-scanner/commit/1948193)) * install parse-commit-message and add typings for that library ([2e04ac9](https://github.com/dxheroes/dx-scanner/commit/2e04ac9)) --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29e4a1a0d..4bc259519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,69 @@ +# [1.24.0](https://github.com/dxheroes/dx-scanner/compare/v1.23.2...v1.24.0) (2019-12-06) + + +### Bug Fixes + +* add BitbucketService to the type ([7a71226](https://github.com/dxheroes/dx-scanner/commit/7a71226)) +* add condition so it doesn't fail if there are no PRs ([4839367](https://github.com/dxheroes/dx-scanner/commit/4839367)) +* add getRepoCommits() into interface, ([8b544ef](https://github.com/dxheroes/dx-scanner/commit/8b544ef)) +* add getRepoCommits() into interface, ([648f066](https://github.com/dxheroes/dx-scanner/commit/648f066)) +* add moment to package.json ([20fec03](https://github.com/dxheroes/dx-scanner/commit/20fec03)) +* Add parse-commit-message ([d5c6a08](https://github.com/dxheroes/dx-scanner/commit/d5c6a08)) +* add queryState to new GitHubNock() ([46a7a31](https://github.com/dxheroes/dx-scanner/commit/46a7a31)) +* add yarnrc to ignore engines ([71421c1](https://github.com/dxheroes/dx-scanner/commit/71421c1)) +* bind CollaborationInspector and IssueTrackingInspector, ([b23c983](https://github.com/dxheroes/dx-scanner/commit/b23c983)) +* change date of PR so it can for testing practicing Does PR practice ([69932c3](https://github.com/dxheroes/dx-scanner/commit/69932c3)) +* change dates ([8f9d5c1](https://github.com/dxheroes/dx-scanner/commit/8f9d5c1)) +* condition, ([4213929](https://github.com/dxheroes/dx-scanner/commit/4213929)) +* disable camel case in whole file instead of each line ([caef75b](https://github.com/dxheroes/dx-scanner/commit/caef75b)) +* get all pullRequests ([7bbca3b](https://github.com/dxheroes/dx-scanner/commit/7bbca3b)) +* getRepoCommits() test ([7ff57d6](https://github.com/dxheroes/dx-scanner/commit/7ff57d6)) +* if the PR is updated, count with that date, not with the createdAt date ([bb374f0](https://github.com/dxheroes/dx-scanner/commit/bb374f0)) +* increase coverage by adding some tests ([3801a6d](https://github.com/dxheroes/dx-scanner/commit/3801a6d)) +* move getPathOrRepoUrl from ReporterUtils to GitServiceUtils ([2198384](https://github.com/dxheroes/dx-scanner/commit/2198384)) +* move inspectors to language component context instead of overall container ([a19410f](https://github.com/dxheroes/dx-scanner/commit/a19410f)) +* name of tests ([9f025d2](https://github.com/dxheroes/dx-scanner/commit/9f025d2)) +* name of value ([a42909e](https://github.com/dxheroes/dx-scanner/commit/a42909e)) +* optional created_at and updated_at ([a7773a5](https://github.com/dxheroes/dx-scanner/commit/a7773a5)) +* refactor code ([2bd8bd9](https://github.com/dxheroes/dx-scanner/commit/2bd8bd9)) +* remove ambiguous binding ([005b88b](https://github.com/dxheroes/dx-scanner/commit/005b88b)) +* remove comma ([cf555bf](https://github.com/dxheroes/dx-scanner/commit/cf555bf)) +* remove console.log() ([ae095e3](https://github.com/dxheroes/dx-scanner/commit/ae095e3)) +* remove merge conflict ([dd8216d](https://github.com/dxheroes/dx-scanner/commit/dd8216d)) +* remove unnecessary condition ([e0a43f5](https://github.com/dxheroes/dx-scanner/commit/e0a43f5)) +* remove unnecessary name of branch ([9473353](https://github.com/dxheroes/dx-scanner/commit/9473353)) +* remove unused imports ([535e1c7](https://github.com/dxheroes/dx-scanner/commit/535e1c7)) +* rename files ([3769e64](https://github.com/dxheroes/dx-scanner/commit/3769e64)) +* rename practice ([c96061d](https://github.com/dxheroes/dx-scanner/commit/c96061d)) +* return CollaborationInspector and IssueTrackingInspector (not undefined), ([d461ad7](https://github.com/dxheroes/dx-scanner/commit/d461ad7)) +* return repoCommits in own interface ([dca5707](https://github.com/dxheroes/dx-scanner/commit/dca5707)) +* return repoCommits in own interface ([63fe746](https://github.com/dxheroes/dx-scanner/commit/63fe746)) +* revert change ([741e491](https://github.com/dxheroes/dx-scanner/commit/741e491)) +* revert change ([e8ae9ac](https://github.com/dxheroes/dx-scanner/commit/e8ae9ac)) +* revert changes ([89765c2](https://github.com/dxheroes/dx-scanner/commit/89765c2)) +* revert changes ([43d3f16](https://github.com/dxheroes/dx-scanner/commit/43d3f16)) +* revert changes ([43c8eaf](https://github.com/dxheroes/dx-scanner/commit/43c8eaf)) +* revert changes and fix tests ([98b444c](https://github.com/dxheroes/dx-scanner/commit/98b444c)) +* revert changes and fix tets ([0437471](https://github.com/dxheroes/dx-scanner/commit/0437471)) +* tests ([1c660ef](https://github.com/dxheroes/dx-scanner/commit/1c660ef)) +* unify name ([c5bde88](https://github.com/dxheroes/dx-scanner/commit/c5bde88)) +* url ([6710a7f](https://github.com/dxheroes/dx-scanner/commit/6710a7f)) +* use different date as default ([a589a04](https://github.com/dxheroes/dx-scanner/commit/a589a04)) +* use method to change the message of the repo commits ([bbf2136](https://github.com/dxheroes/dx-scanner/commit/bbf2136)) +* use moment.js to convert days to milliseconds ([99585fe](https://github.com/dxheroes/dx-scanner/commit/99585fe)) +* use parser-commit-message instead of manual parsing ([cf4b5cb](https://github.com/dxheroes/dx-scanner/commit/cf4b5cb)) +* use qs ([e324c1f](https://github.com/dxheroes/dx-scanner/commit/e324c1f)) +* version of parse-commit-message ([b804092](https://github.com/dxheroes/dx-scanner/commit/b804092)) + + +### Features + +* add getRepoCommits into CollaborationInspector ([fba7af9](https://github.com/dxheroes/dx-scanner/commit/fba7af9)) +* add getRepoCommits into CollaborationInspector ([dccf3eb](https://github.com/dxheroes/dx-scanner/commit/dccf3eb)) +* add new practice ([70e796a](https://github.com/dxheroes/dx-scanner/commit/70e796a)) +* Detect parcticing/notPracticing based on date of commit and date of PR minus 30 days ([1948193](https://github.com/dxheroes/dx-scanner/commit/1948193)) +* install parse-commit-message and add typings for that library ([2e04ac9](https://github.com/dxheroes/dx-scanner/commit/2e04ac9)) + ## [1.23.2](https://github.com/dxheroes/dx-scanner/compare/v1.23.1...v1.23.2) (2019-12-06) diff --git a/package.json b/package.json index 52b7b0385..c1a751da7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.23.2", + "version": "1.24.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From a667a78c7317d8e456135ac2da84c2a3c315d5bb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 22:45:09 +0100 Subject: [PATCH 130/196] feat: add TimeToSolvePractice --- .../TimeToSolvePractice.ts | 59 +++++++++++++++++++ src/practices/index.ts | 2 + 2 files changed, 61 insertions(+) create mode 100644 src/practices/LanguageIndependent/TimeToSolvePractice.ts diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.ts b/src/practices/LanguageIndependent/TimeToSolvePractice.ts new file mode 100644 index 000000000..77e2c284e --- /dev/null +++ b/src/practices/LanguageIndependent/TimeToSolvePractice.ts @@ -0,0 +1,59 @@ +import moment from 'moment'; +import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { PracticeEvaluationResult, PracticeImpact } from '../../model'; +import { GitServiceUtils } from '../../services/git/GitServiceUtils'; +import { DxPractice } from '../DxPracticeDecorator'; +import { IPractice } from '../IPractice'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; + +@DxPractice({ + id: 'LanguageIndependent.TimeToSolve', + name: '', + impact: PracticeImpact.medium, + suggestion: '', + reportOnlyOnce: true, + url: 'https://dxkb.io/p/pull-requests', + dependsOn: { practicing: ['LanguageIndependent.DoesPullRequests'] }, +}) +export class TimeToSolvePractice implements IPractice { + async isApplicable(): Promise { + return true; + } + + async evaluate(ctx: PracticeContext): Promise { + if (ctx.fileInspector === undefined || ctx.collaborationInspector === undefined) { + return PracticeEvaluationResult.unknown; + } + + const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); + const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); + + const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName, { + filter: { state: PullRequestState.open }, + }); + + if (pullRequests.items.length === 0) { + return PracticeEvaluationResult.practicing; + } + + const latestPRsUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); + + const descendingSortedPrDates = latestPRsUpdate.sort((prA, prB) => prB - prA); + + const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); + const now = Date.now(); + const openPullrequestsTooLong = []; + + descendingSortedPrDates.forEach((prDate) => { + if (now - prDate > daysInMilliseconds) { + openPullrequestsTooLong.push(prDate); + } + }); + + if (openPullrequestsTooLong.length === 0) { + return PracticeEvaluationResult.practicing; + } + + return PracticeEvaluationResult.notPracticing; + } +} diff --git a/src/practices/index.ts b/src/practices/index.ts index 942a979ef..c02fe5fbf 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -23,6 +23,7 @@ import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrect import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessagesPractice'; +import { TimeToSolvePractice } from './LanguageIndependent/TimeToSolvePractice'; // register practices here export const practices = [ @@ -51,4 +52,5 @@ export const practices = [ TsGitignoreCorrectlySetPractice, DoesPullRequestsPractice, CorrectCommitMessagesPractice, + TimeToSolvePractice, ]; From 5aee28a23f1eb330f9ccd77119a12778ca4396bb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 6 Dec 2019 22:45:32 +0100 Subject: [PATCH 131/196] test: work on tests for TimeToSolvePractice --- .../TimeToSolvePractice.spec.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts new file mode 100644 index 000000000..343f639ca --- /dev/null +++ b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts @@ -0,0 +1,37 @@ +import nock from 'nock'; +import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { createTestContainer, TestContainerContext } from '../../inversify.config'; +import { PracticeEvaluationResult } from '../../model'; +import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { TimeToSolvePractice } from './TimeToSolvePractice'; + +describe('TimeToSolvePractice', () => { + let practice: TimeToSolvePractice; + let containerCtx: TestContainerContext; + + beforeEach(async () => { + nock.cleanAll(); + }); + + beforeAll(() => { + containerCtx = createTestContainer(); + containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePractice); + practice = containerCtx.container.get('TimeToSolvePractice'); + }); + + afterEach(async () => { + containerCtx.virtualFileSystemService.clearFileSystem(); + containerCtx.practiceContext.fileInspector!.purgeCache(); + }); + + it('', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( + [{ number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }], + PullRequestState.open, + ); + + const evaluated = await practice.evaluate(containerCtx.practiceContext); + expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + }); +}); From 2db8559f908d4e2a062c46e38c87da939de4e7cb Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sun, 8 Dec 2019 12:48:50 +0100 Subject: [PATCH 132/196] feat(CLIReporter): add rich suggestion text to the report --- src/model.ts | 19 -------- .../DependenciesVersionMajorLevel.spec.ts | 6 +-- .../DependenciesVersionMajorLevel.ts | 9 ++-- ...DependenciesVersionMinorPatchLevel.spec.ts | 6 +-- .../DependenciesVersionMinorPatchLevel.ts | 8 ++-- .../JavaScript/DependenciesVersionPractice.ts | 46 ------------------- .../JsGitignoreCorrectlySetPractice.ts | 15 +++++- ...geJsonConfigurationSetCorrectlyPractice.ts | 14 ++++-- src/practices/PracticeBase.ts | 2 + .../TsGitignoreCorrectlySetPractice.ts | 16 ++++++- src/practices/index.ts | 8 ++-- src/reporters/CLIReporter.ts | 21 +++++++-- src/reporters/ReporterData.ts | 14 +++++- 13 files changed, 88 insertions(+), 96 deletions(-) delete mode 100644 src/practices/JavaScript/DependenciesVersionPractice.ts diff --git a/src/model.ts b/src/model.ts index 445c8d30f..765102c3b 100644 --- a/src/model.ts +++ b/src/model.ts @@ -73,25 +73,6 @@ export interface Repository { authString?: string; } -// export interface Project { -// components: DeprecatedProjectComponent[]; -// } - -// /** -// * @deprecated -// */ -// export interface DeprecatedProjectComponent { -// githubUrl?: string; -// path: string; -// git?: GitInfo; -// language: ProgrammingLanguage; -// type: ProjectComponentType; -// platform: ProjectComponentPlatform; -// framework: ProjectComponentFramework; -// packageManagement?: PackageManagement; -// testing: TestingInfo; -// } - export interface PracticeMetadata { id: string; name: string; diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts index f1329478f..a06348ff0 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts @@ -1,5 +1,5 @@ import { PracticeEvaluationResult } from '../../model'; -import { DependenciesVersionMajorLevel } from './DependenciesVersionMajorLevel'; +import { DependenciesVersionMajorLevelPractice } from './DependenciesVersionMajorLevel'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import ncu from 'npm-check-updates'; import { JavaScriptPackageInspector } from '../../inspectors/package/JavaScriptPackageInspector'; @@ -7,7 +7,7 @@ import { mockPackage } from '../../test/helpers/mockPackage'; jest.mock('npm-check-updates'); describe('DependenciesVersionPractice of Major Level', () => { - let practice: DependenciesVersionMajorLevel; + let practice: DependenciesVersionMajorLevelPractice; let containerCtx: TestContainerContext; const mockedNcu = ncu.run; const MockedJSPackageInspector = >(JavaScriptPackageInspector); @@ -15,7 +15,7 @@ describe('DependenciesVersionPractice of Major Level', () => { beforeAll(async () => { containerCtx = createTestContainer(); - containerCtx.container.bind('DependenciesVersionMajorLevel').to(DependenciesVersionMajorLevel); + containerCtx.container.bind('DependenciesVersionMajorLevel').to(DependenciesVersionMajorLevelPractice); practice = containerCtx.container.get('DependenciesVersionMajorLevel'); mockJsPackageInspector = new MockedJSPackageInspector(); }); diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts index 2c6e2b2ba..33ce18ae2 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.ts @@ -5,16 +5,17 @@ import { PackageInspectorBase, SemverLevel } from '../../inspectors/package/Pack import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { PracticeBase } from '../PracticeBase'; +import { ReportDetailType } from '../../reporters/ReporterData'; @DxPractice({ id: 'JavaScript.DependenciesVersionMajorLevel', name: 'Update Dependencies of Major Level', impact: PracticeImpact.small, - suggestion: 'Keep the dependencies updated to have all possible features. Use, for example, Renovate Bot.', + suggestion: 'Keep the dependencies updated to have all possible features. Use, for example, npm-check-updates.', reportOnlyOnce: true, - url: 'https://renovatebot.com/', + url: 'https://github.com/tjunnone/npm-check-updates', }) -export class DependenciesVersionMajorLevel extends PracticeBase { +export class DependenciesVersionMajorLevelPractice extends PracticeBase { async isApplicable(ctx: PracticeContext): Promise { return ( ctx.projectComponent.language === ProgrammingLanguage.JavaScript || ctx.projectComponent.language === ProgrammingLanguage.TypeScript @@ -71,7 +72,7 @@ export class DependenciesVersionMajorLevel extends PracticeBase { } setData(pkgsToUpdate: PkgToUpdate[]): void { - this.data.details = [{ headers: ['Name', 'New', 'Current'], data: pkgsToUpdate }]; + this.data.details = [{ type: ReportDetailType.table, headers: ['Name', 'New', 'Current'], data: pkgsToUpdate }]; } } diff --git a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts index e361075c1..c71c6b30a 100644 --- a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts @@ -3,11 +3,11 @@ import { mockPackage } from '../../test/helpers/mockPackage'; import { JavaScriptPackageInspector } from '../../inspectors/package/JavaScriptPackageInspector'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; -import { DependenciesVersionMinorPatchLevel } from './DependenciesVersionMinorPatchLevel'; +import { DependenciesVersionMinorPatchLevelPractice } from './DependenciesVersionMinorPatchLevel'; jest.mock('npm-check-updates'); describe('DependenciesVersionPractice of Minor and Patch Level', () => { - let practice: DependenciesVersionMinorPatchLevel; + let practice: DependenciesVersionMinorPatchLevelPractice; let containerCtx: TestContainerContext; const mockedNcu = ncu.run; const MockedJSPackageInspector = >(JavaScriptPackageInspector); @@ -15,7 +15,7 @@ describe('DependenciesVersionPractice of Minor and Patch Level', () => { beforeAll(async () => { containerCtx = createTestContainer(); - containerCtx.container.bind('DependenciesVersionMinorPatchLevel').to(DependenciesVersionMinorPatchLevel); + containerCtx.container.bind('DependenciesVersionMinorPatchLevel').to(DependenciesVersionMinorPatchLevelPractice); practice = containerCtx.container.get('DependenciesVersionMinorPatchLevel'); mockJsPackageInspector = new MockedJSPackageInspector(); }); diff --git a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts index 09079b094..6009f0948 100644 --- a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts +++ b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.ts @@ -2,7 +2,7 @@ import { PracticeContext } from '../../contexts/practice/PracticeContext'; import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; -import { DependenciesVersionMajorLevel } from './DependenciesVersionMajorLevel'; +import { DependenciesVersionMajorLevelPractice } from './DependenciesVersionMajorLevel'; import { SemverLevel } from '../../inspectors/package/PackageInspectorBase'; import { flatten } from 'lodash'; @@ -10,11 +10,11 @@ import { flatten } from 'lodash'; id: 'JavaScript.DependenciesVersionMinorPatchLevel', name: 'Update Dependencies of Minor and Patch Level', impact: PracticeImpact.high, - suggestion: 'Keep the dependencies updated to eliminate security concerns and compatibility issues. Use, for example, Renovate Bot.', + suggestion: 'Keep the dependencies updated to eliminate security concerns and compatibility issues. Use, for example, npm-check-updates.', reportOnlyOnce: true, - url: 'https://renovatebot.com/', + url: 'https://github.com/tjunnone/npm-check-updates', }) -export class DependenciesVersionMinorPatchLevel extends DependenciesVersionMajorLevel implements IPractice { +export class DependenciesVersionMinorPatchLevelPractice extends DependenciesVersionMajorLevelPractice implements IPractice { async isApplicable(ctx: PracticeContext): Promise { return ( ctx.projectComponent.language === ProgrammingLanguage.JavaScript || ctx.projectComponent.language === ProgrammingLanguage.TypeScript diff --git a/src/practices/JavaScript/DependenciesVersionPractice.ts b/src/practices/JavaScript/DependenciesVersionPractice.ts deleted file mode 100644 index 769cc6f75..000000000 --- a/src/practices/JavaScript/DependenciesVersionPractice.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { PracticeImpact, PracticeEvaluationResult, ProgrammingLanguage } from '../../model'; -import { DxPractice } from '../DxPracticeDecorator'; -import { IPractice } from '../IPractice'; -import { PracticeContext } from '../../contexts/practice/PracticeContext'; -import _ from 'lodash'; -import ncu from 'npm-check-updates'; - -@DxPractice({ - id: 'LanguageIndependent.DependenciesVersion', - name: 'Update Dependencies', - impact: PracticeImpact.high, - suggestion: 'Keep the dependencies updated to eliminate security concerns and compatibility issues. Use, for example, Renovate Bot.', - reportOnlyOnce: true, - url: 'https://renovatebot.com/', -}) -export class DependenciesVersionPractice implements IPractice { - async isApplicable(ctx: PracticeContext): Promise { - return ( - ctx.projectComponent.language === ProgrammingLanguage.JavaScript || ctx.projectComponent.language === ProgrammingLanguage.TypeScript - ); - } - - async evaluate(ctx: PracticeContext): Promise { - if (!ctx.fileInspector || !ctx.packageInspector) { - return PracticeEvaluationResult.unknown; - } - - const pkgs = ctx.packageInspector.packages; - const fakePkgJson: { dependencies: { [key: string]: string } } = { dependencies: {} }; - - pkgs && - pkgs.forEach((p) => { - fakePkgJson.dependencies[p.name] = p.requestedVersion.value; - }); - - const result = await ncu.run({ - packageData: JSON.stringify(fakePkgJson), - }); - - if (_.keys(result).length === 0) { - return PracticeEvaluationResult.practicing; - } - - return PracticeEvaluationResult.notPracticing; - } -} diff --git a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts index 99fb0c76d..09d5a35d0 100644 --- a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts +++ b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts @@ -2,6 +2,8 @@ import { IPractice } from '../IPractice'; import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { PracticeBase } from '../PracticeBase'; +import { ReportDetailType } from '../../reporters/ReporterData'; @DxPractice({ id: 'JavaScript.GitignoreCorrectlySet', @@ -12,7 +14,7 @@ import { PracticeContext } from '../../contexts/practice/PracticeContext'; url: 'https://github.com/github/gitignore/blob/master/Node.gitignore', dependsOn: { practicing: ['LanguageIndependent.GitignoreIsPresent'] }, }) -export class JsGitignoreCorrectlySetPractice implements IPractice { +export class JsGitignoreCorrectlySetPractice extends PracticeBase { async isApplicable(ctx: PracticeContext): Promise { return ctx.projectComponent.language === ProgrammingLanguage.JavaScript; } @@ -44,6 +46,17 @@ export class JsGitignoreCorrectlySetPractice implements IPractice { return PracticeEvaluationResult.practicing; } + this.setData(); return PracticeEvaluationResult.notPracticing; } + + private setData() { + this.data.details = [ + { + type: ReportDetailType.text, + text: + 'You should ignore one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', + }, + ]; + } } diff --git a/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.ts b/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.ts index e996f3fb5..3e82bd9ae 100644 --- a/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.ts +++ b/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.ts @@ -1,7 +1,8 @@ -import { IPractice } from '../IPractice'; import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { PracticeBase } from '../PracticeBase'; +import { ReportDetailType } from '../../reporters/ReporterData'; @DxPractice({ id: 'JavaScript.PackageJsonConfigurationSetCorrectly', @@ -13,7 +14,7 @@ import { PracticeContext } from '../../contexts/practice/PracticeContext'; url: 'https://docs.npmjs.com/files/package.json', dependsOn: { practicing: ['Javascript.PackageManagementUsed'] }, }) -export class JsPackageJsonConfigurationSetCorrectlyPractice implements IPractice { +export class JsPackageJsonConfigurationSetCorrectlyPractice extends PracticeBase { async isApplicable(ctx: PracticeContext): Promise { return ( ctx.projectComponent.language === ProgrammingLanguage.JavaScript || ctx.projectComponent.language === ProgrammingLanguage.TypeScript @@ -21,7 +22,7 @@ export class JsPackageJsonConfigurationSetCorrectlyPractice implements IPractice } async evaluate(ctx: PracticeContext): Promise { - if (ctx.fileInspector === undefined) { + if (!ctx.fileInspector) { return PracticeEvaluationResult.unknown; } @@ -49,6 +50,13 @@ export class JsPackageJsonConfigurationSetCorrectlyPractice implements IPractice return PracticeEvaluationResult.practicing; } + this.setData(); return PracticeEvaluationResult.notPracticing; } + + private setData() { + this.data.details = [ + { type: ReportDetailType.text, text: "The package.json doesn't have configured scripts correctly. The most common scripts are build, start, test and lint." } + ]; + } } diff --git a/src/practices/PracticeBase.ts b/src/practices/PracticeBase.ts index 37d7d35a9..68e07ad5a 100644 --- a/src/practices/PracticeBase.ts +++ b/src/practices/PracticeBase.ts @@ -4,7 +4,9 @@ import { IPractice, PracticeData } from './IPractice'; import { ErrorFactory } from '../lib/errors'; import { PracticeEvaluationResult } from '../model'; import { PracticeContext } from '../contexts/practice/PracticeContext'; +import { injectable } from 'inversify'; +@injectable() export abstract class PracticeBase implements IPractice { data: Partial & PracticeData; diff --git a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts index e21ff52db..242686c96 100644 --- a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts +++ b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts @@ -1,7 +1,8 @@ -import { IPractice } from '../IPractice'; import { PracticeEvaluationResult, PracticeImpact, ProgrammingLanguage } from '../../model'; import { DxPractice } from '../DxPracticeDecorator'; import { PracticeContext } from '../../contexts/practice/PracticeContext'; +import { PracticeBase } from '../PracticeBase'; +import { ReportDetailType } from '../../reporters/ReporterData'; @DxPractice({ id: 'TypeScript.GitignoreCorrectlySet', @@ -12,7 +13,7 @@ import { PracticeContext } from '../../contexts/practice/PracticeContext'; url: 'https://github.com/github/gitignore/blob/master/Node.gitignore', dependsOn: { practicing: ['LanguageIndependent.GitignoreIsPresent'] }, }) -export class TsGitignoreCorrectlySetPractice implements IPractice { +export class TsGitignoreCorrectlySetPractice extends PracticeBase { async isApplicable(ctx: PracticeContext): Promise { return ctx.projectComponent.language === ProgrammingLanguage.TypeScript; } @@ -54,6 +55,17 @@ export class TsGitignoreCorrectlySetPractice implements IPractice { return PracticeEvaluationResult.practicing; } + this.setData(); return PracticeEvaluationResult.notPracticing; } + + private setData() { + this.data.details = [ + { + type: ReportDetailType.text, + text: + 'You should ignore one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', + }, + ]; + } } diff --git a/src/practices/index.ts b/src/practices/index.ts index 942a979ef..58644be43 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -17,11 +17,11 @@ import { EditorConfigIsPresentPractice } from './LanguageIndependent/EditorConfi import { GitignoreIsPresentPractice } from './LanguageIndependent/GitignoreIsPresentPractice'; import { JsGitignoreCorrectlySetPractice } from './JavaScript/JsGitignoreCorrectlySetPractice'; import { JavaGitignoreCorrectlySetPractice } from './Java/JavaGitignoreCorrectlySetPractice'; -import { DependenciesVersionMajorLevel } from './JavaScript/DependenciesVersionMajorLevel'; +import { DependenciesVersionMajorLevelPractice } from './JavaScript/DependenciesVersionMajorLevel'; import { ESLintWithoutErrorsPractice } from './JavaScript/ESLintWithoutErrorsPractice'; import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrectlySetPractice'; import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; -import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; +import { DependenciesVersionMinorPatchLevelPractice } from './JavaScript/DependenciesVersionMinorPatchLevel'; import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessagesPractice'; // register practices here @@ -43,8 +43,8 @@ export const practices = [ DeprecatedTSLintPractice, DockerizationUsedPractice, EditorConfigIsPresentPractice, - DependenciesVersionMajorLevel, - DependenciesVersionMinorPatchLevel, + DependenciesVersionMajorLevelPractice, + DependenciesVersionMinorPatchLevelPractice, GitignoreIsPresentPractice, JsGitignoreCorrectlySetPractice, JavaGitignoreCorrectlySetPractice, diff --git a/src/reporters/CLIReporter.ts b/src/reporters/CLIReporter.ts index 6afba0944..236e19a96 100644 --- a/src/reporters/CLIReporter.ts +++ b/src/reporters/CLIReporter.ts @@ -2,10 +2,11 @@ import { blue, bold, Color, green, grey, italic, red, reset, underline, yellow, import { injectable } from 'inversify'; import { PracticeImpact, PracticeMetadata, PracticeEvaluationResult } from '../model'; import { IReporter, PracticeWithContextForReporter } from './IReporter'; -import { sharedSubpath } from '../detectors/utils'; import { ReporterUtils } from './ReporterUtils'; import { PracticeDetail } from '../practices/IPractice'; import { GitServiceUtils } from '../services/git/GitServiceUtils'; +import { ReportDetailType, ReporterData } from './ReporterData'; +import { assertNever } from '../lib/assertNever'; @injectable() export class CLIReporter implements IReporter { @@ -106,11 +107,12 @@ export class CLIReporter implements IReporter { lines.push(this.linesForPractice(practiceWithContext.practice, color)); if (practiceWithContext.practice.data?.details) { - lines.push(practiceWithContext.practice.data.details.map((d) => this.renderDetail(d, (color = grey))).join(' ')); + const linesWithDetail = practiceWithContext.practice.data.details.map((d) => this.renderDetail(d)).join(' '); + lines.push(reset(grey(linesWithDetail))); } if (practiceWithContext.practice.impact !== practiceWithContext.overridenImpact) { - lines.push(bold(this.lineForChangedImpact(practiceWithContext, (color = grey)))); + lines.push(reset(bold(this.lineForChangedImpact(practiceWithContext, grey)))); } } @@ -136,7 +138,16 @@ export class CLIReporter implements IReporter { ); } - private renderDetail(detail: PracticeDetail, color: Color) { - return reset(color(`${detail}`)); + private renderDetail(detail: PracticeDetail) { + switch (detail.type) { + case ReportDetailType.table: + return ReporterData.table(detail.headers, detail.data); + + case ReportDetailType.text: + return detail.text; + + default: + return assertNever(detail); + } } } diff --git a/src/reporters/ReporterData.ts b/src/reporters/ReporterData.ts index 39cceea01..e7c862d2c 100644 --- a/src/reporters/ReporterData.ts +++ b/src/reporters/ReporterData.ts @@ -2,16 +2,26 @@ import { table as tableLib, getBorderCharacters, TableUserConfig } from 'table'; export class ReporterData { // eslint-disable-next-line @typescript-eslint/no-explicit-any - static table = (data: any[], userConfig?: TableUserConfig | undefined): string => { - return tableLib(data, { ...{ border: getBorderCharacters('norc') }, ...userConfig }); + static table = (headers: string[], data: Record[], userConfig?: TableUserConfig | undefined): string => { + const tableData = data.map(Object.values); + + tableData.unshift(headers); + return tableLib(tableData, { ...{ border: getBorderCharacters('norc'), singleLine: true }, ...userConfig }); }; } export type ReportTable = { + type: ReportDetailType.table; headers: string[]; data: Record[]; }; export type ReportText = { + type: ReportDetailType.text; text: string; }; + +export enum ReportDetailType { + table = 'table', + text = 'text', +} From 48b3429f511e5afa693cefcc09b7ea8cc7df66cb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 13:48:46 +0100 Subject: [PATCH 133/196] fix: reflect used service --- src/inversify.config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 7328e7cf1..c4f0bbff0 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -70,7 +70,9 @@ export const createTestContainer = ( // FileSystemService as default ProjectBrowser container.bind(Types.IProjectFilesBrowser).toConstantValue(vfss); - container.bind(Types.IContentRepositoryBrowser).to(GitHubService); + projectComponent?.repositoryPath?.includes('github') + ? container.bind(Types.IContentRepositoryBrowser).to(GitHubService) + : container.bind(Types.IContentRepositoryBrowser).to(BitbucketService); container.bind(Types.IFileInspector).to(FileInspector); container.bind(Types.IPackageInspector).to(JavaScriptPackageInspector); container.bind(Types.ICollaborationInspector).to(CollaborationInspector); From 69e0b3e40521fdf2d54d1b3f87a1dd5eea61ff08 Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Sun, 8 Dec 2019 13:50:25 +0100 Subject: [PATCH 134/196] chore: add more tests --- src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts | 1 + .../JavaScript/DependenciesVersionMinorPatchLevel.spec.ts | 1 + .../JavaScript/JsGitignoreCorrectlySetPractice.spec.ts | 1 + .../JsPackageJsonConfigurationSetCorrectlyPractice.spec.ts | 1 + .../TypeScript/TsGitignoreCorrectlySetPractice.spec.ts | 1 + src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts | 2 +- 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts index a06348ff0..523a2a088 100644 --- a/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMajorLevel.spec.ts @@ -34,6 +34,7 @@ describe('DependenciesVersionPractice of Major Level', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + expect(practice.data.details).not.toBeUndefined(); }); it('practicing if newest package version dependency of major level', async () => { diff --git a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts index c71c6b30a..78c4310e0 100644 --- a/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts +++ b/src/practices/JavaScript/DependenciesVersionMinorPatchLevel.spec.ts @@ -34,6 +34,7 @@ describe('DependenciesVersionPractice of Minor and Patch Level', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + expect(practice.data.details).not.toBeUndefined(); }); it('practicing if newest package version dependency of minor or patch level', async () => { diff --git a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.spec.ts b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.spec.ts index 45ddb15f9..cb86af25f 100644 --- a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.spec.ts +++ b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.spec.ts @@ -34,6 +34,7 @@ describe('JsGitignoreCorrectlySetPractice', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + expect(practice.data.details).not.toBeUndefined(); }); it('Returns unknown if there is no fileInspector', async () => { diff --git a/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.spec.ts b/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.spec.ts index 67de25a38..0f1c1a473 100644 --- a/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.spec.ts +++ b/src/practices/JavaScript/JsPackageJsonConfigurationSetCorrectlyPractice.spec.ts @@ -32,6 +32,7 @@ describe('JsPackageJsonConfigurationSetCorrectlyPractice', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + expect(practice.data.details).not.toBeUndefined(); }); it('Returns unknown if there are no file inspector', async () => { diff --git a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.spec.ts b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.spec.ts index f4dccca44..b7baf6c82 100644 --- a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.spec.ts +++ b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.spec.ts @@ -34,6 +34,7 @@ describe('TsGitignoreCorrectlySetPractice', () => { const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + expect(practice.data.details).not.toBeUndefined(); }); it('Returns unknown if there is no fileInspector', async () => { diff --git a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts index 242686c96..a2fad8996 100644 --- a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts +++ b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts @@ -64,7 +64,7 @@ export class TsGitignoreCorrectlySetPractice extends PracticeBase { { type: ReportDetailType.text, text: - 'You should ignore one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', + 'You should ignore one of build folder (build, dist or lib), one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', }, ]; } From 633caead58ef7e7d0abd7f4010db450332c30760 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 13:57:16 +0100 Subject: [PATCH 135/196] fix: add possibility return no pullrequests by not passing state --- src/test/helpers/bitbucketNock.ts | 33 ++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index fcbeb5d13..29f08e90e 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -7,6 +7,7 @@ import { Paginated } from '../../inspectors'; import { PullRequest } from '../../services/git/model'; import { getPullRequestResponse } from '../../services/git/__MOCKS__/bitbucketServiceMockFolder'; import _ from 'lodash'; +import moment from 'moment'; export class BitbucketNock { user: string; @@ -112,40 +113,54 @@ export class BitbucketNock { return interceptor; } - mockBitbucketPullRequestsResponse(states: BitbucketPullRequestState | BitbucketPullRequestState[]): Paginated { + mockBitbucketPullRequestsResponse(args: { + states?: BitbucketPullRequestState | BitbucketPullRequestState[]; + updatedAt?: number; + }): Paginated { const pullRequests: PullRequest[] = []; + if (!args.states) { + return { + items: [], + totalCount: 0, + hasNextPage: false, + hasPreviousPage: false, + page: 1, + perPage: 0, + }; + } const paginatedPullrequests: Paginated = { items: [getPullRequestResponse], hasNextPage: true, hasPreviousPage: false, page: 1, - perPage: typeof states === 'string' ? 1 : states.length, - totalCount: typeof states === 'string' ? 1 : states.length, + perPage: typeof args.states === 'string' ? 1 : args.states.length, + totalCount: typeof args.states === 'string' ? 1 : args.states.length, }; - if (typeof states !== 'string') { - states.forEach((state) => { + if (typeof args.states !== 'string') { + args.states.forEach((state) => { const pullrequest = _.cloneDeep(getPullRequestResponse); pullrequest.state = state; + pullrequest.updatedAt = moment(args.updatedAt).format(); pullrequest.closedAt = pullrequest.state === BitbucketPullRequestState.closed || pullrequest.state === BitbucketPullRequestState.declined ? pullrequest.updatedAt : null; pullrequest.mergedAt = pullrequest.state === BitbucketPullRequestState.closed ? pullrequest.updatedAt : null; - pullRequests.push(pullrequest); }); paginatedPullrequests.items = pullRequests; } else { - getPullRequestResponse.state = states; + getPullRequestResponse.state = args.states; + getPullRequestResponse.updatedAt = moment(args.updatedAt).format(); getPullRequestResponse.closedAt = - states === BitbucketPullRequestState.closed || states === BitbucketPullRequestState.declined + args.states === BitbucketPullRequestState.closed || args.states === BitbucketPullRequestState.declined ? getPullRequestResponse.updatedAt : null; - getPullRequestResponse.mergedAt = states === BitbucketPullRequestState.closed ? getPullRequestResponse.updatedAt : null; + getPullRequestResponse.mergedAt = args.states === BitbucketPullRequestState.closed ? getPullRequestResponse.updatedAt : null; paginatedPullrequests.items = [getPullRequestResponse]; } From 37bc6f2a522b6815c1926491705ae30b81674d55 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 14:05:08 +0100 Subject: [PATCH 136/196] fix: as the bitbucket fails if the account is a team account add possibility to ownerId be a null --- src/services/bitbucket/BitbucketService.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index fb0d9bbbe..141ca7880 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -95,7 +95,14 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; + let ownerId: string | null; + try { + ownerId = `${(await this.client.users.get({ username: 'atlassian' })).data.uuid}`; + } catch (error) { + if (error.message.includes('is a team account')) { + ownerId = null; + } + } const response: DeepRequired> = await axios.get(apiUrl); @@ -122,7 +129,7 @@ export class BitbucketService implements IVCSService { id: val.destination.repository.uuid, owner: { login: owner, - id: ownerId, + id: ownerId, url: ownerUrl, }, }, From ec2f240e11dbefb13b6fa92da0fd694442949212 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:05:02 +0100 Subject: [PATCH 137/196] fix: change updatedAt only if it's provided --- src/test/helpers/bitbucketNock.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index 29f08e90e..bd25f90ce 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -143,7 +143,9 @@ export class BitbucketNock { const pullrequest = _.cloneDeep(getPullRequestResponse); pullrequest.state = state; - pullrequest.updatedAt = moment(args.updatedAt).format(); + if (args.updatedAt) { + pullrequest.updatedAt = moment(args.updatedAt).format('YYYY-MM-DDTHH:mm:ss.SSSSSSZ'); + } pullrequest.closedAt = pullrequest.state === BitbucketPullRequestState.closed || pullrequest.state === BitbucketPullRequestState.declined ? pullrequest.updatedAt @@ -155,7 +157,9 @@ export class BitbucketNock { paginatedPullrequests.items = pullRequests; } else { getPullRequestResponse.state = args.states; - getPullRequestResponse.updatedAt = moment(args.updatedAt).format(); + if (args.updatedAt) { + getPullRequestResponse.updatedAt = moment(args.updatedAt).format('YYYY-MM-DDTHH:mm:ss.SSSSSSZ'); + } getPullRequestResponse.closedAt = args.states === BitbucketPullRequestState.closed || args.states === BitbucketPullRequestState.declined ? getPullRequestResponse.updatedAt From 4118637a3f8f6f29daf1a3eb8f516dfbe63f13b8 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:07:09 +0100 Subject: [PATCH 138/196] fix: remove unnecessary code --- .../LanguageIndependent/TimeToSolvePractice.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.ts b/src/practices/LanguageIndependent/TimeToSolvePractice.ts index 77e2c284e..9d32af5cd 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePractice.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePractice.ts @@ -4,7 +4,6 @@ import { PracticeEvaluationResult, PracticeImpact } from '../../model'; import { GitServiceUtils } from '../../services/git/GitServiceUtils'; import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; -import { PullRequestState } from '../../inspectors/ICollaborationInspector'; @DxPractice({ id: 'LanguageIndependent.TimeToSolve', @@ -28,9 +27,8 @@ export class TimeToSolvePractice implements IPractice { const repoName = GitServiceUtils.getRepoName(ctx.projectComponent.repositoryPath, ctx.projectComponent.path); const ownerAndRepoName = GitServiceUtils.getOwnerAndRepoName(repoName); - const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName, { - filter: { state: PullRequestState.open }, - }); + //Both GitHub API and Bitbucket API returns open pullrequests defaultly + const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); if (pullRequests.items.length === 0) { return PracticeEvaluationResult.practicing; @@ -38,13 +36,11 @@ export class TimeToSolvePractice implements IPractice { const latestPRsUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); - const descendingSortedPrDates = latestPRsUpdate.sort((prA, prB) => prB - prA); - const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); const now = Date.now(); const openPullrequestsTooLong = []; - descendingSortedPrDates.forEach((prDate) => { + latestPRsUpdate.forEach((prDate) => { if (now - prDate > daysInMilliseconds) { openPullrequestsTooLong.push(prDate); } From bd86a781c5d5c00bd9cc2e58be05829a37d78c07 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:07:58 +0100 Subject: [PATCH 139/196] fix: getting ownerId if it's team account --- src/services/bitbucket/BitbucketService.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 141ca7880..c17657597 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -95,12 +95,12 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - let ownerId: string | null; + let ownerId: string; try { - ownerId = `${(await this.client.users.get({ username: 'atlassian' })).data.uuid}`; + ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; } catch (error) { if (error.message.includes('is a team account')) { - ownerId = null; + ownerId = `${(await this.client.teams.get({ username: owner })).data.uuid}`; } } @@ -129,7 +129,7 @@ export class BitbucketService implements IVCSService { id: val.destination.repository.uuid, owner: { login: owner, - id: ownerId, + id: ownerId, url: ownerUrl, }, }, @@ -152,8 +152,14 @@ export class BitbucketService implements IVCSService { }; const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; - + let ownerId = ''; + try { + ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; + } catch (error) { + if (error.message.includes('is a team account')) { + ownerId = `${(await this.client.teams.get({ username: owner })).data.uuid}`; + } + } const response = >>await this.client.pullrequests.get(params); response.data; From c9f7d9119951511a2714c62d1beeb7f414c2e67f Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:08:20 +0100 Subject: [PATCH 140/196] fix: tests as it is possible to get team account id --- .../TimeToSolvePractice.spec.ts | 74 ++++++++++++++++--- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts index 343f639ca..b78076384 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts @@ -1,22 +1,29 @@ +import moment from 'moment'; import nock from 'nock'; -import { PullRequestState } from '../../inspectors/ICollaborationInspector'; +import { CollaborationInspector } from '../../inspectors'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; -import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { BitbucketPullRequestState } from '../../services'; +import { BitbucketNock } from '../../test/helpers/bitbucketNock'; import { TimeToSolvePractice } from './TimeToSolvePractice'; describe('TimeToSolvePractice', () => { let practice: TimeToSolvePractice; let containerCtx: TestContainerContext; + let bitbucketNock: BitbucketNock; + const MockedCollaborationInspector = >(CollaborationInspector); + let mockCollaborationInspector: CollaborationInspector; beforeEach(async () => { nock.cleanAll(); + bitbucketNock = new BitbucketNock('pypy', 'pypy'); }); beforeAll(() => { containerCtx = createTestContainer(); containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePractice); practice = containerCtx.container.get('TimeToSolvePractice'); + mockCollaborationInspector = new MockedCollaborationInspector(); }); afterEach(async () => { @@ -24,14 +31,63 @@ describe('TimeToSolvePractice', () => { containerCtx.practiceContext.fileInspector!.purgeCache(); }); - it('', async () => { - containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [{ number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }], - PullRequestState.open, - ); + it('returns practicing if there are open pullrequests updated or created less than 30 days from now', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://bitbucket.org/pypy/pypy'; + nock(bitbucketNock.url) + .get('/users/pypy') + .reply(200); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); + const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(10, 'days').asMilliseconds() }; + mockCollaborationInspector.getPullRequests = async () => { + return bitbucketNock.mockBitbucketPullRequestsResponse(args); + }; + + const evaluated = await practice.evaluate({ + ...containerCtx.practiceContext, + collaborationInspector: mockCollaborationInspector, + }); - const evaluated = await practice.evaluate(containerCtx.practiceContext); expect(evaluated).toEqual(PracticeEvaluationResult.practicing); }); + + it('returns practicing if there are open pullrequests updated or created more than 30 days from now', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'https://bitbucket.org/pypy/pypy'; + nock(bitbucketNock.url) + .get('/users/pypy') + .reply(200); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); + const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(100, 'days').asMilliseconds() }; + mockCollaborationInspector.getPullRequests = async () => { + return bitbucketNock.mockBitbucketPullRequestsResponse(args); + }; + + const evaluated = await practice.evaluate({ + ...containerCtx.practiceContext, + collaborationInspector: mockCollaborationInspector, + }); + + expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); + }); + + it('returns practicing if there are no open pullrequest', async () => { + mockCollaborationInspector.getPullRequests = async () => { + return bitbucketNock.mockBitbucketPullRequestsResponse({}); + }; + + const evaluated = await practice.evaluate({ + ...containerCtx.practiceContext, + collaborationInspector: mockCollaborationInspector, + }); + expect(evaluated).toEqual(PracticeEvaluationResult.practicing); + }); + + it('returns always true, as it is always applicable', async () => { + const response = await practice.isApplicable(); + expect(response).toBe(true); + }); + + it('returns unknown if there is no collaborationInspector', async () => { + const evaluated = await practice.evaluate({ ...containerCtx.practiceContext, collaborationInspector: undefined }); + expect(evaluated).toEqual(PracticeEvaluationResult.unknown); + }); }); From e9f994395d89cc71b484e24bb70866f9e5f39cee Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:08:37 +0100 Subject: [PATCH 141/196] fix: tests --- .../bitbucket/BitbucketService.spec.ts | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index fa0aaa74f..e109919e3 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -27,11 +27,15 @@ describe('Bitbucket Service', () => { it('returns open pull requests in own interface', async () => { nock(bitbucketNock.url) .get('/users/pypy') - .reply(200); + .replyWithError('is a team account'); + + nock(bitbucketNock.url) + .get('/teams/pypy') + .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); bitbucketNock.getApiResponse('pullrequests'); const response = await service.getPullRequests('pypy', 'pypy'); - const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(BitbucketPullRequestState.open); + const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); expect(response).toMatchObject(getOpenPullRequestsResponse); }); @@ -39,11 +43,15 @@ describe('Bitbucket Service', () => { const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); nock(bitbucketNock.url) .get('/users/pypy') - .reply(200); + .replyWithError('is a team account'); + + nock(bitbucketNock.url) + .get('/teams/pypy') + .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); - const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(state); + const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: state }); expect(response).toMatchObject(allPullrequestsResponse); }); @@ -51,7 +59,11 @@ describe('Bitbucket Service', () => { it('returns specific pull request in own interface', async () => { nock(bitbucketNock.url) .get('/users/pypy') - .reply(200); + .replyWithError('is a team account'); + + nock(bitbucketNock.url) + .get('/teams/pypy') + .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); bitbucketNock.getApiResponse('pullrequests', 1); const response = await service.getPullRequest('pypy', 'pypy', 1); @@ -93,13 +105,21 @@ describe('Bitbucket Service', () => { }, }; + nock(bitbucketNock.url) + .get('/users/pypy') + .replyWithError('is a team account'); + + nock(bitbucketNock.url) + .get('/teams/pypy') + .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); + nock(bitbucketNock.url) .get('/users/pypy') .reply(200); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); const response = await service.getPullRequests('pypy', 'pypy', state); - const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse(BitbucketPullRequestState.closed); + const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.closed }); expect(response).toMatchObject(getMergedPullRequestsResponse); }); From c56e67fe2dc0e42166f2fdba460f057d9fad0087 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:08:54 +0100 Subject: [PATCH 142/196] fix: value of owner id --- .../bitbucketServiceMockFolder/getPullRequestResponse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts index 4d6eb03a5..e93f859fe 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullRequestResponse.ts @@ -21,7 +21,7 @@ export const getPullRequestResponse: PullRequest = { id: '{54220cd1-b139-4188-9455-1e13e663f1ac}', owner: { login: 'pypy', - id: 'undefined', + id: '{f122f6a4-9111-4431-9f88-884d8cedd194}', url: 'www.bitbucket.org/pypy', }, }, From ba705b4e541a26b8a33b8302d0d54d27ecb0dac4 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:35:46 +0100 Subject: [PATCH 143/196] fix: use arguments provider uri to detect if bind GithubService or BitbucketService --- src/inspectors/CollaborationInspector.spec.ts | 4 +++- src/inspectors/IssueTrackingInspector.spec.ts | 3 ++- src/inversify.config.ts | 2 +- src/practices/LanguageIndependent/DoesPullRequests.spec.ts | 3 ++- .../LanguageIndependent/TimeToSolvePractice.spec.ts | 5 ++--- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index 15cae6f93..5d8a370f9 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -17,7 +17,8 @@ describe('Collaboration Inspector', () => { let containerCtx: TestContainerContext; beforeAll(async () => { - containerCtx = createTestContainer(); + const args = { uri: 'https://github.com/octocat/Hello-World' }; + containerCtx = createTestContainer(args); inspector = containerCtx.practiceContext.collaborationInspector; }); @@ -26,6 +27,7 @@ describe('Collaboration Inspector', () => { }); it('returns paginated pull requests', async () => { + containerCtx.practiceContext.projectComponent.repositoryPath = 'www.github.com'; new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, ]); diff --git a/src/inspectors/IssueTrackingInspector.spec.ts b/src/inspectors/IssueTrackingInspector.spec.ts index 26ea260ef..937a052f8 100644 --- a/src/inspectors/IssueTrackingInspector.spec.ts +++ b/src/inspectors/IssueTrackingInspector.spec.ts @@ -16,7 +16,8 @@ describe('Issue Tracking Inspector', () => { let containerCtx: TestContainerContext; beforeAll(async () => { - containerCtx = createTestContainer(); + const args = { uri: 'https://github.com/octocat/Hello-World' }; + containerCtx = createTestContainer(args); inspector = containerCtx.practiceContext.issueTrackingInspector; }); diff --git a/src/inversify.config.ts b/src/inversify.config.ts index c4f0bbff0..604d922ec 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -70,7 +70,7 @@ export const createTestContainer = ( // FileSystemService as default ProjectBrowser container.bind(Types.IProjectFilesBrowser).toConstantValue(vfss); - projectComponent?.repositoryPath?.includes('github') + args?.uri.includes('github') ? container.bind(Types.IContentRepositoryBrowser).to(GitHubService) : container.bind(Types.IContentRepositoryBrowser).to(BitbucketService); container.bind(Types.IFileInspector).to(FileInspector); diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index dae0598b9..60820061c 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -15,7 +15,8 @@ describe('DoesPullRequests', () => { }); beforeAll(() => { - containerCtx = createTestContainer(); + const args = { uri: 'https://github.com/octocat/Hello-World' }; + containerCtx = createTestContainer(args); containerCtx.container.bind('DoesPullRequests').to(DoesPullRequestsPractice); practice = containerCtx.container.get('DoesPullRequests'); }); diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts index b78076384..4fb76bcd3 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts @@ -20,7 +20,8 @@ describe('TimeToSolvePractice', () => { }); beforeAll(() => { - containerCtx = createTestContainer(); + const args = { uri: 'https://bitbucket.org/pypy/pypy' }; + containerCtx = createTestContainer(args); containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePractice); practice = containerCtx.container.get('TimeToSolvePractice'); mockCollaborationInspector = new MockedCollaborationInspector(); @@ -32,7 +33,6 @@ describe('TimeToSolvePractice', () => { }); it('returns practicing if there are open pullrequests updated or created less than 30 days from now', async () => { - containerCtx.practiceContext.projectComponent.repositoryPath = 'https://bitbucket.org/pypy/pypy'; nock(bitbucketNock.url) .get('/users/pypy') .reply(200); @@ -51,7 +51,6 @@ describe('TimeToSolvePractice', () => { }); it('returns practicing if there are open pullrequests updated or created more than 30 days from now', async () => { - containerCtx.practiceContext.projectComponent.repositoryPath = 'https://bitbucket.org/pypy/pypy'; nock(bitbucketNock.url) .get('/users/pypy') .reply(200); From 9e18b766f5104e10ac8ba908b8a743cf345e2fb4 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:43:16 +0100 Subject: [PATCH 144/196] fix: rename practice and files. Add name and suggestion text. --- ...ce.spec.ts => TimeToSolvePullRequestsPractice.spec.ts} | 8 ++++---- ...olvePractice.ts => TimeToSolvePullRequestsPractice.ts} | 8 ++++---- src/practices/index.ts | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/practices/LanguageIndependent/{TimeToSolvePractice.spec.ts => TimeToSolvePullRequestsPractice.spec.ts} (94%) rename src/practices/LanguageIndependent/{TimeToSolvePractice.ts => TimeToSolvePullRequestsPractice.ts} (87%) diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts similarity index 94% rename from src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts rename to src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts index 4fb76bcd3..fb56e6cef 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts @@ -5,10 +5,10 @@ import { createTestContainer, TestContainerContext } from '../../inversify.confi import { PracticeEvaluationResult } from '../../model'; import { BitbucketPullRequestState } from '../../services'; import { BitbucketNock } from '../../test/helpers/bitbucketNock'; -import { TimeToSolvePractice } from './TimeToSolvePractice'; +import { TimeToSolvePullRequestsPractice } from './TimeToSolvePullRequestsPractice'; -describe('TimeToSolvePractice', () => { - let practice: TimeToSolvePractice; +describe('TimeToSolvePullRequestsPractice', () => { + let practice: TimeToSolvePullRequestsPractice; let containerCtx: TestContainerContext; let bitbucketNock: BitbucketNock; const MockedCollaborationInspector = >(CollaborationInspector); @@ -22,7 +22,7 @@ describe('TimeToSolvePractice', () => { beforeAll(() => { const args = { uri: 'https://bitbucket.org/pypy/pypy' }; containerCtx = createTestContainer(args); - containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePractice); + containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePullRequestsPractice); practice = containerCtx.container.get('TimeToSolvePractice'); mockCollaborationInspector = new MockedCollaborationInspector(); }); diff --git a/src/practices/LanguageIndependent/TimeToSolvePractice.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts similarity index 87% rename from src/practices/LanguageIndependent/TimeToSolvePractice.ts rename to src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts index 9d32af5cd..eb7bb6188 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePractice.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts @@ -6,15 +6,15 @@ import { DxPractice } from '../DxPracticeDecorator'; import { IPractice } from '../IPractice'; @DxPractice({ - id: 'LanguageIndependent.TimeToSolve', - name: '', + id: 'LanguageIndependent.TimeToSolvePullRequests', + name: 'Solve Pull Requests Continuously', impact: PracticeImpact.medium, - suggestion: '', + suggestion: 'Do not have an open Pull Request more than 30 days. Review PRs continuously.', reportOnlyOnce: true, url: 'https://dxkb.io/p/pull-requests', dependsOn: { practicing: ['LanguageIndependent.DoesPullRequests'] }, }) -export class TimeToSolvePractice implements IPractice { +export class TimeToSolvePullRequestsPractice implements IPractice { async isApplicable(): Promise { return true; } diff --git a/src/practices/index.ts b/src/practices/index.ts index c02fe5fbf..23177aa15 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -23,7 +23,7 @@ import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrect import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessagesPractice'; -import { TimeToSolvePractice } from './LanguageIndependent/TimeToSolvePractice'; +import { TimeToSolvePullRequestsPractice } from './LanguageIndependent/TimeToSolvePractice'; // register practices here export const practices = [ @@ -52,5 +52,5 @@ export const practices = [ TsGitignoreCorrectlySetPractice, DoesPullRequestsPractice, CorrectCommitMessagesPractice, - TimeToSolvePractice, + TimeToSolvePullRequestsPractice, ]; From 9c8bba49b58b184fc048848926958d2b03ae6ed2 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:45:57 +0100 Subject: [PATCH 145/196] fix: add a comment about logic to try catch --- src/services/bitbucket/BitbucketService.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index c17657597..7d362518b 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -95,6 +95,8 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; + + //Bitbucket use two types of accounts - user and team. The request for users uuid fails if it is a team account. let ownerId: string; try { ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; From 26ea99fc4ccca9b0db6042a30117295362fdc685 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:47:18 +0100 Subject: [PATCH 146/196] fix: add a comment --- src/services/bitbucket/BitbucketService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 7d362518b..03781f57e 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -96,7 +96,7 @@ export class BitbucketService implements IVCSService { const ownerUrl = `www.bitbucket.org/${owner}`; - //Bitbucket use two types of accounts - user and team. The request for users uuid fails if it is a team account. + //Bitbucket uses two types of accounts - user and team. The request for users' uuid fails if it is a team account. let ownerId: string; try { ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; @@ -154,6 +154,7 @@ export class BitbucketService implements IVCSService { }; const ownerUrl = `www.bitbucket.org/${owner}`; + //Bitbucket use two types of accounts - user and team. The request for users uuid fails if it is a team account. let ownerId = ''; try { ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; From af50b8db18612800a28a91260440ee207ce66b2f Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Sun, 8 Dec 2019 16:53:27 +0100 Subject: [PATCH 147/196] fix: path --- src/practices/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/index.ts b/src/practices/index.ts index 23177aa15..f444ffe21 100644 --- a/src/practices/index.ts +++ b/src/practices/index.ts @@ -23,7 +23,7 @@ import { TsGitignoreCorrectlySetPractice } from './TypeScript/TsGitignoreCorrect import { DoesPullRequestsPractice } from './LanguageIndependent/DoesPullRequests'; import { DependenciesVersionMinorPatchLevel } from './JavaScript/DependenciesVersionMinorPatchLevel'; import { CorrectCommitMessagesPractice } from './LanguageIndependent/CorrectCommitMessagesPractice'; -import { TimeToSolvePullRequestsPractice } from './LanguageIndependent/TimeToSolvePractice'; +import { TimeToSolvePullRequestsPractice } from './LanguageIndependent/TimeToSolvePullRequestsPractice'; // register practices here export const practices = [ From 1141cad8c7b1e71cef5202b95723a50346180b66 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 9 Dec 2019 14:35:20 +0100 Subject: [PATCH 148/196] fix: rebind IContentRepositoryBrowser in practice instead of binding in inversify.config.ts --- src/inspectors/CollaborationInspector.spec.ts | 3 +-- src/inspectors/IssueTrackingInspector.spec.ts | 3 +-- src/inversify.config.ts | 4 +--- src/practices/LanguageIndependent/DoesPullRequests.spec.ts | 3 +-- .../TimeToSolvePullRequestsPractice.spec.ts | 7 ++++--- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index 5d8a370f9..9293126db 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -17,8 +17,7 @@ describe('Collaboration Inspector', () => { let containerCtx: TestContainerContext; beforeAll(async () => { - const args = { uri: 'https://github.com/octocat/Hello-World' }; - containerCtx = createTestContainer(args); + containerCtx = createTestContainer(); inspector = containerCtx.practiceContext.collaborationInspector; }); diff --git a/src/inspectors/IssueTrackingInspector.spec.ts b/src/inspectors/IssueTrackingInspector.spec.ts index 937a052f8..26ea260ef 100644 --- a/src/inspectors/IssueTrackingInspector.spec.ts +++ b/src/inspectors/IssueTrackingInspector.spec.ts @@ -16,8 +16,7 @@ describe('Issue Tracking Inspector', () => { let containerCtx: TestContainerContext; beforeAll(async () => { - const args = { uri: 'https://github.com/octocat/Hello-World' }; - containerCtx = createTestContainer(args); + containerCtx = createTestContainer(); inspector = containerCtx.practiceContext.issueTrackingInspector; }); diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 604d922ec..7328e7cf1 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -70,9 +70,7 @@ export const createTestContainer = ( // FileSystemService as default ProjectBrowser container.bind(Types.IProjectFilesBrowser).toConstantValue(vfss); - args?.uri.includes('github') - ? container.bind(Types.IContentRepositoryBrowser).to(GitHubService) - : container.bind(Types.IContentRepositoryBrowser).to(BitbucketService); + container.bind(Types.IContentRepositoryBrowser).to(GitHubService); container.bind(Types.IFileInspector).to(FileInspector); container.bind(Types.IPackageInspector).to(JavaScriptPackageInspector); container.bind(Types.ICollaborationInspector).to(CollaborationInspector); diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index 60820061c..dae0598b9 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -15,8 +15,7 @@ describe('DoesPullRequests', () => { }); beforeAll(() => { - const args = { uri: 'https://github.com/octocat/Hello-World' }; - containerCtx = createTestContainer(args); + containerCtx = createTestContainer(); containerCtx.container.bind('DoesPullRequests').to(DoesPullRequestsPractice); practice = containerCtx.container.get('DoesPullRequests'); }); diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts index fb56e6cef..6d9ef739e 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts @@ -3,9 +3,10 @@ import nock from 'nock'; import { CollaborationInspector } from '../../inspectors'; import { createTestContainer, TestContainerContext } from '../../inversify.config'; import { PracticeEvaluationResult } from '../../model'; -import { BitbucketPullRequestState } from '../../services'; +import { BitbucketPullRequestState, BitbucketService } from '../../services'; import { BitbucketNock } from '../../test/helpers/bitbucketNock'; import { TimeToSolvePullRequestsPractice } from './TimeToSolvePullRequestsPractice'; +import { Types } from '../../types'; describe('TimeToSolvePullRequestsPractice', () => { let practice: TimeToSolvePullRequestsPractice; @@ -20,9 +21,9 @@ describe('TimeToSolvePullRequestsPractice', () => { }); beforeAll(() => { - const args = { uri: 'https://bitbucket.org/pypy/pypy' }; - containerCtx = createTestContainer(args); + containerCtx = createTestContainer(); containerCtx.container.bind('TimeToSolvePractice').to(TimeToSolvePullRequestsPractice); + containerCtx.container.rebind(Types.IContentRepositoryBrowser).to(BitbucketService); practice = containerCtx.container.get('TimeToSolvePractice'); mockCollaborationInspector = new MockedCollaborationInspector(); }); From 269f3848e8354256084cd499f4b1a094fbb019f6 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 9 Dec 2019 14:43:26 +0100 Subject: [PATCH 149/196] fix: remove unnecessary line of code --- src/inspectors/CollaborationInspector.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index 9293126db..15cae6f93 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -26,7 +26,6 @@ describe('Collaboration Inspector', () => { }); it('returns paginated pull requests', async () => { - containerCtx.practiceContext.projectComponent.repositoryPath = 'www.github.com'; new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, ]); From 2b83d63e071115e4ccf6bb662c18ad6f2790f6fd Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 9 Dec 2019 15:05:23 +0100 Subject: [PATCH 150/196] fix: get the ownerId via repo info with one request --- src/services/bitbucket/BitbucketService.ts | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 03781f57e..07dfbd348 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -96,15 +96,7 @@ export class BitbucketService implements IVCSService { const ownerUrl = `www.bitbucket.org/${owner}`; - //Bitbucket uses two types of accounts - user and team. The request for users' uuid fails if it is a team account. - let ownerId: string; - try { - ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; - } catch (error) { - if (error.message.includes('is a team account')) { - ownerId = `${(await this.client.teams.get({ username: owner })).data.uuid}`; - } - } + const ownerId = (await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid; const response: DeepRequired> = await axios.get(apiUrl); @@ -154,15 +146,8 @@ export class BitbucketService implements IVCSService { }; const ownerUrl = `www.bitbucket.org/${owner}`; - //Bitbucket use two types of accounts - user and team. The request for users uuid fails if it is a team account. - let ownerId = ''; - try { - ownerId = `${(await this.client.users.get({ username: owner })).data.uuid}`; - } catch (error) { - if (error.message.includes('is a team account')) { - ownerId = `${(await this.client.teams.get({ username: owner })).data.uuid}`; - } - } + const ownerId = (await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid; + const response = >>await this.client.pullrequests.get(params); response.data; From 81daee8f15ca7260e57eb219cbfc16925c0387dc Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 9 Dec 2019 15:05:54 +0100 Subject: [PATCH 151/196] fix: implement getOwnerId() in bitbucketNock --- .../TimeToSolvePullRequestsPractice.spec.ts | 8 +--- .../bitbucket/BitbucketService.spec.ts | 37 ++----------------- src/test/helpers/bitbucketNock.ts | 8 ++++ 3 files changed, 14 insertions(+), 39 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts index 6d9ef739e..b67414aab 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts @@ -34,9 +34,7 @@ describe('TimeToSolvePullRequestsPractice', () => { }); it('returns practicing if there are open pullrequests updated or created less than 30 days from now', async () => { - nock(bitbucketNock.url) - .get('/users/pypy') - .reply(200); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(10, 'days').asMilliseconds() }; mockCollaborationInspector.getPullRequests = async () => { @@ -52,9 +50,7 @@ describe('TimeToSolvePullRequestsPractice', () => { }); it('returns practicing if there are open pullrequests updated or created more than 30 days from now', async () => { - nock(bitbucketNock.url) - .get('/users/pypy') - .reply(200); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(100, 'days').asMilliseconds() }; mockCollaborationInspector.getPullRequests = async () => { diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index e109919e3..05bcdb32e 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -25,15 +25,8 @@ describe('Bitbucket Service', () => { }); it('returns open pull requests in own interface', async () => { - nock(bitbucketNock.url) - .get('/users/pypy') - .replyWithError('is a team account'); - - nock(bitbucketNock.url) - .get('/teams/pypy') - .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests'); - const response = await service.getPullRequests('pypy', 'pypy'); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); expect(response).toMatchObject(getOpenPullRequestsResponse); @@ -41,13 +34,7 @@ describe('Bitbucket Service', () => { it('returns all pull requests in own interface', async () => { const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); - nock(bitbucketNock.url) - .get('/users/pypy') - .replyWithError('is a team account'); - - nock(bitbucketNock.url) - .get('/teams/pypy') - .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); @@ -57,13 +44,7 @@ describe('Bitbucket Service', () => { }); it('returns specific pull request in own interface', async () => { - nock(bitbucketNock.url) - .get('/users/pypy') - .replyWithError('is a team account'); - - nock(bitbucketNock.url) - .get('/teams/pypy') - .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests', 1); const response = await service.getPullRequest('pypy', 'pypy', 1); @@ -105,17 +86,7 @@ describe('Bitbucket Service', () => { }, }; - nock(bitbucketNock.url) - .get('/users/pypy') - .replyWithError('is a team account'); - - nock(bitbucketNock.url) - .get('/teams/pypy') - .reply(200, { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' }); - - nock(bitbucketNock.url) - .get('/users/pypy') - .reply(200); + bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); const response = await service.getPullRequests('pypy', 'pypy', state); diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index bd25f90ce..3b42741b4 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -98,6 +98,14 @@ export class BitbucketNock { return BitbucketNock.get(url, params, persist).reply(200, response); } + getOwnerId() { + const url = `${this.url}/repositories/${this.user}/${this.repoName}`; + const params = {}; + const persist = true; + const response = { owner: { uuid: '{f122f6a4-9111-4431-9f88-884d8cedd194}' } }; + return BitbucketNock.get(url, params, persist).reply(200, response); + } + private static get(url: string, params: nock.DataMatcherMap, persist = true): nock.Interceptor { const urlObj = new URL(url); From 26abede4f29abb331ced0a639deb1600a9056bec Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 9 Dec 2019 15:08:01 +0100 Subject: [PATCH 152/196] refactor: use different syntax to save string --- src/services/bitbucket/BitbucketService.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 07dfbd348..9d80b071c 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -95,8 +95,7 @@ export class BitbucketService implements IVCSService { } const ownerUrl = `www.bitbucket.org/${owner}`; - - const ownerId = (await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid; + const ownerId = `${(await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid}`; const response: DeepRequired> = await axios.get(apiUrl); @@ -146,7 +145,7 @@ export class BitbucketService implements IVCSService { }; const ownerUrl = `www.bitbucket.org/${owner}`; - const ownerId = (await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid; + const ownerId = `${(await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid}`; const response = >>await this.client.pullrequests.get(params); response.data; From b883dcad0203b79995550d9d8b676840bdbcab4a Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Mon, 9 Dec 2019 15:54:04 +0100 Subject: [PATCH 153/196] chore: better wording in a detail text Co-Authored-By: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> --- src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts index 09d5a35d0..ecdc7d98d 100644 --- a/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts +++ b/src/practices/JavaScript/JsGitignoreCorrectlySetPractice.ts @@ -55,7 +55,7 @@ export class JsGitignoreCorrectlySetPractice extends PracticeBase { { type: ReportDetailType.text, text: - 'You should ignore one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', + 'You should ignore one of the lock files (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', }, ]; } From 506372827392359e73ba40c230e7c12f48fb9ded Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Mon, 9 Dec 2019 15:54:14 +0100 Subject: [PATCH 154/196] chore: better wording in a detail text Co-Authored-By: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> --- src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts index a2fad8996..57bd20809 100644 --- a/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts +++ b/src/practices/TypeScript/TsGitignoreCorrectlySetPractice.ts @@ -64,7 +64,7 @@ export class TsGitignoreCorrectlySetPractice extends PracticeBase { { type: ReportDetailType.text, text: - 'You should ignore one of build folder (build, dist or lib), one of lock file (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', + 'You should ignore one of the build folders (build, dist or lib), one of the lock files (package-lock.json or yarn.lock), node_modules folder, coverage folder and log files (*.log)', }, ]; } From c1aa97db64394aae2a1c4a58eb7ccb91452f49c9 Mon Sep 17 00:00:00 2001 From: Adela Homolova <53510747+adelkahomolova@users.noreply.github.com> Date: Tue, 10 Dec 2019 13:42:22 +0100 Subject: [PATCH 155/196] fix: invalid letter case Co-Authored-By: Prokop Simek --- .../LanguageIndependent/TimeToSolvePullRequestsPractice.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts index eb7bb6188..9f93dd475 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts @@ -38,7 +38,7 @@ export class TimeToSolvePullRequestsPractice implements IPractice { const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); const now = Date.now(); - const openPullrequestsTooLong = []; + const openPullRequestsTooLong = []; latestPRsUpdate.forEach((prDate) => { if (now - prDate > daysInMilliseconds) { From 0fe3e8bd09deb9fc19ff49e6132d63103cff04f3 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 10 Dec 2019 13:43:28 +0100 Subject: [PATCH 156/196] fix: remove unnecessary condition --- .../LanguageIndependent/TimeToSolvePullRequestsPractice.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts index eb7bb6188..86cbc99ac 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts @@ -30,10 +30,6 @@ export class TimeToSolvePullRequestsPractice implements IPractice { //Both GitHub API and Bitbucket API returns open pullrequests defaultly const pullRequests = await ctx.collaborationInspector.getPullRequests(ownerAndRepoName.owner, ownerAndRepoName.repoName); - if (pullRequests.items.length === 0) { - return PracticeEvaluationResult.practicing; - } - const latestPRsUpdate = pullRequests.items.map((item) => new Date(item.updatedAt || item.createdAt).getTime()); const daysInMilliseconds = moment.duration(30, 'days').asMilliseconds(); From f8bd6a53875e830af2452886f93658bbb2a7a6ee Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 10 Dec 2019 13:50:03 +0100 Subject: [PATCH 157/196] fix: wrong letter case --- .../LanguageIndependent/TimeToSolvePullRequestsPractice.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts index b240525b6..83c71acf8 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.ts @@ -38,11 +38,11 @@ export class TimeToSolvePullRequestsPractice implements IPractice { latestPRsUpdate.forEach((prDate) => { if (now - prDate > daysInMilliseconds) { - openPullrequestsTooLong.push(prDate); + openPullRequestsTooLong.push(prDate); } }); - if (openPullrequestsTooLong.length === 0) { + if (openPullRequestsTooLong.length === 0) { return PracticeEvaluationResult.practicing; } From cd746f4f035d990744f2912cd24d0fe5d318b6df Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 10 Dec 2019 13:50:19 +0100 Subject: [PATCH 158/196] fix: remove unnecessary test --- .../TimeToSolvePullRequestsPractice.spec.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts index b67414aab..b0248e7e3 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts @@ -65,18 +65,6 @@ describe('TimeToSolvePullRequestsPractice', () => { expect(evaluated).toEqual(PracticeEvaluationResult.notPracticing); }); - it('returns practicing if there are no open pullrequest', async () => { - mockCollaborationInspector.getPullRequests = async () => { - return bitbucketNock.mockBitbucketPullRequestsResponse({}); - }; - - const evaluated = await practice.evaluate({ - ...containerCtx.practiceContext, - collaborationInspector: mockCollaborationInspector, - }); - expect(evaluated).toEqual(PracticeEvaluationResult.practicing); - }); - it('returns always true, as it is always applicable', async () => { const response = await practice.isApplicable(); expect(response).toBe(true); From 4d2fb1632f478e358ed042b3c8438f0480776e7d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 10 Dec 2019 13:31:54 +0000 Subject: [PATCH 159/196] chore(release): 1.25.0 [skip ci] # [1.25.0](https://github.com/dxheroes/dx-scanner/compare/v1.24.0...v1.25.0) (2019-12-10) ### Bug Fixes * add a comment ([26ea99f](https://github.com/dxheroes/dx-scanner/commit/26ea99f)) * add a comment about logic to try catch ([9c8bba4](https://github.com/dxheroes/dx-scanner/commit/9c8bba4)) * add possibility return no pullrequests by not passing state ([633caea](https://github.com/dxheroes/dx-scanner/commit/633caea)) * as the bitbucket fails if the account is a team account add possibility to ownerId be a null ([37bc6f2](https://github.com/dxheroes/dx-scanner/commit/37bc6f2)) * change updatedAt only if it's provided ([ec2f240](https://github.com/dxheroes/dx-scanner/commit/ec2f240)) * get the ownerId via repo info with one request ([2b83d63](https://github.com/dxheroes/dx-scanner/commit/2b83d63)) * getting ownerId if it's team account ([bd86a78](https://github.com/dxheroes/dx-scanner/commit/bd86a78)) * implement getOwnerId() in bitbucketNock ([81daee8](https://github.com/dxheroes/dx-scanner/commit/81daee8)) * invalid letter case ([c1aa97d](https://github.com/dxheroes/dx-scanner/commit/c1aa97d)) * path ([af50b8d](https://github.com/dxheroes/dx-scanner/commit/af50b8d)) * rebind IContentRepositoryBrowser in practice instead of binding in inversify.config.ts ([1141cad](https://github.com/dxheroes/dx-scanner/commit/1141cad)) * reflect used service ([48b3429](https://github.com/dxheroes/dx-scanner/commit/48b3429)) * remove unnecessary code ([4118637](https://github.com/dxheroes/dx-scanner/commit/4118637)) * remove unnecessary condition ([0fe3e8b](https://github.com/dxheroes/dx-scanner/commit/0fe3e8b)) * remove unnecessary line of code ([269f384](https://github.com/dxheroes/dx-scanner/commit/269f384)) * remove unnecessary test ([cd746f4](https://github.com/dxheroes/dx-scanner/commit/cd746f4)) * rename practice and files. Add name and suggestion text. ([9e18b76](https://github.com/dxheroes/dx-scanner/commit/9e18b76)) * tests ([e9f9943](https://github.com/dxheroes/dx-scanner/commit/e9f9943)) * tests as it is possible to get team account id ([c9f7d91](https://github.com/dxheroes/dx-scanner/commit/c9f7d91)) * use arguments provider uri to detect if bind GithubService or BitbucketService ([ba705b4](https://github.com/dxheroes/dx-scanner/commit/ba705b4)) * value of owner id ([c56e67f](https://github.com/dxheroes/dx-scanner/commit/c56e67f)) * wrong letter case ([f8bd6a5](https://github.com/dxheroes/dx-scanner/commit/f8bd6a5)) ### Features * add TimeToSolvePractice ([a667a78](https://github.com/dxheroes/dx-scanner/commit/a667a78)) --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc259519..d4d9e9934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +# [1.25.0](https://github.com/dxheroes/dx-scanner/compare/v1.24.0...v1.25.0) (2019-12-10) + + +### Bug Fixes + +* add a comment ([26ea99f](https://github.com/dxheroes/dx-scanner/commit/26ea99f)) +* add a comment about logic to try catch ([9c8bba4](https://github.com/dxheroes/dx-scanner/commit/9c8bba4)) +* add possibility return no pullrequests by not passing state ([633caea](https://github.com/dxheroes/dx-scanner/commit/633caea)) +* as the bitbucket fails if the account is a team account add possibility to ownerId be a null ([37bc6f2](https://github.com/dxheroes/dx-scanner/commit/37bc6f2)) +* change updatedAt only if it's provided ([ec2f240](https://github.com/dxheroes/dx-scanner/commit/ec2f240)) +* get the ownerId via repo info with one request ([2b83d63](https://github.com/dxheroes/dx-scanner/commit/2b83d63)) +* getting ownerId if it's team account ([bd86a78](https://github.com/dxheroes/dx-scanner/commit/bd86a78)) +* implement getOwnerId() in bitbucketNock ([81daee8](https://github.com/dxheroes/dx-scanner/commit/81daee8)) +* invalid letter case ([c1aa97d](https://github.com/dxheroes/dx-scanner/commit/c1aa97d)) +* path ([af50b8d](https://github.com/dxheroes/dx-scanner/commit/af50b8d)) +* rebind IContentRepositoryBrowser in practice instead of binding in inversify.config.ts ([1141cad](https://github.com/dxheroes/dx-scanner/commit/1141cad)) +* reflect used service ([48b3429](https://github.com/dxheroes/dx-scanner/commit/48b3429)) +* remove unnecessary code ([4118637](https://github.com/dxheroes/dx-scanner/commit/4118637)) +* remove unnecessary condition ([0fe3e8b](https://github.com/dxheroes/dx-scanner/commit/0fe3e8b)) +* remove unnecessary line of code ([269f384](https://github.com/dxheroes/dx-scanner/commit/269f384)) +* remove unnecessary test ([cd746f4](https://github.com/dxheroes/dx-scanner/commit/cd746f4)) +* rename practice and files. Add name and suggestion text. ([9e18b76](https://github.com/dxheroes/dx-scanner/commit/9e18b76)) +* tests ([e9f9943](https://github.com/dxheroes/dx-scanner/commit/e9f9943)) +* tests as it is possible to get team account id ([c9f7d91](https://github.com/dxheroes/dx-scanner/commit/c9f7d91)) +* use arguments provider uri to detect if bind GithubService or BitbucketService ([ba705b4](https://github.com/dxheroes/dx-scanner/commit/ba705b4)) +* value of owner id ([c56e67f](https://github.com/dxheroes/dx-scanner/commit/c56e67f)) +* wrong letter case ([f8bd6a5](https://github.com/dxheroes/dx-scanner/commit/f8bd6a5)) + + +### Features + +* add TimeToSolvePractice ([a667a78](https://github.com/dxheroes/dx-scanner/commit/a667a78)) + # [1.24.0](https://github.com/dxheroes/dx-scanner/compare/v1.23.2...v1.24.0) (2019-12-06) diff --git a/package.json b/package.json index c1a751da7..e36a0c8bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.24.0", + "version": "1.25.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 0648ce9cbfc5719c9591db8d723cba3a7a11fbe9 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Tue, 10 Dec 2019 21:12:50 +0100 Subject: [PATCH 160/196] fix: add linesAdded and linesRemoved to own interface of Commit. Implement it in BitbucketService and rewrite tests. --- .../bitbucket/BitbucketService.spec.ts | 3 + src/services/bitbucket/BitbucketService.ts | 168 +++++++++++------- src/services/git/model.ts | 2 + src/test/helpers/bitbucketNock.ts | 11 ++ 4 files changed, 121 insertions(+), 63 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 05bcdb32e..6a98ed02c 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -53,6 +53,7 @@ describe('Bitbucket Service', () => { it('returns pullrequest commits in own interface', async () => { bitbucketNock.getApiResponse('pullrequests', 622, 'commits'); + bitbucketNock.getAdditionsAndDeletions('622', true); const response = await service.getPullCommits('pypy', 'pypy', 622); expect(response).toMatchObject(getPullCommits); @@ -97,6 +98,7 @@ describe('Bitbucket Service', () => { it('returns repo commits in own interface', async () => { bitbucketNock.getApiResponse('commits'); + bitbucketNock.getAdditionsAndDeletions('f9c2cfcfaafa644dcc286ce2fc8b3386d46c11df'); const response = await service.getRepoCommits('pypy', 'pypy'); expect(response).toMatchObject(getRepoCommits); @@ -104,6 +106,7 @@ describe('Bitbucket Service', () => { it('return on commit in own interface', async () => { bitbucketNock.getApiResponse('commit', '961b3a27'); + bitbucketNock.getAdditionsAndDeletions('961b3a27'); const response = await service.getCommit('pypy', 'pypy', '961b3a27'); expect(response).toMatchObject(getRepoCommit); diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 9d80b071c..482211a4e 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -99,41 +99,41 @@ export class BitbucketService implements IVCSService { const response: DeepRequired> = await axios.get(apiUrl); - const values = response.data.values.map(async (val) => { - return { - user: { - id: val.author.uuid, - login: val.author.nickname, - url: val.author.links.html.href, - }, - url: val.links.html.href, - body: val.description, - createdAt: val.created_on, - updatedAt: val.updated_on, - closedAt: - val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, - mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, - state: val.state, - id: val.id, - base: { - repo: { - url: val.destination.repository.links.html.href, - name: val.destination.repository.name, - id: val.destination.repository.uuid, - owner: { - login: owner, - id: ownerId, - url: ownerUrl, + const items = await Promise.all( + response.data.values.map(async (val) => { + return { + user: { + id: val.author.uuid, + login: val.author.nickname, + url: val.author.links.html.href, + }, + url: val.links.html.href, + body: val.description, + createdAt: val.created_on, + updatedAt: val.updated_on, + closedAt: + val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, + mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, + state: val.state, + id: val.id, + base: { + repo: { + url: val.destination.repository.links.html.href, + name: val.destination.repository.name, + id: val.destination.repository.uuid, + owner: { + login: owner, + id: ownerId, + url: ownerUrl, + }, }, }, - }, - }; - }); + }; + }), + ); const pagination = this.getPagination(response.data); - const items = await Promise.all(values); - return { items, ...pagination }; } @@ -195,24 +195,40 @@ export class BitbucketService implements IVCSService { const response = >>await this.client.pullrequests.listCommits(params); - const items = response.data.values.map((val) => ({ - sha: val.hash, - commit: { - url: val.links.html.href, - message: val.message, - author: { - name: val.author.raw, - email: 'undefined', - date: val.date, - }, - tree: { + const items = await Promise.all( + response.data.values.map(async (val) => { + const diffValues = ( + (await this.client.repositories.getPullRequestDiffStat({ repo_slug: repo, username: owner, pull_request_id: `${prNumber}` })).data + .values + ); + let linesAdded = 0; + let linesRemoved = 0; + diffValues.forEach((val) => { + linesAdded += val.lines_added; + linesRemoved += val.lines_removed; + }); + return { sha: val.hash, - url: val.links.html.href, - }, - //TODO - verified: false, - }, - })); + commit: { + url: val.links.html.href, + message: val.message, + author: { + name: val.author.raw, + email: 'undefined', + date: val.date, + }, + linesAdded: linesAdded, + linesRemoved: linesRemoved, + tree: { + sha: val.hash, + url: val.links.html.href, + }, + //TODO + verified: false, + }, + }; + }), + ); const pagination = this.getPagination(response.data); return { items, ...pagination }; @@ -309,22 +325,37 @@ export class BitbucketService implements IVCSService { username: owner, }; const response = >>await this.client.repositories.listCommits(params); - const items = response.data.values.map((val) => ({ - sha: val.hash, - url: val.links.html.href, - message: val.rendered.message.raw, - author: { - name: val.author.user.nickname, - email: this.extractEmailFromString(val.author.raw) || '', - date: val.date, - }, - tree: { - sha: val.parents[0].hash, - url: val.parents[0].links.html.href, - }, - // TODO - verified: false, - })); + const items = await Promise.all( + response.data.values.map(async (val) => { + const diffValues = ( + (await this.client.repositories.listDiffStats({ repo_slug: repo, username: owner, spec: val.hash })).data.values + ); + let linesAdded = 0; + let linesRemoved = 0; + diffValues.forEach((val) => { + linesAdded += val.lines_added; + linesRemoved += val.lines_removed; + }); + return { + sha: val.hash, + url: val.links.html.href, + message: val.rendered.message.raw, + author: { + name: val.author.user.nickname, + email: this.extractEmailFromString(val.author.raw) || '', + date: val.date, + }, + linesAdded: linesAdded, + linesRemoved: linesRemoved, + tree: { + sha: val.parents[0].hash, + url: val.parents[0].links.html.href, + }, + // TODO + verified: false, + }; + }), + ); const pagination = this.getPagination(response.data); return { items, ...pagination }; @@ -337,6 +368,15 @@ export class BitbucketService implements IVCSService { username: owner, }; const response = >>await this.client.commits.get(params); + const diffValues = ( + (await this.client.repositories.listDiffStats({ repo_slug: repo, username: owner, spec: commitSha })).data.values + ); + let linesAdded = 0; + let linesRemoved = 0; + diffValues.forEach((val) => { + linesAdded += val.lines_added; + linesRemoved += val.lines_removed; + }); return { sha: response.data.hash, url: response.data.links.html.href, @@ -346,6 +386,8 @@ export class BitbucketService implements IVCSService { email: this.extractEmailFromString(response.data.author.raw) || '', date: response.data.date, }, + linesAdded: linesAdded, + linesRemoved: linesRemoved, tree: { sha: response.data.parents[0].hash, url: response.data.parents[0].links.html.href, diff --git a/src/services/git/model.ts b/src/services/git/model.ts index 02de4e620..80b5bab69 100644 --- a/src/services/git/model.ts +++ b/src/services/git/model.ts @@ -36,6 +36,8 @@ export interface Commit { author: Author; message: string; tree: Tree; + linesAdded: number; + linesRemoved: number; verified: boolean; } diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index 3b42741b4..25c846320 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -106,6 +106,17 @@ export class BitbucketNock { return BitbucketNock.get(url, params, persist).reply(200, response); } + getAdditionsAndDeletions(sha: string, pullRequestCommit?: boolean) { + let url = `${this.url}/repositories/${this.user}/${this.repoName}/diffstat/${sha}`; + if (pullRequestCommit) { + url = `${this.url}/repositories/${this.user}/${this.repoName}/pullrequests/${sha}/diffstat`; + } + const params = {}; + const persist = true; + const response = { values: [{ lines_removed: 1, lines_added: 2 }] }; + return BitbucketNock.get(url, params, persist).reply(200, response); + } + private static get(url: string, params: nock.DataMatcherMap, persist = true): nock.Interceptor { const urlObj = new URL(url); From d60558370a95c1ad9d557d789714f2320ca167c7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 11 Dec 2019 09:34:50 +0000 Subject: [PATCH 161/196] chore(release): 1.26.0 [skip ci] # [1.26.0](https://github.com/dxheroes/dx-scanner/compare/v1.25.0...v1.26.0) (2019-12-11) ### Features * **CLIReporter:** add rich suggestion text to the report ([2db8559](https://github.com/dxheroes/dx-scanner/commit/2db8559)) * **CLIReporter:** show detailed info (collected data) from practices ([30458ce](https://github.com/dxheroes/dx-scanner/commit/30458ce)) * collect data from practices ([4fa1b85](https://github.com/dxheroes/dx-scanner/commit/4fa1b85)) --- CHANGELOG.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4d9e9934..e991aa15c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [1.26.0](https://github.com/dxheroes/dx-scanner/compare/v1.25.0...v1.26.0) (2019-12-11) + + +### Features + +* **CLIReporter:** add rich suggestion text to the report ([2db8559](https://github.com/dxheroes/dx-scanner/commit/2db8559)) +* **CLIReporter:** show detailed info (collected data) from practices ([30458ce](https://github.com/dxheroes/dx-scanner/commit/30458ce)) +* collect data from practices ([4fa1b85](https://github.com/dxheroes/dx-scanner/commit/4fa1b85)) + # [1.25.0](https://github.com/dxheroes/dx-scanner/compare/v1.24.0...v1.25.0) (2019-12-10) diff --git a/package.json b/package.json index 0438fe53b..df05574c0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.25.0", + "version": "1.26.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 07e88e52984b880cd9a17755e48e08fade3d1145 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 11 Dec 2019 12:53:22 +0100 Subject: [PATCH 162/196] fix: remove unnecessary Promise.all(); remove request for getting diffStat --- package.json | 4 +- .../bitbucket/BitbucketService.spec.ts | 3 - src/services/bitbucket/BitbucketService.ts | 173 +++++++----------- 3 files changed, 71 insertions(+), 109 deletions(-) diff --git a/package.json b/package.json index 0438fe53b..b293cea4a 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "@octokit/rest": "16.35.0", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", - "@types/table": "^4.0.7", "@types/qs": "^6.9.0", + "@types/table": "^4.0.7", "@types/yaml": "^1.2.0", "axios": "0.19.0", "bitbucket": "1.15.2", @@ -47,8 +47,8 @@ "inversify": "5.0.1", "js-yaml": "3.13.1", "lodash": "4.17.15", - "moment": "^2.24.0", "memfs": "3.0.1", + "moment": "^2.24.0", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 6a98ed02c..05bcdb32e 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -53,7 +53,6 @@ describe('Bitbucket Service', () => { it('returns pullrequest commits in own interface', async () => { bitbucketNock.getApiResponse('pullrequests', 622, 'commits'); - bitbucketNock.getAdditionsAndDeletions('622', true); const response = await service.getPullCommits('pypy', 'pypy', 622); expect(response).toMatchObject(getPullCommits); @@ -98,7 +97,6 @@ describe('Bitbucket Service', () => { it('returns repo commits in own interface', async () => { bitbucketNock.getApiResponse('commits'); - bitbucketNock.getAdditionsAndDeletions('f9c2cfcfaafa644dcc286ce2fc8b3386d46c11df'); const response = await service.getRepoCommits('pypy', 'pypy'); expect(response).toMatchObject(getRepoCommits); @@ -106,7 +104,6 @@ describe('Bitbucket Service', () => { it('return on commit in own interface', async () => { bitbucketNock.getApiResponse('commit', '961b3a27'); - bitbucketNock.getAdditionsAndDeletions('961b3a27'); const response = await service.getCommit('pypy', 'pypy', '961b3a27'); expect(response).toMatchObject(getRepoCommit); diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 482211a4e..f4806422f 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -99,38 +99,36 @@ export class BitbucketService implements IVCSService { const response: DeepRequired> = await axios.get(apiUrl); - const items = await Promise.all( - response.data.values.map(async (val) => { - return { - user: { - id: val.author.uuid, - login: val.author.nickname, - url: val.author.links.html.href, - }, - url: val.links.html.href, - body: val.description, - createdAt: val.created_on, - updatedAt: val.updated_on, - closedAt: - val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, - mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, - state: val.state, - id: val.id, - base: { - repo: { - url: val.destination.repository.links.html.href, - name: val.destination.repository.name, - id: val.destination.repository.uuid, - owner: { - login: owner, - id: ownerId, - url: ownerUrl, - }, + const items = response.data.values.map((val) => { + return { + user: { + id: val.author.uuid, + login: val.author.nickname, + url: val.author.links.html.href, + }, + url: val.links.html.href, + body: val.description, + createdAt: val.created_on, + updatedAt: val.updated_on, + closedAt: + val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, + mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, + state: val.state, + id: val.id, + base: { + repo: { + url: val.destination.repository.links.html.href, + name: val.destination.repository.name, + id: val.destination.repository.uuid, + owner: { + login: owner, + id: ownerId, + url: ownerUrl, }, }, - }; - }), - ); + }, + }; + }); const pagination = this.getPagination(response.data); @@ -195,40 +193,27 @@ export class BitbucketService implements IVCSService { const response = >>await this.client.pullrequests.listCommits(params); - const items = await Promise.all( - response.data.values.map(async (val) => { - const diffValues = ( - (await this.client.repositories.getPullRequestDiffStat({ repo_slug: repo, username: owner, pull_request_id: `${prNumber}` })).data - .values - ); - let linesAdded = 0; - let linesRemoved = 0; - diffValues.forEach((val) => { - linesAdded += val.lines_added; - linesRemoved += val.lines_removed; - }); - return { - sha: val.hash, - commit: { + const items = response.data.values.map((val) => { + return { + sha: val.hash, + commit: { + url: val.links.html.href, + message: val.message, + author: { + name: val.author.raw, + email: 'undefined', + date: val.date, + }, + tree: { + sha: val.hash, url: val.links.html.href, - message: val.message, - author: { - name: val.author.raw, - email: 'undefined', - date: val.date, - }, - linesAdded: linesAdded, - linesRemoved: linesRemoved, - tree: { - sha: val.hash, - url: val.links.html.href, - }, - //TODO - verified: false, }, - }; - }), - ); + //TODO + verified: false, + }, + }; + }); + const pagination = this.getPagination(response.data); return { items, ...pagination }; @@ -325,37 +310,25 @@ export class BitbucketService implements IVCSService { username: owner, }; const response = >>await this.client.repositories.listCommits(params); - const items = await Promise.all( - response.data.values.map(async (val) => { - const diffValues = ( - (await this.client.repositories.listDiffStats({ repo_slug: repo, username: owner, spec: val.hash })).data.values - ); - let linesAdded = 0; - let linesRemoved = 0; - diffValues.forEach((val) => { - linesAdded += val.lines_added; - linesRemoved += val.lines_removed; - }); - return { - sha: val.hash, - url: val.links.html.href, - message: val.rendered.message.raw, - author: { - name: val.author.user.nickname, - email: this.extractEmailFromString(val.author.raw) || '', - date: val.date, - }, - linesAdded: linesAdded, - linesRemoved: linesRemoved, - tree: { - sha: val.parents[0].hash, - url: val.parents[0].links.html.href, - }, - // TODO - verified: false, - }; - }), - ); + const items = response.data.values.map((val) => { + return { + sha: val.hash, + url: val.links.html.href, + message: val.rendered.message.raw, + author: { + name: val.author.user.nickname, + email: this.extractEmailFromString(val.author.raw) || '', + date: val.date, + }, + tree: { + sha: val.parents[0].hash, + url: val.parents[0].links.html.href, + }, + // TODO + verified: false, + }; + }); + const pagination = this.getPagination(response.data); return { items, ...pagination }; @@ -368,15 +341,7 @@ export class BitbucketService implements IVCSService { username: owner, }; const response = >>await this.client.commits.get(params); - const diffValues = ( - (await this.client.repositories.listDiffStats({ repo_slug: repo, username: owner, spec: commitSha })).data.values - ); - let linesAdded = 0; - let linesRemoved = 0; - diffValues.forEach((val) => { - linesAdded += val.lines_added; - linesRemoved += val.lines_removed; - }); + return { sha: response.data.hash, url: response.data.links.html.href, @@ -386,8 +351,6 @@ export class BitbucketService implements IVCSService { email: this.extractEmailFromString(response.data.author.raw) || '', date: response.data.date, }, - linesAdded: linesAdded, - linesRemoved: linesRemoved, tree: { sha: response.data.parents[0].hash, url: response.data.parents[0].links.html.href, @@ -409,6 +372,8 @@ export class BitbucketService implements IVCSService { throw new Error('Method not implemented yet.'); } + // async getDiffStat(owner: string, repo: string, sha: string) {} + private unwrap(clientPromise: Promise>) { return clientPromise .then((response) => { From d1232ed32c8a7eda31b9de4301737db63784d7cb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 11 Dec 2019 12:54:20 +0100 Subject: [PATCH 163/196] feat: add Lines interface --- src/services/git/model.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/services/git/model.ts b/src/services/git/model.ts index 80b5bab69..b85b9492f 100644 --- a/src/services/git/model.ts +++ b/src/services/git/model.ts @@ -20,6 +20,7 @@ export interface PullRequest { mergedAt: string | null; state: string; base: { repo: Repo }; + lines?: Lines; } export interface PullRequestReview { @@ -36,8 +37,6 @@ export interface Commit { author: Author; message: string; tree: Tree; - linesAdded: number; - linesRemoved: number; verified: boolean; } @@ -123,6 +122,12 @@ export interface PullCommits { commit: Commit; } +interface Lines { + additions: number; + deletions: number; + changes: number; +} + interface Author { name: string; email: string; From 3c78fe378e992ab886270f237847a3ee1a8a4999 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Wed, 11 Dec 2019 15:37:55 +0100 Subject: [PATCH 164/196] feat: implement getPullsDiffStat() in BitbucketService and add test for that --- .../bitbucket/BitbucketService.spec.ts | 9 ++++++++- src/services/bitbucket/BitbucketService.ts | 18 +++++++++++++++++- src/test/helpers/bitbucketNock.ts | 8 +++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 05bcdb32e..4c0745a18 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -102,10 +102,17 @@ describe('Bitbucket Service', () => { expect(response).toMatchObject(getRepoCommits); }); - it('return on commit in own interface', async () => { + it('returns one commit in own interface', async () => { bitbucketNock.getApiResponse('commit', '961b3a27'); const response = await service.getCommit('pypy', 'pypy', '961b3a27'); expect(response).toMatchObject(getRepoCommit); }); + + it('returns pulls diff stat in own interface', async () => { + bitbucketNock.getAdditionsAndDeletions('622'); + + const response = await service.getPullsDiffStat('pypy', 'pypy', '622'); + expect(response).toMatchObject({ additions: 2, deletions: 1, changes: 3 }); + }); }); diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index f4806422f..2eaacd40c 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -372,7 +372,23 @@ export class BitbucketService implements IVCSService { throw new Error('Method not implemented yet.'); } - // async getDiffStat(owner: string, repo: string, sha: string) {} + async getPullsDiffStat(owner: string, repo: string, sha: string) { + const diffStatData = (await this.client.pullrequests.getDiffStat({ repo_slug: repo, username: owner, pull_request_id: sha })).data; + + let linesRemoved = 0, + linesAdded = 0; + + diffStatData.values.forEach((val: { lines_removed: number; lines_added: number }) => { + linesRemoved += val.lines_removed; + linesAdded += val.lines_added; + }); + + return { + additions: linesAdded, + deletions: linesRemoved, + changes: linesAdded + linesRemoved, + }; + } private unwrap(clientPromise: Promise>) { return clientPromise diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index 25c846320..e0772d287 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -106,11 +106,9 @@ export class BitbucketNock { return BitbucketNock.get(url, params, persist).reply(200, response); } - getAdditionsAndDeletions(sha: string, pullRequestCommit?: boolean) { - let url = `${this.url}/repositories/${this.user}/${this.repoName}/diffstat/${sha}`; - if (pullRequestCommit) { - url = `${this.url}/repositories/${this.user}/${this.repoName}/pullrequests/${sha}/diffstat`; - } + getAdditionsAndDeletions(sha: string) { + const url = `${this.url}/repositories/${this.user}/${this.repoName}/pullrequests/${sha}/diffstat`; + const params = {}; const persist = true; const response = { values: [{ lines_removed: 1, lines_added: 2 }] }; From 47e57ad5f9e68a0583bbd9b62f6f3393270cadac Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 12 Dec 2019 13:43:01 +0100 Subject: [PATCH 165/196] fix: add pagination to getPullrequests() in Bitbucket --- src/services/bitbucket/BitbucketService.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 2eaacd40c..6ea2701ce 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -84,15 +84,17 @@ export class BitbucketService implements IVCSService { repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { - let state; - if (options?.filter?.state) { - state = VCSServicesUtils.getPRState(options.filter.state, VCSService.bitbucket); - } - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); let apiUrl = `https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/pullrequests`; - if (stateForUri) { - apiUrl = apiUrl.concat(`${stateForUri}`); - } + + const state = VCSServicesUtils.getPRState(options?.filter?.state, VCSService.bitbucket); + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + + const paginationForUri = qs.stringify( + { page: options?.pagination?.page, pagelen: options?.pagination?.perPage }, + { addQueryPrefix: true, indices: false }, + ); + + apiUrl = apiUrl.concat(`${stateForUri}${paginationForUri}`); const ownerUrl = `www.bitbucket.org/${owner}`; const ownerId = `${(await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid}`; From 4bfbd8ba1f5eae75fbf81fe7a6249c738d365ecd Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Thu, 12 Dec 2019 14:32:42 +0100 Subject: [PATCH 166/196] test: add test for getting first pull request --- src/services/bitbucket/BitbucketService.spec.ts | 10 ++++++++++ src/test/helpers/bitbucketNock.ts | 14 +++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 4c0745a18..690637fe1 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -27,11 +27,21 @@ describe('Bitbucket Service', () => { it('returns open pull requests in own interface', async () => { bitbucketNock.getOwnerId(); bitbucketNock.getApiResponse('pullrequests'); + const response = await service.getPullRequests('pypy', 'pypy'); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); expect(response).toMatchObject(getOpenPullRequestsResponse); }); + it('returns one open pull requests in own interface', async () => { + bitbucketNock.getOwnerId(); + bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open, { page: 1, perPage: 1 }); + + const response = await service.getPullRequests('pypy', 'pypy', { pagination: { page: 1, perPage: 1 } }); + const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); + expect(response).toMatchObject(getOpenPullRequestsResponse); + }); + it('returns all pull requests in own interface', async () => { const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); bitbucketNock.getOwnerId(); diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index e0772d287..9a350f8ee 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -3,7 +3,7 @@ import nock from 'nock'; import { BitbucketCommit } from '../../services/bitbucket/BitbucketService'; import { BitbucketPullRequestState } from '../../services/git/IVCSService'; import qs from 'qs'; -import { Paginated } from '../../inspectors'; +import { Paginated, PaginationParams } from '../../inspectors'; import { PullRequest } from '../../services/git/model'; import { getPullRequestResponse } from '../../services/git/__MOCKS__/bitbucketServiceMockFolder'; import _ from 'lodash'; @@ -24,6 +24,7 @@ export class BitbucketNock { id?: number | string, value?: string, state?: BitbucketPullRequestState | BitbucketPullRequestState[], + pagination?: PaginationParams, ): nock.Scope { let url = `${this.url}/repositories/${this.user}/${this.repoName}/${resource}`; let response; @@ -73,6 +74,17 @@ export class BitbucketNock { response = new PullRequestsMock([pullRequest]).pullrequests; } } + if (pagination) { + const paginationForUri = qs.stringify( + { page: pagination?.page, pagelen: pagination?.perPage }, + { addQueryPrefix: true, indices: false }, + ); + params = { page: pagination.page, pagelen: pagination.perPage }; + + url = url.concat(`${paginationForUri}`); + const pullRequest = new PullRequestMock(state).pullRequest; + response = new PullRequestsMock([pullRequest]).pullrequests; + } } break; case 'issues': From fad8e78cbc0b438f7759cc727e682e34f5cc4598 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 09:52:37 +0100 Subject: [PATCH 167/196] fix: use pagination if it's provided --- src/services/git/GitHubService.ts | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index bd86c7b3e..7cf72e2ee 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -74,11 +74,18 @@ export class GitHubService implements IVCSService { options?: ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; - if (options !== undefined && options.filter !== undefined && options.filter.state !== undefined) { - const state = VCSServicesUtils.getPRState(options.filter.state, VCSService.github); - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true }); - url = `${url}${stateForUri}`; - } + + const state = VCSServicesUtils.getPRState(options?.filter?.state, VCSService.github); + const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + + const paginationForUri = qs.stringify( + // eslint-disable-next-line @typescript-eslint/camelcase + { page: options?.pagination?.page, per_page: options?.pagination?.perPage }, + { addQueryPrefix: true, indices: false }, + ); + + url = url.concat(`${stateForUri}${paginationForUri}`); + const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); const items = response.map((val) => ({ @@ -473,7 +480,14 @@ export class GitHubService implements IVCSService { /** * Get all results across all pages. */ - private async paginate(uri: string, owner: string, repo: string, prNumber?: number, issueNumber?: number) { + private async paginate( + uri: string, + owner: string, + repo: string, + prNumber?: number, + issueNumber?: number, + options?: ListGetterOptions<{ state?: PullRequestState }>, + ) { const object = { owner: owner, repo: repo, @@ -487,6 +501,11 @@ export class GitHubService implements IVCSService { Object.assign(object, { issue_number: issueNumber }); } + if (options?.pagination) { + // eslint-disable-next-line @typescript-eslint/camelcase + Object.assign(object, { page: options.pagination.page, per_page: options.pagination.perPage }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any return this.client.paginate(uri, object, (response: Octokit.Response) => { this.debugGitHubResponse(response); From 8da9512dd684cb00f458141617a5970d3b6a3924 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 09:53:09 +0100 Subject: [PATCH 168/196] test: add test for getPullRequests() if the pagination is provided --- src/services/git/GitHubService.spec.ts | 20 ++++++++++++++++++++ src/test/helpers/gitHubNock.ts | 11 +++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index e0c87677d..ca2e24d61 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -56,6 +56,26 @@ describe('GitHub Service', () => { expect(response).toMatchObject(getPullsServiceResponse); }); + it('returns one pull in own interface', async () => { + const pagination = { page: 1, perPage: 1 }; + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( + [ + { + number: 1347, + state: 'open', + title: 'new-feature', + body: 'Please pull these awesome changes', + head: 'new-topic', + base: 'master', + }, + ], + undefined, + pagination, + ); + const response = await service.getPullRequests('octocat', 'Hello-World', { pagination }); + expect(response).toMatchObject(getPullsServiceResponse); + }); + it('returns open pulls by default', async () => { new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, diff --git a/src/test/helpers/gitHubNock.ts b/src/test/helpers/gitHubNock.ts index 3471cb511..62fdbb815 100644 --- a/src/test/helpers/gitHubNock.ts +++ b/src/test/helpers/gitHubNock.ts @@ -38,6 +38,7 @@ export class GitHubNock { updated_at?: string; }[], queryState?: string, + pagination?: { page: number; perPage: number }, persist = true, ): PullRequestItem[] { const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { @@ -60,7 +61,7 @@ export class GitHubNock { ); }); - return this.getPullsInternal(undefined, queryState, responseBody, persist); + return this.getPullsInternal(undefined, queryState, responseBody, persist, pagination); } getPull( @@ -94,7 +95,7 @@ export class GitHubNock { updated_at, ); - return this.getPullsInternal(number, undefined, responseBody, persist); + return this.getPullsInternal(number, undefined, responseBody, persist, undefined); } getContributors(contributors: { id: string; login: string }[], persist = true): Contributor[] { @@ -121,6 +122,7 @@ export class GitHubNock { state: string | undefined, pulls: T, persist = true, + pagination: { page: number; perPage: number } | undefined, ): T { const url = this.repository.pulls_url.replace('{/number}', number !== undefined ? `/${number}` : ''); const params: nock.DataMatcherMap = {}; @@ -128,6 +130,11 @@ export class GitHubNock { params.state = state; } + if (pagination) { + params.page = pagination.page; + params.per_page = pagination.perPage; + } + GitHubNock.get(url, params, persist).reply(200, pulls); return pulls; } From dcba2267e604e7c1f82a51a2a8f0421034316973 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 14:01:36 +0100 Subject: [PATCH 169/196] feat: get pullrequests with diffStat if `withDiffStat` value is true --- src/inspectors/common/ListGetterOptions.ts | 1 + src/services/bitbucket/BitbucketService.ts | 63 ++++++++++++---------- src/services/git/model.ts | 2 +- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/inspectors/common/ListGetterOptions.ts b/src/inspectors/common/ListGetterOptions.ts index 33b6faa70..52c427221 100644 --- a/src/inspectors/common/ListGetterOptions.ts +++ b/src/inspectors/common/ListGetterOptions.ts @@ -5,4 +5,5 @@ export interface ListGetterOptions { filter?: Filter; // specific options to filter by (for example "state" for Github PR'ss) pagination?: PaginationParams; // general purpose pagination sort?: SortOptions; // specific sorting options + withDiffStat?: boolean; } diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 6ea2701ce..fdfa1c304 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -101,36 +101,43 @@ export class BitbucketService implements IVCSService { const response: DeepRequired> = await axios.get(apiUrl); - const items = response.data.values.map((val) => { - return { - user: { - id: val.author.uuid, - login: val.author.nickname, - url: val.author.links.html.href, - }, - url: val.links.html.href, - body: val.description, - createdAt: val.created_on, - updatedAt: val.updated_on, - closedAt: - val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, - mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, - state: val.state, - id: val.id, - base: { - repo: { - url: val.destination.repository.links.html.href, - name: val.destination.repository.name, - id: val.destination.repository.uuid, - owner: { - login: owner, - id: ownerId, - url: ownerUrl, + const items = await Promise.all( + response.data.values.map(async (val) => { + const pullRequest = { + user: { + id: val.author.uuid, + login: val.author.nickname, + url: val.author.links.html.href, + }, + url: val.links.html.href, + body: val.description, + createdAt: val.created_on, + updatedAt: val.updated_on, + closedAt: + val.state === BitbucketPullRequestState.closed || val.state === BitbucketPullRequestState.declined ? val.updated_on : null, + mergedAt: val.state === BitbucketPullRequestState.closed ? val.updated_on : null, + state: val.state, + id: val.id, + base: { + repo: { + url: val.destination.repository.links.html.href, + name: val.destination.repository.name, + id: val.destination.repository.uuid, + owner: { + login: owner, + id: ownerId, + url: ownerUrl, + }, }, }, - }, - }; - }); + }; + if (options?.withDiffStat) { + const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); + return { ...pullRequest, lines }; + } + return pullRequest; + }), + ); const pagination = this.getPagination(response.data); diff --git a/src/services/git/model.ts b/src/services/git/model.ts index b85b9492f..2cdce1848 100644 --- a/src/services/git/model.ts +++ b/src/services/git/model.ts @@ -122,7 +122,7 @@ export interface PullCommits { commit: Commit; } -interface Lines { +export interface Lines { additions: number; deletions: number; changes: number; From 056dbcb4e65b8c15e14864606e23e4a28cfd4cdc Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 14:02:01 +0100 Subject: [PATCH 170/196] test: add test for getting pullrequests with diffStat if `withDiffStat` value is true --- .../bitbucket/BitbucketService.spec.ts | 30 ++++++++++++++----- src/test/helpers/bitbucketNock.ts | 20 +++++++++++-- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 690637fe1..3ad53a218 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -1,18 +1,18 @@ import nock from 'nock'; -import { BitbucketNock } from '../../test/helpers/bitbucketNock'; -import { BitbucketService } from './BitbucketService'; +import { ListGetterOptions, PullRequestState } from '../../inspectors'; import { - getPullRequestResponse, + getIssueCommentsResponse, + getIssueResponse, + getIssuesResponse, getPullCommits, - getRepoCommits, + getPullRequestResponse, getRepoCommit, - getIssuesResponse, - getIssueResponse, - getIssueCommentsResponse, + getRepoCommits, } from '../../services/git/__MOCKS__/bitbucketServiceMockFolder'; +import { BitbucketNock } from '../../test/helpers/bitbucketNock'; import { BitbucketPullRequestState, VCSService } from '../git/IVCSService'; import { VCSServicesUtils } from '../git/VCSServicesUtils'; -import { PullRequestState, ListGetterOptions } from '../../inspectors'; +import { BitbucketService } from './BitbucketService'; describe('Bitbucket Service', () => { let service: BitbucketService; @@ -42,6 +42,20 @@ describe('Bitbucket Service', () => { expect(response).toMatchObject(getOpenPullRequestsResponse); }); + it('returns open pull requests with diffStat in own interface', async () => { + bitbucketNock.getOwnerId(); + bitbucketNock.getApiResponse('pullrequests'); + bitbucketNock.getAdditionsAndDeletions('1'); + + const response = await service.getPullRequests('pypy', 'pypy', { withDiffStat: true }); + const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ + states: BitbucketPullRequestState.open, + withDiffStat: true, + }); + + expect(response).toMatchObject(getOpenPullRequestsResponse); + }); + it('returns all pull requests in own interface', async () => { const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); bitbucketNock.getOwnerId(); diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index 9a350f8ee..df4a82613 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -145,6 +145,7 @@ export class BitbucketNock { mockBitbucketPullRequestsResponse(args: { states?: BitbucketPullRequestState | BitbucketPullRequestState[]; updatedAt?: number; + withDiffStat?: boolean; }): Paginated { const pullRequests: PullRequest[] = []; if (!args.states) { @@ -166,6 +167,11 @@ export class BitbucketNock { perPage: typeof args.states === 'string' ? 1 : args.states.length, totalCount: typeof args.states === 'string' ? 1 : args.states.length, }; + const lines = { + additions: 2, + deletions: 1, + changes: 3, + }; if (typeof args.states !== 'string') { args.states.forEach((state) => { @@ -180,7 +186,11 @@ export class BitbucketNock { ? pullrequest.updatedAt : null; pullrequest.mergedAt = pullrequest.state === BitbucketPullRequestState.closed ? pullrequest.updatedAt : null; - pullRequests.push(pullrequest); + if (args.withDiffStat) { + pullRequests.push({ ...pullrequest, lines }); + } else { + pullRequests.push(pullrequest); + } }); paginatedPullrequests.items = pullRequests; @@ -194,9 +204,13 @@ export class BitbucketNock { ? getPullRequestResponse.updatedAt : null; getPullRequestResponse.mergedAt = args.states === BitbucketPullRequestState.closed ? getPullRequestResponse.updatedAt : null; - - paginatedPullrequests.items = [getPullRequestResponse]; + if (args.withDiffStat) { + paginatedPullrequests.items = [{ ...getPullRequestResponse, lines }]; + } else { + paginatedPullrequests.items = [getPullRequestResponse]; + } } + return paginatedPullrequests; } } From 81cb265570cd6544321269e05dd5c07a4d31c4cb Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 14:12:08 +0100 Subject: [PATCH 171/196] feat: add getPullsDiffStat() in CollaborationInspector; allow to get one specific pull request with diffStat --- src/inspectors/CollaborationInspector.ts | 8 ++++++-- src/inspectors/ICollaborationInspector.ts | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index e3a381079..ef041d313 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -16,8 +16,8 @@ export class CollaborationInspector implements ICollaborationInspector { return this.service.getPullRequests(owner, repo, options); } - async getPullRequest(owner: string, repo: string, prNumber: number) { - return this.service.getPullRequest(owner, repo, prNumber); + async getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean) { + return this.service.getPullRequest(owner, repo, prNumber, withDiffStat); } async getPullRequestFiles(owner: string, repo: string, prNumber: number) { @@ -31,4 +31,8 @@ export class CollaborationInspector implements ICollaborationInspector { async getRepoCommits(owner: string, repo: string, sha?: string) { return this.service.getRepoCommits(owner, repo, sha); } + + async getPullsDiffStat(owner: string, repo: string, prNumber: string) { + return this.service.getPullsDiffStat(owner, repo, prNumber); + } } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 62c5f9924..ab48a416c 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -1,13 +1,14 @@ import { Paginated } from './common/Paginated'; -import { PullCommits, PullFiles, PullRequest, Commit } from '../services/git/model'; +import { PullCommits, PullFiles, PullRequest, Commit, Lines } from '../services/git/model'; import { ListGetterOptions } from './common/ListGetterOptions'; export interface ICollaborationInspector { getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; - getPullRequest(owner: string, repo: string, prNumber: number): Promise; + getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; getRepoCommits(owner: string, repo: string, sha?: string): Promise>; + getPullsDiffStat(owner: string, repo: string, prNumber: string): Promise; } export enum PullRequestState { From 837e8a07e32734d7f7abb4227799bec73bb0754b Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 14:12:23 +0100 Subject: [PATCH 172/196] feat: allow to get one specific pull request with diffStat in GithubService and BitbucketService --- src/services/bitbucket/BitbucketService.ts | 10 ++- src/services/git/GitHubService.ts | 75 ++++++++++++++-------- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index fdfa1c304..efe916b24 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -144,7 +144,7 @@ export class BitbucketService implements IVCSService { return { items, ...pagination }; } - async getPullRequest(owner: string, repo: string, prNumber: number): Promise { + async getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean): Promise { const params = { pull_request_id: prNumber, repo_slug: repo, @@ -156,8 +156,7 @@ export class BitbucketService implements IVCSService { const response = >>await this.client.pullrequests.get(params); response.data; - - return { + const pullRequest = { user: { id: response.data.author.uuid, login: response.data.author.nickname, @@ -187,6 +186,11 @@ export class BitbucketService implements IVCSService { }, }, }; + if (withDiffStat) { + const lines = await this.getPullsDiffStat(owner, repo, `${prNumber}`); + return { ...pullRequest, lines }; + } + return pullRequest; } async getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise> { diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 7cf72e2ee..66144b4d2 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -88,29 +88,38 @@ export class GitHubService implements IVCSService { const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); - const items = response.map((val) => ({ - user: { - id: val.user.id.toString(), - login: val.user.login, - url: val.user.url, - }, - url: val.url, - body: val.body, - createdAt: val.created_at, - updatedAt: val.updated_at, - closedAt: val.closed_at, - mergedAt: val.merged_at, - state: val.state, - id: val.id, - base: { - repo: { - url: val.base.repo.url, - name: val.base.repo.name, - id: val.base.repo.id.toString(), - owner: { url: val.base.repo.owner.url, id: val.base.repo.owner.id.toString(), login: val.base.repo.owner.login }, - }, - }, - })); + const items = await Promise.all( + response.map(async (val) => { + const pullRequest = { + user: { + id: val.user.id.toString(), + login: val.user.login, + url: val.user.url, + }, + url: val.url, + body: val.body, + createdAt: val.created_at, + updatedAt: val.updated_at, + closedAt: val.closed_at, + mergedAt: val.merged_at, + state: val.state, + id: val.id, + base: { + repo: { + url: val.base.repo.url, + name: val.base.repo.name, + id: val.base.repo.id.toString(), + owner: { url: val.base.repo.owner.url, id: val.base.repo.owner.id.toString(), login: val.base.repo.owner.login }, + }, + }, + }; + if (options?.withDiffStat) { + const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); + return { ...pullRequest, lines }; + } + return pullRequest; + }), + ); const pagination = this.getPagination(response.length); return { items, ...pagination }; @@ -119,10 +128,10 @@ export class GitHubService implements IVCSService { /** * Get a single pull request. */ - async getPullRequest(owner: string, repo: string, prNumber: number): Promise { + async getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean): Promise { // eslint-disable-next-line @typescript-eslint/camelcase const response = await this.unwrap(this.client.pulls.get({ owner, repo, pull_number: prNumber })); - return { + const pullRequest = { user: { id: response.data.user.id.toString(), login: response.data.user.login, @@ -149,6 +158,11 @@ export class GitHubService implements IVCSService { }, }, }; + if (withDiffStat) { + const lines = await this.getPullsDiffStat(owner, repo, `${prNumber}`); + return { ...pullRequest, lines }; + } + return pullRequest; } /** @@ -477,6 +491,17 @@ export class GitHubService implements IVCSService { return { items, ...pagination }; } + async getPullsDiffStat(owner: string, repo: string, sha: string) { + // eslint-disable-next-line @typescript-eslint/camelcase + const response = await this.unwrap(this.client.pulls.get({ owner, repo, pull_number: (sha) })); + + return { + additions: response.data.additions, + deletions: response.data.deletions, + changes: response.data.additions + response.data.deletions, + }; + } + /** * Get all results across all pages. */ From 68f1ce6eb245ebd54273a315d38d176eff090111 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Fri, 13 Dec 2019 15:36:07 +0100 Subject: [PATCH 173/196] test: add test to gett pulls in own interface with diffStat --- src/services/git/GitHubService.spec.ts | 24 +++++++++++++++++++++++- src/test/helpers/gitHubNock.ts | 2 -- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index ca2e24d61..b3d44f0bc 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/camelcase */ import nock from 'nock'; import { GitHubService } from './GitHubService'; -import { GitHubNock } from '../../test/helpers/gitHubNock'; +import { GitHubNock, PullRequest } from '../../test/helpers/gitHubNock'; import { getPullsServiceResponse, getPullRequestsReviewsResponse, @@ -26,6 +26,7 @@ import { import { PullRequestState } from '../../inspectors'; import { File } from './model'; import { getRepoCommitsServiceResponse } from './__MOCKS__/gitHubServiceMockFolder/getRepoCommitsServiceResponse.mock'; +import _ from 'lodash'; describe('GitHub Service', () => { let service: GitHubService; @@ -56,6 +57,27 @@ describe('GitHub Service', () => { expect(response).toMatchObject(getPullsServiceResponse); }); + it('returns pulls in own interface with diffStat', async () => { + const params = { + number: 1347, + state: 'open', + title: 'new-feature', + body: 'Please pull these awesome changes', + head: 'new-topic', + base: 'master', + }; + + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([params]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPull(1, params.state, params.title, params.body, params.head, params.base); + + const response = await service.getPullRequests('octocat', 'Hello-World', { withDiffStat: true }); + + const lines = { additions: 1, deletions: 0, changes: 1 }; + const getPullsServiceResponseWithDiffStat = _.cloneDeep(getPullsServiceResponse); + getPullsServiceResponseWithDiffStat.items[0] = { ...getPullsServiceResponseWithDiffStat.items[0], lines }; + expect(response).toMatchObject(getPullsServiceResponseWithDiffStat); + }); + it('returns one pull in own interface', async () => { const pagination = { page: 1, perPage: 1 }; new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( diff --git a/src/test/helpers/gitHubNock.ts b/src/test/helpers/gitHubNock.ts index 62fdbb815..a677c6874 100644 --- a/src/test/helpers/gitHubNock.ts +++ b/src/test/helpers/gitHubNock.ts @@ -72,9 +72,7 @@ export class GitHubNock { head: string, base: string, persist = true, - created_at?: string, - updated_at?: string, ): PullRequest { if (!created_at) { From 57d767a993c90fdc5f9f3900f8d57f8c13e8e89a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Dec 2019 00:42:44 +0000 Subject: [PATCH 174/196] fix(deps): pin dependencies --- package.json | 16 ++++++++-------- yarn.lock | 34 +++++++++++++++++----------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index df05574c0..16fb44418 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,9 @@ "@octokit/rest": "16.35.0", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", - "@types/table": "^4.0.7", - "@types/qs": "^6.9.0", - "@types/yaml": "^1.2.0", + "@types/table": "4.0.7", + "@types/qs": "6.9.0", + "@types/yaml": "1.2.0", "axios": "0.19.0", "bitbucket": "1.15.2", "colors": "1.4.0", @@ -47,24 +47,24 @@ "inversify": "5.0.1", "js-yaml": "3.13.1", "lodash": "4.17.15", - "moment": "^2.24.0", + "moment": "2.24.0", "memfs": "3.0.1", "node-filter-async": "1.1.3", "npm-check-updates": "3.2.2", "oclif": "1.15.1", - "parse-commit-message": "^3.2.3", - "qs": "^6.9.1", + "parse-commit-message": "3.2.3", + "qs": "6.9.1", "reflect-metadata": "0.1.13", "semver": "6.3.0", "simple-git": "1.126.0", - "table": "^5.4.6", + "table": "5.4.6", "toposort": "2.0.2", "ts-node": "8.5.4", "tslib": "1.10.0", "typescript": "3.7.2", "update-notifier": "3.0.1", "xml2js": "0.4.22", - "yaml": "^1.7.2" + "yaml": "1.7.2" }, "devDependencies": { "@semantic-release/changelog": "3.0.6", diff --git a/yarn.lock b/yarn.lock index 11f10635c..b39e75e25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -843,7 +843,7 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/qs@^6.9.0": +"@types/qs@6.9.0": version "6.9.0" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.0.tgz#2a5fa918786d07d3725726f7f650527e1cfeaffd" integrity sha512-c4zji5CjWv1tJxIZkz1oUtGcdOlsH3aza28Nqmm+uNDWBRHoMsjooBEN4czZp1V3iXPihE/VRUOBqg+4Xq0W4g== @@ -871,7 +871,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/table@^4.0.7": +"@types/table@4.0.7": version "4.0.7" resolved "https://registry.yarnpkg.com/@types/table/-/table-4.0.7.tgz#c21100d37d4924abbbde85414170260d4d7b0316" integrity sha512-HKtXvBxU8U8evZCSlUi9HbfT/SFW7nSGCoiBEheB06jAhXeW6JbGh8biEAqIFG5rZo9f8xeJVdIn455sddmIcw== @@ -893,7 +893,7 @@ dependencies: "@types/node" "*" -"@types/yaml@^1.2.0": +"@types/yaml@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.2.0.tgz#4ed577fc4ebbd6b829b28734e56d10c9e6984e09" integrity sha512-GW8b9qM+ebgW3/zjzPm0I1NxMvLaz/YKT9Ph6tTb+Fkeyzd9yLTvQ6ciQ2MorTRmb/qXmfjMerRpG4LviixaqQ== @@ -5952,7 +5952,7 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.24.0: +moment@2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -6921,7 +6921,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-commit-message@^3.2.3: +parse-commit-message@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/parse-commit-message/-/parse-commit-message-3.2.3.tgz#96a0b2e3fb295aece355d3a8bd326b6a6f555372" integrity sha512-JujCvCYUrjhmaRHb2AuzR9mAos9JE/5+ZftAaFoGtPhoJ9KNQcgx6JtrWGmGFkVjfky5qTBRjzJeFZla1Po0/A== @@ -7313,7 +7313,7 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@^6.9.1: +qs@6.9.1: version "6.9.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== @@ -8658,6 +8658,16 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@5.4.6: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + table@^5.2.3: version "5.4.1" resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" @@ -8668,16 +8678,6 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^5.4.6: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - taketalk@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/taketalk/-/taketalk-1.0.0.tgz#b4d4f0deed206ae7df775b129ea2ca6de52f26dd" @@ -9616,7 +9616,7 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yaml@^1.7.2: +yaml@1.7.2, yaml@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== From a6f011c849c0de4764377d3ad51bd4d66c96f32a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Dec 2019 01:37:27 +0000 Subject: [PATCH 175/196] chore(release): 1.26.1 [skip ci] ## [1.26.1](https://github.com/dxheroes/dx-scanner/compare/v1.26.0...v1.26.1) (2019-12-16) ### Bug Fixes * **deps:** pin dependencies ([57d767a](https://github.com/dxheroes/dx-scanner/commit/57d767a)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e991aa15c..9cf4c3d20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.26.1](https://github.com/dxheroes/dx-scanner/compare/v1.26.0...v1.26.1) (2019-12-16) + + +### Bug Fixes + +* **deps:** pin dependencies ([57d767a](https://github.com/dxheroes/dx-scanner/commit/57d767a)) + # [1.26.0](https://github.com/dxheroes/dx-scanner/compare/v1.25.0...v1.26.0) (2019-12-11) diff --git a/package.json b/package.json index 16fb44418..a1da09933 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.26.0", + "version": "1.26.1", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 96f59c9e9cf1acc484b2721daa7f42a366ee04aa Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Dec 2019 01:37:57 +0000 Subject: [PATCH 176/196] fix(deps): update all non-major dependencies --- package.json | 18 ++++----- yarn.lock | 109 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 73 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index a1da09933..87f3dce71 100644 --- a/package.json +++ b/package.json @@ -27,15 +27,15 @@ "dependencies": { "@oclif/command": "1.5.19", "@oclif/config": "1.13.3", - "@oclif/plugin-help": "2.2.1", - "@octokit/rest": "16.35.0", + "@oclif/plugin-help": "2.2.3", + "@octokit/rest": "16.35.2", "@types/eslint": "6.1.3", "@types/js-yaml": "3.12.1", "@types/table": "4.0.7", "@types/qs": "6.9.0", "@types/yaml": "1.2.0", "axios": "0.19.0", - "bitbucket": "1.15.2", + "bitbucket": "1.17.0", "colors": "1.4.0", "cross-env": "6.0.3", "debug": "4.1.1", @@ -56,12 +56,12 @@ "qs": "6.9.1", "reflect-metadata": "0.1.13", "semver": "6.3.0", - "simple-git": "1.126.0", + "simple-git": "1.129.0", "table": "5.4.6", "toposort": "2.0.2", "ts-node": "8.5.4", "tslib": "1.10.0", - "typescript": "3.7.2", + "typescript": "3.7.3", "update-notifier": "3.0.1", "xml2js": "0.4.22", "yaml": "1.7.2" @@ -74,17 +74,17 @@ "@types/glob": "7.1.1", "@types/jest": "24.0.23", "@types/lodash": "4.14.149", - "@types/node": "12.12.14", + "@types/node": "12.12.17", "@types/rimraf": "2.0.3", "@types/semver": "6.2.0", "@types/toposort": "2.0.3", "@types/update-notifier": "2.5.0", "@types/xml2js": "0.4.5", - "@typescript-eslint/eslint-plugin": "2.9.0", - "@typescript-eslint/parser": "2.9.0", + "@typescript-eslint/eslint-plugin": "2.11.0", + "@typescript-eslint/parser": "2.11.0", "codecov": "3.6.1", "eslint-config-prettier": "6.7.0", - "eslint-plugin-prettier": "3.1.1", + "eslint-plugin-prettier": "3.1.2", "jest": "24.9.0", "nock": "11.7.0", "prettier": "1.19.1", diff --git a/yarn.lock b/yarn.lock index b39e75e25..70e587c70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -445,7 +445,21 @@ chalk "^2.4.2" tslib "^1.9.3" -"@oclif/plugin-help@2.2.1", "@oclif/plugin-help@^2": +"@oclif/plugin-help@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.3.tgz#b993041e92047f0e1762668aab04d6738ac06767" + integrity sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g== + dependencies: + "@oclif/command" "^1.5.13" + chalk "^2.4.1" + indent-string "^4.0.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-help@^2": version "2.2.1" resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.1.tgz#cb4d23e453b19340b07c48fb299948b7c74366d3" integrity sha512-psEA3t41MSGBErLk6xCaAq2jKrRtx3Br+kHpd43vZeGEeZ7Gos4wgK0JAaHBbvhvUQskCHg8dzoqv4XEeTWeVQ== @@ -548,10 +562,10 @@ once "^1.4.0" universal-user-agent "^4.0.0" -"@octokit/rest@16.35.0": - version "16.35.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.35.0.tgz#7ccc1f802f407d5b8eb21768c6deca44e7b4c0d8" - integrity sha512-9ShFqYWo0CLoGYhA1FdtdykJuMzS/9H6vSbbQWDX4pWr4p9v+15MsH/wpd/3fIU+tSxylaNO48+PIHqOkBRx3w== +"@octokit/rest@16.35.2": + version "16.35.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.35.2.tgz#0098c9e2a895d4afb0fa6578479283553543143c" + integrity sha512-iijaNZpn9hBpUdh8YdXqNiWazmq4R1vCUsmxpBB0kCQ0asHZpCx+HNs22eiHuwYKRhO31ZSAGBJLi0c+3XHaKQ== dependencies: "@octokit/request" "^5.2.0" "@octokit/request-error" "^1.0.2" @@ -828,10 +842,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031" integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ== -"@types/node@12.12.14": - version "12.12.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" - integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== +"@types/node@12.12.17": + version "12.12.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" + integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -910,40 +924,40 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.9.0.tgz#fa810282c0e45f6c2310b9c0dfcd25bff97ab7e9" - integrity sha512-98rfOt3NYn5Gr9wekTB8TexxN6oM8ZRvYuphPs1Atfsy419SDLYCaE30aJkRiiTCwGEY98vOhFsEVm7Zs4toQQ== +"@typescript-eslint/eslint-plugin@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.11.0.tgz#4477c33491ccf0a9a3f4a30ef84978fa0ea0cad2" + integrity sha512-G2HHA1vpMN0EEbUuWubiCCfd0R3a30BB+UdvnFkxwZIxYEGOrWEXDv8tBFO9f44CWc47Xv9lLM3VSn4ORLI2bA== dependencies: - "@typescript-eslint/experimental-utils" "2.9.0" + "@typescript-eslint/experimental-utils" "2.11.0" eslint-utils "^1.4.3" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.9.0.tgz#bbe99a8d9510240c055fc4b17230dd0192ba3c7f" - integrity sha512-0lOLFdpdJsCMqMSZT7l7W2ta0+GX8A3iefG3FovJjrX+QR8y6htFlFdU7aOVPL6pDvt6XcsOb8fxk5sq+girTw== +"@typescript-eslint/experimental-utils@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.11.0.tgz#cef18e6b122706c65248a5d8984a9779ed1e52ac" + integrity sha512-YxcA/y0ZJaCc/fB/MClhcDxHI0nOBB7v2/WxBju2cOTanX7jO9ttQq6Fy4yW9UaY5bPd9xL3cun3lDVqk67sPQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.9.0" + "@typescript-eslint/typescript-estree" "2.11.0" eslint-scope "^5.0.0" -"@typescript-eslint/parser@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.9.0.tgz#2e9cf438de119b143f642a3a406e1e27eb70b7cd" - integrity sha512-fJ+dNs3CCvEsJK2/Vg5c2ZjuQ860ySOAsodDPwBaVlrGvRN+iCNC8kUfLFL8cT49W4GSiLPa/bHiMjYXA7EhKQ== +"@typescript-eslint/parser@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.11.0.tgz#cdcc3be73ee31cbef089af5ff97ccaa380ef6e8b" + integrity sha512-DyGXeqhb3moMioEFZIHIp7oXBBh7dEfPTzGrlyP0Mi9ScCra4SWEGs3kPd18mG7Sy9Wy8z88zmrw5tSGL6r/6A== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.9.0" - "@typescript-eslint/typescript-estree" "2.9.0" + "@typescript-eslint/experimental-utils" "2.11.0" + "@typescript-eslint/typescript-estree" "2.11.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.9.0.tgz#09138daf8f47d0e494ba7db9e77394e928803017" - integrity sha512-v6btSPXEWCP594eZbM+JCXuFoXWXyF/z8kaSBSdCb83DF+Y7+xItW29SsKtSULgLemqJBT+LpT+0ZqdfH7QVmA== +"@typescript-eslint/typescript-estree@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.11.0.tgz#21ada6504274cd1644855926312c798fc697e9fb" + integrity sha512-HGY4+d4MagO6cKMcKfIKaTMxcAv7dEVnji2Zi+vi5VV8uWAM631KjAB5GxFcexMYrwKT0EekRiiGK1/Sd7VFGA== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -1433,10 +1447,10 @@ binaryextensions@^2.1.2: resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== -bitbucket@1.15.2: - version "1.15.2" - resolved "https://registry.yarnpkg.com/bitbucket/-/bitbucket-1.15.2.tgz#da1f0c6a5a8b2da60ba88bf56a79b7cab0d77e93" - integrity sha512-g1i7IQOspL5sFXyjRQL6PlmU0N24T2BMirLsRVt415NvkozgjJMp3vFh4dj/2LMszI1kh5TodAj9cUFyuRh/bA== +bitbucket@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/bitbucket/-/bitbucket-1.17.0.tgz#40a7cef8b933827fe31751854f0fa8bd9fad1813" + integrity sha512-MgWlQd6iBHRxNrKcqFZkpu0xBx7ajRGMZ2TgrRglf2u3ASvaW6PzEviQNLhaWoelS2nG3DjhhEv2d+ClajQqXQ== dependencies: before-after-hook "^1.4.0" btoa-lite "^1.0.0" @@ -2842,10 +2856,10 @@ eslint-plugin-eslint-plugin@2.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5" integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg== -eslint-plugin-prettier@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" - integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== +eslint-plugin-prettier@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" + integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== dependencies: prettier-linter-helpers "^1.0.0" @@ -4054,6 +4068,11 @@ indent-string@^3.0.0, indent-string@^3.2.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -8133,10 +8152,10 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" -simple-git@1.126.0: - version "1.126.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.126.0.tgz#0c345372275139c8433b8277f4b3e155092aa434" - integrity sha512-47mqHxgZnN8XRa9HbpWprzUv3Ooqz9RY/LSZgvA7jCkW8jcwLahMz7LKugY91KZehfG0sCVPtgXiU72hd6b1Bw== +simple-git@1.129.0: + version "1.129.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.129.0.tgz#eddd2611d2bf41c77e1d08cd70c0b7f3af785040" + integrity sha512-XbzNmugMTeV2crZnPl+b1ZJn+nqXCUNyrZxDXpLM0kHL3B85sbPlpd8q9I4qtAHI9D2FxTB6w4BuiAGKYtyzKw== dependencies: debug "^4.0.1" @@ -9007,10 +9026,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" - integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== +typescript@3.7.3: + version "3.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" + integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== uglify-js@^3.1.4: version "3.6.0" From 204ff8e1fa09ab1f14db236562680ef21a973979 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Dec 2019 02:49:28 +0000 Subject: [PATCH 177/196] chore(release): 1.26.2 [skip ci] ## [1.26.2](https://github.com/dxheroes/dx-scanner/compare/v1.26.1...v1.26.2) (2019-12-16) ### Bug Fixes * **deps:** update all non-major dependencies ([96f59c9](https://github.com/dxheroes/dx-scanner/commit/96f59c9)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cf4c3d20..8e7cfbb1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.26.2](https://github.com/dxheroes/dx-scanner/compare/v1.26.1...v1.26.2) (2019-12-16) + + +### Bug Fixes + +* **deps:** update all non-major dependencies ([96f59c9](https://github.com/dxheroes/dx-scanner/commit/96f59c9)) + ## [1.26.1](https://github.com/dxheroes/dx-scanner/compare/v1.26.0...v1.26.1) (2019-12-16) diff --git a/package.json b/package.json index 87f3dce71..0a290789d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.26.1", + "version": "1.26.2", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 373ce006a4e9683e420e2598369c20e08c891247 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Dec 2019 02:50:20 +0000 Subject: [PATCH 178/196] fix(deps): update dependency update-notifier to v4 --- package.json | 2 +- yarn.lock | 205 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 184 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 0a290789d..5bd022f3f 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ts-node": "8.5.4", "tslib": "1.10.0", "typescript": "3.7.3", - "update-notifier": "3.0.1", + "update-notifier": "4.0.0", "xml2js": "0.4.22", "yaml": "1.7.2" }, diff --git a/yarn.lock b/yarn.lock index 70e587c70..aa193205e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1133,7 +1133,7 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== @@ -1496,6 +1496,20 @@ boxen@^3.0.0: type-fest "^0.3.0" widest-line "^2.0.0" +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1754,6 +1768,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.3.tgz#5ce6e01618e47048ac22f34f7f39db5c6fd679ef" @@ -2196,6 +2218,18 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.0.tgz#37de662c7a49b5fe8dbcf8f6f5818d2d81ed852b" + integrity sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ== + dependencies: + dot-prop "^5.1.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -2388,6 +2422,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" @@ -2670,6 +2709,13 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dot-prop@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + dotenv@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" @@ -3633,6 +3679,13 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-dirs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" + integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== + dependencies: + ini "^1.3.5" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3818,6 +3871,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" @@ -4376,6 +4434,14 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-installed-globally@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.1.tgz#679afef819347a72584617fd19497f010b8ed35f" + integrity sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -4386,6 +4452,11 @@ is-npm@^3.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -4403,6 +4474,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -4415,6 +4491,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -4499,7 +4580,7 @@ is-text-path@^1.0.0: dependencies: text-extensions "^1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -5642,6 +5723,13 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + make-error@1.x, make-error@^1.1.1: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" @@ -8045,6 +8133,13 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + semver-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" @@ -8506,6 +8601,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.0.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" @@ -8515,15 +8619,6 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" -string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -8664,6 +8759,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" @@ -8746,6 +8848,11 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +term-size@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2" + integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg== + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -9021,6 +9128,13 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9100,6 +9214,13 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unist-util-is@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" @@ -9180,23 +9301,23 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -update-notifier@3.0.1, update-notifier@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250" - integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ== +update-notifier@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.0.0.tgz#f344a6f8b03e00e31b323d632a0e632e9f0e0654" + integrity sha512-p9zf71hWt5GVXM4iEBujpUgx8mK9AWiCCapEJm/O1z5ntCim83Z1ATqzZFBHFYqx03laMqv8LiDgs/7ikXjf/g== dependencies: - boxen "^3.0.0" - chalk "^2.0.1" - configstore "^4.0.0" + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.0" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.1.0" - is-npm "^3.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" is-yarn-global "^0.3.0" latest-version "^5.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" update-notifier@^2.3.0, update-notifier@^2.5.0: version "2.5.0" @@ -9214,6 +9335,24 @@ update-notifier@^2.3.0, update-notifier@^2.5.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +update-notifier@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250" + integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ== + dependencies: + boxen "^3.0.0" + chalk "^2.0.1" + configstore "^4.0.0" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.1.0" + is-npm "^3.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -9466,6 +9605,13 @@ widest-line@^2.0.0, widest-line@^2.0.1: dependencies: string-width "^2.1.1" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + windows-release@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" @@ -9562,6 +9708,16 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.3: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" + integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -9586,6 +9742,11 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" From 2c33c1719b794f73370fbfdab0df91aa963798b1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 13:21:54 +0100 Subject: [PATCH 179/196] fix: Add comments --- src/services/bitbucket/BitbucketService.ts | 2 ++ src/services/git/GitHubService.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index efe916b24..9111b9718 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -131,6 +131,7 @@ export class BitbucketService implements IVCSService { }, }, }; + // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true if (options?.withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; @@ -186,6 +187,7 @@ export class BitbucketService implements IVCSService { }, }, }; + // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true if (withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${prNumber}`); return { ...pullRequest, lines }; diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 66144b4d2..e0fbf3ad5 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -113,6 +113,7 @@ export class GitHubService implements IVCSService { }, }, }; + // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true if (options?.withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; @@ -158,6 +159,7 @@ export class GitHubService implements IVCSService { }, }, }; + // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true if (withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${prNumber}`); return { ...pullRequest, lines }; From 5dcf8796217c8c2f3e9599e6eb6b9a3d98c13df1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 13:42:23 +0100 Subject: [PATCH 180/196] fix: remove unnecessary code --- src/services/git/GitHubService.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index e0fbf3ad5..54e9a4963 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -507,14 +507,7 @@ export class GitHubService implements IVCSService { /** * Get all results across all pages. */ - private async paginate( - uri: string, - owner: string, - repo: string, - prNumber?: number, - issueNumber?: number, - options?: ListGetterOptions<{ state?: PullRequestState }>, - ) { + private async paginate(uri: string, owner: string, repo: string, prNumber?: number, issueNumber?: number) { const object = { owner: owner, repo: repo, @@ -528,11 +521,6 @@ export class GitHubService implements IVCSService { Object.assign(object, { issue_number: issueNumber }); } - if (options?.pagination) { - // eslint-disable-next-line @typescript-eslint/camelcase - Object.assign(object, { page: options.pagination.page, per_page: options.pagination.perPage }); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any return this.client.paginate(uri, object, (response: Octokit.Response) => { this.debugGitHubResponse(response); From f11ac89b7a1495931b4f85f3f4e911cb53afa117 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 14:09:08 +0100 Subject: [PATCH 181/196] fix: use method to get an email and fix test after that --- src/services/bitbucket/BitbucketService.ts | 2 +- .../__MOCKS__/bitbucketServiceMockFolder/getPullCommits.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 9111b9718..487f505dd 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -216,7 +216,7 @@ export class BitbucketService implements IVCSService { message: val.message, author: { name: val.author.raw, - email: 'undefined', + email: this.extractEmailFromString(val.author.raw) || '', date: val.date, }, tree: { diff --git a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits.ts b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits.ts index 196989358..500efef42 100644 --- a/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits.ts +++ b/src/services/git/__MOCKS__/bitbucketServiceMockFolder/getPullCommits.ts @@ -8,7 +8,7 @@ export const getPullCommits: Paginated = { commit: { url: 'https://bitbucket.org/ashwinahuja/pypy/commits/f799951483319e5397d41019de50f8e07b01b04f', message: 'Remove the duplicated (unnecessary items)', - author: { name: 'ashwinahuja', email: 'undefined', date: '2018-09-13T16:19:32+00:00' }, + author: { name: 'ashwinahuja', email: '', date: '2018-09-13T16:19:32+00:00' }, tree: { sha: 'f799951483319e5397d41019de50f8e07b01b04f', url: 'https://bitbucket.org/ashwinahuja/pypy/commits/f799951483319e5397d41019de50f8e07b01b04f', @@ -21,7 +21,7 @@ export const getPullCommits: Paginated = { commit: { url: 'https://bitbucket.org/ashwinahuja/pypy/commits/0e3d572c47c60df4760e541da6a05e5e305d6175', message: 'Making datetime objects more compatible with old C extensions written for CPython', - author: { name: 'ashwinahuja', email: 'undefined', date: '2018-09-13T16:14:59+00:00' }, + author: { name: 'ashwinahuja', email: '', date: '2018-09-13T16:14:59+00:00' }, tree: { sha: '0e3d572c47c60df4760e541da6a05e5e305d6175', url: 'https://bitbucket.org/ashwinahuja/pypy/commits/0e3d572c47c60df4760e541da6a05e5e305d6175', From eacdd7bfd43fe959841e7dd37f0d1dfd9dc10350 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 14:17:34 +0100 Subject: [PATCH 182/196] fix: value name --- src/services/bitbucket/BitbucketService.ts | 4 ++-- src/services/git/GitHubService.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 487f505dd..64548dcf7 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -387,8 +387,8 @@ export class BitbucketService implements IVCSService { throw new Error('Method not implemented yet.'); } - async getPullsDiffStat(owner: string, repo: string, sha: string) { - const diffStatData = (await this.client.pullrequests.getDiffStat({ repo_slug: repo, username: owner, pull_request_id: sha })).data; + async getPullsDiffStat(owner: string, repo: string, prNumber: string) { + const diffStatData = (await this.client.pullrequests.getDiffStat({ repo_slug: repo, username: owner, pull_request_id: prNumber })).data; let linesRemoved = 0, linesAdded = 0; diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 54e9a4963..3c79eee7d 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -493,9 +493,9 @@ export class GitHubService implements IVCSService { return { items, ...pagination }; } - async getPullsDiffStat(owner: string, repo: string, sha: string) { + async getPullsDiffStat(owner: string, repo: string, prNumber: string) { // eslint-disable-next-line @typescript-eslint/camelcase - const response = await this.unwrap(this.client.pulls.get({ owner, repo, pull_number: (sha) })); + const response = await this.unwrap(this.client.pulls.get({ owner, repo, pull_number: (prNumber) })); return { additions: response.data.additions, From ce5f8a7aabf691d24d9b1c48101bbf96c79075d0 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 14:40:57 +0100 Subject: [PATCH 183/196] refactor: use options so it's not necessary to follow the order of values. --- .../bitbucket/BitbucketService.spec.ts | 24 +++---- src/test/helpers/bitbucketNock.ts | 64 +++++++++---------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 3ad53a218..42ac21fb7 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -26,7 +26,7 @@ describe('Bitbucket Service', () => { it('returns open pull requests in own interface', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests'); + bitbucketNock.getApiResponse({ resource: 'pullrequests' }); const response = await service.getPullRequests('pypy', 'pypy'); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); @@ -35,7 +35,7 @@ describe('Bitbucket Service', () => { it('returns one open pull requests in own interface', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open, { page: 1, perPage: 1 }); + bitbucketNock.getApiResponse({ resource: 'pullrequests', state: BitbucketPullRequestState.open, pagination: { page: 1, perPage: 1 } }); const response = await service.getPullRequests('pypy', 'pypy', { pagination: { page: 1, perPage: 1 } }); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open }); @@ -44,7 +44,7 @@ describe('Bitbucket Service', () => { it('returns open pull requests with diffStat in own interface', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests'); + bitbucketNock.getApiResponse({ resource: 'pullrequests' }); bitbucketNock.getAdditionsAndDeletions('1'); const response = await service.getPullRequests('pypy', 'pypy', { withDiffStat: true }); @@ -59,7 +59,7 @@ describe('Bitbucket Service', () => { it('returns all pull requests in own interface', async () => { const state = VCSServicesUtils.getPRState(PullRequestState.all, VCSService.bitbucket); bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, state); + bitbucketNock.getApiResponse({ resource: 'pullrequests', state: state }); const response = await service.getPullRequests('pypy', 'pypy', { filter: { state: PullRequestState.all } }); const allPullrequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: state }); @@ -69,35 +69,35 @@ describe('Bitbucket Service', () => { it('returns specific pull request in own interface', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', 1); + bitbucketNock.getApiResponse({ resource: 'pullrequests', id: 1 }); const response = await service.getPullRequest('pypy', 'pypy', 1); expect(response).toMatchObject(getPullRequestResponse); }); it('returns pullrequest commits in own interface', async () => { - bitbucketNock.getApiResponse('pullrequests', 622, 'commits'); + bitbucketNock.getApiResponse({ resource: 'pullrequests', id: 622, value: 'commits' }); const response = await service.getPullCommits('pypy', 'pypy', 622); expect(response).toMatchObject(getPullCommits); }); it('returns issues in own interface', async () => { - bitbucketNock.getApiResponse('issues'); + bitbucketNock.getApiResponse({ resource: 'issues' }); const response = await service.getIssues('pypy', 'pypy'); expect(response).toMatchObject(getIssuesResponse); }); it('returns issue in own interface', async () => { - bitbucketNock.getApiResponse('issues', 3086); + bitbucketNock.getApiResponse({ resource: 'issues', id: 3086 }); const response = await service.getIssue('pypy', 'pypy', 3086); expect(response).toMatchObject(getIssueResponse); }); it('returns issue comments in own interface', async () => { - bitbucketNock.getApiResponse('issues', 3086, 'comments'); + bitbucketNock.getApiResponse({ resource: 'issues', id: 3086, value: 'comments' }); const response = await service.getIssueComments('pypy', 'pypy', 3086); expect(response).toMatchObject(getIssueCommentsResponse); @@ -111,7 +111,7 @@ describe('Bitbucket Service', () => { }; bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.closed); + bitbucketNock.getApiResponse({ resource: 'pullrequests', state: BitbucketPullRequestState.closed }); const response = await service.getPullRequests('pypy', 'pypy', state); const getMergedPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.closed }); @@ -120,14 +120,14 @@ describe('Bitbucket Service', () => { }); it('returns repo commits in own interface', async () => { - bitbucketNock.getApiResponse('commits'); + bitbucketNock.getApiResponse({ resource: 'commits' }); const response = await service.getRepoCommits('pypy', 'pypy'); expect(response).toMatchObject(getRepoCommits); }); it('returns one commit in own interface', async () => { - bitbucketNock.getApiResponse('commit', '961b3a27'); + bitbucketNock.getApiResponse({ resource: 'commit', id: '961b3a27' }); const response = await service.getCommit('pypy', 'pypy', '961b3a27'); expect(response).toMatchObject(getRepoCommit); diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index df4a82613..6ffe09993 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -19,77 +19,77 @@ export class BitbucketNock { this.url = 'https://api.bitbucket.org/2.0'; } - getApiResponse( - resource: string, - id?: number | string, - value?: string, - state?: BitbucketPullRequestState | BitbucketPullRequestState[], - pagination?: PaginationParams, - ): nock.Scope { - let url = `${this.url}/repositories/${this.user}/${this.repoName}/${resource}`; + getApiResponse(options: { + resource: string; + id?: number | string; + value?: string; + state?: BitbucketPullRequestState | BitbucketPullRequestState[]; + pagination?: PaginationParams; + }): nock.Scope { + let url = `${this.url}/repositories/${this.user}/${this.repoName}/${options.resource}`; let response; let params = {}; const persist = true; - if (state === undefined) { - state = BitbucketPullRequestState.open; + if (options.state === undefined) { + options.state = BitbucketPullRequestState.open; } - if (value !== undefined) { - switch (value) { + if (options.value !== undefined) { + switch (options.value) { case 'comments': - url = url.concat(`/${id}/${value}`); + url = url.concat(`/${options.id}/${options.value}`); response = new IssueCommentsMock().issueComments; break; case 'commits': - url = url.concat(`/${id}/${value}`); + url = url.concat(`/${options.id}/${options.value}`); response = new CommitsMock().commits; break; } } else { - switch (resource) { + switch (options.resource) { case 'pullrequests': - if (id !== undefined) { - url = url.concat(`/${id}`); - response = new PullRequestMock(state).pullRequest; + if (options.id !== undefined) { + url = url.concat(`/${options.id}`); + response = new PullRequestMock(options.state).pullRequest; } else { - if (state === BitbucketPullRequestState.open) { - const pullRequest = new PullRequestMock(state).pullRequest; + if (options.state === BitbucketPullRequestState.open) { + const pullRequest = new PullRequestMock(options.state).pullRequest; response = new PullRequestsMock([pullRequest]).pullrequests; } else { - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); + const stateForUri = qs.stringify({ state: options.state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); url = url.concat(`${stateForUri}`); - params = { state: state }; + params = { state: options.state }; - if (typeof state !== 'string') { + if (typeof options.state !== 'string') { const pullRequests: Bitbucket.Schema.Pullrequest[] = []; - state.forEach((state) => { + options.state.forEach((state) => { pullRequests.push(new PullRequestMock(state).pullRequest); }); response = new PullRequestsMock(pullRequests).pullrequests; } else { - const pullRequest = new PullRequestMock(state).pullRequest; + const pullRequest = new PullRequestMock(options.state).pullRequest; response = new PullRequestsMock([pullRequest]).pullrequests; } } - if (pagination) { + if (options.pagination) { const paginationForUri = qs.stringify( - { page: pagination?.page, pagelen: pagination?.perPage }, + { page: options.pagination?.page, pagelen: options.pagination?.perPage }, { addQueryPrefix: true, indices: false }, ); - params = { page: pagination.page, pagelen: pagination.perPage }; + params = { page: options.pagination.page, pagelen: options.pagination.perPage }; url = url.concat(`${paginationForUri}`); - const pullRequest = new PullRequestMock(state).pullRequest; + const pullRequest = new PullRequestMock(options.state).pullRequest; response = new PullRequestsMock([pullRequest]).pullrequests; } } break; case 'issues': - if (id !== undefined) { - url = url.concat(`/${id}`); + if (options.id !== undefined) { + url = url.concat(`/${options.id}`); response = new IssueMock().issue; } else { response = new IssuesMock().issues; @@ -99,7 +99,7 @@ export class BitbucketNock { response = new RepoCommitsMock().repoCommits; break; case 'commit': - url = url.concat(`/${id}`); + url = url.concat(`/${options.id}`); response = new RepoCommitMock().repoCommit; break; default: From adcec0830432c04f5ce1e8db07651912dca8660e Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 14:50:31 +0100 Subject: [PATCH 184/196] fix: rename value --- src/test/helpers/bitbucketNock.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/helpers/bitbucketNock.ts b/src/test/helpers/bitbucketNock.ts index 6ffe09993..e3ea349ea 100644 --- a/src/test/helpers/bitbucketNock.ts +++ b/src/test/helpers/bitbucketNock.ts @@ -118,8 +118,8 @@ export class BitbucketNock { return BitbucketNock.get(url, params, persist).reply(200, response); } - getAdditionsAndDeletions(sha: string) { - const url = `${this.url}/repositories/${this.user}/${this.repoName}/pullrequests/${sha}/diffstat`; + getAdditionsAndDeletions(prNumber: string) { + const url = `${this.url}/repositories/${this.user}/${this.repoName}/pullrequests/${prNumber}/diffstat`; const params = {}; const persist = true; From 35f27d5759836a789493ac786fb8e1c4e79e89f1 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 14:50:52 +0100 Subject: [PATCH 185/196] fix: adding values --- .../TimeToSolvePullRequestsPractice.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts index b0248e7e3..dfcddae0c 100644 --- a/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts +++ b/src/practices/LanguageIndependent/TimeToSolvePullRequestsPractice.spec.ts @@ -35,7 +35,7 @@ describe('TimeToSolvePullRequestsPractice', () => { it('returns practicing if there are open pullrequests updated or created less than 30 days from now', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); + bitbucketNock.getApiResponse({ resource: 'pullrequests', state: BitbucketPullRequestState.open }); const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(10, 'days').asMilliseconds() }; mockCollaborationInspector.getPullRequests = async () => { return bitbucketNock.mockBitbucketPullRequestsResponse(args); @@ -51,7 +51,7 @@ describe('TimeToSolvePullRequestsPractice', () => { it('returns practicing if there are open pullrequests updated or created more than 30 days from now', async () => { bitbucketNock.getOwnerId(); - bitbucketNock.getApiResponse('pullrequests', undefined, undefined, BitbucketPullRequestState.open); + bitbucketNock.getApiResponse({ resource: 'pullrequests', state: BitbucketPullRequestState.open }); const args = { states: BitbucketPullRequestState.open, updatedAt: Date.now() - moment.duration(100, 'days').asMilliseconds() }; mockCollaborationInspector.getPullRequests = async () => { return bitbucketNock.mockBitbucketPullRequestsResponse(args); From 67fd111a5f76a746526fb237ea65654375d99522 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 15:01:29 +0100 Subject: [PATCH 186/196] refactor: use options so it's not necessary to follow the order of values. --- src/test/helpers/gitHubNock.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/test/helpers/gitHubNock.ts b/src/test/helpers/gitHubNock.ts index a677c6874..6db95ec82 100644 --- a/src/test/helpers/gitHubNock.ts +++ b/src/test/helpers/gitHubNock.ts @@ -61,7 +61,7 @@ export class GitHubNock { ); }); - return this.getPullsInternal(undefined, queryState, responseBody, persist, pagination); + return this.getPullsInternal({ state: queryState, pulls: responseBody, persist: persist, pagination: pagination }); } getPull( @@ -93,7 +93,7 @@ export class GitHubNock { updated_at, ); - return this.getPullsInternal(number, undefined, responseBody, persist, undefined); + return this.getPullsInternal({ number: number, pulls: responseBody, persist: persist }); } getContributors(contributors: { id: string; login: string }[], persist = true): Contributor[] { @@ -115,26 +115,26 @@ export class GitHubNock { return contents; } - private getPullsInternal( - number: number | undefined, - state: string | undefined, - pulls: T, - persist = true, - pagination: { page: number; perPage: number } | undefined, - ): T { - const url = this.repository.pulls_url.replace('{/number}', number !== undefined ? `/${number}` : ''); + private getPullsInternal(options: { + number?: number | undefined; + state?: string | undefined; + pulls: T; + persist: boolean; + pagination?: { page: number; perPage: number } | undefined; + }): T { + const url = this.repository.pulls_url.replace('{/number}', options.number !== undefined ? `/${options.number}` : ''); const params: nock.DataMatcherMap = {}; - if (state !== undefined) { - params.state = state; + if (options.state !== undefined) { + params.state = options.state; } - if (pagination) { - params.page = pagination.page; - params.per_page = pagination.perPage; + if (options.pagination) { + params.page = options.pagination.page; + params.per_page = options.pagination.perPage; } - GitHubNock.get(url, params, persist).reply(200, pulls); - return pulls; + GitHubNock.get(url, params, options.persist).reply(200, options.pulls); + return options.pulls; } getCommits(persist = true): nock.Interceptor { From 548f46936130a91678437ec13a5e6c2e428f4b49 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 15:18:22 +0100 Subject: [PATCH 187/196] refactor: use options so it's not necessary to follow the order of values. --- src/services/git/GitHubService.spec.ts | 65 ++++++++++++++++---------- src/test/helpers/gitHubNock.ts | 24 ++++++---- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index b3d44f0bc..24e344f4d 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -49,9 +49,18 @@ describe('GitHub Service', () => { }); it('returns pulls in own interface', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ - { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, - ]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ + { + number: 1347, + state: 'open', + title: 'new-feature', + body: 'Please pull these awesome changes', + head: 'new-topic', + base: 'master', + }, + ], + }); const response = await service.getPullRequests('octocat', 'Hello-World'); expect(response).toMatchObject(getPullsServiceResponse); @@ -67,7 +76,7 @@ describe('GitHub Service', () => { base: 'master', }; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([params]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ pulls: [params] }); new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPull(1, params.state, params.title, params.body, params.head, params.base); const response = await service.getPullRequests('octocat', 'Hello-World', { withDiffStat: true }); @@ -80,8 +89,8 @@ describe('GitHub Service', () => { it('returns one pull in own interface', async () => { const pagination = { page: 1, perPage: 1 }; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [ + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ { number: 1347, state: 'open', @@ -91,50 +100,58 @@ describe('GitHub Service', () => { base: 'master', }, ], - undefined, - pagination, - ); + pagination: pagination, + }); const response = await service.getPullRequests('octocat', 'Hello-World', { pagination }); expect(response).toMatchObject(getPullsServiceResponse); }); it('returns open pulls by default', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ - { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, - ]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ + { + number: 1347, + state: 'open', + title: 'new-feature', + body: 'Please pull these awesome changes', + head: 'new-topic', + base: 'master', + }, + ], + }); const response = await service.getPullRequests('octocat', 'Hello-World'); expect(response.items.map((item) => item.state)).toMatchObject(['open']); }); it('returns open pulls', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [{ number: 1347, state: 'open', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }], - 'open', - ); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [{ number: 1347, state: 'open', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }], + queryState: 'open', + }); const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.open } }); expect(response.items.map((item) => item.state)).toMatchObject(['open']); }); it('returns closed pulls', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [{ number: 1347, state: 'closed', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }], - 'closed', - ); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [{ number: 1347, state: 'closed', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }], + queryState: 'closed', + }); const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.closed } }); expect(response.items.map((item) => item.state)).toMatchObject(['closed']); }); it('returns all pulls', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [ + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ { number: 1347, state: 'open', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }, { number: 1348, state: 'closed', title: 'new-feature', body: '', head: 'new-topic', base: 'master' }, ], - 'all', - ); + queryState: 'all', + }); const response = await service.getPullRequests('octocat', 'Hello-World', { filter: { state: PullRequestState.all } }); expect(response.items.map((item) => item.state)).toMatchObject(['open', 'closed']); diff --git a/src/test/helpers/gitHubNock.ts b/src/test/helpers/gitHubNock.ts index 6db95ec82..dc44e1669 100644 --- a/src/test/helpers/gitHubNock.ts +++ b/src/test/helpers/gitHubNock.ts @@ -26,7 +26,7 @@ export class GitHubNock { this.getContents(path, undefined, persist); } - getPulls( + getPulls(options: { pulls: { number: number; state: string; @@ -36,12 +36,15 @@ export class GitHubNock { base: string; created_at?: string; updated_at?: string; - }[], - queryState?: string, - pagination?: { page: number; perPage: number }, - persist = true, - ): PullRequestItem[] { - const responseBody = pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { + }[]; + queryState?: string; + pagination?: { page: number; perPage: number }; + persist?: boolean; + }): PullRequestItem[] { + if (!options.persist) { + options.persist = true; + } + const responseBody = options.pulls.map(({ number, state, title, body, head, base, created_at, updated_at }) => { if (!created_at) { created_at = '2011-01-26T19:01:12Z'; } @@ -61,7 +64,12 @@ export class GitHubNock { ); }); - return this.getPullsInternal({ state: queryState, pulls: responseBody, persist: persist, pagination: pagination }); + return this.getPullsInternal({ + state: options.queryState, + pulls: responseBody, + persist: options.persist, + pagination: options.pagination, + }); } getPull( From a6f465c25729de3a8fe372e2d04c9ca40d1b0098 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 15:32:13 +0100 Subject: [PATCH 188/196] fix: tests after refactoring --- src/inspectors/CollaborationInspector.spec.ts | 8 +++++--- .../DoesPullRequests.spec.ts | 20 ++++++++++--------- src/services/git/Git.spec.ts | 8 ++++---- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/inspectors/CollaborationInspector.spec.ts b/src/inspectors/CollaborationInspector.spec.ts index 15cae6f93..2f1168450 100644 --- a/src/inspectors/CollaborationInspector.spec.ts +++ b/src/inspectors/CollaborationInspector.spec.ts @@ -26,9 +26,11 @@ describe('Collaboration Inspector', () => { }); it('returns paginated pull requests', async () => { - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([ - { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, - ]); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ + { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, + ], + }); const response = await inspector.getPullRequests('octocat', 'Hello-World'); expect(response).toMatchObject(getPullsServiceResponse); diff --git a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts index dae0598b9..26905ef82 100644 --- a/src/practices/LanguageIndependent/DoesPullRequests.spec.ts +++ b/src/practices/LanguageIndependent/DoesPullRequests.spec.ts @@ -27,10 +27,12 @@ describe('DoesPullRequests', () => { it('return practicing if there is at least one PR which is newer than last commit in master minus 30 days', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [{ number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }], - PullRequestState.all, - ); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ + { number: 1347, state: 'open', title: 'new-feature', body: 'Please pull these awesome changes', head: 'new-topic', base: 'master' }, + ], + queryState: PullRequestState.all, + }); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); @@ -39,7 +41,7 @@ describe('DoesPullRequests', () => { it('return notPracticing if there is no PR which is newer than last commit in master minus 30 days', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls([], PullRequestState.all); + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ pulls: [], queryState: PullRequestState.all }); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); @@ -48,8 +50,8 @@ describe('DoesPullRequests', () => { it('return notPracticing if there is PR older than 30 days than the last commit in master', async () => { containerCtx.practiceContext.projectComponent.repositoryPath = 'https://github.com/octocat/Hello-World'; - new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls( - [ + new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ + pulls: [ { number: 1348, state: 'opened', @@ -61,8 +63,8 @@ describe('DoesPullRequests', () => { created_at: '2000-03-06T23:06:50Z', }, ], - PullRequestState.all, - ); + queryState: PullRequestState.all, + }); new GitHubNock('1', 'octocat', 1, 'Hello-World').getCommits().reply(200, getRepoCommitsResponse); const evaluated = await practice.evaluate(containerCtx.practiceContext); diff --git a/src/services/git/Git.spec.ts b/src/services/git/Git.spec.ts index 3652863d5..51c3329ac 100644 --- a/src/services/git/Git.spec.ts +++ b/src/services/git/Git.spec.ts @@ -290,13 +290,13 @@ describe('Git', () => { describe('#getPullRequestCount', () => { it('returns the number of both open and closed pull requests', async () => { - gitHubNock.getPulls( - [ + gitHubNock.getPulls({ + pulls: [ { number: 1, state: 'open', title: '1', body: '1', head: 'head', base: 'base' }, { number: 2, state: 'closed', title: '2', body: '2', head: 'head', base: 'base' }, ], - 'all', - ); + queryState: 'all', + }); const result = await git.getPullRequestCount(); expect(result).toEqual(2); From ac2332894dc6ec01c58a953ed3d3cbeede9bb7bf Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 15:32:22 +0100 Subject: [PATCH 189/196] docs: add comments --- src/services/bitbucket/BitbucketService.ts | 3 +++ src/services/git/GitHubService.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 64548dcf7..785e0a866 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -387,6 +387,9 @@ export class BitbucketService implements IVCSService { throw new Error('Method not implemented yet.'); } + /** + * Add additions, deletions and changes of pull request when the getPullRequests() is called with withDiffStat = true + */ async getPullsDiffStat(owner: string, repo: string, prNumber: string) { const diffStatData = (await this.client.pullrequests.getDiffStat({ repo_slug: repo, username: owner, pull_request_id: prNumber })).data; diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 3c79eee7d..e65fd3714 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -493,6 +493,9 @@ export class GitHubService implements IVCSService { return { items, ...pagination }; } + /** + * Add additions, deletions and changes of pull request when the getPullRequests() is called with withDiffStat = true + */ async getPullsDiffStat(owner: string, repo: string, prNumber: string) { // eslint-disable-next-line @typescript-eslint/camelcase const response = await this.unwrap(this.client.pulls.get({ owner, repo, pull_number: (prNumber) })); From 251fa7846f42ca949512d961fe7b97d0cd6f502e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Dec 2019 14:56:07 +0000 Subject: [PATCH 190/196] chore(release): 1.26.3 [skip ci] ## [1.26.3](https://github.com/dxheroes/dx-scanner/compare/v1.26.2...v1.26.3) (2019-12-16) ### Bug Fixes * **deps:** update dependency update-notifier to v4 ([373ce00](https://github.com/dxheroes/dx-scanner/commit/373ce00)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e7cfbb1c..cdbce86b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.26.3](https://github.com/dxheroes/dx-scanner/compare/v1.26.2...v1.26.3) (2019-12-16) + + +### Bug Fixes + +* **deps:** update dependency update-notifier to v4 ([373ce00](https://github.com/dxheroes/dx-scanner/commit/373ce00)) + ## [1.26.2](https://github.com/dxheroes/dx-scanner/compare/v1.26.1...v1.26.2) (2019-12-16) diff --git a/package.json b/package.json index 5bd022f3f..83bea7af4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.26.2", + "version": "1.26.3", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From 76de07d94be9634242f6df2371724cff48e62da3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Dec 2019 14:56:49 +0000 Subject: [PATCH 191/196] fix(deps): update dependency semver to v7 --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 83bea7af4..8e8afea63 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "parse-commit-message": "3.2.3", "qs": "6.9.1", "reflect-metadata": "0.1.13", - "semver": "6.3.0", + "semver": "7.0.0", "simple-git": "1.129.0", "table": "5.4.6", "toposort": "2.0.2", diff --git a/yarn.lock b/yarn.lock index aa193205e..20c0b5639 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8160,7 +8160,12 @@ semver-utils@^1.1.4: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== From b0eaaf082266e3218fd64689febf454aba38ccbc Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 16:24:11 +0100 Subject: [PATCH 192/196] fix: concating url --- src/services/bitbucket/BitbucketService.ts | 11 +++++------ src/services/git/GitHubService.ts | 13 ++++++------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 785e0a866..9af3f1c35 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -87,15 +87,14 @@ export class BitbucketService implements IVCSService { let apiUrl = `https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/pullrequests`; const state = VCSServicesUtils.getPRState(options?.filter?.state, VCSService.bitbucket); - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); - const paginationForUri = qs.stringify( - { page: options?.pagination?.page, pagelen: options?.pagination?.perPage }, - { addQueryPrefix: true, indices: false }, + apiUrl = apiUrl.concat( + `${qs.stringify( + { state: state, page: options?.pagination?.page, pagelen: options?.pagination?.perPage }, + { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }, + )}`, ); - apiUrl = apiUrl.concat(`${stateForUri}${paginationForUri}`); - const ownerUrl = `www.bitbucket.org/${owner}`; const ownerId = `${(await this.client.repositories.get({ repo_slug: repo, username: owner })).data.owner?.uuid}`; diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index e65fd3714..b72d6f718 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -76,16 +76,15 @@ export class GitHubService implements IVCSService { let url = 'GET /repos/:owner/:repo/pulls'; const state = VCSServicesUtils.getPRState(options?.filter?.state, VCSService.github); - const stateForUri = qs.stringify({ state: state }, { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }); - const paginationForUri = qs.stringify( - // eslint-disable-next-line @typescript-eslint/camelcase - { page: options?.pagination?.page, per_page: options?.pagination?.perPage }, - { addQueryPrefix: true, indices: false }, + url = url.concat( + `${qs.stringify( + // eslint-disable-next-line @typescript-eslint/camelcase + { state: state, page: options?.pagination?.page, per_page: options?.pagination?.perPage }, + { addQueryPrefix: true, indices: false, arrayFormat: 'repeat' }, + )}`, ); - url = url.concat(`${stateForUri}${paginationForUri}`); - const response: PullsListResponseItem[] = await this.paginate(url, owner, repo); const items = await Promise.all( From 281ab8395666fb226bc6355cdd93351e50d2c180 Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 16:34:42 +0100 Subject: [PATCH 193/196] fix: use withDiffStat value separately, not within ListGetterOptions --- src/inspectors/CollaborationInspector.ts | 2 +- src/inspectors/ICollaborationInspector.ts | 7 ++++++- src/inspectors/common/ListGetterOptions.ts | 1 - src/services/bitbucket/BitbucketService.spec.ts | 2 +- src/services/bitbucket/BitbucketService.ts | 3 ++- src/services/git/GitHubService.spec.ts | 2 +- src/services/git/GitHubService.ts | 3 ++- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index ef041d313..1146e6d1f 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -12,7 +12,7 @@ export class CollaborationInspector implements ICollaborationInspector { this.service = service; } - async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>) { + async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, withDiffStat?: boolean) { return this.service.getPullRequests(owner, repo, options); } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index ab48a416c..0c2539ace 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -3,7 +3,12 @@ import { PullCommits, PullFiles, PullRequest, Commit, Lines } from '../services/ import { ListGetterOptions } from './common/ListGetterOptions'; export interface ICollaborationInspector { - getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>): Promise>; + getPullRequests( + owner: string, + repo: string, + options?: ListGetterOptions<{ state?: PullRequestState }>, + withDiffStat?: boolean, + ): Promise>; getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; getPullRequestFiles(owner: string, repo: string, prNumber: number): Promise>; diff --git a/src/inspectors/common/ListGetterOptions.ts b/src/inspectors/common/ListGetterOptions.ts index 52c427221..33b6faa70 100644 --- a/src/inspectors/common/ListGetterOptions.ts +++ b/src/inspectors/common/ListGetterOptions.ts @@ -5,5 +5,4 @@ export interface ListGetterOptions { filter?: Filter; // specific options to filter by (for example "state" for Github PR'ss) pagination?: PaginationParams; // general purpose pagination sort?: SortOptions; // specific sorting options - withDiffStat?: boolean; } diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index 42ac21fb7..f3444da48 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -47,7 +47,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse({ resource: 'pullrequests' }); bitbucketNock.getAdditionsAndDeletions('1'); - const response = await service.getPullRequests('pypy', 'pypy', { withDiffStat: true }); + const response = await service.getPullRequests('pypy', 'pypy', undefined, true); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open, withDiffStat: true, diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 9af3f1c35..43465072e 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -83,6 +83,7 @@ export class BitbucketService implements IVCSService { owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, + withDiffStat?: boolean, ): Promise> { let apiUrl = `https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/pullrequests`; @@ -131,7 +132,7 @@ export class BitbucketService implements IVCSService { }, }; // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true - if (options?.withDiffStat) { + if (withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; } diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index 24e344f4d..19eb332e1 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -79,7 +79,7 @@ describe('GitHub Service', () => { new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ pulls: [params] }); new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPull(1, params.state, params.title, params.body, params.head, params.base); - const response = await service.getPullRequests('octocat', 'Hello-World', { withDiffStat: true }); + const response = await service.getPullRequests('octocat', 'Hello-World', undefined, true); const lines = { additions: 1, deletions: 0, changes: 1 }; const getPullsServiceResponseWithDiffStat = _.cloneDeep(getPullsServiceResponse); diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index b72d6f718..5415cf588 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -72,6 +72,7 @@ export class GitHubService implements IVCSService { owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, + withDiffStat?: boolean, ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; @@ -113,7 +114,7 @@ export class GitHubService implements IVCSService { }, }; // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true - if (options?.withDiffStat) { + if (withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; } From 30ad683ab6dfdc9c849f03e5984569fd20638bd2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Dec 2019 15:46:14 +0000 Subject: [PATCH 194/196] chore(release): 1.26.4 [skip ci] ## [1.26.4](https://github.com/dxheroes/dx-scanner/compare/v1.26.3...v1.26.4) (2019-12-16) ### Bug Fixes * **deps:** update dependency semver to v7 ([76de07d](https://github.com/dxheroes/dx-scanner/commit/76de07d)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdbce86b2..8c4922fb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.26.4](https://github.com/dxheroes/dx-scanner/compare/v1.26.3...v1.26.4) (2019-12-16) + + +### Bug Fixes + +* **deps:** update dependency semver to v7 ([76de07d](https://github.com/dxheroes/dx-scanner/commit/76de07d)) + ## [1.26.3](https://github.com/dxheroes/dx-scanner/compare/v1.26.2...v1.26.3) (2019-12-16) diff --git a/package.json b/package.json index 8e8afea63..c7ff44c1b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.26.3", + "version": "1.26.4", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git", From eb92a777f854865d7a2448dcb19e9433d7869bbf Mon Sep 17 00:00:00 2001 From: Adela Homolova Date: Mon, 16 Dec 2019 16:57:43 +0100 Subject: [PATCH 195/196] refactor: use options as a value --- src/inspectors/CollaborationInspector.ts | 6 +++++- src/inspectors/ICollaborationInspector.ts | 3 +-- src/services/bitbucket/BitbucketService.spec.ts | 2 +- src/services/bitbucket/BitbucketService.ts | 5 ++--- src/services/git/GitHubService.spec.ts | 4 ++-- src/services/git/GitHubService.ts | 5 ++--- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/inspectors/CollaborationInspector.ts b/src/inspectors/CollaborationInspector.ts index 1146e6d1f..b8c7540f9 100644 --- a/src/inspectors/CollaborationInspector.ts +++ b/src/inspectors/CollaborationInspector.ts @@ -12,7 +12,11 @@ export class CollaborationInspector implements ICollaborationInspector { this.service = service; } - async getPullRequests(owner: string, repo: string, options?: ListGetterOptions<{ state?: PullRequestState }>, withDiffStat?: boolean) { + async getPullRequests( + owner: string, + repo: string, + options?: { withDiffStat?: boolean } & ListGetterOptions<{ state?: PullRequestState }>, + ) { return this.service.getPullRequests(owner, repo, options); } diff --git a/src/inspectors/ICollaborationInspector.ts b/src/inspectors/ICollaborationInspector.ts index 0c2539ace..35dd5108a 100644 --- a/src/inspectors/ICollaborationInspector.ts +++ b/src/inspectors/ICollaborationInspector.ts @@ -6,8 +6,7 @@ export interface ICollaborationInspector { getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: PullRequestState }>, - withDiffStat?: boolean, + options?: { withDiffStat?: boolean } & ListGetterOptions<{ state?: PullRequestState }>, ): Promise>; getPullRequest(owner: string, repo: string, prNumber: number, withDiffStat?: boolean): Promise; getPullCommits(owner: string, repo: string, prNumber: number): Promise>; diff --git a/src/services/bitbucket/BitbucketService.spec.ts b/src/services/bitbucket/BitbucketService.spec.ts index f3444da48..42ac21fb7 100644 --- a/src/services/bitbucket/BitbucketService.spec.ts +++ b/src/services/bitbucket/BitbucketService.spec.ts @@ -47,7 +47,7 @@ describe('Bitbucket Service', () => { bitbucketNock.getApiResponse({ resource: 'pullrequests' }); bitbucketNock.getAdditionsAndDeletions('1'); - const response = await service.getPullRequests('pypy', 'pypy', undefined, true); + const response = await service.getPullRequests('pypy', 'pypy', { withDiffStat: true }); const getOpenPullRequestsResponse = bitbucketNock.mockBitbucketPullRequestsResponse({ states: BitbucketPullRequestState.open, withDiffStat: true, diff --git a/src/services/bitbucket/BitbucketService.ts b/src/services/bitbucket/BitbucketService.ts index 43465072e..6c4c04d38 100644 --- a/src/services/bitbucket/BitbucketService.ts +++ b/src/services/bitbucket/BitbucketService.ts @@ -82,8 +82,7 @@ export class BitbucketService implements IVCSService { async getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: PullRequestState }>, - withDiffStat?: boolean, + options?: { withDiffStat?: boolean } & ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { let apiUrl = `https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/pullrequests`; @@ -132,7 +131,7 @@ export class BitbucketService implements IVCSService { }, }; // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true - if (withDiffStat) { + if (options?.withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; } diff --git a/src/services/git/GitHubService.spec.ts b/src/services/git/GitHubService.spec.ts index 19eb332e1..b1f1864bd 100644 --- a/src/services/git/GitHubService.spec.ts +++ b/src/services/git/GitHubService.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/camelcase */ import nock from 'nock'; import { GitHubService } from './GitHubService'; -import { GitHubNock, PullRequest } from '../../test/helpers/gitHubNock'; +import { GitHubNock } from '../../test/helpers/gitHubNock'; import { getPullsServiceResponse, getPullRequestsReviewsResponse, @@ -79,7 +79,7 @@ describe('GitHub Service', () => { new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPulls({ pulls: [params] }); new GitHubNock('1', 'octocat', 1296269, 'Hello-World').getPull(1, params.state, params.title, params.body, params.head, params.base); - const response = await service.getPullRequests('octocat', 'Hello-World', undefined, true); + const response = await service.getPullRequests('octocat', 'Hello-World', { withDiffStat: true }); const lines = { additions: 1, deletions: 0, changes: 1 }; const getPullsServiceResponseWithDiffStat = _.cloneDeep(getPullsServiceResponse); diff --git a/src/services/git/GitHubService.ts b/src/services/git/GitHubService.ts index 5415cf588..3afe3249c 100644 --- a/src/services/git/GitHubService.ts +++ b/src/services/git/GitHubService.ts @@ -71,8 +71,7 @@ export class GitHubService implements IVCSService { async getPullRequests( owner: string, repo: string, - options?: ListGetterOptions<{ state?: PullRequestState }>, - withDiffStat?: boolean, + options?: { withDiffStat?: boolean } & ListGetterOptions<{ state?: PullRequestState }>, ): Promise> { let url = 'GET /repos/:owner/:repo/pulls'; @@ -114,7 +113,7 @@ export class GitHubService implements IVCSService { }, }; // Get number of changes, additions and deletions in PullRequest if the withDiffStat is true - if (withDiffStat) { + if (options?.withDiffStat) { const lines = await this.getPullsDiffStat(owner, repo, `${val.id}`); return { ...pullRequest, lines }; } From 0d0176897bfa0600c199301b5c3d3160214acf27 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 17 Dec 2019 09:52:11 +0000 Subject: [PATCH 196/196] chore(release): 1.27.0 [skip ci] # [1.27.0](https://github.com/dxheroes/dx-scanner/compare/v1.26.4...v1.27.0) (2019-12-17) ### Bug Fixes * Add comments ([2c33c17](https://github.com/dxheroes/dx-scanner/commit/2c33c17)) * add linesAdded and linesRemoved to own interface of Commit. Implement it in BitbucketService and rewrite tests. ([0648ce9](https://github.com/dxheroes/dx-scanner/commit/0648ce9)) * add pagination to getPullrequests() in Bitbucket ([47e57ad](https://github.com/dxheroes/dx-scanner/commit/47e57ad)) * adding values ([35f27d5](https://github.com/dxheroes/dx-scanner/commit/35f27d5)) * concating url ([b0eaaf0](https://github.com/dxheroes/dx-scanner/commit/b0eaaf0)) * remove unnecessary code ([5dcf879](https://github.com/dxheroes/dx-scanner/commit/5dcf879)) * remove unnecessary Promise.all(); remove request for getting diffStat ([07e88e5](https://github.com/dxheroes/dx-scanner/commit/07e88e5)) * rename value ([adcec08](https://github.com/dxheroes/dx-scanner/commit/adcec08)) * tests after refactoring ([a6f465c](https://github.com/dxheroes/dx-scanner/commit/a6f465c)) * use method to get an email and fix test after that ([f11ac89](https://github.com/dxheroes/dx-scanner/commit/f11ac89)) * use pagination if it's provided ([fad8e78](https://github.com/dxheroes/dx-scanner/commit/fad8e78)) * use withDiffStat value separately, not within ListGetterOptions ([281ab83](https://github.com/dxheroes/dx-scanner/commit/281ab83)) * value name ([eacdd7b](https://github.com/dxheroes/dx-scanner/commit/eacdd7b)) ### Features * allow to get one specific pull request with diffStat in GithubService and BitbucketService ([837e8a0](https://github.com/dxheroes/dx-scanner/commit/837e8a0)) * add getPullsDiffStat() in CollaborationInspector; allow to get one specific pull request with diffStat ([81cb265](https://github.com/dxheroes/dx-scanner/commit/81cb265)) * add Lines interface ([d1232ed](https://github.com/dxheroes/dx-scanner/commit/d1232ed)) * get pullrequests with diffStat if `withDiffStat` value is true ([dcba226](https://github.com/dxheroes/dx-scanner/commit/dcba226)) * implement getPullsDiffStat() in BitbucketService and add test for that ([3c78fe3](https://github.com/dxheroes/dx-scanner/commit/3c78fe3)) --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c4922fb8..81f8db821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# [1.27.0](https://github.com/dxheroes/dx-scanner/compare/v1.26.4...v1.27.0) (2019-12-17) + + +### Bug Fixes + +* Add comments ([2c33c17](https://github.com/dxheroes/dx-scanner/commit/2c33c17)) +* add linesAdded and linesRemoved to own interface of Commit. Implement it in BitbucketService and rewrite tests. ([0648ce9](https://github.com/dxheroes/dx-scanner/commit/0648ce9)) +* add pagination to getPullrequests() in Bitbucket ([47e57ad](https://github.com/dxheroes/dx-scanner/commit/47e57ad)) +* adding values ([35f27d5](https://github.com/dxheroes/dx-scanner/commit/35f27d5)) +* concating url ([b0eaaf0](https://github.com/dxheroes/dx-scanner/commit/b0eaaf0)) +* remove unnecessary code ([5dcf879](https://github.com/dxheroes/dx-scanner/commit/5dcf879)) +* remove unnecessary Promise.all(); remove request for getting diffStat ([07e88e5](https://github.com/dxheroes/dx-scanner/commit/07e88e5)) +* rename value ([adcec08](https://github.com/dxheroes/dx-scanner/commit/adcec08)) +* tests after refactoring ([a6f465c](https://github.com/dxheroes/dx-scanner/commit/a6f465c)) +* use method to get an email and fix test after that ([f11ac89](https://github.com/dxheroes/dx-scanner/commit/f11ac89)) +* use pagination if it's provided ([fad8e78](https://github.com/dxheroes/dx-scanner/commit/fad8e78)) +* use withDiffStat value separately, not within ListGetterOptions ([281ab83](https://github.com/dxheroes/dx-scanner/commit/281ab83)) +* value name ([eacdd7b](https://github.com/dxheroes/dx-scanner/commit/eacdd7b)) + + +### Features + +* allow to get one specific pull request with diffStat in GithubService and BitbucketService ([837e8a0](https://github.com/dxheroes/dx-scanner/commit/837e8a0)) +* add getPullsDiffStat() in CollaborationInspector; allow to get one specific pull request with diffStat ([81cb265](https://github.com/dxheroes/dx-scanner/commit/81cb265)) +* add Lines interface ([d1232ed](https://github.com/dxheroes/dx-scanner/commit/d1232ed)) +* get pullrequests with diffStat if `withDiffStat` value is true ([dcba226](https://github.com/dxheroes/dx-scanner/commit/dcba226)) +* implement getPullsDiffStat() in BitbucketService and add test for that ([3c78fe3](https://github.com/dxheroes/dx-scanner/commit/3c78fe3)) + ## [1.26.4](https://github.com/dxheroes/dx-scanner/compare/v1.26.3...v1.26.4) (2019-12-16) diff --git a/package.json b/package.json index c7ff44c1b..2931141f6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dx-scanner", "description": "Scan your project for possible DX recommendations.", - "version": "1.26.4", + "version": "1.27.0", "author": "DX Heroes LTD (https://dxheroes.io)", "homepage": "https://github.com/dxheroes/dx-scanner", "repository": "ssh://git@github.com/dxheroes/dx-scanner.git",