mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
ML - displaying all Python and R packages (including system ones) (#10603)
* displaying all packages including readonly
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
"preview": true,
|
"preview": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"vscode": "^1.25.0",
|
"vscode": "^1.25.0",
|
||||||
"azdata": ">=1.13.0"
|
"azdata": ">=1.18.0"
|
||||||
},
|
},
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"onCommand:ml.command.managePackages",
|
"onCommand:ml.command.managePackages",
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ EXEC sp_execute_external_script
|
|||||||
@script=N'import pkg_resources
|
@script=N'import pkg_resources
|
||||||
import pandas
|
import pandas
|
||||||
OutputDataSet = pandas.DataFrame([(d.project_name, d.version) for d in pkg_resources.working_set])'
|
OutputDataSet = pandas.DataFrame([(d.project_name, d.version) for d in pkg_resources.working_set])'
|
||||||
select e.name, version from sys.external_libraries e join @tablevar t on e.name = t.name
|
select t.name, (CASE WHEN e.name is NULL THEN 1 ELSE 0 END) as isReadOnly , version from @tablevar t
|
||||||
where [language] = 'PYTHON'
|
left join sys.external_libraries e on e.name = t.name and upper(e.[language]) = 'PYTHON'
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const listRPackagesQuery = `
|
const listRPackagesQuery = `
|
||||||
@@ -30,9 +30,8 @@ EXEC sp_execute_external_script
|
|||||||
@language=N'R',
|
@language=N'R',
|
||||||
@script=N'
|
@script=N'
|
||||||
OutputDataSet <- as.data.frame(installed.packages()[,c(1,3)])'
|
OutputDataSet <- as.data.frame(installed.packages()[,c(1,3)])'
|
||||||
|
select t.name, (CASE WHEN e.name is NULL THEN 1 ELSE 0 END) as isReadOnly , version from @tablevar t
|
||||||
select e.name, version from sys.external_libraries e join @tablevar t on e.name = t.name
|
left join sys.external_libraries e on e.name = t.name and upper(e.[language]) = 'R'
|
||||||
where [language] = 'R'
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const checkMlInstalledQuery = `
|
const checkMlInstalledQuery = `
|
||||||
@@ -100,7 +99,8 @@ export class QueryRunner {
|
|||||||
packages = result.rows.map(row => {
|
packages = result.rows.map(row => {
|
||||||
return {
|
return {
|
||||||
name: row[0].displayValue,
|
name: row[0].displayValue,
|
||||||
version: row[1].displayValue
|
readonly: row[1].displayValue === '1',
|
||||||
|
version: row[2].displayValue
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,8 +70,17 @@ export abstract class SqlPackageManageProviderBase {
|
|||||||
* @param packages Packages to uninstall
|
* @param packages Packages to uninstall
|
||||||
*/
|
*/
|
||||||
public async uninstallPackages(packages: nbExtensionApis.IPackageDetails[], databaseName: string): Promise<void> {
|
public async uninstallPackages(packages: nbExtensionApis.IPackageDetails[], databaseName: string): Promise<void> {
|
||||||
|
let allPackages = await this.listPackages(databaseName);
|
||||||
|
|
||||||
if (packages) {
|
if (packages) {
|
||||||
await Promise.all(packages.map(x => this.executeScripts(ScriptMode.Uninstall, x, databaseName)));
|
await Promise.all(packages.map(x => {
|
||||||
|
const originalPackage = allPackages.find(p => p.name === x.name && p.version === x.version);
|
||||||
|
if (originalPackage && originalPackage.readonly) {
|
||||||
|
return Promise.reject(`Cannot uninstalled system package '${x.name}'`);
|
||||||
|
} else {
|
||||||
|
return this.executeScripts(ScriptMode.Uninstall, x, databaseName);
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,9 +68,10 @@ export class SqlRPackageManageProvider extends SqlPackageManageProviderBase impl
|
|||||||
let credentials = await this._apiWrapper.getCredentials(connection.connectionId);
|
let credentials = await this._apiWrapper.getCredentials(connection.connectionId);
|
||||||
|
|
||||||
if (connection) {
|
if (connection) {
|
||||||
|
let server = connection.serverName.replace('\\', '\\\\');
|
||||||
let database = databaseName ? `, database="${databaseName}"` : '';
|
let database = databaseName ? `, database="${databaseName}"` : '';
|
||||||
const auth = connection.userName ? `, uid="${connection.userName}", pwd="${credentials[azdata.ConnectionOptionSpecialType.password]}"` : '';
|
const auth = connection.userName ? `, uid="${connection.userName}", pwd="${credentials[azdata.ConnectionOptionSpecialType.password]}"` : '';
|
||||||
let connectionParts = `server="${connection.serverName}"${auth}${database}`;
|
let connectionParts = `server="${server}"${auth}${database}`;
|
||||||
let rCommandScript = scriptMode === ScriptMode.Install ? 'sql_install.packages' : 'sql_remove.packages';
|
let rCommandScript = scriptMode === ScriptMode.Install ? 'sql_install.packages' : 'sql_remove.packages';
|
||||||
|
|
||||||
let scripts: string[] = [
|
let scripts: string[] = [
|
||||||
|
|||||||
@@ -21,32 +21,32 @@ function createContext(): TestContext {
|
|||||||
apiWrapper: TypeMoq.Mock.ofType(ApiWrapper),
|
apiWrapper: TypeMoq.Mock.ofType(ApiWrapper),
|
||||||
queryProvider: {
|
queryProvider: {
|
||||||
providerId: '',
|
providerId: '',
|
||||||
cancelQuery: () => {return Promise.reject();},
|
cancelQuery: () => { return Promise.reject(); },
|
||||||
runQuery: () => {return Promise.reject();},
|
runQuery: () => { return Promise.reject(); },
|
||||||
runQueryStatement: () => {return Promise.reject();},
|
runQueryStatement: () => { return Promise.reject(); },
|
||||||
runQueryString: () => {return Promise.reject();},
|
runQueryString: () => { return Promise.reject(); },
|
||||||
runQueryAndReturn: () => { return Promise.reject(); },
|
runQueryAndReturn: () => { return Promise.reject(); },
|
||||||
parseSyntax: () => {return Promise.reject();},
|
parseSyntax: () => { return Promise.reject(); },
|
||||||
getQueryRows: () => {return Promise.reject();},
|
getQueryRows: () => { return Promise.reject(); },
|
||||||
disposeQuery: () => {return Promise.reject();},
|
disposeQuery: () => { return Promise.reject(); },
|
||||||
saveResults: () => {return Promise.reject();},
|
saveResults: () => { return Promise.reject(); },
|
||||||
setQueryExecutionOptions: () => {return Promise.reject();},
|
setQueryExecutionOptions: () => { return Promise.reject(); },
|
||||||
registerOnQueryComplete: () => {return Promise.reject();},
|
registerOnQueryComplete: () => { return Promise.reject(); },
|
||||||
registerOnBatchStart: () => {return Promise.reject();},
|
registerOnBatchStart: () => { return Promise.reject(); },
|
||||||
registerOnBatchComplete: () => {return Promise.reject();},
|
registerOnBatchComplete: () => { return Promise.reject(); },
|
||||||
registerOnResultSetAvailable: () => {return Promise.reject();},
|
registerOnResultSetAvailable: () => { return Promise.reject(); },
|
||||||
registerOnResultSetUpdated: () => {return Promise.reject();},
|
registerOnResultSetUpdated: () => { return Promise.reject(); },
|
||||||
registerOnMessage: () => {return Promise.reject();},
|
registerOnMessage: () => { return Promise.reject(); },
|
||||||
commitEdit: () => {return Promise.reject();},
|
commitEdit: () => { return Promise.reject(); },
|
||||||
createRow: () => {return Promise.reject();},
|
createRow: () => { return Promise.reject(); },
|
||||||
deleteRow: () => {return Promise.reject();},
|
deleteRow: () => { return Promise.reject(); },
|
||||||
disposeEdit: () => {return Promise.reject();},
|
disposeEdit: () => { return Promise.reject(); },
|
||||||
initializeEdit: () => {return Promise.reject();},
|
initializeEdit: () => { return Promise.reject(); },
|
||||||
revertCell: () => {return Promise.reject();},
|
revertCell: () => { return Promise.reject(); },
|
||||||
revertRow: () => {return Promise.reject();},
|
revertRow: () => { return Promise.reject(); },
|
||||||
updateCell: () => {return Promise.reject();},
|
updateCell: () => { return Promise.reject(); },
|
||||||
getEditRows: () => {return Promise.reject();},
|
getEditRows: () => { return Promise.reject(); },
|
||||||
registerOnEditSessionReady: () => {return Promise.reject();},
|
registerOnEditSessionReady: () => { return Promise.reject(); },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -82,6 +82,11 @@ describe('Query Runner', () => {
|
|||||||
isNull: false,
|
isNull: false,
|
||||||
invariantCultureDisplayValue: ''
|
invariantCultureDisplayValue: ''
|
||||||
}, {
|
}, {
|
||||||
|
displayValue: '0',
|
||||||
|
isNull: false,
|
||||||
|
invariantCultureDisplayValue: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
displayValue: '1.1.1',
|
displayValue: '1.1.1',
|
||||||
isNull: false,
|
isNull: false,
|
||||||
invariantCultureDisplayValue: ''
|
invariantCultureDisplayValue: ''
|
||||||
@@ -90,6 +95,10 @@ describe('Query Runner', () => {
|
|||||||
displayValue: 'p2',
|
displayValue: 'p2',
|
||||||
isNull: false,
|
isNull: false,
|
||||||
invariantCultureDisplayValue: ''
|
invariantCultureDisplayValue: ''
|
||||||
|
}, {
|
||||||
|
displayValue: '1',
|
||||||
|
isNull: false,
|
||||||
|
invariantCultureDisplayValue: ''
|
||||||
}, {
|
}, {
|
||||||
displayValue: '1.1.2',
|
displayValue: '1.1.2',
|
||||||
isNull: false,
|
isNull: false,
|
||||||
@@ -99,15 +108,17 @@ describe('Query Runner', () => {
|
|||||||
let expected = [
|
let expected = [
|
||||||
{
|
{
|
||||||
'name': 'p1',
|
'name': 'p1',
|
||||||
|
'readonly': false,
|
||||||
'version': '1.1.1'
|
'version': '1.1.1'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': 'p2',
|
'name': 'p2',
|
||||||
|
'readonly': true,
|
||||||
'version': '1.1.2'
|
'version': '1.1.2'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -128,7 +139,7 @@ describe('Query Runner', () => {
|
|||||||
];
|
];
|
||||||
let expected: IPackageDetails[] = [];
|
let expected: IPackageDetails[] = [];
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -148,7 +159,7 @@ describe('Query Runner', () => {
|
|||||||
let rows: azdata.DbCellValue[][] = [
|
let rows: azdata.DbCellValue[][] = [
|
||||||
];
|
];
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -173,7 +184,7 @@ describe('Query Runner', () => {
|
|||||||
];
|
];
|
||||||
let expected = true;
|
let expected = true;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -198,7 +209,7 @@ describe('Query Runner', () => {
|
|||||||
];
|
];
|
||||||
let expected = false;
|
let expected = false;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -217,7 +228,7 @@ describe('Query Runner', () => {
|
|||||||
let rows: azdata.DbCellValue[][] = [];
|
let rows: azdata.DbCellValue[][] = [];
|
||||||
let expected = false;
|
let expected = false;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -242,7 +253,7 @@ describe('Query Runner', () => {
|
|||||||
];
|
];
|
||||||
let expected = true;
|
let expected = true;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -267,7 +278,7 @@ describe('Query Runner', () => {
|
|||||||
];
|
];
|
||||||
let expected = false;
|
let expected = false;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
@@ -286,7 +297,7 @@ describe('Query Runner', () => {
|
|||||||
let rows: azdata.DbCellValue[][] = [];
|
let rows: azdata.DbCellValue[][] = [];
|
||||||
let expected = false;
|
let expected = false;
|
||||||
|
|
||||||
let result : azdata.SimpleExecuteResult = {
|
let result: azdata.SimpleExecuteResult = {
|
||||||
rowCount: 2,
|
rowCount: 2,
|
||||||
columnInfo: [],
|
columnInfo: [],
|
||||||
rows: rows,
|
rows: rows,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ export interface IJupyterServerInstallation {
|
|||||||
export interface IPackageDetails {
|
export interface IPackageDetails {
|
||||||
name: string;
|
name: string;
|
||||||
version: string;
|
version: string;
|
||||||
|
readonly?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPackageTarget {
|
export interface IPackageTarget {
|
||||||
|
|||||||
1
extensions/notebook/src/types.d.ts
vendored
1
extensions/notebook/src/types.d.ts
vendored
@@ -63,6 +63,7 @@ export interface IJupyterServerInstallation {
|
|||||||
export interface IPackageDetails {
|
export interface IPackageDetails {
|
||||||
name: string;
|
name: string;
|
||||||
version: string;
|
version: string;
|
||||||
|
readonly?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user