Skip to content

Commit ffc651c

Browse files
committed
Correctly parse long for arguments for rpy2 magics
1 parent 4fee513 commit ffc651c

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { IOverridesRegistry } from './overrides';
22
import {
33
parse_r_args,
4+
rpy2_args_pattern,
45
rpy2_reverse_pattern,
56
rpy2_reverse_replacement
67
} from './rpy2';
@@ -46,7 +47,7 @@ export const language_specific_overrides: IOverridesRegistry = {
4647
},
4748
{
4849
// support up to 10 arguments
49-
pattern: '%R' + '(?: -(\\S+) (\\S+))?'.repeat(10) + '(.*)(\n)?',
50+
pattern: '%R' + rpy2_args_pattern(10) + '(.*)(\n)?',
5051
replacement: (match, ...args) => {
5152
let r = parse_r_args(args, -4);
5253
return `${r.outputs}rpy2.ipython.rmagic.RMagics.R("${r.content}", "${r.others}"${r.inputs})`;
@@ -81,7 +82,7 @@ export const language_specific_overrides: IOverridesRegistry = {
8182
// rpy2 extension R magic - this should likely go as an example to the user documentation, rather than being a default
8283
// only handles simple one input - one output case
8384
{
84-
pattern: '^%%R' + '(?: -(\\S) (\\S+))?'.repeat(10) + '(\n)?([\\s\\S]*)',
85+
pattern: '^%%R' + rpy2_args_pattern(10) + '(\n)?([\\s\\S]*)',
8586
replacement: (match, ...args) => {
8687
let r = parse_r_args(args, -3);
8788
return `${r.outputs}rpy2.ipython.rmagic.RMagics.R("""${r.content}""", "${r.others}"${r.inputs})`;

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('rpy2 IPython overrides', () => {
3232
let line_magics_map = new LineMagicsMap(
3333
language_specific_overrides['python'].line_magics
3434
);
35-
it('inputs and outputs', () => {
35+
it('works with the short form arguments, inputs and outputs', () => {
3636
let line = '%R -i x';
3737
let override = line_magics_map.override_for(line);
3838
expect(override).to.equal('rpy2.ipython.rmagic.RMagics.R("", "", x)');
@@ -75,5 +75,22 @@ describe('rpy2 IPython overrides', () => {
7575
reverse = line_magics_map.reverse.override_for(override);
7676
expect(reverse).to.equal(line);
7777
});
78+
79+
it('works with the long form arguments', () => {
80+
let line = '%R --input x';
81+
let override = line_magics_map.override_for(line);
82+
expect(override).to.equal('rpy2.ipython.rmagic.RMagics.R("", "", x)');
83+
let reverse = line_magics_map.reverse.override_for(override);
84+
// TODO: make this preserve the long form
85+
expect(reverse).to.equal('%R -i x');
86+
87+
line = '%R --width 800 --height 400 command()';
88+
override = line_magics_map.override_for(line);
89+
expect(override).to.equal(
90+
'rpy2.ipython.rmagic.RMagics.R(" command()", "--width 800 --height 400")'
91+
);
92+
reverse = line_magics_map.reverse.override_for(override);
93+
expect(reverse).to.equal(line);
94+
});
7895
});
7996
});

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ export function parse_r_args(args: string[], content_position: number) {
77
let variable = args[i + 1];
88
if (typeof arg === 'undefined') {
99
break;
10-
} else if (arg === 'i') {
10+
} else if (arg === 'i' || arg === '-input') {
1111
inputs.push(variable);
12-
} else if (arg === 'o') {
12+
} else if (arg === 'o' || arg === '-output') {
1313
outputs.push(variable);
1414
} else {
1515
others.push('-' + arg + ' ' + variable);
@@ -81,3 +81,7 @@ export function rpy2_reverse_replacement(match: string, ...args: string[]) {
8181
contents: contents
8282
};
8383
}
84+
85+
export function rpy2_args_pattern(max_n: number) {
86+
return '(?: -(\\S+) (\\S+))?'.repeat(max_n);
87+
}

0 commit comments

Comments
 (0)