Skip to content

Commit

Permalink
Move AbortFlag into Parser (#72)
Browse files Browse the repository at this point in the history
  • Loading branch information
MakotoE committed May 7, 2020
1 parent 23f09d3 commit 50522bb
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 72 deletions.
17 changes: 0 additions & 17 deletions AbortFlag.test.ts

This file was deleted.

15 changes: 0 additions & 15 deletions AbortFlag.ts

This file was deleted.

15 changes: 2 additions & 13 deletions action.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {CsvStringAndName, ExportOptions, ImportOptions, Parser} from './parser';
import {AppState, OutputType} from './state';
import {AbortFlag} from './AbortFlag';
import {ThunkDispatch} from 'redux-thunk';

export type Action =
Expand Down Expand Up @@ -66,8 +65,6 @@ export const init = () => async (dispatch: Dispatch, _, {parser}: ExtraArg): Pro
});
}

let abortFlag = new AbortFlag(); // TODO move into Parser

function setProgressCallback(dispatch: Dispatch): (percent: number) => void {
return (percent) => {
dispatch({
Expand All @@ -84,13 +81,9 @@ export const importCSV = (options: ImportOptions) =>
progress: {show: true, aborting: false, percent: 0.0},
});

abortFlag.abort();
abortFlag = new AbortFlag();

const parseErrors = await parser.importCSV(
options,
setProgressCallback(dispatch),
abortFlag,
);
if (parseErrors.length > 0) {
dispatch({
Expand All @@ -112,13 +105,9 @@ export const exportCSV = (options: ExportOptions) =>
progress: {show: true, aborting: false, percent: 0.0},
});

abortFlag.abort();
abortFlag = new AbortFlag();

const result = await parser.csvStringAndName(
options,
setProgressCallback(dispatch),
abortFlag,
);

dispatch({
Expand All @@ -129,8 +118,8 @@ export const exportCSV = (options: ExportOptions) =>
}

export const abort = () =>
async (dispatch: Dispatch, getState: GetState): Promise<void> => {
abortFlag.abort();
async (dispatch: Dispatch, getState: GetState, {parser}: ExtraArg): Promise<void> => {
parser.abort();
const {progress} = getState();
dispatch({
type: SET_PROGRESS,
Expand Down
14 changes: 4 additions & 10 deletions components/Export.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ describe('Export', () => {
return <MemoryRouter><Provider store={store}><Export /></Provider></MemoryRouter>
}

it('export text', (done) => {
it('export text', async () => {
const parser = sinon.stub(new Parser());
parser.csvStringAndName.onFirstCall().resolves({string: 'export result', name: ''});

Expand All @@ -39,22 +39,16 @@ describe('Export', () => {
wrapper.find(DelimiterInput).props().onChange(',');
wrapper.find(NewlineDropdown).props().onChange(NewlineSequence.LF);
wrapper.update();
wrapper.find(PrimaryButton).props().onClick(null);
await wrapper.find(PrimaryButton).props().onClick(null);

const expected: ExportOptions = {
delimiter: ',',
newline: NewlineSequence.LF,
}
// @ts-ignore
assert(parser.csvStringAndName.calledOnceWith(expected));
setTimeout(
() => {
wrapper.update();
assert.strictEqual(wrapper.find(TextField).props().value, 'export result');
done();
},
2,
);
wrapper.update();
assert.strictEqual(wrapper.find(TextField).props().value, 'export result');
});

it('compatability test', () => {
Expand Down
5 changes: 3 additions & 2 deletions components/Import.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ describe('Import', () => {
return <MemoryRouter><Provider store={store}><Import /></Provider></MemoryRouter>
}

it('import', () => {
it('import', async () => {
const parser = sinon.stub(new Parser());
parser.importCSV.resolves([]);
const store = createStore(reducer, applyMiddleware(thunk.withExtraArgument({parser})));
const wrapper = mount(<ImportWithContext store={store} />);

Expand All @@ -39,7 +40,7 @@ describe('Import', () => {
wrapper.find(NewlineDropdown).props().onChange(NewlineSequence.LF);
wrapper.find(EncodingDropdown).props().onChange('UTF-8');
wrapper.update();
wrapper.find(PrimaryButton).props().onClick(null);
await wrapper.find(PrimaryButton).props().onClick(null);

const expected: ImportOptions = {
source: {inputType: 1, text: 'csv text'},
Expand Down
4 changes: 3 additions & 1 deletion components/Import.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ export default function Import(): React.ReactElement {
>
<PrimaryButton
disabled={buttonTooltipContent !== ''}
onClick={() => dispatch(importCSV({source, newline, delimiter, encoding}))}
onClick={
async () => dispatch(importCSV({source, newline, delimiter, encoding}))
}
text={'Import CSV'}
/>
</TooltipHost>
Expand Down
4 changes: 2 additions & 2 deletions createLargeCSV.js → generateCSV.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ function row() {

function main() {
const rowStr = row();
fs.writeFileSync(__dirname + '/largeCSVFile.csv', '');
const fd = fs.openSync(__dirname + '/largeCSVFile.csv', 'a');
fs.writeFileSync(__dirname + '/csvFile.csv', '');
const fd = fs.openSync(__dirname + '/csvFile.csv', 'a');
for (let i = 0; i < rows; i++) {
fs.writeSync(fd, rowStr);
}
Expand Down
29 changes: 22 additions & 7 deletions parser.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as Parser from './parser';
import {
AbortFlag,
addQuotes,
ChunkProcessor,
chunkRange,
Expand All @@ -14,7 +15,6 @@ import {
} from './parser';
import {ParseConfig} from 'papaparse';
import * as assert from 'assert';
import {AbortFlag} from './AbortFlag';
import {Shape} from './excel';

describe('parser', () => {
Expand Down Expand Up @@ -117,7 +117,22 @@ describe('parser', () => {
});
});

it('_chunkRange()', () => {
describe('AbortFlag', () => {
it('abort()', () => {
const flag0 = new AbortFlag();
assert.strictEqual(flag0.aborted(), false);
flag0.abort();
assert.strictEqual(flag0.aborted(), true);
flag0.abort();
assert.strictEqual(flag0.aborted(), true);

const flag1 = new AbortFlag();
flag1.abort();
assert.strictEqual(flag1.aborted(), true);
});
});

it('chunkRange()', () => {
interface Test {
chunk: number;
shape: Shape;
Expand Down Expand Up @@ -239,7 +254,7 @@ describe('parser', () => {
}
});

it('_addQuotes()', () => {
it('addQuotes()', () => {
const tests: {row: string[]; delimiter: string; expected: string[]}[] = [
{
row: [''],
Expand Down Expand Up @@ -294,7 +309,7 @@ describe('parser', () => {
}
});

it('_rowString()', () => {
it('rowString()', () => {
const tests: {row: any[]; exportOptions: ExportOptions; expected: string}[] = [
{
row: [],
Expand Down Expand Up @@ -336,7 +351,7 @@ describe('parser', () => {
}
});

it('_chunkString()', async () => {
it('chunkString()', async () => {
const tests: {values: any[][]; exportOptions: ExportOptions; expected: string}[] = [
{
values: [[]],
Expand All @@ -361,7 +376,7 @@ describe('parser', () => {
}
});

describe('_csvString()', () => {
describe('csvString()', () => {
it('normal operation', async () => {
interface Test {
shape: Shape;
Expand Down Expand Up @@ -506,7 +521,7 @@ describe('parser', () => {
});
});

it('_nameToUse()', () => {
it('nameToUse()', () => {
const tests: {workbookName: string; worksheetName: string; expected: string}[] = [
{
workbookName: '',
Expand Down
38 changes: 33 additions & 5 deletions parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import * as ExcelAPI from './excel';
import {APIVersionInfo, Shape} from './excel';
import * as Papa from 'papaparse';
import {AbortFlag} from './AbortFlag';

export const enum InputType {file, text}

Expand Down Expand Up @@ -36,6 +35,10 @@ export interface ExportOptions {
let reduceChunkSize = null;

export class Parser {
constructor() {
this.abortFlag = new AbortFlag();
}

async init(): Promise<APIVersionInfo> { // TODO clean up the spaghetti
const result = await ExcelAPI.init();
if (result.platform === Office.PlatformType.OfficeOnline) {
Expand All @@ -52,11 +55,12 @@ export class Parser {
async importCSV(
importOptions: ImportOptions,
progressCallback: ProgressCallback,
abortFlag: AbortFlag,
): Promise<Papa.ParseError[]> {
this.abort();

let errors = null;
await ExcelAPI.runOnBlankWorksheet(async (worksheet) => {
const chunkProcessor = new ChunkProcessor(worksheet, progressCallback, abortFlag);
const chunkProcessor = new ChunkProcessor(worksheet, progressCallback, this.abortFlag);
errors = await chunkProcessor.run(importOptions);
});
return errors;
Expand All @@ -65,8 +69,9 @@ export class Parser {
async csvStringAndName(
exportOptions: ExportOptions,
progressCallback: ProgressCallback,
abortFlag: AbortFlag,
): Promise<CsvStringAndName> {
this.abort();

let namesAndShape = null;
let resultString = '';
await ExcelAPI.runOnCurrentWorksheet(async (worksheet) => {
Expand All @@ -78,7 +83,7 @@ export class Parser {
chunkRows(namesAndShape.shape),
exportOptions,
progressCallback,
abortFlag,
this.abortFlag,
);
});

Expand All @@ -87,6 +92,29 @@ export class Parser {
string: resultString,
};
}

abort(): void {
this.abortFlag.abort();
this.abortFlag = new AbortFlag();
}

private abortFlag: AbortFlag;
}

export class AbortFlag {
public constructor() {
this._aborted = false;
}

public abort(): void {
this._aborted = true;
}

public aborted(): boolean {
return this._aborted;
}

private _aborted: boolean;
}

type ProgressCallback = (progress: number) => void;
Expand Down

0 comments on commit 50522bb

Please sign in to comment.