Skip to content

Commit 71969a7

Browse files
authored
Merge pull request #293 from krassowski/improve-magic-false-positives
Alleviate too aggressive line magics substitution #281
2 parents 30e38bd + 26f35c6 commit 71969a7

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

CHANGELOG.md

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,44 @@
11
## CHANGELOG
22

3-
### `@krassowski/jupyterlab-lsp 1.0.1` (unreleased)
3+
### `@krassowski/jupyterlab-lsp 1.1.0` (unreleased)
4+
5+
- features
6+
7+
- language servers can now be configured from the Advanced Settings Editor ([#245][])
48

59
- bug fixes
610

711
- fixes currently-highlighted token in dark editor themes against light lab theme
812
(and vice versa) ([#195][])
913
- restores sorting order-indicating caret icons in diagnostics panel table ([#261][])
1014
- handles document open and change operation ordering more predictably ([#284][])
15+
- fixes some pyflakes issues caused by line magics substitution ([#293][])
1116

1217
[#195]: https://github.com/krassowski/jupyterlab-lsp/issues/195
1318
[#261]: https://github.com/krassowski/jupyterlab-lsp/issues/261
19+
[#293]: https://github.com/krassowski/jupyterlab-lsp/pull/293
20+
21+
### `@krassowski/jupyterlab-lsp 0.9.0` (unreleased)
22+
23+
- features
24+
25+
- language servers can now be configured from the Advanced Settings Editor ([#245][])
26+
27+
- bug fixes
28+
29+
- handles document open and change operation ordering more predictably ([#284][])
30+
31+
### `lsp-ws-connection 0.5.0` (unreleased)
32+
33+
- features
34+
35+
- language servers can now be configured from the Advanced Settings Editor ([#245][])
36+
37+
- bug fixes
38+
39+
- handles document open and change operation ordering more predictably ([#284][])
40+
41+
[#245]: https://github.com/krassowski/jupyterlab-lsp/pull/245
1442
[#284]: https://github.com/krassowski/jupyterlab-lsp/pull/284
1543

1644
### `@krassowski/jupyterlab-lsp 1.0.0` (2020-03-14)

packages/jupyterlab-lsp/src/magics/defaults.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@ describe('Default IPython overrides', () => {
104104
expect(reverse).to.equal(LINE_MAGIC_WITH_SPACE);
105105
});
106106

107+
it('overrides x =%ls', () => {
108+
// this is a corner-case as described in
109+
// https://github.com/krassowski/jupyterlab-lsp/issues/281#issuecomment-645286076
110+
let override = line_magics_map.override_for('x =%ls');
111+
expect(override).to.equal('x =get_ipython().run_line_magic("ls", "")');
112+
});
113+
114+
it('does not override line-magic-like constructs', () => {
115+
let override = line_magics_map.override_for('list("%")');
116+
expect(override).to.equal(null);
117+
});
118+
107119
it('escapes arguments', () => {
108120
const line_magic_with_args = '%MAGIC "arg"';
109121
let override = line_magics_map.override_for(line_magic_with_args);
@@ -122,5 +134,10 @@ describe('Default IPython overrides', () => {
122134
let reverse = line_magics_map.reverse.override_for(override);
123135
expect(reverse).to.equal('!ls -o');
124136
});
137+
138+
it('does not override shell-like constructs', () => {
139+
let override = line_magics_map.override_for('"!ls"');
140+
expect(override).to.equal(null);
141+
});
125142
});
126143
});

packages/jupyterlab-lsp/src/magics/defaults.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,13 @@ export const language_specific_overrides: IOverridesRegistry = {
3838
// keep the content, keep magic/command name and new line at the end
3939

4040
// note magics do not have to start with the new line, for example x = !ls or x = %ls are both valid.
41+
// x =%ls is also valid. However, percent may also appear in strings, e.g. ls('%').
42+
// Hence: (^|\\s|=) for shell commands (!) and line magics (%); see issue #281.
43+
// This does not solve all issues, for example `list(" %ls")` still leads to:
44+
// `list(" get_ipython().run_line_magic("ls")", "")`.
4145
{
42-
pattern: '!(\\S+)(.*)(\n)?',
43-
replacement: 'get_ipython().getoutput("$1$2")$3',
46+
pattern: '(^|\\s|=)!(\\S+)(.*)(\n)?',
47+
replacement: '$1get_ipython().getoutput("$2$3")$4',
4448
reverse: {
4549
pattern: 'get_ipython\\(\\).getoutput\\("(.*?)"\\)(\n)?',
4650
replacement: '!$1$2'
@@ -62,11 +66,11 @@ export const language_specific_overrides: IOverridesRegistry = {
6266
}
6367
},
6468
{
65-
pattern: '%(\\S+)(.*)(\n)?',
66-
replacement: (match, name, args, line_break) => {
69+
pattern: '(^|\\s|=)%(\\S+)(.*)(\n)?',
70+
replacement: (match, prefix, name, args, line_break) => {
6771
args = empty_or_escaped(args);
6872
line_break = line_break || '';
69-
return `get_ipython().run_line_magic("${name}", "${args}")${line_break}`;
73+
return `${prefix}get_ipython().run_line_magic("${name}", "${args}")${line_break}`;
7074
},
7175
reverse: {
7276
pattern:

0 commit comments

Comments
 (0)