def test_functions(gctorture): f = rcopy(reval("function(x) x^2")) assert f(3) == 9 f2 = rcopy(reval("function(x) x^2"), convert=False) assert rcopy(f2(3)) == 9 sumfun = rcopy(reval("sum")) assert sumfun([1, 2, 3]) == 6
def test_lists(gctorture): d = rcopy(reval("list(a = 1, b = 'hello')")) assert isinstance(d, OrderedDict) assert d["a"] == 1 and d["b"] == "hello" d = rcopy(dict, reval("list(a = 1, b = 'hello')")) assert isinstance(d, dict) assert d["a"] == 1 and d["b"] == "hello" d = rcopy(reval("list(x = list(1, 2))")) assert d["x"] == [1, 2] assert rcopy(tuple, reval("list(1, 2)")) == (1, 2)
def load_settings(session): if roption("radian.editing_mode", "emacs") in ["vim", "vi"]: session.app.editing_mode = EditingMode.VI else: session.app.editing_mode = EditingMode.EMACS color_scheme = roption("radian.color_scheme", "native") session.style = style_from_pygments_cls(get_style_by_name(color_scheme)) session.auto_match = roption("radian.auto_match", False) session.auto_indentation = roption("radian.auto_indentation", True) session.tab_size = int(roption("radian.tab_size", 4)) session.complete_while_typing = roption("radian.complete_while_typing", True) session.completion_timeout = roption("radian.completion_timeout", 0.05) session.history_search_no_duplicates = roption( "radian.history_search_no_duplicates", False) session.insert_new_line = roption("radian.insert_new_line", True) session.indent_lines = roption("radian.indent_lines", True) prompt = roption("radian.prompt", None) if not prompt: sys_prompt = roption("prompt") if sys_prompt == "> ": prompt = PROMPT else: prompt = sys_prompt session.default_prompt = prompt setoption("prompt", prompt) shell_prompt = roption("radian.shell_prompt", SHELL_PROMPT) session.shell_prompt = shell_prompt browse_prompt = roption("radian.browse_prompt", BROWSE_PROMPT) session.browse_prompt = browse_prompt set_width_on_resize = roption("setWidthOnResize", True) session.auto_width = roption("radian.auto_width", set_width_on_resize) output_width = session.app.output.get_size().columns if output_width and session.auto_width: setoption("width", output_width) # necessary on windows setoption("menu.graphics", False) # enables completion of installed package names if rcopy(reval("rc.settings('ipck')")) is None: reval("rc.settings(ipck = TRUE)") # backup the updated settings session._backup_settings()
def data_from_R(dataset, package): """ Import datasets from R. This is basically a wrapper around R's `data` function in the base library. https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/data """ s = f"data({dataset}, package = \"{package}\")" R.reval(s) d = R.reval(f"{dataset}") df = R.rcopy(d) return pd.DataFrame(df)
def test_strings(): assert rcall("identical", robject("abc"), rstring("abc"), _convert=True) assert rcall("identical", robject("β"), rstring("β"), _convert=True) assert rcall("identical", robject("你"), rstring("你"), _convert=True) assert rcall("identical", robject(['a', 'b']), reval("c('a', 'b')"), _convert=True)
def installed_packages(): return rcopy( list, reval(""" tryCatch( base::rownames(utils::installed.packages()), error = function(e) character(0) ) """))
def test_numbers(gctorture): assert rcopy(reval("5")) == 5 assert rcopy(list, reval("5")) == [5] assert rcopy(reval("2 + 1i")) == complex(2, 1) assert rcopy(reval("c(1L, 3L, 5L)")) == [1, 3, 5] assert rcopy(reval("c(1, 3, 5)")) == [1.0, 3.0, 5.0] assert rcopy(reval("c(1 + 3i, 3 + 2i)")) == [complex(1, 3), complex(3, 2)]
def test_numbers(): assert rcall("identical", robject(1), rint(1), _convert=True) assert rcall("identical", robject(1.0), rdouble(1), _convert=True) assert not rcall("identical", robject(1), rdouble(1), _convert=True) assert not rcall("identical", robject(1.0), rint(1), _convert=True) assert rcall("identical", robject(complex(1, 2)), reval("1 + 2i"), _convert=True) assert rcall("identical", robject([1, 2]), reval("c(1L, 2L)"), _convert=True) assert rcall("identical", robject([1.0, 2.0]), reval("c(1, 2)"), _convert=True) assert rcall("identical", robject([complex(1, 2), complex(2, 1)]), reval("c(1 + 2i, 2 + 1i)"), _convert=True)
def test_write_console_utf8(mocker, gctorture): mocker_write_console = mocker.patch("rchitect.console.write_console") # windows still doesn't like `ð��€` reval("cat('æ–‡å—')") mocker_write_console.assert_called_once_with('æ–‡å—', 0)
def test_read_console_interrupt(mocker, gctorture): mocker.patch("rchitect.setup.ask_input", side_effect=KeyboardInterrupt()) with pytest.raises(Exception) as excinfo: reval("readline('> ')") assert str(excinfo.value).startswith("Error")
def test_read_console_long(mocker, gctorture): s = "a" * 5000 mocker.patch("rchitect.setup.ask_input", return_value=s) ret = reval("readline('> ')") assert rcopy(ret) == s
def test_reval(gctorture): exp = rparse("x = 1L") assert "expression" in rclass(exp) assert "integer" in rclass(reval(exp)) assert str(exp) == 'RObject{EXPRSXP}\nexpression(x = 1L)'
def enable_reticulate_prompt(): enable = "reticulate" in rcopy(reval("rownames(installed.packages())")) and \ roption("radian.enable_reticulate_prompt", True) if enable: setoption("radian.suppress_reticulate_message", True) return enable
def package_is_installed(pkg): return pkg in rcopy(reval("rownames(installed.packages())"))
def test_r_to_py_rchitect_object(): reval("library(reticulate)") foo = Foo() x = rcall("r_to_py", robject(foo)) assert "python.builtin.object" in rcopy(rcall("class", x))
def test_write_console(mocker): mocker_write_console = mocker.patch("rchitect.console.write_console") reval("cat('helloworld')") mocker_write_console.assert_called_once_with('helloworld', 0)
def test_booleans(): assert rcall("identical", robject([True, False]), reval("c(TRUE, FALSE)"), _convert=True)
def test_ordered_list(): d = OrderedDict([("a", 2), ("b", "hello")]) assert rcall("identical", robject(d), reval("list(a = 2L, b = 'hello')"), _convert=True)
def test_none(): assert rcall("identical", robject(None), reval("NULL"), _convert=True)
def test_number(): assert rcopy(reval("5")) == 5
def test_write_console_stderr(mocker, gctorture): mocker_write_console = mocker.patch("rchitect.console.write_console") reval("cat('helloworld', file = stderr())") mocker_write_console.assert_called_once_with('helloworld', 1)
def test_booleans(gctorture): assert rcopy(reval("TRUE")) is True assert rcopy(reval("FALSE")) is False assert rcopy(list, reval("FALSE")) == [False] assert rcopy(reval("c(TRUE, FALSE)")) == [True, False]
def test_rcopy_reticulate_object(): reval("library(reticulate)") py_object = reval("r_to_py(LETTERS)") assert rcopy(py_object) == list(string.ascii_uppercase)
def test_raw(gctorture): assert rcopy(reval("as.raw(charToRaw('hello'))")) == b"hello"
def test_rfunction(gctorture): f = reval("function() {}") assert unbox(robject(rcopy(f))) == unbox(f)
def test_none(gctorture): assert rcopy(reval("NULL")) is None
def test_py_tools(): env = rcall(("base", "new.env")) reval("getOption('rchitect.py_tools')$attach()", envir=env) assert "import" in rcall("names", env, _convert=True) reval("os <- import('os')", envir=env) path = reval(""" os$path$join("foo", "bar") """, envir=env) assert "character" in rclass(path) assert rcopy(path) == os.path.join("foo", "bar") path = reval(""" py_call(os$path$join, "foo", "bar") """, envir=env) assert "PyObject" in rclass(path) assert rcopy(path) == os.path.join("foo", "bar") ret = reval(""" bulitins <- import_builtins() len <- bulitins$len len(py_eval("[1, 2, 3]")) """, envir=env) assert rcopy(ret) == 3 ret = reval(""" pyo <- py_object("hello") py_copy(pyo) """, envir=env) assert rcopy(ret) == "hello" ret = reval(""" x <- py_eval("[1, 2, 3]") x[2L] """, envir=env) assert rcopy(ret) == 3 ret = reval(""" x <- py_eval("[1, 2, 3]") x[2L] <- 4L x """, envir=env) assert rcopy(ret) == [1, 2, 4] ret = reval(""" d <- dict(a = 1L, b = 2L) d['b'] """, envir=env) assert rcopy(ret) == 2 ret = reval(""" Foo <- py_eval("type(str('Foo'), (object,), {})") foo <- Foo() foo$x <- 1L foo """, envir=env) assert rcopy(ret).x == 1 assert rcopy(reval("py_unicode('hello')", envir=env)) == "hello" assert rcopy(reval("tuple('a', 3)", envir=env)) == ('a', 3)
def test_read_console(mocker, gctorture): mocker.patch("rchitect.setup.ask_input", return_value="hello") ret = reval("readline('> ')") assert rcopy(ret) == "hello"
def session_initialize(session): if not sys.platform.startswith("win"): def reticulate_hook(*args): rcall(("base", "source"), os.path.join(os.path.dirname(__file__), "data", "patching_reticulate.R"), new_env()) set_hook(package_event("reticulate", "onLoad"), reticulate_hook) if not roption("radian.suppress_reticulate_message", False): def reticulate_message_hook(*args): if not roption("radian.suppress_reticulate_message", False): rcall("packageStartupMessage", RETICULATE_MESSAGE) set_hook(package_event("reticulate", "onLoad"), reticulate_message_hook) if roption("radian.enable_reticulate_prompt", True): def reticulate_prompt(*args): rcall(("base", "source"), os.path.join(os.path.dirname(__file__), "data", "register_reticulate.R"), new_env()) set_hook(package_event("reticulate", "onLoad"), reticulate_prompt) if roption("radian.editing_mode", "emacs") in ["vim", "vi"]: session.app.editing_mode = EditingMode.VI else: session.app.editing_mode = EditingMode.EMACS color_scheme = roption("radian.color_scheme", "native") session.style = style_from_pygments_cls(get_style_by_name(color_scheme)) session.auto_match = roption("radian.auto_match", False) session.auto_indentation = roption("radian.auto_indentation", True) session.tab_size = int(roption("radian.tab_size", 4)) session.complete_while_typing = roption("radian.complete_while_typing", True) session.completion_timeout = roption("radian.completion_timeout", 0.05) session.history_search_no_duplicates = roption( "radian.history_search_no_duplicates", False) session.insert_new_line = roption("radian.insert_new_line", True) session.indent_lines = roption("radian.indent_lines", True) prompt = roption("radian.prompt", None) if not prompt: sys_prompt = roption("prompt") if sys_prompt == "> ": prompt = PROMPT else: prompt = sys_prompt session.default_prompt = prompt setoption("prompt", prompt) shell_prompt = roption("radian.shell_prompt", SHELL_PROMPT) session.shell_prompt = shell_prompt browse_prompt = roption("radian.browse_prompt", BROWSE_PROMPT) session.browse_prompt = browse_prompt set_width_on_resize = roption("setWidthOnResize", True) session.auto_width = roption("radian.auto_width", set_width_on_resize) output_width = session.app.output.get_size().columns if output_width and session.auto_width: setoption("width", output_width) # necessary on windows setoption("menu.graphics", False) # enables completion of installed package names if rcopy(reval("rc.settings('ipck')")) is None: reval("rc.settings(ipck = TRUE)") # backup the updated settings session._backup_settings()
def test_reval_error(gctorture): with pytest.raises(Exception) as excinfo: reval("1 + 'A'") assert "non-numeric argument to binary operator" in str(excinfo.value)