From 3fd9fd449c7d221e86c0a4b08e01b76cfb5598c8 Mon Sep 17 00:00:00 2001 From: Shati Patel <42641846+shati-patel@users.noreply.github.com> Date: Mon, 14 Nov 2022 12:45:18 +0000 Subject: [PATCH] Add support for local dbs in config (#1751) --- .../src/databases/db-config-store.ts | 6 +- .../ql-vscode/src/databases/db-config.ts | 27 +++++++- .../databases/db-panel.test.ts | 16 +++++ .../databases/data/workspace-databases.json | 34 ++++++++++ .../databases/db-config-store.test.ts | 31 ++++++++- .../databases/db-config-validator.test.ts | 7 +- .../databases/db-tree-creator.test.ts | 16 +++++ .../ql-vscode/workspace-databases-schema.json | 68 ++++++++++++++++++- 8 files changed, 196 insertions(+), 9 deletions(-) diff --git a/extensions/ql-vscode/src/databases/db-config-store.ts b/extensions/ql-vscode/src/databases/db-config-store.ts index e5e1c5baa..9889e94fd 100644 --- a/extensions/ql-vscode/src/databases/db-config-store.ts +++ b/extensions/ql-vscode/src/databases/db-config-store.ts @@ -99,7 +99,11 @@ export class DbConfigStore extends DisposableObject { repositoryLists: [], owners: [], repositories: [], - } + }, + local: { + lists: [], + databases: [], + }, }; } } diff --git a/extensions/ql-vscode/src/databases/db-config.ts b/extensions/ql-vscode/src/databases/db-config.ts index cd5e04868..e51a41cb8 100644 --- a/extensions/ql-vscode/src/databases/db-config.ts +++ b/extensions/ql-vscode/src/databases/db-config.ts @@ -2,6 +2,7 @@ export interface DbConfig { remote: RemoteDbConfig; + local: LocalDbConfig; } export interface RemoteDbConfig { @@ -15,6 +16,23 @@ export interface RemoteRepositoryList { repositories: string[]; } +export interface LocalDbConfig { + lists: LocalList[]; + databases: LocalDatabase[]; +} + +export interface LocalList { + name: string; + databases: LocalDatabase[]; +} + +export interface LocalDatabase { + name: string; + dateAdded: number; + language: string; + storagePath: string; +} + export function cloneDbConfig(config: DbConfig): DbConfig { return { remote: { @@ -24,6 +42,13 @@ export function cloneDbConfig(config: DbConfig): DbConfig { })), owners: [...config.remote.owners], repositories: [...config.remote.repositories], - } + }, + local: { + lists: config.local.lists.map((list) => ({ + name: list.name, + databases: list.databases.map((db) => ({ ...db })), + })), + databases: config.local.databases.map((db) => ({ ...db })), + }, }; } diff --git a/extensions/ql-vscode/src/vscode-tests/minimal-workspace/databases/db-panel.test.ts b/extensions/ql-vscode/src/vscode-tests/minimal-workspace/databases/db-panel.test.ts index 259ee34ee..6337861c4 100644 --- a/extensions/ql-vscode/src/vscode-tests/minimal-workspace/databases/db-panel.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/minimal-workspace/databases/db-panel.test.ts @@ -58,6 +58,10 @@ describe('db panel', async () => { owners: [], repositories: [] }, + local: { + lists: [], + databases: [] + }, }; await saveDbConfig(dbConfig); @@ -116,6 +120,10 @@ describe('db panel', async () => { owners: [], repositories: [] }, + local: { + lists: [], + databases: [] + }, }; await saveDbConfig(dbConfig); @@ -148,6 +156,10 @@ describe('db panel', async () => { owners: ['owner1', 'owner2'], repositories: [] }, + local: { + lists: [], + databases: [] + }, }; await saveDbConfig(dbConfig); @@ -177,6 +189,10 @@ describe('db panel', async () => { owners: [], repositories: ['owner1/repo1', 'owner1/repo2'] }, + local: { + lists: [], + databases: [] + }, }; await saveDbConfig(dbConfig); diff --git a/extensions/ql-vscode/test/pure-tests/databases/data/workspace-databases.json b/extensions/ql-vscode/test/pure-tests/databases/data/workspace-databases.json index 64807c4d2..f2d5c3ff9 100644 --- a/extensions/ql-vscode/test/pure-tests/databases/data/workspace-databases.json +++ b/extensions/ql-vscode/test/pure-tests/databases/data/workspace-databases.json @@ -8,5 +8,39 @@ ], "owners": [], "repositories": ["owner/repo1", "owner/repo2", "owner/repo3"] + }, + "local": { + "lists": [ + { + "name": "localList1", + "databases": [ + { + "name": "foo/bar", + "dateAdded": 1668096745193, + "language": "go", + "storagePath": "/path/to/database/" + } + ] + }, + { + "name": "localList2", + "databases": [ + { + "name": "foo/baz", + "dateAdded": 1668096760848, + "language": "javascript", + "storagePath": "/path/to/database/" + } + ] + } + ], + "databases": [ + { + "name": "example-db", + "dateAdded": 1668096927267, + "language": "ruby", + "storagePath": "/path/to/database/" + } + ] } } diff --git a/extensions/ql-vscode/test/pure-tests/databases/db-config-store.test.ts b/extensions/ql-vscode/test/pure-tests/databases/db-config-store.test.ts index 52c234dcd..0042c52cb 100644 --- a/extensions/ql-vscode/test/pure-tests/databases/db-config-store.test.ts +++ b/extensions/ql-vscode/test/pure-tests/databases/db-config-store.test.ts @@ -27,6 +27,8 @@ describe('db config store', async () => { expect(config.remote.repositoryLists).to.be.empty; expect(config.remote.owners).to.be.empty; expect(config.remote.repositories).to.be.empty; + expect(config.local.lists).to.be.empty; + expect(config.local.databases).to.be.empty; }); it('should load an existing config', async () => { @@ -36,12 +38,35 @@ describe('db config store', async () => { const config = configStore.getConfig().value; expect(config.remote.repositoryLists).to.have.length(1); expect(config.remote.repositoryLists[0]).to.deep.equal({ - 'name': 'repoList1', - 'repositories': ['foo/bar', 'foo/baz'] + name: 'repoList1', + repositories: ['foo/bar', 'foo/baz'] }); expect(config.remote.owners).to.be.empty; expect(config.remote.repositories).to.have.length(3); - expect(config.remote.repositories).to.deep.equal(['owner/repo1', 'owner/repo2', 'owner/repo3']); + expect(config.remote.repositories).to.deep.equal([ + 'owner/repo1', + 'owner/repo2', + 'owner/repo3', + ]); + expect(config.local.lists).to.have.length(2); + expect(config.local.lists[0]).to.deep.equal({ + name: 'localList1', + databases: [ + { + name: 'foo/bar', + dateAdded: 1668096745193, + language: 'go', + storagePath: '/path/to/database/', + }, + ], + }); + expect(config.local.databases).to.have.length(1); + expect(config.local.databases[0]).to.deep.equal({ + name: 'example-db', + dateAdded: 1668096927267, + language: 'ruby', + storagePath: '/path/to/database/', + }); }); it('should not allow modification of the config', async () => { diff --git a/extensions/ql-vscode/test/pure-tests/databases/db-config-validator.test.ts b/extensions/ql-vscode/test/pure-tests/databases/db-config-validator.test.ts index a449cb7bc..0e2120762 100644 --- a/extensions/ql-vscode/test/pure-tests/databases/db-config-validator.test.ts +++ b/extensions/ql-vscode/test/pure-tests/databases/db-config-validator.test.ts @@ -25,9 +25,10 @@ describe('db config validation', async () => { const validationOutput = configValidator.validate(dbConfig); - expect(validationOutput).to.have.length(2); + expect(validationOutput).to.have.length(3); - expect(validationOutput[0]).to.deep.equal('/remote must have required property \'owners\''); - expect(validationOutput[1]).to.deep.equal('/remote must NOT have additional properties'); + expect(validationOutput[0]).to.deep.equal(' must have required property \'local\''); + expect(validationOutput[1]).to.deep.equal('/remote must have required property \'owners\''); + expect(validationOutput[2]).to.deep.equal('/remote must NOT have additional properties'); }); }); diff --git a/extensions/ql-vscode/test/pure-tests/databases/db-tree-creator.test.ts b/extensions/ql-vscode/test/pure-tests/databases/db-tree-creator.test.ts index 55cf76318..c0d2da61e 100644 --- a/extensions/ql-vscode/test/pure-tests/databases/db-tree-creator.test.ts +++ b/extensions/ql-vscode/test/pure-tests/databases/db-tree-creator.test.ts @@ -12,6 +12,10 @@ describe('db tree creator', () => { repositoryLists: [], owners: [], repositories: [] + }, + local: { + lists: [], + databases: [] } }; @@ -63,6 +67,10 @@ describe('db tree creator', () => { ], owners: [], repositories: [] + }, + local: { + lists: [], + databases: [] } }; @@ -102,6 +110,10 @@ describe('db tree creator', () => { 'owner2' ], repositories: [] + }, + local: { + lists: [], + databases: [] } }; @@ -134,6 +146,10 @@ describe('db tree creator', () => { 'owner1/repo2', 'owner2/repo1' ] + }, + local: { + lists: [], + databases: [] } }; diff --git a/extensions/ql-vscode/workspace-databases-schema.json b/extensions/ql-vscode/workspace-databases-schema.json index 513c25cc2..01ba1f067 100644 --- a/extensions/ql-vscode/workspace-databases-schema.json +++ b/extensions/ql-vscode/workspace-databases-schema.json @@ -44,6 +44,72 @@ }, "required": ["repositoryLists", "owners", "repositories"], "additionalProperties": false + }, + "local": { + "type": "object", + "properties": { + "lists": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "databases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "dateAdded": { + "type": "number" + }, + "language": { + "type": "string" + }, + "storagePath": { + "type": "string" + } + }, + "required": ["name", "dateAdded", "language", "storagePath"], + "additionalProperties": false + } + } + }, + "required": ["name", "databases"], + "additionalProperties": false + } + }, + "databases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "dateAdded": { + "type": "number" + }, + "language": { + "type": "string" + }, + "storagePath": { + "type": "string" + } + }, + "required": ["name", "dateAdded", "language", "storagePath"], + "additionalProperties": false + } + } + }, + "required": ["lists", "databases"], + "additionalProperties": false } - } + }, + "required": ["remote", "local"], + "additionalProperties": false }