Skip to content

Commit 0db916b

Browse files
committed
split functionallity into multiple classes
1 parent ce554e9 commit 0db916b

File tree

7 files changed

+87
-88
lines changed

7 files changed

+87
-88
lines changed

src/client/datascience/export/exportBase.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 7 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
import { inject, injectable, named } from 'inversify';
2-
import { Memento, SaveDialogOptions, Uri } from 'vscode';
3-
import { IApplicationShell } from '../../common/application/types';
2+
import { Uri } from 'vscode';
43
import { IFileSystem, TemporaryFile } from '../../common/platform/types';
5-
import { IMemento, WORKSPACE_MEMENTO } from '../../common/types';
6-
import { ExportNotebookSettings } from '../interactive-common/interactiveWindowTypes';
74
import { IDataScienceErrorHandler, INotebookEditor } from '../types';
5+
import { IExportManagerFilePicker } from './exportManagerFilePicker';
86

97
export enum ExportFormat {
108
pdf = 'pdf',
119
html = 'html',
1210
python = 'python'
1311
}
1412

15-
export const PDFExtensions = { PDF: ['.pdf'] };
16-
export const HTMLExtensions = { HTML: ['.html', 'htm'] };
17-
export const PythonExtensions = { Python: ['.py'] };
18-
1913
export const IExportManager = Symbol('IExportManager');
2014
export interface IExportManager {
2115
export(format: ExportFormat, activeEditor: INotebookEditor): Promise<Uri | undefined>;
@@ -28,27 +22,21 @@ export interface IExport {
2822

2923
@injectable()
3024
export class ExportManager implements IExportManager {
31-
private readonly defaultExportSaveLocation = ''; // set default save location
32-
3325
constructor(
3426
@inject(IExport) @named(ExportFormat.pdf) private readonly exportToPDF: IExport,
3527
@inject(IExport) @named(ExportFormat.html) private readonly exportToHTML: IExport,
3628
@inject(IExport) @named(ExportFormat.python) private readonly exportToPython: IExport,
37-
@inject(IApplicationShell) private readonly applicationShell: IApplicationShell,
38-
@inject(IMemento) @named(WORKSPACE_MEMENTO) private workspaceStorage: Memento,
3929
@inject(IFileSystem) private readonly fileSystem: IFileSystem,
40-
@inject(IDataScienceErrorHandler) private readonly errorHandler: IDataScienceErrorHandler
30+
@inject(IDataScienceErrorHandler) private readonly errorHandler: IDataScienceErrorHandler,
31+
@inject(IExportManagerFilePicker) private readonly filePicker: IExportManagerFilePicker
4132
) {}
4233

4334
public async export(format: ExportFormat, activeEditor: INotebookEditor): Promise<Uri | undefined> {
4435
// need to add telementry and status messages
4536

46-
let target;
47-
if (format !== ExportFormat.python) {
48-
target = await this.getExportFileLocation(format);
49-
if (!target) {
50-
return; // user didn't select path
51-
}
37+
const target = await this.filePicker.getExportFileLocation(format);
38+
if (!target) {
39+
return;
5240
}
5341

5442
const tempFile = await this.makeTemporaryFile(activeEditor);
@@ -91,55 +79,8 @@ export class ExportManager implements IExportManager {
9179

9280
return tempFile;
9381
}
94-
95-
private getLastFileSaveLocation(): Uri {
96-
const filePath = this.workspaceStorage.get(
97-
ExportNotebookSettings.lastSaveLocation,
98-
this.defaultExportSaveLocation
99-
);
100-
101-
return Uri.file(filePath);
102-
}
103-
104-
private updateFileSaveLocation(value: Uri) {
105-
const filePath = value.toString();
106-
this.workspaceStorage.update(ExportNotebookSettings.lastSaveLocation, filePath);
107-
}
108-
109-
private async getExportFileLocation(format: ExportFormat): Promise<Uri | undefined> {
110-
let fileExtensions;
111-
switch (format) {
112-
case ExportFormat.python:
113-
fileExtensions = PythonExtensions;
114-
break;
115-
116-
case ExportFormat.pdf:
117-
fileExtensions = PDFExtensions;
118-
break;
119-
120-
case ExportFormat.html:
121-
fileExtensions = HTMLExtensions;
122-
break;
123-
124-
default:
125-
return;
126-
}
127-
128-
const options: SaveDialogOptions = {
129-
defaultUri: this.getLastFileSaveLocation(),
130-
saveLabel: '',
131-
filters: fileExtensions
132-
};
133-
134-
const uri = await this.applicationShell.showSaveDialog(options);
135-
if (uri) {
136-
this.updateFileSaveLocation(uri);
137-
}
138-
return uri;
139-
}
14082
}
14183

14284
// continue with decorater pattern - READ
14385
// ts mockito - READ
144-
// do depenedncy checking using code seen before
14586
// test that stuff
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { inject, injectable, named } from 'inversify';
2+
import { Memento, SaveDialogOptions, Uri } from 'vscode';
3+
import { IApplicationShell } from '../../common/application/types';
4+
import { IMemento, WORKSPACE_MEMENTO } from '../../common/types';
5+
import { ExportNotebookSettings } from '../interactive-common/interactiveWindowTypes';
6+
import { ExportFormat } from './exportManager';
7+
8+
export const PDFExtensions = { PDF: ['.pdf'] };
9+
export const HTMLExtensions = { HTML: ['.html', 'htm'] };
10+
export const PythonExtensions = { Python: ['.py'] };
11+
12+
export const IExportManagerFilePicker = Symbol('IExportManagerFilePicker');
13+
export interface IExportManagerFilePicker {
14+
getExportFileLocation(format: ExportFormat): Promise<Uri | undefined>;
15+
}
16+
17+
@injectable()
18+
export class ExportManagerFilePicker implements IExportManagerFilePicker {
19+
private readonly defaultExportSaveLocation = ''; // set default save location
20+
21+
constructor(
22+
@inject(IApplicationShell) private readonly applicationShell: IApplicationShell,
23+
@inject(IMemento) @named(WORKSPACE_MEMENTO) private workspaceStorage: Memento
24+
) {}
25+
26+
public async getExportFileLocation(format: ExportFormat): Promise<Uri | undefined> {
27+
let fileExtensions;
28+
switch (format) {
29+
case ExportFormat.python:
30+
fileExtensions = PythonExtensions;
31+
break;
32+
33+
case ExportFormat.pdf:
34+
fileExtensions = PDFExtensions;
35+
break;
36+
37+
case ExportFormat.html:
38+
fileExtensions = HTMLExtensions;
39+
break;
40+
41+
default:
42+
return;
43+
}
44+
45+
const options: SaveDialogOptions = {
46+
defaultUri: this.getLastFileSaveLocation(),
47+
saveLabel: '',
48+
filters: fileExtensions
49+
};
50+
51+
const uri = await this.applicationShell.showSaveDialog(options);
52+
if (uri) {
53+
this.updateFileSaveLocation(uri);
54+
}
55+
return uri;
56+
}
57+
58+
private getLastFileSaveLocation(): Uri {
59+
const filePath = this.workspaceStorage.get(
60+
ExportNotebookSettings.lastSaveLocation,
61+
this.defaultExportSaveLocation
62+
);
63+
64+
return Uri.file(filePath);
65+
}
66+
67+
private updateFileSaveLocation(value: Uri) {
68+
const filePath = value.toString();
69+
this.workspaceStorage.update(ExportNotebookSettings.lastSaveLocation, filePath);
70+
}
71+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { injectable } from 'inversify';
22
import { Uri } from 'vscode';
3-
import { ExportBase } from './exportBase';
3+
import { IExport } from './exportManager';
44

55
@injectable()
6-
export class ExportToHTML extends ExportBase {
6+
export class ExportToHTML implements IExport {
77
// tslint:disable-next-line: no-empty
88
public async export(_source: Uri, _target: Uri): Promise<void> {}
99
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { injectable } from 'inversify';
22
import { Uri } from 'vscode';
3-
import { ExportBase } from './exportBase';
3+
import { IExport } from './exportManager';
44

55
@injectable()
6-
export class ExportToPDF extends ExportBase {
6+
export class ExportToPDF implements IExport {
77
// tslint:disable-next-line: no-empty
88
public async export(_source: Uri, _target: Uri): Promise<void> {}
99
}

src/client/datascience/export/exportToPython.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ import { Uri, ViewColumn } from 'vscode';
33
import { IDocumentManager } from '../../common/application/types';
44
import { IFileSystem } from '../../common/platform/types';
55
import { INotebookEditorProvider, INotebookImporter } from '../types';
6-
import { ExportBase } from './exportBase';
6+
import { IExport } from './exportManager';
77

88
@injectable()
9-
export class ExportToPython extends ExportBase {
9+
export class ExportToPython implements IExport {
1010
constructor(
1111
@inject(INotebookEditorProvider) protected readonly notebookEditorProvider: INotebookEditorProvider,
1212
@inject(IFileSystem) protected readonly fileSystem: IFileSystem,
1313
@inject(IDocumentManager) protected readonly documentManager: IDocumentManager,
1414
@inject(INotebookImporter) protected readonly importer: INotebookImporter
15-
) {
16-
super();
17-
}
15+
) {}
1816

1917
public async export(source: Uri): Promise<void> {
2018
const contents = await this.importer.importFromFile(

src/client/datascience/serviceRegistry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { DataScienceErrorHandler } from './errorHandler/errorHandler';
3737
import { ExportCommands } from './export/exportCommands';
3838
import { ExportFormat, ExportManager, IExport, IExportManager } from './export/exportManager';
3939
import { ExportManagerDependencyChecker } from './export/exportManagerDependencyChecker';
40+
import { ExportManagerFilePicker, IExportManagerFilePicker } from './export/exportManagerFilePicker';
4041
import { ExportToHTML } from './export/exportToHTML';
4142
import { ExportToPDF } from './export/exportToPDF';
4243
import { ExportToPython } from './export/exportToPython';
@@ -276,6 +277,7 @@ export function registerTypes(serviceManager: IServiceManager) {
276277
serviceManager.addSingleton<IExport>(IExport, ExportToHTML, ExportFormat.html);
277278
serviceManager.addSingleton<IExport>(IExport, ExportToPython, ExportFormat.python);
278279
serviceManager.addSingleton<ExportCommands>(ExportCommands, ExportCommands);
280+
serviceManager.addSingleton<IExportManagerFilePicker>(ExportManagerFilePicker, ExportManagerFilePicker);
279281

280282
registerGatherTypes(serviceManager);
281283
registerNotebookTypes(serviceManager);

0 commit comments

Comments
 (0)