Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: third-party import #16

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/core/src/structures/synset/parseSynset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Lemma } from '../lemma';
import { isVerified, stripMetacharacters } from './metacharacters';

export function parseSynset(rawString: string) {
const sanitized = sanitize(rawString);
const sanitized = sanitize(rawString || '');
const verified = isVerified(sanitized);
const annotations = sanitized.includes('(')
? new AnnotationHelper()
Expand Down
1 change: 1 addition & 0 deletions packages/engine/src/cli/synsets-cmd/argv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export type PullArgv = {
subcommand: 'pull';
partial: boolean;
only: boolean;
source: string;
_: string[];
};

Expand Down
27 changes: 17 additions & 10 deletions packages/engine/src/cli/synsets-cmd/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,40 @@ import type { WordsAddLangSheet, WordsSheet } from '../../google';

export * from './argv';

export async function getGoogleGitSyncPrerequisites() {
interface Overrides {
spreadsheetName?: string;
mainLanguagesSheet?: string;
additionalLanguagesSheet?: string;
}

export async function getGoogleGitSyncPrerequisites({
spreadsheetName = 'new_interslavic_words_list',
mainLanguagesSheet = 'words',
additionalLanguagesSheet = 'words_add_lang'
}: Overrides = {}) {
const { fileDatabase, googleAPIs } = await compose();

const spreadsheetConfig = await fileDatabase.spreadsheets.findById(
'new_interslavic_words_list',
spreadsheetName,
);

if (!spreadsheetConfig) {
throw new Error(
'Cannot find the spreadsheet config for "new_interslavic_words_list"',
`Cannot find the spreadsheet config with the name: ${spreadsheetName}`,
);
}

const spreadsheet = googleAPIs.spreadsheet(spreadsheetConfig.google_id);
const words = await spreadsheet.getSheetByTitle('words');
const words = await spreadsheet.getSheetByTitle(mainLanguagesSheet);
if (!words) {
throw new Error('Cannot find the sheet: words');
throw new Error(`Cannot find the sheet: ${mainLanguagesSheet}`);
}

const wordsAddLang = await spreadsheet.getSheetByTitle('words_add_lang');
if (!wordsAddLang) {
throw new Error('Cannot find the sheet: words_add_lang');
}
const wordsAddLang = await spreadsheet.getSheetByTitle(additionalLanguagesSheet);

return {
words: words as unknown as WordsSheet,
wordsAddLang: wordsAddLang as unknown as WordsAddLangSheet,
wordsAddLang: wordsAddLang as unknown as (WordsAddLangSheet | undefined),
multisynsets: fileDatabase.multisynsets,
};
}
Expand Down
14 changes: 13 additions & 1 deletion packages/engine/src/cli/synsets-cmd/pull.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@ import { GSheets2Git } from '../../sync';
import type { PullArgv } from './argv';
import { getGoogleGitSyncPrerequisites, parseSelectedSynsets } from './common';

function toUndefined(value: string): string | undefined {
return value === '' ? undefined : value;
}

export async function pull(argv: PullArgv) {
const [spreadsheetName, mainLanguagesSheet, additionalLanguagesSheet] = argv.source
? argv.source.split(':').map(toUndefined)
: [];

const { multisynsets, words, wordsAddLang } =
await getGoogleGitSyncPrerequisites();
await getGoogleGitSyncPrerequisites({
spreadsheetName,
mainLanguagesSheet,
additionalLanguagesSheet,
});

const selectedIds = await parseSelectedSynsets(multisynsets, argv);
if (argv.only && !selectedIds) {
Expand Down
4 changes: 4 additions & 0 deletions packages/engine/src/cli/synsets-cmd/push.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ export async function push(argv: PushArgv) {
const { words, wordsAddLang, multisynsets } =
await getGoogleGitSyncPrerequisites();

if (!wordsAddLang) {
throw new Error('Cannot find the sheet: words_add_lang');
}

const selectedIds = await parseSelectedSynsets(multisynsets, argv);
if (argv.only && !selectedIds) {
console.log(
Expand Down
4 changes: 4 additions & 0 deletions packages/engine/src/cli/synsets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ export const builder: CommandBuilder<subcommand.SynsetsArgvAny, any> = {
description: 'Partial sync (disable deletion)',
default: false,
},
source: {
type: 'string',
description: 'Custom source spreadsheet',
},
only: {
type: 'boolean',
description: 'Only selected synsets',
Expand Down
29 changes: 25 additions & 4 deletions packages/engine/src/sync/words/GSheetsOp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { log } from '../../utils';

export type GSheetsOpOptions = {
readonly words: WordsSheet;
readonly wordsAddLang: WordsAddLangSheet;
readonly wordsAddLang?: WordsAddLangSheet;
readonly selectedIds?: number[];
readonly multisynsets: MultilingualSynsetRepository;
/** Disables deletion of entities */
Expand All @@ -25,8 +25,9 @@ type TableDTO = WordsRecord | WordsAddLangRecord;
export abstract class GSheetsOp extends IdSyncOperation<number> {
private _words?: Promise<Map<number, WordsDTO>>;
private _wordsAdd?: Promise<Map<number, WordsAddLangDTO>>;
private _maxId?: Promise<number>;
protected readonly wordsSheet: WordsSheet;
protected readonly wordsAddLangSheet: WordsAddLangSheet;
protected readonly wordsAddLangSheet?: WordsAddLangSheet;
protected readonly multisynsets: MultilingualSynsetRepository;
protected readonly selectedIds?: Set<number>;

Expand All @@ -49,6 +50,15 @@ export abstract class GSheetsOp extends IdSyncOperation<number> {
await this.wordsAdd();
}

protected async maxFsId(): Promise<number> {
if (!this._maxId) {
// eslint-disable-next-line unicorn/no-array-reduce
this._maxId = this.multisynsets.keys().then((keys) => keys.reduce((a, b) => Math.max(Math.abs(a), Math.abs(b)), 0));
}

return this._maxId;
}

protected async wordIds(): Promise<number[]> {
return this.words().then((r) => [...r.keys()]);
}
Expand All @@ -63,7 +73,9 @@ export abstract class GSheetsOp extends IdSyncOperation<number> {

protected async wordsAdd(): Promise<Map<number, WordsAddLangDTO>> {
if (!this._wordsAdd) {
this._wordsAdd = this._getRecords(this.wordsAddLangSheet);
this._wordsAdd = this.wordsAddLangSheet
? this._getRecords(this.wordsAddLangSheet)
: Promise.resolve(new Map());
}

return this._wordsAdd;
Expand All @@ -76,10 +88,19 @@ export abstract class GSheetsOp extends IdSyncOperation<number> {
{ cat: ['gsheets'], tid: ['sync', sheet.id] },
`fetch ${sheet.title}`,
async () => {
let maxFsId = await this.maxFsId();
const dtos = (await sheet.getValues()) as unknown as DTO[];
const grecords = new Map(
dtos
.map((dto) => [Math.abs(+dto.id), dto]),
.map((dto) => {
let id = Math.abs(+dto.id);
if (Number.isNaN(id)) {
id = ++maxFsId;
dto.id = id.toString();
}

return [id, dto];
}),
);

return grecords;
Expand Down
14 changes: 7 additions & 7 deletions packages/engine/src/sync/words/Git2Gsheets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export class Git2Gsheets extends GSheetsOp {
notes,
});

this.wordsAddLangSheet.batch.appendRows({
this.wordsAddLangSheet!.batch.appendRows({
values: [[...dtoAddLang]],
});
}
Expand All @@ -79,7 +79,7 @@ export class Git2Gsheets extends GSheetsOp {

protected async rollbackTransaction(): Promise<void> {
this.wordsSheet.batch.clear();
this.wordsAddLangSheet.batch.clear();
this.wordsAddLangSheet!.batch.clear();
}

protected async commit(): Promise<void> {
Expand All @@ -91,7 +91,7 @@ export class Git2Gsheets extends GSheetsOp {
'batch update',
async () => {
await this.wordsSheet.batch.flush();
await this.wordsAddLangSheet.batch.flush();
await this.wordsAddLangSheet!.batch.flush();
},
);
}
Expand Down Expand Up @@ -139,7 +139,7 @@ export class Git2Gsheets extends GSheetsOp {
}

private _synset2dtoAddLang(ms: MultilingualSynset): WordsAddLangDTO {
const Mapper = this.wordsAddLangSheet
const Mapper = this.wordsAddLangSheet!
.Mapper as ArrayMapper<WordsAddLangRecord>;
const isv = ms.synsets.isv!;
// TODO: this is a violation of synset vs lemma separation
Expand Down Expand Up @@ -199,7 +199,7 @@ export class Git2Gsheets extends GSheetsOp {
if (!dto.isv.startsWith('!')) {
dto.isv = '!' + dto.isv;

this.wordsAddLangSheet.batch.updateRows({
this.wordsAddLangSheet!.batch.updateRows({
startRowIndex: dto.getIndex() + 1,
startColumnIndex: dto.getColumnIndex('isv'),
values: [[dto.isv]],
Expand Down Expand Up @@ -245,13 +245,13 @@ export class Git2Gsheets extends GSheetsOp {
if (dtoOld) {
if (this._hasChangesWords(dtoOld, dtoNew)) {
const startRowIndex = dtoOld.getIndex() + 1;
this.wordsAddLangSheet.batch.updateRows({
this.wordsAddLangSheet!.batch.updateRows({
startRowIndex,
values: [[...dtoNew]],
});
}
} else {
this.wordsAddLangSheet.batch.appendRows({
this.wordsAddLangSheet!.batch.appendRows({
values: [[...dtoNew]],
});
}
Expand Down
Loading