Skip to content

Commit 4839d72

Browse files
authored
feat: Ruff Python formatter and linter (#2233)
Fixes #1255 (This might not actually be breaking, it's more just notes for implementing in DHE) BREAKING CHANGE: The app should call `MonacoUtils.init` with a `getWorker` function that uses the JSON worker in addition to the general fallback worker when adding support for configuring ruff.
1 parent a24dc8c commit 4839d72

32 files changed

Lines changed: 4877 additions & 131 deletions

jest.config.base.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const nodeModulesToTransform = [
3434
'web-namespaces',
3535
'hastscript',
3636
'nanoid',
37+
'@astral-sh/ruff-wasm-web',
3738
];
3839

3940
module.exports = {

package-lock.json

Lines changed: 45 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"@types/lodash.clamp": "^4.0.6",
8787
"@types/lodash.debounce": "^4.0.6",
8888
"@types/lodash.flatten": "^4.4.0",
89+
"@types/lodash.merge": "^4.6.9",
8990
"@types/lodash.set": "^4.3.7",
9091
"@types/lodash.throttle": "^4.1.1",
9192
"@types/memoizee": "^0.4.5",

packages/app-utils/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"@paciolan/remote-module-loader": "^3.0.2",
5757
"classnames": "^2.5.1",
5858
"lodash.debounce": "^4.0.8",
59+
"lodash.merge": "^4.6.2",
5960
"lodash.throttle": "^4.1.1"
6061
},
6162
"peerDependencies": {

packages/app-utils/src/storage/LocalWorkspaceStorage.ts

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
DecimalColumnFormatter,
1313
IntegerColumnFormatter,
1414
} from '@deephaven/jsapi-utils';
15+
import merge from 'lodash.merge';
1516
import UserLayoutUtils from './UserLayoutUtils';
1617
import type LayoutStorage from './LayoutStorage';
1718

@@ -36,6 +37,26 @@ export class LocalWorkspaceStorage implements WorkspaceStorage {
3637
return undefined;
3738
}
3839

40+
static getJSONServerConfig(
41+
serverConfigValues: Map<string, string> | undefined,
42+
key: string
43+
): Record<string, unknown> | undefined {
44+
const value = serverConfigValues?.get(key);
45+
46+
if (value == null) {
47+
return undefined;
48+
}
49+
50+
try {
51+
return JSON.parse(value);
52+
} catch (e) {
53+
log.error(
54+
`Unable to parse JSON server config for key ${key}. Value: ${value}`
55+
);
56+
return undefined;
57+
}
58+
}
59+
3960
static makeDefaultWorkspaceSettings(
4061
serverConfigValues: ServerConfigValues
4162
): WorkspaceSettings {
@@ -57,13 +78,20 @@ export class LocalWorkspaceStorage implements WorkspaceStorage {
5778
showEmptyStrings: true,
5879
showNullStrings: true,
5980
showExtraGroupColumn: true,
60-
defaultNotebookSettings: {
81+
notebookSettings: {
6182
isMinimapEnabled: false,
83+
formatOnSave: false,
84+
python: {
85+
linter: {
86+
isEnabled: true,
87+
// Omit default config so default settings are used if the user never changes them
88+
},
89+
},
6290
},
6391
webgl: true,
6492
webglEditable: true,
65-
gridDensity: 'regular' as const,
66-
};
93+
gridDensity: 'regular',
94+
} satisfies WorkspaceSettings;
6795
const serverSettings = {
6896
defaultDateTimeFormat: serverConfigValues?.get('dateTimeFormat'),
6997
formatter: [],
@@ -108,15 +136,28 @@ export class LocalWorkspaceStorage implements WorkspaceStorage {
108136
serverConfigValues,
109137
'showExtraGroupColumn'
110138
),
111-
defaultNotebookSettings:
112-
serverConfigValues?.get('isMinimapEnabled') !== undefined
113-
? {
114-
isMinimapEnabled: LocalWorkspaceStorage.getBooleanServerConfig(
115-
serverConfigValues,
116-
'isMinimapEnabled'
117-
) as boolean,
118-
}
119-
: undefined,
139+
notebookSettings: {
140+
isMinimapEnabled: LocalWorkspaceStorage.getBooleanServerConfig(
141+
serverConfigValues,
142+
'web.user.notebookSettings.isMinimapEnabled'
143+
),
144+
formatOnSave: LocalWorkspaceStorage.getBooleanServerConfig(
145+
serverConfigValues,
146+
'web.user.notebookSettings.formatOnSave'
147+
),
148+
python: {
149+
linter: {
150+
isEnabled: LocalWorkspaceStorage.getBooleanServerConfig(
151+
serverConfigValues,
152+
'web.user.notebookSettings.python.linter.isEnabled'
153+
),
154+
config: LocalWorkspaceStorage.getJSONServerConfig(
155+
serverConfigValues,
156+
'web.user.notebookSettings.python.linter.config'
157+
),
158+
},
159+
},
160+
},
120161
webgl: LocalWorkspaceStorage.getBooleanServerConfig(
121162
serverConfigValues,
122163
'web.webgl'
@@ -125,19 +166,9 @@ export class LocalWorkspaceStorage implements WorkspaceStorage {
125166
serverConfigValues,
126167
'web.webgl.editable'
127168
),
128-
};
169+
} satisfies Partial<WorkspaceSettings>;
129170

130-
const keys = Object.keys(serverSettings) as Array<
131-
keyof typeof serverSettings
132-
>;
133-
for (let i = 0; i < keys.length; i += 1) {
134-
const key = keys[i];
135-
if (serverSettings[key] !== undefined) {
136-
// @ts-expect-error override default for defined server settings
137-
settings[key] = serverSettings[key];
138-
}
139-
}
140-
return settings;
171+
return merge({}, settings, serverSettings);
141172
}
142173

143174
static async makeWorkspaceData(

packages/code-studio/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"lodash.throttle": "^4.1.1",
4848
"memoize-one": "^5.1.1",
4949
"memoizee": "^0.4.15",
50-
"monaco-editor": "^0.41.0",
50+
"monaco-editor": "^0.43.0",
5151
"nanoid": "^5.0.7",
5252
"pouchdb-browser": "^7.2.2",
5353
"pouchdb-find": "^7.2.2",

packages/code-studio/src/AppRoot.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import { MonacoUtils } from '@deephaven/console';
33
import { DownloadServiceWorkerUtils } from '@deephaven/iris-grid';
44
import MonacoWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
5+
import MonacoJsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
56
import AppRouter from './main/AppRouter';
67

78
// load addional css for playwright docker tests
@@ -16,7 +17,14 @@ export function AppRoot(): JSX.Element {
1617
window.location.href
1718
)
1819
);
19-
MonacoUtils.init({ getWorker: () => new MonacoWorker() });
20+
MonacoUtils.init({
21+
getWorker: (id: string, label: string) => {
22+
if (label === 'json') {
23+
return new MonacoJsonWorker();
24+
}
25+
return new MonacoWorker();
26+
},
27+
});
2028

2129
// disable annoying dnd-react warnings
2230
// eslint-disable-next-line @typescript-eslint/ban-ts-comment

0 commit comments

Comments
 (0)