Skip to content

Commit f8eaa9a

Browse files
authored
Merge pull request #153 from krassowski/fix/rpy2-line-without-code
Fix the (hopefully) last corner case of %R line magic
2 parents aaaf187 + 872249f commit f8eaa9a

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
- rpy2 magics received enhanced support for argument parsing
4040
in both parent Python document (re-written overrides) and
4141
exctracted R documents (improved foreign code extractor) (
42-
[#148](https://github.com/krassowski/jupyterlab-lsp/pull/148)
42+
[#148](https://github.com/krassowski/jupyterlab-lsp/pull/148),
43+
[#153](https://github.com/krassowski/jupyterlab-lsp/pull/153)
4344
)
4445
- console logs can now easily be redirected to a floating console
4546
windows for debugging of the browser tests (see CONTRIBUTING.md)

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,29 @@ describe('Default extractors', () => {
6363

6464
let r_document = get_the_only_virtual(foreign_document_map);
6565
expect(r_document.language).to.equal('r');
66-
expect(r_document.value).to.equal('df <- data.frame()\nggplot(df)\n');
66+
expect(r_document.value).to.equal('df <- data.frame(); ggplot(df)\n');
67+
});
68+
69+
it('parses input when no code is given', () => {
70+
let code = '%R -i df';
71+
let { foreign_document_map } = extract(code);
72+
73+
let r_document = get_the_only_virtual(foreign_document_map);
74+
expect(r_document.value).to.equal('df <- data.frame();\n');
6775
});
6876

6977
it('parses multiple inputs (into dummy data frames)', () => {
7078
let code = wrap_in_python_lines('%R -i df -i x ggplot(df)');
7179
let r_document = get_the_only_virtual(extract(code).foreign_document_map);
7280
expect(r_document.value).to.equal(
73-
'df <- data.frame()\n' + 'x <- data.frame()\n' + 'ggplot(df)\n'
81+
'df <- data.frame(); x <- data.frame(); ggplot(df)\n'
7482
);
7583
});
7684

7785
it('parses inputs ignoring other arguments', () => {
7886
let code = wrap_in_python_lines('%R -i df --width 300 -o x ggplot(df)');
7987
let r_document = get_the_only_virtual(extract(code).foreign_document_map);
80-
expect(r_document.value).to.equal(
81-
'df <- data.frame()\n' + 'ggplot(df)\n'
82-
);
88+
expect(r_document.value).to.equal('df <- data.frame(); ggplot(df)\n');
8389
});
8490
});
8591

@@ -101,6 +107,6 @@ describe('Default extractors', () => {
101107

102108
let r_document = get_the_only_virtual(foreign_document_map);
103109
expect(r_document.language).to.equal('r');
104-
expect(r_document.value).to.equal('df <- data.frame()\nggplot(df)\n');
110+
expect(r_document.value).to.equal('df <- data.frame(); ggplot(df)\n');
105111
});
106112
});

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@ import {
99
function rpy2_replacer(match: string, ...args: string[]) {
1010
let r = extract_r_args(args, -3);
1111
// define dummy input variables using empty data frames
12-
let inputs = r.inputs.map(i => i + ' <- data.frame()').join('\n');
13-
if (inputs !== '') {
14-
inputs += '\n';
12+
let inputs = r.inputs.map(i => i + ' <- data.frame();').join(' ');
13+
let code: string;
14+
if (typeof r.rest === 'undefined') {
15+
code = '';
16+
} else {
17+
code = r.rest.startsWith(' ') ? r.rest.slice(1) : r.rest;
1518
}
16-
return `${inputs}${r.rest}`;
19+
if (inputs !== '' && code) {
20+
inputs += ' ';
21+
}
22+
return `${inputs}${code}`;
1723
}
1824

1925
// TODO: make the regex code extractors configurable
@@ -32,7 +38,7 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
3238
}),
3339
new RegExpForeignCodeExtractor({
3440
language: 'r',
35-
pattern: '(?:^|\n)%R' + rpy2_args_pattern(RPY2_MAX_ARGS) + ' (.*)\n?',
41+
pattern: '(?:^|\n)%R' + rpy2_args_pattern(RPY2_MAX_ARGS) + '( .*)?\n?',
3642
extract_to_foreign: rpy2_replacer,
3743
is_standalone: false,
3844
file_extension: 'R'

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function extract_r_args(args: string[], content_position: number) {
2020
return {
2121
inputs: inputs,
2222
outputs: outputs,
23-
rest: args.slice(content_position, content_position + 1),
23+
rest: args[args.length + content_position],
2424
others: others
2525
};
2626
}

0 commit comments

Comments
 (0)