Skip to content

Commit

Permalink
fix: move configuration logic and setup test
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisTowles committed Sep 25, 2022
1 parent f1da289 commit a6a3964
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 27 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"type": "object",
"title": "Paste Image Configuration",
"properties": {
"pasteImage.path": {
"pasteImage.folderPath": {
"type": "string",
"default": "${currentFileDir}",
"description": "The destination to save image file.You can use variable ${currentFileDir} and ${projectRoot}. ${currentFileDir} will be replace by the path of directory that contain current editing file. ${projectRoot} will be replace by path of the project opened in vscode."
Expand Down
25 changes: 25 additions & 0 deletions playground/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,28 @@ Test file without an image
image.png
![](.)

imagePath![](Y-09-Sep%2025,%202022-00-10-36.png)
image.png

![](asfdasdfasda.png)

![](image.png)

![](Y-09-Sep%2025,%202022-00-32-00.png)

safd
asdfasdf.png

asdfa
![](Y-09-Sep%2025,%202022-01-17-14.png)

![](Y-09-Sep%2025,%202022-00-32-13.png)



asdfaasdf

image.png
ASDA

![](2022-09-45-09-45-50.png)
96 changes: 96 additions & 0 deletions src/configuration.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { describe, expect, it } from 'vitest'
import { WorkspaceConfiguration, ConfigurationTarget } from 'vscode';
import { Constants } from "./constants";
import { parseConfigurationToConfig } from "./configuration";



class WorkspaceConfigurationMock implements WorkspaceConfiguration {
readonly [key: string]: any;
has(section: string): boolean {
throw new Error("Method not implemented.");
}
inspect<T>(section: string): { key: string; defaultValue?: T | undefined; globalValue?: T | undefined; workspaceValue?: T | undefined; workspaceFolderValue?: T | undefined; defaultLanguageValue?: T | undefined; globalLanguageValue?: T | undefined; workspaceLanguageValue?: T | undefined; workspaceFolderLanguageValue?: T | undefined; languageIds?: string[] | undefined; } | undefined {
throw new Error("Method not implemented.");
}
update(section: string, value: any, configurationTarget?: boolean | ConfigurationTarget | null | undefined, overrideInLanguage?: boolean | undefined): Thenable<void> {
throw new Error("Method not implemented.");
}
get<T>(section: string, defaultValue?: T): T | undefined {

if(defaultValue !== undefined) {
throw new Error("Logic for defaultValue not implemented.");
}

let result: string | boolean;

switch (section) {
case Constants.Config_FolderPath:
result = __dirname;
break;
case Constants.Config_BasePath:
result = __dirname;
break;
case Constants.Config_ForceUnixStyleSeparator:
result = true;
break;
case Constants.Config_Prefix:
result = '';
break;
case Constants.Config_Suffix:
result = '';
break;
case Constants.Config_NamePrefix:
result = '';
break;
case Constants.Config_NameSuffix:
result = '';
break;
case Constants.Config_DefaultName:
result = "yyyy-LL-mm-HH-mm-ss";
break;
case Constants.Config_EncodePath:
result = 'urlEncodeSpace'; // todo: enum
break;
case Constants.Config_InsertPattern:
result = "${imageSyntaxPrefix}${imageFilePath}${imageSyntaxSuffix}";
break;
case Constants.Config_ShowFilePathConfirmInputBox:
result = false;
break;
case Constants.Config_FilePathConfirmInputBoxMode:
result = 'fullPath'; // todo: enum
break;
default:
throw new Error(`No Mock provided for Config ${section}.`);
}
return result as T;
}
}


describe('Configuration', () => {

it('check mock works', () => {
const vsWorkspaceConfiguration = new WorkspaceConfigurationMock();
expect(vsWorkspaceConfiguration.get(Constants.Config_FolderPath)).toBe(__dirname);
})

it('check parse of default values', () => {

const vsWorkspaceConfiguration = new WorkspaceConfigurationMock();
const config = parseConfigurationToConfig({
projectPath: __dirname,
filePath: __dirname,
configuration: vsWorkspaceConfiguration,
})

expect(config.basePathConfig).toBe(__dirname);
expect(config.suffixConfig).toBe('');
//expect(config.forceUnixStyleSeparatorConfig).toBeTruthy();

//expect(config.showFilePathConfirmInputBox).toBeTruthy();


})
});
35 changes: 16 additions & 19 deletions src/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Constants } from "./constants";
import vscode from 'vscode';
import { WorkspaceConfiguration } from 'vscode';
import path from "path";
import { ILogger } from "./logger";

export interface Configuration {
prefixConfig: string;
suffixConfig: string;
forceUnixStyleSeparatorConfig: string;
forceUnixStyleSeparatorConfig: boolean;
encodePathConfig: string;
namePrefixConfig: string;
nameSuffixConfig: string;
Expand All @@ -26,33 +26,30 @@ const PATH_VARIABLE_CURRENT_FILE_NAME_WITHOUT_EXT = /\$\{currentFileNameWithoutE



export const loadConfiguration = ({ projectPath, filePath }: { projectPath: string; filePath: string;}): Configuration => {
const configuration = vscode.workspace.getConfiguration(Constants.ConfigurationName)

export const parseConfigurationToConfig = ({ projectPath, filePath, configuration }: { projectPath: string; filePath: string; configuration: WorkspaceConfiguration}): Configuration => {

let defaultNameConfig = configuration['defaultName']
let folderPathConfig = configuration['path']
let basePathConfig = configuration['basePath']
let prefixConfig = configuration['prefix'];
let suffixConfig = configuration['suffix'];
let forceUnixStyleSeparatorConfig = configuration['forceUnixStyleSeparator'];

let encodePathConfig = configuration['encodePath'];
let namePrefixConfig = configuration['namePrefix'];
let nameSuffixConfig = configuration['nameSuffix'];
let insertPatternConfig = configuration['insertPattern'];
let showFilePathConfirmInputBox= configuration['showFilePathConfirmInputBox'] || false;
let filePathConfirmInputBoxMode = configuration['filePathConfirmInputBoxMode'];

let defaultNameConfig = configuration.get<string>(Constants.Config_DefaultName);
let folderPathConfig = configuration.get<string>(Constants.Config_FolderPath);
let basePathConfig = configuration.get<string>(Constants.Config_BasePath );
let prefixConfig = configuration.get<string>(Constants.Config_Prefix, '');
let suffixConfig = configuration.get<string>(Constants.Config_Suffix, '');
let forceUnixStyleSeparatorConfig = configuration.get<boolean>(Constants.Config_ForceUnixStyleSeparator );

let encodePathConfig = configuration.get<string>(Constants.Config_EncodePath, '');
let namePrefixConfig = configuration.get<string>(Constants.Config_NamePrefix, '');
let nameSuffixConfig = configuration.get<string>(Constants.Config_NameSuffix, '');
let insertPatternConfig = configuration.get<string>(Constants.Config_InsertPattern, '');
let showFilePathConfirmInputBox= configuration.get<boolean>(Constants.Config_ShowFilePathConfirmInputBox) || false;
let filePathConfirmInputBoxMode = configuration.get<string>(Constants.Config_FilePathConfirmInputBoxMode) || "inputBox";

// load config pasteImage.defaultName

if (!defaultNameConfig) {
defaultNameConfig = "yyyy-LL-dd-HH-mm-ss"
}

// load config pasteImage.path

if (!folderPathConfig) {
folderPathConfig = "${currentFileDir}";
}
Expand Down
15 changes: 15 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,19 @@ export class Constants {
public static ConfigurationName = 'pasteImage'; // match the command in package.json
public static ChannelLogName = 'Markdown Paste Image'; // match the command in package.json


// Configuration Params constants
public static Config_DefaultName = 'defaultName';
public static Config_FolderPath = 'folderPath';
public static Config_BasePath = 'basePath'
public static Config_Prefix = 'prefix';
public static Config_Suffix = 'suffix';
public static Config_ForceUnixStyleSeparator = 'forceUnixStyleSeparator';
public static Config_EncodePath = 'encodePath';
public static Config_NamePrefix = 'namePrefix';
public static Config_NameSuffix = 'nameSuffix';
public static Config_InsertPattern = 'insertPattern';
public static Config_ShowFilePathConfirmInputBox= 'showFilePathConfirmInputBox';
public static Config_FilePathConfirmInputBoxMode = 'filePathConfirmInputBoxMode';

}
20 changes: 13 additions & 7 deletions src/paster.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ import { DateTime } from 'luxon';
import { win32CreateImageWithPowershell } from './osTools/win32';
import { macCreateImageWithAppleScript } from './osTools/macOS';
import { SaveClipboardImageToFileResult } from './dto/SaveClipboardImageToFileResult';
import { Configuration, loadConfiguration } from './configuration';
import { Configuration, parseConfigurationToConfig } from './configuration';
import { Constants } from './constants';


export class Paster {


static PATH_VARIABLE_IMAGE_FILE_PATH = /\$\{imageFilePath\}/g;
static PATH_VARIABLE_IMAGE_ORIGINAL_FILE_PATH = /\$\{imageOriginalFilePath\}/g;
static PATH_VARIABLE_IMAGE_FILE_NAME = /\$\{imageFileName\}/g;
Expand Down Expand Up @@ -60,8 +61,13 @@ export class Paster {

// load other config
let config: Configuration;
try{
config = loadConfiguration({projectPath, filePath});
try {

config = parseConfigurationToConfig({
projectPath,
filePath,
configuration: vscode.workspace.getConfiguration(Constants.ConfigurationName)
});

logger.debug(`config = ${JSON.stringify(config, null, 2)}`);
} catch (err) {
Expand All @@ -70,8 +76,8 @@ export class Paster {
}

// replace variable in config
const imagePath = await this.getImagePath({ filePath, selectText, config: config, logger })

const imagePath = await this.getImagePath({ filePath, selectText, config: config, logger })
try {
// is the file existed?
let fileAlreadyExisted = await fse.existsSync(imagePath);
Expand Down Expand Up @@ -104,7 +110,7 @@ export class Paster {
const result = await this.saveClipboardImageToFileAndGetPath({ imagePath, logger });

if (result.success) {
logger.debug(`saveClipboardImageToFileAndGetPath - ${imagePath} }`);
logger.debug(`saveClipboardImageToFileAndGetPath - ${result.imagePath} }`);
} else {

if (result.noImageInClipboard) {
Expand Down

0 comments on commit a6a3964

Please sign in to comment.