|
9 | 9 | from functools import wraps
|
10 | 10 | from typing import List, Type
|
11 | 11 |
|
12 |
| -try: |
13 |
| - import rpy2 |
14 |
| - import rpy2.robjects |
15 |
| -except ImportError: |
16 |
| - pass |
17 | 12 | if sys.version_info >= (3, 9):
|
18 | 13 | from functools import cache
|
19 | 14 | else:
|
20 | 15 | from functools import lru_cache
|
| 16 | + |
21 | 17 | cache = lru_cache(maxsize=None)
|
22 | 18 |
|
23 | 19 | from packaging import version
|
@@ -357,56 +353,55 @@ def format_code(self, code: str, notebook: bool, **options) -> str:
|
357 | 353 | return isort.code(code=code, **options)
|
358 | 354 |
|
359 | 355 |
|
360 |
| -class FormatRFormatter(BaseFormatter): |
361 |
| - label = "Apply FormatR Formatter" |
362 |
| - package_name = "formatR" |
| 356 | +class RFormatter(BaseFormatter): |
| 357 | + @property |
| 358 | + @abc.abstractmethod |
| 359 | + def package_name(self) -> str: |
| 360 | + pass |
363 | 361 |
|
364 | 362 | @property
|
365 | 363 | def importable(self) -> bool:
|
366 |
| - try: |
367 |
| - import rpy2.robjects.packages as rpackages |
| 364 | + package_location = subprocess.run( |
| 365 | + ["Rscript", "-e", f"cat(system.file(package='{self.package_name}'))"], |
| 366 | + capture_output=True, |
| 367 | + text=True, |
| 368 | + ) |
| 369 | + return package_location != "" |
368 | 370 |
|
369 |
| - rpackages.importr(self.package_name, robject_translations={".env": "env"}) |
370 | 371 |
|
371 |
| - return True |
372 |
| - except Exception: |
373 |
| - return False |
| 372 | +class FormatRFormatter(RFormatter): |
| 373 | + label = "Apply FormatR Formatter" |
| 374 | + package_name = "formatR" |
374 | 375 |
|
375 | 376 | @handle_line_ending_and_magic
|
376 | 377 | def format_code(self, code: str, notebook: bool, **options) -> str:
|
377 | 378 | import rpy2.robjects.packages as rpackages
|
| 379 | + from rpy2.robjects import conversion, default_converter |
378 | 380 |
|
379 |
| - format_r = rpackages.importr(self.package_name, robject_translations={".env": "env"}) |
380 |
| - formatted_code = format_r.tidy_source(text=code, output=False, **options) |
381 |
| - return "\n".join(formatted_code[0]) |
| 381 | + with conversion.localconverter(default_converter): |
| 382 | + format_r = rpackages.importr(self.package_name, robject_translations={".env": "env"}) |
| 383 | + formatted_code = format_r.tidy_source(text=code, output=False, **options) |
| 384 | + return "\n".join(formatted_code[0]) |
382 | 385 |
|
383 | 386 |
|
384 |
| -class StylerFormatter(BaseFormatter): |
| 387 | +class StylerFormatter(RFormatter): |
385 | 388 | label = "Apply Styler Formatter"
|
386 | 389 | package_name = "styler"
|
387 | 390 |
|
388 |
| - @property |
389 |
| - def importable(self) -> bool: |
390 |
| - try: |
391 |
| - import rpy2.robjects.packages as rpackages |
392 |
| - |
393 |
| - rpackages.importr(self.package_name) |
394 |
| - |
395 |
| - return True |
396 |
| - except Exception: |
397 |
| - return False |
398 |
| - |
399 | 391 | @handle_line_ending_and_magic
|
400 | 392 | def format_code(self, code: str, notebook: bool, **options) -> str:
|
401 | 393 | import rpy2.robjects.packages as rpackages
|
| 394 | + from rpy2.robjects import conversion, default_converter |
402 | 395 |
|
403 |
| - styler_r = rpackages.importr(self.package_name) |
404 |
| - formatted_code = styler_r.style_text(code, **self._transform_options(styler_r, options)) |
405 |
| - return "\n".join(formatted_code) |
| 396 | + with conversion.localconverter(default_converter): |
| 397 | + styler_r = rpackages.importr(self.package_name) |
| 398 | + formatted_code = styler_r.style_text(code, **self._transform_options(styler_r, options)) |
| 399 | + return "\n".join(formatted_code) |
406 | 400 |
|
407 | 401 | @staticmethod
|
408 | 402 | def _transform_options(styler_r, options):
|
409 | 403 | transformed_options = copy.deepcopy(options)
|
| 404 | + import rpy2.robjects |
410 | 405 |
|
411 | 406 | if "math_token_spacing" in transformed_options:
|
412 | 407 | if isinstance(options["math_token_spacing"], dict):
|
|
0 commit comments