Skip to content

Commit 444e9db

Browse files
committed
Finalize v0.5.0: docs, tests, and code cleanup for release
1 parent 6674aee commit 444e9db

File tree

4 files changed

+131
-46
lines changed

4 files changed

+131
-46
lines changed

docs/CONFIGURATION.md

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,14 @@ Ctrl+Shift+P → "Excel Power Query: Apply Recommended Defaults"
156156

157157
| Setting | Type | Default | Description | Use Cases |
158158
| ------------------- | ------- | ------- | ------------------------------------ | ---------------------------------------------------------------- |
159-
| `verboseMode` | boolean | `false` | Detailed logs in Output panel | ✅ Troubleshooting<br>✅ Understanding operations<br>❌ Clean UI |
160-
| `debugMode` | boolean | `false` | Debug-level logging + files | ✅ Extension development<br>❌ Normal usage |
159+
| `logLevel` | string | `info` | Set logging level (`none`, `error`, `warn`, `info`, `verbose`, `debug`). Replaces legacy settings. | ✅ Control log detail<br>✅ Troubleshooting<br>❌ Minimal UI |
160+
| `verboseMode` | boolean | `false` | **[DEPRECATED]** Use `logLevel` instead. Detailed logs in Output panel. | ✅ Troubleshooting<br>✅ Understanding operations<br>❌ Clean UI |
161+
| `debugMode` | boolean | `false` | **[DEPRECATED]** Use `logLevel` instead. Debug-level logging + files. | ✅ Extension development<br>❌ Normal usage |
161162
| `showStatusBarInfo` | boolean | `true` | Show watch/sync status in status bar | ✅ Visual feedback<br>❌ Minimal UI |
162163

164+
165+
**Note:** `verboseMode` and `debugMode` are deprecated and will be removed in a future release. The extension will automatically migrate these to `logLevel` on upgrade.
166+
163167
**Example - Troubleshooting Setup:**
164168

165169
```json
@@ -170,6 +174,15 @@ Ctrl+Shift+P → "Excel Power Query: Apply Recommended Defaults"
170174
}
171175
```
172176

177+
178+
**Example - Set Logging Level:**
179+
180+
```json
181+
{
182+
"excel-power-query-editor.logLevel": "debug"
183+
}
184+
```
185+
173186
**Example - Extension Development:**
174187

175188
```json
@@ -311,30 +324,37 @@ Ctrl+Shift+P → "Excel Power Query: Apply Recommended Defaults"
311324

312325
### New Settings in v0.5.0:
313326

327+
- `logLevel` - Set the logging level for the extension (replaces `verboseMode` and `debugMode`)
314328
- `sync.openExcelAfterWrite` - Automatically open Excel after sync
315329
- `sync.debounceMs` - Configurable sync delay (prevents CoPilot triple-sync)
316330
- `watch.checkExcelWriteable` - Excel file access validation
317331
- `backup.maxFiles` - Replaces deprecated `maxBackups`
318332

319333
### Deprecated Settings:
320334

335+
- `verboseMode` - Use `logLevel` instead. Will be removed in a future release.
336+
- `debugMode` - Use `logLevel` instead. Will be removed in a future release.
321337
- `syncDeleteTurnsWatchOff` - Functionality merged with `watchOffOnDelete`
322338

339+
323340
### Automatic Migration:
324341

325-
The extension automatically migrates your v0.4.x settings. **No action required.**
342+
The extension automatically migrates your v0.4.x settings, including legacy logging settings (`verboseMode`, `debugMode`) to the new `logLevel` setting. **No action required.**
326343

327344
### Manual Migration (Optional):
328345

329346
```json
330347
// v0.4.x
331348
{
332-
"excel-power-query-editor.maxBackups": 5
349+
"excel-power-query-editor.maxBackups": 5,
350+
"excel-power-query-editor.verboseMode": true,
351+
"excel-power-query-editor.debugMode": false
333352
}
334353

