diff --git a/package-lock.json b/package-lock.json index e5e7941..6ec3ee3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rspec-focus", - "version": "0.3.1", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rspec-focus", - "version": "0.3.1", + "version": "0.4.0", "license": "MIT", "devDependencies": { "@eslint/compat": "^2.0.2", diff --git a/package.json b/package.json index 6b768d4..53edfdd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "rspec-focus", "displayName": "RSpec Focus", "description": "Add and clear focus mode in RSpec files", - "version": "0.3.1", + "version": "0.4.0", "license": "MIT", "publisher": "asux", "icon": "rspec.png", @@ -33,8 +33,18 @@ "activationEvents": [ "onLanguage:ruby" ], - "main": "./out/src/rspec-focus", + "main": "./out/src/extension", "contributes": { + "configuration": { + "title": "RSpec Focus", + "properties": { + "rspec-focus.focusTag": { + "type": "string", + "default": "focus", + "description": "RSpec tag used for focus (e.g. focus, wip). Inserted as :tag in examples." + } + } + }, "commands": [ { "command": "rspec-focus.add", diff --git a/src/rspec-focus.ts b/src/extension.ts similarity index 82% rename from src/rspec-focus.ts rename to src/extension.ts index 253b24b..8468b66 100644 --- a/src/rspec-focus.ts +++ b/src/extension.ts @@ -42,7 +42,13 @@ const KEYWORDS = [ 'it_should_behave_like' ]; -const FOCUS_TAG = ', :focus'; +const DEFAULT_FOCUS_TAG = 'focus'; + +function getFocusTag(): string { + const raw = vscode.workspace.getConfiguration('rspec-focus').get('focusTag', DEFAULT_FOCUS_TAG); + const sanitized = (raw ?? '').replace(/^:+/, '').replace(/[^a-zA-Z0-9_].*$/, '') || DEFAULT_FOCUS_TAG; + return `, :${sanitized}`; +} function getKeywordsRegexp(): RegExp { return new RegExp(`(?:${KEYWORDS.join('|')})\\s['"].+['"]\\sdo$`, 'm'); @@ -58,6 +64,7 @@ async function add() { return; } + const focusTag = getFocusTag(); await editor.edit((editBuilder) => { const activePosition = editor.selection.active; for (let i = activePosition.line; i >= 0; i--) { @@ -66,13 +73,13 @@ async function add() { const matches = text.match(getKeywordsRegexp()) || text.match(getRSpecBlockRegexp()); if (matches) { - if (text.includes(FOCUS_TAG)) { + if (text.includes(focusTag)) { continue; } else { const doIndex = text.lastIndexOf('do'); if (doIndex !== -1) { const position = new Position(i, doIndex - 1); - editBuilder.insert(position, FOCUS_TAG); + editBuilder.insert(position, focusTag); } break; } @@ -87,15 +94,16 @@ async function clear() { return; } + const focusTag = getFocusTag(); await editor.edit((editBuilder) => { for (let i = 0; i < editor.document.lineCount; i++) { const line = editor.document.lineAt(i); const text = line.text; - const focusIndex = text.indexOf(FOCUS_TAG); + const focusIndex = text.indexOf(focusTag); if (focusIndex !== -1) { const start = new Position(i, focusIndex); - const end = new Position(i, focusIndex + FOCUS_TAG.length); + const end = new Position(i, focusIndex + focusTag.length); editBuilder.delete(new Range(start, end)); } } diff --git a/test/rspec-focus.test.ts b/test/extension.test.ts similarity index 76% rename from test/rspec-focus.test.ts rename to test/extension.test.ts index 25f5d69..04a7e0a 100644 --- a/test/rspec-focus.test.ts +++ b/test/extension.test.ts @@ -73,4 +73,24 @@ suite('RSpec Focus Functional Tests', () => { assert.strictEqual(editor.document.lineAt(0).text, "describe 'User' do"); assert.strictEqual(editor.document.lineAt(1).text, " it 'is valid' do"); }); + + test('Uses configurable focus tag (e.g. wip)', async () => { + const config = vscode.workspace.getConfiguration('rspec-focus'); + const original = config.get('focusTag'); + try { + await config.update('focusTag', 'wip', vscode.ConfigurationTarget.Global); + + const content = "it 'work in progress' do\nend"; + const editor = await setupEditor(content); + editor.selection = new vscode.Selection(new vscode.Position(0, 0), new vscode.Position(0, 0)); + + await vscode.commands.executeCommand('rspec-focus.add'); + assert.strictEqual(editor.document.lineAt(0).text, "it 'work in progress', :wip do"); + + await vscode.commands.executeCommand('rspec-focus.clear'); + assert.strictEqual(editor.document.lineAt(0).text, "it 'work in progress' do"); + } finally { + await config.update('focusTag', original, vscode.ConfigurationTarget.Global); + } + }); });