Create remote db tree view items based on the user's db config (#1714)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { logger } from '../logging';
|
|
||||||
import { DbConfigStore } from './db-config-store';
|
import { DbConfigStore } from './db-config-store';
|
||||||
import { DbItem } from './db-item';
|
import { DbItem } from './db-item';
|
||||||
|
import { createLocalTree, createRemoteTree } from './db-tree-creator';
|
||||||
|
|
||||||
export class DbManager {
|
export class DbManager {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -8,15 +8,12 @@ export class DbManager {
|
|||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public loadDatabases(): void {
|
|
||||||
const config = this.dbConfigStore.getConfig();
|
|
||||||
void logger.log(`Loaded databases: ${JSON.stringify(config)}`);
|
|
||||||
|
|
||||||
// This will be fleshed out in a future change.
|
|
||||||
}
|
|
||||||
|
|
||||||
public getDbItems(): DbItem[] {
|
public getDbItems(): DbItem[] {
|
||||||
// This will be fleshed out in a future change.
|
const config = this.dbConfigStore.getConfig();
|
||||||
return [];
|
|
||||||
|
return [
|
||||||
|
createRemoteTree(config),
|
||||||
|
createLocalTree()
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ export class DbModule extends DisposableObject {
|
|||||||
await dbConfigStore.initialize();
|
await dbConfigStore.initialize();
|
||||||
|
|
||||||
const dbManager = new DbManager(dbConfigStore);
|
const dbManager = new DbManager(dbConfigStore);
|
||||||
dbManager.loadDatabases();
|
|
||||||
|
|
||||||
const dbPanel = new DbPanel(dbManager);
|
const dbPanel = new DbPanel(dbManager);
|
||||||
|
|
||||||
this.push(dbPanel);
|
this.push(dbPanel);
|
||||||
|
|||||||
70
extensions/ql-vscode/src/databases/db-tree-creator.ts
Normal file
70
extensions/ql-vscode/src/databases/db-tree-creator.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import { DbConfig, RemoteRepositoryList } from './db-config';
|
||||||
|
import {
|
||||||
|
DbItemKind,
|
||||||
|
RemoteOwnerDbItem,
|
||||||
|
RemoteRepoDbItem,
|
||||||
|
RemoteSystemDefinedListDbItem,
|
||||||
|
RemoteUserDefinedListDbItem,
|
||||||
|
RootLocalDbItem,
|
||||||
|
RootRemoteDbItem
|
||||||
|
} from './db-item';
|
||||||
|
|
||||||
|
export function createRemoteTree(dbConfig: DbConfig): RootRemoteDbItem {
|
||||||
|
const systemDefinedLists = [
|
||||||
|
createSystemDefinedList(10),
|
||||||
|
createSystemDefinedList(100),
|
||||||
|
createSystemDefinedList(1000)
|
||||||
|
];
|
||||||
|
|
||||||
|
const userDefinedRepoLists = dbConfig.remote.repositoryLists.map(createUserDefinedList);
|
||||||
|
const owners = dbConfig.remote.owners.map(createOwnerItem);
|
||||||
|
const repos = dbConfig.remote.repositories.map(createRepoItem);
|
||||||
|
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RootRemote,
|
||||||
|
children: [
|
||||||
|
...systemDefinedLists,
|
||||||
|
...owners,
|
||||||
|
...userDefinedRepoLists,
|
||||||
|
...repos
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createLocalTree(): RootLocalDbItem {
|
||||||
|
// This will be fleshed out further in the future.
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RootLocal
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSystemDefinedList(n: number): RemoteSystemDefinedListDbItem {
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RemoteSystemDefinedList,
|
||||||
|
listName: `top_${n}`,
|
||||||
|
listDisplayName: `Top ${n} repositories`,
|
||||||
|
listDescription: `Top ${n} repositories of a language`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createUserDefinedList(list: RemoteRepositoryList): RemoteUserDefinedListDbItem {
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RemoteUserDefinedList,
|
||||||
|
listName: list.name,
|
||||||
|
repos: list.repositories.map((r) => createRepoItem(r))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createOwnerItem(owner: string): RemoteOwnerDbItem {
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RemoteOwner,
|
||||||
|
ownerName: owner
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createRepoItem(repo: string): RemoteRepoDbItem {
|
||||||
|
return {
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: repo
|
||||||
|
};
|
||||||
|
}
|
||||||
49
extensions/ql-vscode/src/databases/ui/db-item-mapper.ts
Normal file
49
extensions/ql-vscode/src/databases/ui/db-item-mapper.ts
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import { DbItem, DbItemKind } from '../db-item';
|
||||||
|
import {
|
||||||
|
createDbTreeViewItemOwner,
|
||||||
|
createDbTreeViewItemRepo,
|
||||||
|
createDbTreeViewItemRoot,
|
||||||
|
createDbTreeViewItemSystemDefinedList,
|
||||||
|
createDbTreeViewItemUserDefinedList,
|
||||||
|
DbTreeViewItem
|
||||||
|
} from './db-tree-view-item';
|
||||||
|
|
||||||
|
export function mapDbItemToTreeViewItem(dbItem: DbItem): DbTreeViewItem {
|
||||||
|
switch (dbItem.kind) {
|
||||||
|
case DbItemKind.RootLocal:
|
||||||
|
return createDbTreeViewItemRoot(
|
||||||
|
dbItem,
|
||||||
|
'local',
|
||||||
|
'Local databases',
|
||||||
|
[]);
|
||||||
|
|
||||||
|
case DbItemKind.RootRemote:
|
||||||
|
return createDbTreeViewItemRoot(
|
||||||
|
dbItem,
|
||||||
|
'remote',
|
||||||
|
'Remote databases',
|
||||||
|
dbItem.children.map(c => mapDbItemToTreeViewItem(c)));
|
||||||
|
|
||||||
|
case DbItemKind.RemoteSystemDefinedList:
|
||||||
|
return createDbTreeViewItemSystemDefinedList(
|
||||||
|
dbItem,
|
||||||
|
dbItem.listDisplayName,
|
||||||
|
dbItem.listDescription);
|
||||||
|
|
||||||
|
case DbItemKind.RemoteUserDefinedList:
|
||||||
|
return createDbTreeViewItemUserDefinedList(
|
||||||
|
dbItem,
|
||||||
|
dbItem.listName,
|
||||||
|
dbItem.repos.map(mapDbItemToTreeViewItem));
|
||||||
|
|
||||||
|
case DbItemKind.RemoteOwner:
|
||||||
|
return createDbTreeViewItemOwner(
|
||||||
|
dbItem,
|
||||||
|
dbItem.ownerName);
|
||||||
|
|
||||||
|
case DbItemKind.RemoteRepo:
|
||||||
|
return createDbTreeViewItemRepo(
|
||||||
|
dbItem,
|
||||||
|
dbItem.repoFullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { logger } from '../../logging';
|
|
||||||
import { ProviderResult, TreeDataProvider, TreeItem } from 'vscode';
|
import { ProviderResult, TreeDataProvider, TreeItem } from 'vscode';
|
||||||
import { createDbTreeViewItemWarning, DbTreeViewItem } from './db-tree-view-item';
|
import { createDbTreeViewItemWarning, DbTreeViewItem } from './db-tree-view-item';
|
||||||
import { DbManager } from '../db-manager';
|
import { DbManager } from '../db-manager';
|
||||||
|
import { mapDbItemToTreeViewItem } from './db-item-mapper';
|
||||||
|
|
||||||
export class DbTreeDataProvider implements TreeDataProvider<DbTreeViewItem> {
|
export class DbTreeDataProvider implements TreeDataProvider<DbTreeViewItem> {
|
||||||
private dbTreeItems: DbTreeViewItem[];
|
private dbTreeItems: DbTreeViewItem[];
|
||||||
@@ -38,15 +38,12 @@ export class DbTreeDataProvider implements TreeDataProvider<DbTreeViewItem> {
|
|||||||
private createTree(): DbTreeViewItem[] {
|
private createTree(): DbTreeViewItem[] {
|
||||||
const dbItems = this.dbManager.getDbItems();
|
const dbItems = this.dbManager.getDbItems();
|
||||||
|
|
||||||
// This will be fleshed out in a future change.
|
|
||||||
void logger.log(`Creating database tree with ${dbItems.length} items`);
|
|
||||||
|
|
||||||
// Add a sample warning as a proof of concept.
|
// Add a sample warning as a proof of concept.
|
||||||
const warningTreeViewItem = createDbTreeViewItemWarning(
|
const warningTreeViewItem = createDbTreeViewItemWarning(
|
||||||
'There was an error',
|
'There was an error',
|
||||||
'Fix it'
|
'Fix it'
|
||||||
);
|
);
|
||||||
|
|
||||||
return [warningTreeViewItem];
|
return [...dbItems.map(mapDbItemToTreeViewItem), warningTreeViewItem];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import { DbItem } from '../db-item';
|
import {
|
||||||
|
DbItem,
|
||||||
|
RemoteOwnerDbItem,
|
||||||
|
RemoteRepoDbItem,
|
||||||
|
RemoteSystemDefinedListDbItem,
|
||||||
|
RemoteUserDefinedListDbItem,
|
||||||
|
RootLocalDbItem,
|
||||||
|
RootRemoteDbItem
|
||||||
|
} from '../db-item';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an item in the database tree view. This item could be
|
* Represents an item in the database tree view. This item could be
|
||||||
@@ -8,9 +16,9 @@ import { DbItem } from '../db-item';
|
|||||||
export class DbTreeViewItem extends vscode.TreeItem {
|
export class DbTreeViewItem extends vscode.TreeItem {
|
||||||
constructor(
|
constructor(
|
||||||
public readonly dbItem: DbItem | undefined,
|
public readonly dbItem: DbItem | undefined,
|
||||||
public readonly iconPath: vscode.ThemeIcon,
|
public readonly iconPath: vscode.ThemeIcon | undefined,
|
||||||
public readonly label: string,
|
public readonly label: string,
|
||||||
public readonly tooltip: string,
|
public readonly tooltip: string | undefined,
|
||||||
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
|
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
|
||||||
public readonly children: DbTreeViewItem[]
|
public readonly children: DbTreeViewItem[]
|
||||||
) {
|
) {
|
||||||
@@ -28,3 +36,72 @@ export function createDbTreeViewItemWarning(label: string, tooltip: string): DbT
|
|||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function createDbTreeViewItemRoot(
|
||||||
|
dbItem: RootLocalDbItem | RootRemoteDbItem,
|
||||||
|
label: string,
|
||||||
|
tooltip: string,
|
||||||
|
children: DbTreeViewItem[]
|
||||||
|
): DbTreeViewItem {
|
||||||
|
return new DbTreeViewItem(
|
||||||
|
dbItem,
|
||||||
|
undefined,
|
||||||
|
label,
|
||||||
|
tooltip,
|
||||||
|
vscode.TreeItemCollapsibleState.Collapsed,
|
||||||
|
children);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDbTreeViewItemSystemDefinedList(
|
||||||
|
dbItem: RemoteSystemDefinedListDbItem,
|
||||||
|
label: string,
|
||||||
|
tooltip: string
|
||||||
|
): DbTreeViewItem {
|
||||||
|
return new DbTreeViewItem(
|
||||||
|
dbItem,
|
||||||
|
new vscode.ThemeIcon('github'),
|
||||||
|
label,
|
||||||
|
tooltip,
|
||||||
|
vscode.TreeItemCollapsibleState.None,
|
||||||
|
[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDbTreeViewItemUserDefinedList(
|
||||||
|
dbItem: RemoteUserDefinedListDbItem,
|
||||||
|
listName: string,
|
||||||
|
children: DbTreeViewItem[]
|
||||||
|
): DbTreeViewItem {
|
||||||
|
return new DbTreeViewItem(
|
||||||
|
dbItem,
|
||||||
|
undefined,
|
||||||
|
listName,
|
||||||
|
undefined,
|
||||||
|
vscode.TreeItemCollapsibleState.Collapsed,
|
||||||
|
children);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDbTreeViewItemOwner(
|
||||||
|
dbItem: RemoteOwnerDbItem,
|
||||||
|
ownerName: string,
|
||||||
|
): DbTreeViewItem {
|
||||||
|
return new DbTreeViewItem(
|
||||||
|
dbItem,
|
||||||
|
new vscode.ThemeIcon('organization'),
|
||||||
|
ownerName,
|
||||||
|
undefined,
|
||||||
|
vscode.TreeItemCollapsibleState.None,
|
||||||
|
[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDbTreeViewItemRepo(
|
||||||
|
dbItem: RemoteRepoDbItem,
|
||||||
|
repoName: string,
|
||||||
|
): DbTreeViewItem {
|
||||||
|
return new DbTreeViewItem(
|
||||||
|
dbItem,
|
||||||
|
new vscode.ThemeIcon('database'),
|
||||||
|
repoName,
|
||||||
|
undefined,
|
||||||
|
vscode.TreeItemCollapsibleState.None,
|
||||||
|
[]);
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,163 @@
|
|||||||
|
import { expect } from 'chai';
|
||||||
|
|
||||||
|
import { DbConfig } from '../../../src/databases/db-config';
|
||||||
|
import { DbItemKind } from '../../../src/databases/db-item';
|
||||||
|
import { createRemoteTree } from '../../../src/databases/db-tree-creator';
|
||||||
|
|
||||||
|
describe('db tree creator', () => {
|
||||||
|
describe('createRemoteTree', () => {
|
||||||
|
it('should build root node and system defined lists', () => {
|
||||||
|
const dbConfig: DbConfig = {
|
||||||
|
remote: {
|
||||||
|
repositoryLists: [],
|
||||||
|
owners: [],
|
||||||
|
repositories: []
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const dbTreeRoot = createRemoteTree(dbConfig);
|
||||||
|
|
||||||
|
expect(dbTreeRoot).to.be.ok;
|
||||||
|
expect(dbTreeRoot.kind).to.equal(DbItemKind.RootRemote);
|
||||||
|
expect(dbTreeRoot.children.length).to.equal(3);
|
||||||
|
expect(dbTreeRoot.children[0]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteSystemDefinedList,
|
||||||
|
listName: 'top_10',
|
||||||
|
listDisplayName: 'Top 10 repositories',
|
||||||
|
listDescription: 'Top 10 repositories of a language'
|
||||||
|
});
|
||||||
|
expect(dbTreeRoot.children[1]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteSystemDefinedList,
|
||||||
|
listName: 'top_100',
|
||||||
|
listDisplayName: 'Top 100 repositories',
|
||||||
|
listDescription: 'Top 100 repositories of a language'
|
||||||
|
});
|
||||||
|
expect(dbTreeRoot.children[2]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteSystemDefinedList,
|
||||||
|
listName: 'top_1000',
|
||||||
|
listDisplayName: 'Top 1000 repositories',
|
||||||
|
listDescription: 'Top 1000 repositories of a language'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create remote user defined list nodes', () => {
|
||||||
|
const dbConfig: DbConfig = {
|
||||||
|
remote: {
|
||||||
|
repositoryLists: [
|
||||||
|
{
|
||||||
|
name: 'my-list-1',
|
||||||
|
repositories: [
|
||||||
|
'owner1/repo1',
|
||||||
|
'owner1/repo2',
|
||||||
|
'owner2/repo1'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'my-list-2',
|
||||||
|
repositories: [
|
||||||
|
'owner3/repo1',
|
||||||
|
'owner3/repo2',
|
||||||
|
'owner4/repo1'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
owners: [],
|
||||||
|
repositories: []
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const dbTreeRoot = createRemoteTree(dbConfig);
|
||||||
|
|
||||||
|
expect(dbTreeRoot).to.be.ok;
|
||||||
|
expect(dbTreeRoot.kind).to.equal(DbItemKind.RootRemote);
|
||||||
|
const repositoryListNodes = dbTreeRoot.children.filter(
|
||||||
|
(child) => child.kind === DbItemKind.RemoteUserDefinedList
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(repositoryListNodes.length).to.equal(2);
|
||||||
|
expect(repositoryListNodes[0]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteUserDefinedList,
|
||||||
|
listName: dbConfig.remote.repositoryLists[0].name,
|
||||||
|
repos: dbConfig.remote.repositoryLists[0].repositories.map((repo) => ({
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: repo
|
||||||
|
}))
|
||||||
|
});
|
||||||
|
expect(repositoryListNodes[1]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteUserDefinedList,
|
||||||
|
listName: dbConfig.remote.repositoryLists[1].name,
|
||||||
|
repos: dbConfig.remote.repositoryLists[1].repositories.map((repo) => ({
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: repo
|
||||||
|
}))
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create remote owner nodes', () => {
|
||||||
|
const dbConfig: DbConfig = {
|
||||||
|
remote: {
|
||||||
|
repositoryLists: [],
|
||||||
|
owners: [
|
||||||
|
'owner1',
|
||||||
|
'owner2'
|
||||||
|
],
|
||||||
|
repositories: []
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const dbTreeRoot = createRemoteTree(dbConfig);
|
||||||
|
|
||||||
|
expect(dbTreeRoot).to.be.ok;
|
||||||
|
expect(dbTreeRoot.kind).to.equal(DbItemKind.RootRemote);
|
||||||
|
const ownerNodes = dbTreeRoot.children.filter(
|
||||||
|
(child) => child.kind === DbItemKind.RemoteOwner
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(ownerNodes.length).to.equal(2);
|
||||||
|
expect(ownerNodes[0]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteOwner,
|
||||||
|
ownerName: dbConfig.remote.owners[0]
|
||||||
|
});
|
||||||
|
expect(ownerNodes[1]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteOwner,
|
||||||
|
ownerName: dbConfig.remote.owners[1]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create remote repo nodes', () => {
|
||||||
|
const dbConfig: DbConfig = {
|
||||||
|
remote: {
|
||||||
|
repositoryLists: [],
|
||||||
|
owners: [],
|
||||||
|
repositories: [
|
||||||
|
'owner1/repo1',
|
||||||
|
'owner1/repo2',
|
||||||
|
'owner2/repo1'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const dbTreeRoot = createRemoteTree(dbConfig);
|
||||||
|
|
||||||
|
expect(dbTreeRoot).to.be.ok;
|
||||||
|
expect(dbTreeRoot.kind).to.equal(DbItemKind.RootRemote);
|
||||||
|
const repoNodes = dbTreeRoot.children.filter(
|
||||||
|
(child) => child.kind === DbItemKind.RemoteRepo
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(repoNodes.length).to.equal(3);
|
||||||
|
expect(repoNodes[0]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: dbConfig.remote.repositories[0]
|
||||||
|
});
|
||||||
|
expect(repoNodes[1]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: dbConfig.remote.repositories[1]
|
||||||
|
});
|
||||||
|
expect(repoNodes[2]).to.deep.equal({
|
||||||
|
kind: DbItemKind.RemoteRepo,
|
||||||
|
repoFullName: dbConfig.remote.repositories[2]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user