335354
// v0.5.0 (improved)
336355
{
337-
"excel-power-query-editor.backup.maxFiles": 5
356+
"excel-power-query-editor.backup.maxFiles": 5,
357+
"excel-power-query-editor.logLevel": "verbose"
338358
}
339359
```
340360

docs/TESTING_NOTES_v0.5.0.md

Whitespace-only changes.

src/extension.ts

Lines changed: 63 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,63 +1658,85 @@ async function rawExtraction(uri?: vscode.Uri, uris?: vscode.Uri[]): Promise<voi
16581658
function dumpAllExtensionSettings(): void {
16591659
try {
16601660
log('=== EXTENSION SETTINGS DUMP ===', 'dumpAllExtensionSettings', 'debug');
1661-
16621661
const extensionId = 'excel-power-query-editor';
1663-
16641662
// Get all configuration scopes
16651663
const userConfig = vscode.workspace.getConfiguration(extensionId, null);
16661664
const workspaceConfig = vscode.workspace.getConfiguration(extensionId, vscode.workspace.workspaceFolders?.[0]?.uri);
1667-
1668-
// Define all known extension settings
1669-
const knownSettings = [
1670-
'watchAlways',
1671-
'watchAlwaysMaxFiles',
1672-
'watchOffOnDelete',
1673-
'syncDeleteAlwaysConfirm',
1674-
'verboseMode',
1675-
'autoBackupBeforeSync',
1676-
'backupLocation',
1677-
'customBackupPath',
1678-
'backup.maxFiles',
1679-
'autoCleanupBackups',
1680-
'syncTimeout',
1681-
'debugMode',
1682-
'showStatusBarInfo',
1683-
'sync.openExcelAfterWrite',
1684-
'sync.debounceMs',
1685-
'watch.checkExcelWriteable'
1686-
];
1687-
1688-
log('USER SETTINGS (Global):', 'dumpAllExtensionSettings', 'debug');
1689-
for (const setting of knownSettings) {
1690-
const value = userConfig.get(setting);
1691-
const hasValue = userConfig.has(setting);
1692-
log(` ${setting}: ${hasValue ? JSON.stringify(value) : '<not set>'}`, 'dumpAllExtensionSettings', 'debug');
1693-
}
1694-
1695-
log('WORKSPACE SETTINGS:', 'dumpAllExtensionSettings', 'debug');
1696-
for (const setting of knownSettings) {
1697-
const value = workspaceConfig.get(setting);
1698-
const hasValue = workspaceConfig.has(setting);
1699-
log(` ${setting}: ${hasValue ? JSON.stringify(value) : '<not set>'}`, 'dumpAllExtensionSettings', 'debug');
1665+
// Collect all keys from both configs
1666+
const allKeys = new Set<string>();
1667+
for (const key of Object.keys(userConfig)) { allKeys.add(key); }
1668+
for (const key of Object.keys(workspaceConfig)) { allKeys.add(key); }
1669+
// Always include logLevel
1670+
// allKeys.add('logLevel');
1671+
// Dump each setting with its value and source
1672+
for (const key of Array.from(allKeys).sort()) {
1673+
let value: any = undefined;
1674+
let source: string = 'default';
1675+
if (workspaceConfig.has(key)) {
1676+
value = workspaceConfig.get(key);
1677+
source = 'workspace';
1678+
} else if (userConfig.has(key)) {
1679+
value = userConfig.get(key);
1680+
source = 'user';
1681+
} else {
1682+
value = vscode.workspace.getConfiguration(extensionId).inspect(key)?.defaultValue;
1683+
}
1684+
log(` ${key}: ${JSON.stringify(value)} [${source}]`, 'dumpAllExtensionSettings', 'debug');
17001685
}
1701-
17021686
// Check environment info
17031687
log('ENVIRONMENT INFO:', 'dumpAllExtensionSettings', 'debug');
17041688
log(` Remote Name: ${vscode.env.remoteName || '<not remote>'}`, 'dumpAllExtensionSettings', 'info');
17051689
log(` VS Code Version: ${vscode.version}`, 'dumpAllExtensionSettings', 'info');
17061690
log(` Workspace Folders: ${vscode.workspace.workspaceFolders?.length || 0}`, 'dumpAllExtensionSettings', 'info');
1707-
17081691
// Check if we're in a dev container
17091692
const isDevContainer = vscode.env.remoteName?.includes('dev-container');
17101693
log(` Is Dev Container: ${isDevContainer}`, 'dumpAllExtensionSettings', 'info');
1711-
17121694
log('=== END SETTINGS DUMP ===', 'dumpAllExtensionSettings', 'info');
1713-
17141695
} catch (error) {
17151696
log(`Failed to dump settings: ${error}`, 'dumpAllExtensionSettings', 'error');
17161697
}
17171698
}
1699+
// Migrate legacy debugMode/verboseMode to logLevel at activation
1700+
export async function migrateLegacySettings() {
1701+
const extensionId = 'excel-power-query-editor';
1702+
const config = vscode.workspace.getConfiguration(extensionId);
1703+
const debugMode = config.get('debugMode');
1704+
const verboseMode = config.get('verboseMode');
1705+
let needsUpdate = false;
1706+
let newLogLevel: string | undefined = undefined;
1707+
if (debugMode === true) {
1708+
newLogLevel = 'debug';
1709+
needsUpdate = true;
1710+
} else if (verboseMode === true) {
1711+
newLogLevel = 'verbose';
1712+
needsUpdate = true;
1713+
}
1714+
if (needsUpdate) {
1715+
await config.update('logLevel', newLogLevel, vscode.ConfigurationTarget.Workspace);
1716+
await config.update('debugMode', undefined, vscode.ConfigurationTarget.Workspace);
1717+
await config.update('verboseMode', undefined, vscode.ConfigurationTarget.Workspace);
1718+
log(`Migrated legacy settings to logLevel='${newLogLevel}' and removed debugMode/verboseMode from workspace settings`, 'settingsMigration', 'info');
1719+
}
1720+
// Also check user settings
1721+
const userConfig = vscode.workspace.getConfiguration(extensionId, null);
1722+
const userDebug = userConfig.get('debugMode');
1723+
const userVerbose = userConfig.get('verboseMode');
1724+
let userNeedsUpdate = false;
1725+
let userLogLevel: string | undefined = undefined;
1726+
if (userDebug === true) {
1727+
userLogLevel = 'debug';
1728+
userNeedsUpdate = true;
1729+
} else if (userVerbose === true) {
1730+
userLogLevel = 'verbose';
1731+
userNeedsUpdate = true;
1732+
}
1733+
if (userNeedsUpdate) {
1734+
await userConfig.update('logLevel', userLogLevel, vscode.ConfigurationTarget.Global);
1735+
await userConfig.update('debugMode', undefined, vscode.ConfigurationTarget.Global);
1736+
await userConfig.update('verboseMode', undefined, vscode.ConfigurationTarget.Global);
1737+
log(`Migrated legacy settings to logLevel='${userLogLevel}' and removed debugMode/verboseMode from user settings`, 'settingsMigration', 'info');
1738+
}
1739+
}
17181740

17191741
async function findExcelFile(mFilePath: string): Promise<string | undefined> {
17201742
const dir = path.dirname(mFilePath);
@@ -1735,6 +1757,8 @@ async function findExcelFile(mFilePath: string): Promise<string | undefined> {
17351757

17361758
async function cleanupBackupsCommand(uri?: vscode.Uri): Promise<void> {
17371759
try {
1760+
// Migrate legacy settings on every activation
1761+
await migrateLegacySettings();
17381762
// Validate URI parameter - don't show file dialog for invalid input
17391763
if (uri && (!uri.fsPath || typeof uri.fsPath !== 'string')) {
17401764
const errorMsg = 'Invalid URI parameter provided to cleanupBackups command';

test/utils.test.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ suite('Utils Tests', () => {
1111
suiteSetup(() => {
1212
// Initialize test configuration system
1313
initTestConfig();
14-
1514
// Ensure temp directory exists
1615
if (!fs.existsSync(tempDir)) {
1716
fs.mkdirSync(tempDir, { recursive: true });
@@ -21,7 +20,6 @@ suite('Utils Tests', () => {
2120
suiteTeardown(() => {
2221
// Clean up test configuration
2322
cleanupTestConfig();
24-
2523
// Clean up temp directory
2624
if (fs.existsSync(tempDir)) {
2725
fs.rmSync(tempDir, { recursive: true, force: true });
@@ -276,3 +274,46 @@ suite('Utils Tests', () => {
276274
});
277275
});
278276
});
277+
278+
279+
// --- Legacy Settings Migration Tests ---
280+
import { migrateLegacySettings } from '../src/extension';
281+
282+
suite('Legacy Settings Migration', () => {
283+
setup(() => {
284+
initTestConfig();
285+
});
286+
teardown(() => {
287+
cleanupTestConfig();
288+
});
289+
290+
test('Migrates both debugMode and verboseMode set', async () => {
291+
await testConfigUpdate('debugMode', true);
292+
await testConfigUpdate('verboseMode', true);
293+
await migrateLegacySettings();
294+
const config = vscode.workspace.getConfiguration('excel-power-query-editor');
295+
assert.strictEqual(config.get('logLevel'), 'debug', 'logLevel should be set to debug');
296+
assert.strictEqual(config.get('debugMode'), undefined, 'debugMode should be removed');
297+
assert.strictEqual(config.get('verboseMode'), undefined, 'verboseMode should be removed');
298+
});
299+
300+
test('Migrates only debugMode set', async () => {
301+
await testConfigUpdate('debugMode', true);
302+
await testConfigUpdate('verboseMode', false);
303+
await migrateLegacySettings();
304+
const config = vscode.workspace.getConfiguration('excel-power-query-editor');
305+
assert.strictEqual(config.get('logLevel'), 'debug', 'logLevel should be set to debug');
306+
assert.strictEqual(config.get('debugMode'), undefined, 'debugMode should be removed');
307+
assert.strictEqual(config.get('verboseMode'), undefined, 'verboseMode should be removed');
308+
});
309+
310+
test('Migrates only verboseMode set', async () => {
311+
await testConfigUpdate('debugMode', false);
312+
await testConfigUpdate('verboseMode', true);
313+
await migrateLegacySettings();
314+
const config = vscode.workspace.getConfiguration('excel-power-query-editor');
315+
assert.strictEqual(config.get('logLevel'), 'verbose', 'logLevel should be set to verbose');
316+
assert.strictEqual(config.get('debugMode'), undefined, 'debugMode should be removed');
317+
assert.strictEqual(config.get('verboseMode'), undefined, 'verboseMode should be removed');
318+
});
319+
});

0 commit comments

Comments
 (0)