galaaz 0.4.10 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/LICENSE +0 -0
  4. data/README.md +3123 -882
  5. data/Rakefile +62 -41
  6. data/bin/galaaz-bootstrap +137 -0
  7. data/bin/galaaz-jruby +14 -0
  8. data/bin/galaaz_jruby_env.inc.sh +6 -0
  9. data/bin/gbookdown +64 -0
  10. data/bin/gknit +223 -6
  11. data/bin/gknit-draft +105 -0
  12. data/bin/gknit-draft.rb +28 -0
  13. data/bin/gknit_Rscript +127 -0
  14. data/bin/grun +27 -1
  15. data/bin/gstudio +49 -4
  16. data/bin/{gstudio.rb → gstudio_irb.rb} +0 -0
  17. data/bin/gstudio_pry.rb +7 -0
  18. data/bin/install-tinytex +6 -0
  19. data/bin/run_all_rspec +43 -0
  20. data/bin/run_example +14 -0
  21. data/bin/run_old_rspec +19 -0
  22. data/bin/run_rspec +23 -0
  23. data/bin/run_rspec_subset +38 -0
  24. data/bin/run_slow_rspec +19 -0
  25. data/blogs/R-on-Rails-Planning-Document.md +940 -0
  26. data/blogs/README.md +100 -0
  27. data/blogs/galaaz_ggplot/galaaz_ggplot.Rmd +38 -66
  28. data/blogs/galaaz_ggplot/galaaz_ggplot.log +754 -0
  29. data/blogs/galaaz_ggplot/galaaz_ggplot.md +364 -0
  30. data/blogs/galaaz_ggplot/galaaz_ggplot.tex +607 -0
  31. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/midwest_rb.png +0 -0
  32. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/scatter_plot_rb.png +0 -0
  33. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/midwest_rb.png +0 -0
  34. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/scatter_plot_rb.png +0 -0
  35. data/blogs/galaaz_ggplot/midwest.Rmd +3 -3
  36. data/blogs/galaaz_ggplot/midwest_external_png +0 -0
  37. data/blogs/gknit/gknit.Rmd +52 -55
  38. data/blogs/gknit/gknit.md +94 -94
  39. data/blogs/gknit/gknit_files/figure-html/bubble-1.png +0 -0
  40. data/blogs/gknit/gknit_files/figure-html/diverging_bar.png +0 -0
  41. data/blogs/gknit/lst.rds +0 -0
  42. data/blogs/gknit/model.rb +1 -1
  43. data/blogs/gknit/stats.bib +0 -0
  44. data/blogs/manual/include_model_local_repro.Rmd +14 -0
  45. data/blogs/manual/include_model_local_repro.md +75 -0
  46. data/blogs/manual/lst.rds +0 -0
  47. data/blogs/manual/manual.Rmd +1582 -196
  48. data/blogs/manual/manual.log +1786 -0
  49. data/blogs/manual/manual.md +3107 -890
  50. data/blogs/manual/manual.tex +3018 -1086
  51. data/blogs/manual/manual_files/figure-html/bubble-1.png +0 -0
  52. data/blogs/manual/manual_files/figure-html/diverging_bar.png +0 -0
  53. data/blogs/manual/manual_files/figure-latex/bubble-1.png +0 -0
  54. data/blogs/manual/model.rb +41 -0
  55. data/blogs/nse_dplyr/nse_dplyr.Rmd +277 -151
  56. data/blogs/nse_dplyr/nse_dplyr.log +928 -0
  57. data/blogs/nse_dplyr/nse_dplyr.md +457 -293
  58. data/blogs/oh_my/not_so.rb +0 -0
  59. data/blogs/oh_my/oh_my.Rmd +1234 -25
  60. data/blogs/oh_my/oh_my.log +804 -0
  61. data/blogs/oh_my/oh_my.md +1808 -228
  62. data/blogs/oh_my/oh_my.tex +821 -0
  63. data/blogs/oh_my/old.Rmd +15 -14
  64. data/blogs/ruby_plot/ruby_plot.Rmd +58 -82
  65. data/blogs/ruby_plot/ruby_plot.log +885 -0
  66. data/blogs/ruby_plot/ruby_plot.md +71 -103
  67. data/blogs/ruby_plot/ruby_plot.tex +940 -0
  68. data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.png +0 -0
  69. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.png +0 -0
  70. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.png +0 -0
  71. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.png +0 -0
  72. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.png +0 -0
  73. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_decorations.png +0 -0
  74. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.png +0 -0
  75. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.png +0 -0
  76. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.png +0 -0
  77. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.png +0 -0
  78. data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.png +0 -0
  79. data/blogs/ruby_plot/ruby_plot_files/figure-latex/dose_len.png +0 -0
  80. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_delivery.png +0 -0
  81. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_dose.png +0 -0
  82. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color.png +0 -0
  83. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color2.png +0 -0
  84. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_decorations.png +0 -0
  85. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_jitter.png +0 -0
  86. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_points.png +0 -0
  87. data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_box_plot.png +0 -0
  88. data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_violin_plot.png +0 -0
  89. data/blogs/ruby_plot/ruby_plot_files/figure-latex/violin_with_jitter.png +0 -0
  90. data/blogs/test/test.Rmd +14 -0
  91. data/examples/50Plots_MasterList/Images/midwest-scatterplot.PNG +0 -0
  92. data/examples/50Plots_MasterList/ScatterPlot.rb +0 -0
  93. data/examples/50Plots_MasterList/scatter_plot.rb +0 -0
  94. data/examples/Bibliography/master.bib +50 -0
  95. data/examples/Bibliography/stats.bib +72 -0
  96. data/examples/R/calc.R +0 -0
  97. data/examples/R/java_interop.R +0 -0
  98. data/examples/bioconductor_deseq2_airway/Documentation/DESeq2-airway-walkthrough.md +56 -0
  99. data/examples/bioconductor_deseq2_airway/bench_galaaz_three_same_process.rb +53 -0
  100. data/examples/bioconductor_deseq2_airway/bench_r_three_same_process.R +34 -0
  101. data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz.rb +33 -0
  102. data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz_optimized.rb +34 -0
  103. data/examples/bioconductor_deseq2_airway/deseq2_airway_minimal.R +30 -0
  104. data/examples/bioconductor_deseq2_airway/deseq2_airway_pipeline_for_bench.R +36 -0
  105. data/examples/islr/all.rb +13 -0
  106. data/examples/islr/ch2.spec.rb +37 -7
  107. data/examples/islr/ch3.spec.rb +11 -2
  108. data/examples/islr/ch3_boston.rb +27 -0
  109. data/examples/islr/ch3_multiple_regression.rb +0 -0
  110. data/examples/islr/ch6.spec.rb +24 -1
  111. data/examples/islr/x_y_rnorm.jpg +0 -0
  112. data/examples/latex_templates/Test-acm_article/Makefile +16 -0
  113. data/examples/latex_templates/Test-acm_article/Test-acm_article.Rmd +65 -0
  114. data/examples/latex_templates/Test-acm_article/acm_proc_article-sp.cls +1670 -0
  115. data/examples/latex_templates/Test-acm_article/sensys-abstract.cls +703 -0
  116. data/examples/latex_templates/Test-acm_article/sigproc.bib +59 -0
  117. data/examples/latex_templates/Test-acs_article/Test-acs_article.Rmd +260 -0
  118. data/examples/latex_templates/Test-acs_article/acs-Test-acs_article.bib +11 -0
  119. data/examples/latex_templates/Test-acs_article/acs-my_output.bib +11 -0
  120. data/examples/latex_templates/Test-acs_article/acstest.bib +17 -0
  121. data/examples/latex_templates/Test-aea_article/AEA.cls +1414 -0
  122. data/{blogs/gknit/marshal.dump → examples/latex_templates/Test-aea_article/BibFile.bib} +0 -0
  123. data/examples/latex_templates/Test-aea_article/Test-aea_article.Rmd +108 -0
  124. data/examples/latex_templates/Test-aea_article/aea.bst +1269 -0
  125. data/examples/latex_templates/Test-aea_article/multicol.sty +853 -0
  126. data/examples/latex_templates/Test-aea_article/references.bib +0 -0
  127. data/examples/latex_templates/Test-aea_article/setspace.sty +546 -0
  128. data/examples/latex_templates/Test-amq_article/Test-amq_article.Rmd +256 -0
  129. data/examples/latex_templates/Test-amq_article/Test-amq_article.pdfsync +3397 -0
  130. data/examples/latex_templates/Test-ams_article/Test-ams_article.Rmd +215 -0
  131. data/examples/latex_templates/Test-ams_article/amstest.bib +436 -0
  132. data/examples/latex_templates/Test-asa_article/Test-asa_article.Rmd +153 -0
  133. data/examples/latex_templates/Test-asa_article/agsm.bst +1353 -0
  134. data/examples/latex_templates/Test-asa_article/bibliography.bib +233 -0
  135. data/examples/latex_templates/Test-ieee_article/IEEEtran.bst +2409 -0
  136. data/examples/latex_templates/Test-ieee_article/IEEEtran.cls +6346 -0
  137. data/examples/latex_templates/Test-ieee_article/Test-ieee_article.Rmd +175 -0
  138. data/examples/latex_templates/Test-ieee_article/mybibfile.bib +20 -0
  139. data/examples/latex_templates/Test-rjournal_article/RJournal.sty +335 -0
  140. data/examples/latex_templates/Test-rjournal_article/RJreferences.bib +18 -0
  141. data/examples/latex_templates/Test-rjournal_article/Test-rjournal_article.Rmd +52 -0
  142. data/examples/latex_templates/Test-springer_article/Test-springer_article.Rmd +65 -0
  143. data/examples/latex_templates/Test-springer_article/bibliography.bib +26 -0
  144. data/examples/latex_templates/Test-springer_article/spbasic.bst +1658 -0
  145. data/examples/latex_templates/Test-springer_article/spmpsci.bst +1512 -0
  146. data/examples/latex_templates/Test-springer_article/spphys.bst +1443 -0
  147. data/examples/latex_templates/Test-springer_article/svglov3.clo +113 -0
  148. data/examples/latex_templates/Test-springer_article/svjour3.cls +1431 -0
  149. data/examples/misc/baseball.csv +0 -0
  150. data/examples/misc/ggplot.rb +3 -2
  151. data/examples/misc/moneyball.rb +0 -0
  152. data/examples/misc/subsetting.rb +0 -0
  153. data/examples/multithread_shards_to_r/shards_to_r.rb +67 -0
  154. data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.Rmd +73 -0
  155. data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.Rmd +382 -0
  156. data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.Rmd +164 -0
  157. data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.Rmd +92 -0
  158. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/attend-grade-relationships.csv +482 -0
  159. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.Rmd +280 -0
  160. data/examples/rmarkdown/svm-xaringan-example/svm-xaringan-example.Rmd +386 -0
  161. data/examples/sthda_ggplot/README.md +0 -0
  162. data/examples/sthda_ggplot/RUN.md +41 -0
  163. data/examples/sthda_ggplot/all.rb +0 -0
  164. data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +0 -0
  165. data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +0 -0
  166. data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +2 -0
  167. data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +0 -0
  168. data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +0 -0
  169. data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +0 -0
  170. data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +0 -0
  171. data/examples/sthda_ggplot/one_variable_continuous/stat.rb +0 -0
  172. data/examples/sthda_ggplot/one_variable_discrete/bar.rb +0 -0
  173. data/examples/sthda_ggplot/qplots/box_violin_dot.rb +0 -0
  174. data/examples/sthda_ggplot/qplots/scatter_plots.rb +0 -0
  175. data/examples/sthda_ggplot/scatter_gg.rb +0 -0
  176. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +0 -0
  177. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +0 -0
  178. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +0 -0
  179. data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +0 -0
  180. data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +0 -0
  181. data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +0 -0
  182. data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +4 -3
  183. data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +0 -0
  184. data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +0 -0
  185. data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +0 -0
  186. data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +0 -0
  187. data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +0 -0
  188. data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +0 -0
  189. data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +0 -0
  190. data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +0 -0
  191. data/ext/new_bridge/Makefile +46 -0
  192. data/ext/new_bridge/galaaz_gatekeeper_phase0.cpp +12 -0
  193. data/ext/new_bridge/galaaz_gatekeeper_phase1.cpp +1639 -0
  194. data/lib/R_interface/galaaz_device.R +20 -0
  195. data/lib/R_interface/include_engine.R +109 -0
  196. data/lib/R_interface/new_bridge_adapter.rb +824 -0
  197. data/lib/R_interface/r.rb +177 -25
  198. data/lib/R_interface/r_arrow.rb +113 -0
  199. data/lib/R_interface/r_libs.R +4 -4
  200. data/lib/R_interface/r_methods.rb +13 -116
  201. data/lib/R_interface/r_module_s.rb +0 -0
  202. data/lib/R_interface/rbinary_operators.rb +20 -2
  203. data/lib/R_interface/rclosure.rb +5 -1
  204. data/lib/R_interface/rdata_frame.rb +34 -70
  205. data/lib/R_interface/rdevice.rb +125 -0
  206. data/lib/R_interface/rdevices.R +0 -0
  207. data/lib/R_interface/renvironment.rb +10 -4
  208. data/lib/R_interface/rexpression.rb +5 -1
  209. data/lib/R_interface/rindexed_object.rb +41 -13
  210. data/lib/R_interface/rlanguage.rb +20 -62
  211. data/lib/R_interface/rlist.rb +115 -25
  212. data/lib/R_interface/rlogical_operators.rb +0 -0
  213. data/lib/R_interface/rmatrix.rb +2 -11
  214. data/lib/R_interface/rmd_indexed_object.rb +5 -1
  215. data/lib/R_interface/robject.rb +348 -290
  216. data/lib/R_interface/rpkg.rb +1 -0
  217. data/lib/R_interface/rsupport.rb +610 -331
  218. data/lib/R_interface/rsupport_scope.rb +2 -1
  219. data/lib/R_interface/rsymbol.rb +50 -0
  220. data/lib/R_interface/ruby_callback.rb +2 -3
  221. data/lib/R_interface/ruby_extensions.rb +225 -175
  222. data/lib/R_interface/runary_operators.rb +0 -0
  223. data/lib/R_interface/rvector.rb +147 -31
  224. data/lib/galaaz.rb +0 -0
  225. data/lib/galaaz_jruby.rb +22 -0
  226. data/lib/gknit/diagnostics.rb +50 -0
  227. data/lib/gknit/draft.rb +111 -0
  228. data/lib/gknit/include_engine.rb +15 -7
  229. data/lib/gknit/knitr_engine.rb +223 -107
  230. data/lib/gknit/rb_engine.rb +3 -3
  231. data/lib/gknit/ruby_engine.rb +0 -0
  232. data/lib/gknit.rb +3 -0
  233. data/lib/new_bridge/bootstrap/windows_bootstrap.rb +285 -0
  234. data/lib/new_bridge/envelope.rb +51 -0
  235. data/lib/new_bridge/eval_result.rb +26 -0
  236. data/lib/new_bridge/framing.rb +39 -0
  237. data/lib/new_bridge/instance_pool_client.rb +38 -0
  238. data/lib/new_bridge/r_instance_manager.rb +404 -0
  239. data/lib/new_bridge/session_client.rb +530 -0
  240. data/lib/new_bridge/tcp_framed.rb +44 -0
  241. data/lib/new_bridge.rb +9 -0
  242. data/lib/util/exec_ruby.rb +95 -46
  243. data/lib/util/inline_file.rb +35 -30
  244. data/new_bridge_specs/benchmark_phase5_5_unboxing_spec.rb +96 -0
  245. data/new_bridge_specs/eval_r_async_spec.rb +113 -0
  246. data/new_bridge_specs/integration_phase5_1_concurrent_spec.rb +50 -0
  247. data/new_bridge_specs/integration_phase5_1_eval_spec.rb +16 -0
  248. data/new_bridge_specs/integration_phase5_1_r_api_spec.rb +25 -0
  249. data/new_bridge_specs/integration_phase5_1_smoke_spec.rb +31 -0
  250. data/new_bridge_specs/integration_phase5_2_dataframe_unboxing_spec.rb +19 -0
  251. data/new_bridge_specs/integration_phase5_2_handle_eval_unboxing_spec.rb +25 -0
  252. data/new_bridge_specs/integration_phase5_3_callback_args_spec.rb +28 -0
  253. data/new_bridge_specs/integration_phase5_3_callback_error_spec.rb +22 -0
  254. data/new_bridge_specs/integration_phase5_3_callback_timeout_spec.rb +28 -0
  255. data/new_bridge_specs/integration_phase5_3_callbacks_smoke_spec.rb +22 -0
  256. data/new_bridge_specs/integration_phase5_3_edge_cases_spec.rb +52 -0
  257. data/new_bridge_specs/integration_phase5_3_nested_spec.rb +30 -0
  258. data/new_bridge_specs/integration_phase5_4_concurrent_sessions_spec.rb +53 -0
  259. data/new_bridge_specs/integration_phase5_4_nested_session_callbacks_spec.rb +49 -0
  260. data/new_bridge_specs/integration_phase5_4_session_routing_spec.rb +38 -0
  261. data/new_bridge_specs/integration_phase5_5_stress_concurrency_spec.rb +52 -0
  262. data/new_bridge_specs/integration_phase5_5_unbox_walk_spec.rb +46 -0
  263. data/new_bridge_specs/phase0_protocol_spec.rb +96 -0
  264. data/new_bridge_specs/phase1_req_ret_spec.rb +66 -0
  265. data/new_bridge_specs/phase2_multi_instance_spec.rb +67 -0
  266. data/new_bridge_specs/phase3_callbacks_spec.rb +71 -0
  267. data/new_bridge_specs/phase4_2_hardening_spec.rb +252 -0
  268. data/new_bridge_specs/phase4_3_r_instance_manager_spec.rb +85 -0
  269. data/new_bridge_specs/phase4_nested_callbacks_spec.rb +123 -0
  270. data/r_requires/ggplot.rb +0 -0
  271. data/r_requires/knitr.rb +0 -0
  272. data/specs/all.rb +15 -11
  273. data/specs/arrow_from_ruby_batches_spec.rb +50 -0
  274. data/specs/arrow_semantics_spec.rb +64 -0
  275. data/specs/bridge_concurrent_spec.rb +46 -0
  276. data/specs/bridge_nested_spec.rb +25 -0
  277. data/specs/dataframe_semantics_spec.rb +122 -0
  278. data/specs/dataframe_single_index_logical_filter_spec.rb +21 -0
  279. data/specs/dispatch_probe_cache_spec.rb +38 -0
  280. data/specs/dispatch_probe_error_class_fallback_spec.rb +20 -0
  281. data/specs/dispatch_probe_fallback_spec.rb +18 -0
  282. data/specs/environment_semantics_spec.rb +89 -0
  283. data/specs/field_access_spec.rb +31 -0
  284. data/specs/figures/bg.jpeg +0 -0
  285. data/specs/figures/bg.png +0 -0
  286. data/specs/figures/bg.svg +168 -57
  287. data/specs/figures/dose_len.png +0 -0
  288. data/specs/figures/no_args.jpeg +0 -0
  289. data/specs/figures/no_args.png +0 -0
  290. data/specs/figures/no_args.svg +168 -57
  291. data/specs/figures/width_height.jpeg +0 -0
  292. data/specs/figures/width_height.png +0 -0
  293. data/specs/figures/width_height_units1.jpeg +0 -0
  294. data/specs/figures/width_height_units1.png +0 -0
  295. data/specs/figures/width_height_units2.jpeg +0 -0
  296. data/specs/figures/width_height_units2.png +0 -0
  297. data/specs/formula_semantics_spec.rb +81 -0
  298. data/specs/galaaz_util_exec_ruby_spec.rb +85 -0
  299. data/specs/galaaz_util_inline_file_spec.rb +54 -0
  300. data/specs/gknit_cli_option_permutation_spec.rb +24 -0
  301. data/specs/gknit_include_engine_spec.rb +72 -0
  302. data/specs/gknit_install_timeout_report_spec.rb +69 -0
  303. data/specs/gknit_internal_error_report_spec.rb +57 -0
  304. data/specs/gknit_vector_map_output_spec.rb +59 -0
  305. data/specs/globalenv_guardrail_spec.rb +52 -0
  306. data/specs/language_expression_semantics_spec.rb +145 -0
  307. data/specs/list_semantics_spec.rb +111 -0
  308. data/specs/new_bridge_bulk_dataframe_transfer_spec.rb +44 -0
  309. data/specs/new_bridge_bulk_vector_transfer_spec.rb +73 -0
  310. data/specs/new_bridge_callback_timeout_spec.rb +69 -0
  311. data/specs/new_bridge_eval_r_fallback_spec.rb +55 -0
  312. data/specs/nil_null_spec.rb +42 -0
  313. data/specs/object_build_phase2_spec.rb +53 -0
  314. data/specs/phase1_callback_bridge_spec.rb +84 -0
  315. data/specs/phase2_gknit_generic_rendering_guardrail_spec.rb +46 -0
  316. data/specs/phase2_gknit_no_raw_code_leakage_spec.rb +43 -0
  317. data/specs/phase3_gknit_generic_graphics_capture_spec.rb +71 -0
  318. data/specs/plot_device_semantics_spec.rb +28 -0
  319. data/specs/plot_snapshot_semantics_spec.rb +58 -0
  320. data/specs/protocol_result_spec.rb +236 -0
  321. data/specs/r_batch_fail_fast_spec.rb +47 -0
  322. data/specs/r_bridge_bootstrap_spec.rb +11 -0
  323. data/specs/r_devices.spec.rb +1 -1
  324. data/specs/r_eval.spec.rb +16 -18
  325. data/specs/r_function.spec.rb +1 -1
  326. data/specs/r_instance_manager_spec.rb +285 -0
  327. data/specs/r_list_apply.spec.rb +15 -15
  328. data/specs/r_matrix.spec.rb +0 -0
  329. data/specs/r_nse.spec.rb +5 -5
  330. data/specs/r_object_send_dispatch_spec.rb +13 -0
  331. data/specs/r_vector_comparator_spec.rb +8 -0
  332. data/specs/r_vector_creation.spec.rb +0 -0
  333. data/specs/r_vector_functions.spec.rb +0 -0
  334. data/specs/r_vector_object.spec.rb +0 -0
  335. data/specs/r_vector_operators.spec.rb +0 -0
  336. data/specs/r_vector_structured_scalar_reads_spec.rb +35 -0
  337. data/specs/r_vector_subsetting.spec.rb +0 -0
  338. data/specs/range_helper_spec.rb +21 -0
  339. data/specs/rsupport_scope_spec.rb +28 -0
  340. data/specs/rsupport_var_name_thread_safety_spec.rb +24 -0
  341. data/specs/scalar_character_spec.rb +44 -0
  342. data/specs/scoped_symbol_dsl_refinement_spec.rb +40 -0
  343. data/specs/session_env_bridge_spec.rb +25 -0
  344. data/specs/simplecov_bootstrap_spec.rb +10 -0
  345. data/specs/spec_helper.rb +10 -0
  346. data/specs/tmp.rb +41 -20
  347. data/specs/unboxing_recursion_regression_spec.rb +30 -0
  348. data/specs/unboxing_spec.rb +49 -0
  349. data/specs/verify_callbacks.rb +42 -0
  350. data/sty/galaaz.sty +0 -0
  351. data/version.rb +1 -1
  352. metadata +239 -71
  353. data/blogs/galaaz_ggplot/galaaz_ggplot.aux +0 -41
  354. data/blogs/galaaz_ggplot/galaaz_ggplot.html +0 -705
  355. data/blogs/galaaz_ggplot/galaaz_ggplot.out +0 -10
  356. data/blogs/galaaz_ggplot/galaaz_ggplot.pdf +0 -0
  357. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-latex/midwest_rb.pdf +0 -0
  358. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-latex/scatter_plot_rb.pdf +0 -0
  359. data/blogs/galaaz_ggplot/midwest.html +0 -188
  360. data/blogs/gknit/gknit.html +0 -2266
  361. data/blogs/gknit/gknit.pdf +0 -0
  362. data/blogs/gknit/gknit.tex +0 -1358
  363. data/blogs/manual/graph.rb +0 -29
  364. data/blogs/manual/manual.html +0 -2995
  365. data/blogs/manual/manual.pdf +0 -0
  366. data/blogs/manual/manual_files/figure-latex/diverging_bar.pdf +0 -0
  367. data/blogs/nse_dplyr/nse_dplyr.html +0 -960
  368. data/blogs/nse_dplyr/nse_dplyr.pdf +0 -0
  369. data/blogs/nse_dplyr/nse_dplyr.tex +0 -1373
  370. data/blogs/oh_my/oh_my.html +0 -680
  371. data/blogs/ruby_plot/ruby_plot.Rmd_external_figs +0 -662
  372. data/blogs/ruby_plot/ruby_plot.html +0 -729
  373. data/blogs/ruby_plot/ruby_plot.pdf +0 -0
  374. data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.svg +0 -57
  375. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.svg +0 -106
  376. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.svg +0 -110
  377. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.svg +0 -174
  378. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.svg +0 -236
  379. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.svg +0 -296
  380. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.svg +0 -236
  381. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.svg +0 -218
  382. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.svg +0 -128
  383. data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.svg +0 -150
  384. data/examples/paper/paper.rb +0 -36
  385. data/specs/r_dataframe.spec.rb +0 -379
  386. data/specs/r_environment.spec.rb +0 -140
  387. data/specs/r_formula.spec.rb +0 -232
  388. data/specs/r_language.spec.rb +0 -112
  389. data/specs/r_list.spec.rb +0 -293
  390. data/specs/r_plots.spec.rb +0 -72
  391. data/specs/ruby_expression.spec.rb +0 -315
data/Rakefile CHANGED
@@ -23,8 +23,10 @@
23
23
 
24
24
  require 'rake/tasklib'
25
25
  require 'rake/testtask'
26
+ require 'shellwords'
26
27
 
27
28
  require_relative 'version'
29
+ require_relative 'lib/galaaz_jruby'
28
30
 
29
31
  #----------------------------------------------------------------------------------------
30
32
  #
@@ -32,11 +34,10 @@ require_relative 'version'
32
34
 
33
35
  class MakeTask < Rake::TaskLib
34
36
 
35
- # Create class variables for the polyglot options and libs
36
- # not yet possible to run native with R it seems...
37
- # @@polyglot_options = "--polyglot --experimental-options --single_threaded"
38
- @@polyglot_options = "--polyglot --jvm --experimental-options --single-threaded"
39
- @@libs = "-Ilib/" # -Ir_requires/"
37
+ # JRuby prefix: required JVM flags from GalaazJRuby + -I lib (see lib/galaaz_jruby.rb).
38
+ def self.galaaz_jruby_invocation
39
+ "jruby #{GalaazJRuby.shell_j_arg_string} -I lib"
40
+ end
40
41
 
41
42
  #----------------------------------------------------------------------------------------
42
43
  #
@@ -55,13 +56,15 @@ class MakeTask < Rake::TaskLib
55
56
  end
56
57
 
57
58
  #----------------------------------------------------------------------------------------
58
- # Actual TruffleRuby command (with options) to run the example
59
+ # Run example or spec with JRuby (Galaaz 2.0 Shadow Bridge)
59
60
  #----------------------------------------------------------------------------------------
60
61
 
61
62
  def make_task
62
- @rspec ?
63
- (sh %{ ruby #{@@polyglot_options} #{@@libs} -S rspec #{@filepath}.rb -f documentation }) :
64
- (sh %{ ruby #{@@polyglot_options} #{@@libs} -S #{@filepath}.rb })
63
+ if @rspec
64
+ sh %{ #{MakeTask.galaaz_jruby_invocation} -S rspec #{@filepath}.rb -f documentation }
65
+ else
66
+ sh %{ #{MakeTask.galaaz_jruby_invocation} #{@filepath}.rb }
67
+ end
65
68
  end
66
69
 
67
70
  #----------------------------------------------------------------------------------------
@@ -76,8 +79,11 @@ class MakeTask < Rake::TaskLib
76
79
 
77
80
  end
78
81
 
79
-
80
- task :default => "sthda:all"
82
+ # Run each .rb file in a directory (for groups that don't have an all.rb)
83
+ def run_each_file(file_list)
84
+ inv = MakeTask.galaaz_jruby_invocation
85
+ file_list.each { |f| sh "#{inv} #{f}" }
86
+ end
81
87
 
82
88
  geoms = FileList['examples/sthda_ggplot/**/*.rb']
83
89
  specs = FileList['specs/**/*.rb']
@@ -164,6 +170,35 @@ bugs.each do |f|
164
170
  Desc
165
171
  end
166
172
 
173
+ #===========================================================================================
174
+ # Aggregate "all" tasks for groups that have multiple files (no single all.rb)
175
+ # sthda:all and islr:all already exist from MakeTask (they run all.rb in that dir)
176
+ #===========================================================================================
177
+
178
+ desc "Run all misc examples"
179
+ task "misc:all" do
180
+ run_each_file(misc.to_a)
181
+ end
182
+
183
+ desc "Run all 50Plots_MasterList examples"
184
+ task "master_list:all" do
185
+ run_each_file(master_list.to_a)
186
+ end
187
+
188
+ desc "Run all bug examples"
189
+ task "bugs:all" do
190
+ run_each_file(bugs.to_a)
191
+ end
192
+
193
+ #===========================================================================================
194
+ # Run all example groups (sthda_ggplot, misc, 50Plots_MasterList, islr, bugs)
195
+ #===========================================================================================
196
+
197
+ desc "Run all examples (sthda_ggplot, misc, 50Plots_MasterList, islr, bugs)"
198
+ task "examples:all" => ["sthda:all", "misc:all", "master_list:all", "islr:all", "bugs:all"]
199
+
200
+ task :default => "examples:all"
201
+
167
202
  #===========================================================================================
168
203
  # Creates task for running gknit
169
204
  #===========================================================================================
@@ -173,20 +208,11 @@ blogs.each do |dir|
173
208
  blog_rmd = "blogs/#{dir}/#{dir}.Rmd"
174
209
  desc "run gknit to build #{dir} blog post"
175
210
  task "blog:#{dir}" do
176
- (sh %{ bin/gknit #{blog_rmd} })
211
+ (sh %{ bin/gknit #{blog_rmd} } )
177
212
  end
178
213
 
179
214
  end
180
215
 
181
- #===========================================================================================
182
- # Loads R and require libraries to run Galaaz
183
- #===========================================================================================
184
-
185
- desc 'Prepare R for running'
186
- task :make_r do
187
- (sh %{ gu install r })
188
- end
189
-
190
216
  #===========================================================================================
191
217
  # Makes a gem for publishing in RubyGems
192
218
  #===========================================================================================
@@ -205,27 +231,22 @@ task :publish_gem do
205
231
  (sh %{ gem push #{$gem_name}-#{$version}.gem })
206
232
  end
207
233
 
208
- =begin
209
- desc 'default task'
210
- task :default => [:install_gem]
211
-
212
- desc 'Install the gem in the standard location'
213
- task :install_gem => [:make_gem] do
214
- sh "gem install #{$gem_name}-#{$version}-java.gem"
215
- end
234
+ #===========================================================================================
235
+ # NewBridge gatekeeper + combined spec run (JRuby; see also bin/run_all_rspec)
236
+ #===========================================================================================
216
237
 
217
- desc 'Make documentation'
218
- task :make_doc do
219
- sh "yard doc lib/*.rb lib/**/*.rb"
238
+ desc 'Compile the NewBridge gatekeeper shared library (ext/new_bridge; incremental make)'
239
+ task :compile_gatekeeper do
240
+ Dir.chdir('ext/new_bridge') { sh 'make all' }
220
241
  end
221
242
 
222
- Rake::TestTask.new do |t|
223
- t.libs << "test"
224
- t.test_files = FileList['test/complete.rb']
225
- t.ruby_opts = ["--server", "-Xinvokedynamic.constants=true", "-J-Xmn512m",
226
- "-J-Xms1024m", "-J-Xmx1024m"]
227
- t.verbose = true
228
- t.warning = true
243
+ desc 'Run specs/ and new_bridge_specs/ under JRuby with SimpleCov (same idea as bin/run_all_rspec)'
244
+ task :specs_all_with_new_bridge => [:compile_gatekeeper] do
245
+ root = File.expand_path(__dir__)
246
+ inv = MakeTask.galaaz_jruby_invocation
247
+ top = Dir[File.join(root, 'specs', '*_spec.rb')] + Dir[File.join(root, 'specs', '*.spec.rb')]
248
+ files = top.sort.map { |p| Shellwords.escape(p) }.join(' ')
249
+ nb = Shellwords.escape(File.join(root, 'new_bridge_specs'))
250
+ helper = Shellwords.escape(File.join(root, 'specs', 'spec_helper.rb'))
251
+ sh %{ #{inv} -r #{helper} -S bundle exec rspec #{files} #{nb} }
229
252
  end
230
-
231
- =end
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'optparse'
5
+ require 'open3'
6
+
7
+ ROOT = File.expand_path('..', __dir__)
8
+ $LOAD_PATH.unshift(File.join(ROOT, 'lib'))
9
+
10
+ require 'new_bridge/bootstrap/windows_bootstrap'
11
+
12
+ mode = :check
13
+ runtime_mode = :auto
14
+ prompt_doc_tools = true
15
+
16
+ OptionParser.new do |opts|
17
+ opts.banner = 'Usage: bin/galaaz-bootstrap [--check|--apply] [--runtime docker|local|auto]'
18
+
19
+ opts.on('--check', 'Run diagnostics only (default)') do
20
+ mode = :check
21
+ end
22
+
23
+ opts.on('--apply', 'Apply WSL-side fixes where possible') do
24
+ mode = :apply
25
+ end
26
+
27
+ opts.on('--runtime MODE', 'Runtime mode: auto (default), docker, or local') do |v|
28
+ runtime_mode = v.to_sym
29
+ end
30
+
31
+ opts.on('--[no-]prompt-doc-tools',
32
+ 'In apply mode, ask to install TinyTeX/poppler for gknit PDF support (default: enabled)') do |v|
33
+ prompt_doc_tools = v
34
+ end
35
+ end.parse!(ARGV)
36
+
37
+ bootstrap = NewBridge::Bootstrap::WindowsBootstrap.new
38
+ result = bootstrap.run(mode: mode, runtime_mode: runtime_mode)
39
+
40
+ def command_exists?(cmd)
41
+ system("command -v #{cmd} >/dev/null 2>&1")
42
+ end
43
+
44
+ def yes_no_prompt(question, default_yes: true)
45
+ return default_yes unless $stdin.tty? && $stdout.tty?
46
+
47
+ suffix = default_yes ? '[Y/n]' : '[y/N]'
48
+ print "#{question} #{suffix} "
49
+ answer = $stdin.gets
50
+ return default_yes if answer.nil?
51
+
52
+ value = answer.strip.downcase
53
+ return default_yes if value.empty?
54
+ return true if %w[y yes].include?(value)
55
+ return false if %w[n no].include?(value)
56
+
57
+ default_yes
58
+ end
59
+
60
+ def install_tinytex
61
+ return puts('TinyTeX/LaTeX already available (pdflatex found).') if command_exists?('pdflatex')
62
+
63
+ installer = File.join(ROOT, 'bin', 'install-tinytex')
64
+ cmd =
65
+ if File.exist?(installer)
66
+ "bash #{installer.inspect}"
67
+ else
68
+ "curl -fsSL https://raw.githubusercontent.com/rstudio/tinytex/master/tools/install-bin-unix.sh | sh"
69
+ end
70
+
71
+ puts 'Installing TinyTeX (LaTeX) for gknit/pdf_document...'
72
+ ok = system(cmd)
73
+ puts('TinyTeX install finished.') if ok
74
+ puts('TinyTeX install failed. Re-run manually: bin/install-tinytex') unless ok
75
+ puts 'PATH note: ensure ~/bin is available in your shell, or use the Phase 2 spec env helper.'
76
+ end
77
+
78
+ def install_poppler
79
+ return puts('Poppler already available (pdftotext found).') if command_exists?('pdftotext')
80
+
81
+ puts 'Installing poppler-utils (pdftotext) for full PDF text assertions...'
82
+ ok = system('sudo apt-get update && sudo apt-get install -y poppler-utils')
83
+ puts('poppler-utils installed.') if ok
84
+ puts('poppler-utils install failed or was cancelled.') unless ok
85
+ end
86
+
87
+ def arrow_available_in_r?
88
+ return false unless command_exists?('Rscript')
89
+
90
+ system(%q{Rscript -e "quit(status = ifelse(requireNamespace('arrow', quietly=TRUE), 0, 1))"})
91
+ end
92
+
93
+ def install_arrow
94
+ unless command_exists?('Rscript')
95
+ puts 'Rscript not found; cannot install arrow package.'
96
+ return
97
+ end
98
+
99
+ if arrow_available_in_r?
100
+ puts 'R arrow package already available.'
101
+ return
102
+ end
103
+
104
+ puts 'Installing R arrow package for Galaaz Arrow helpers...'
105
+ ok = system(%q{Rscript -e "install.packages('arrow', repos='https://cloud.r-project.org/')"})
106
+ unless ok && arrow_available_in_r?
107
+ puts 'arrow install failed or package still unavailable.'
108
+ puts "Try manually: Rscript -e \"install.packages('arrow', repos='https://cloud.r-project.org/')\""
109
+ return
110
+ end
111
+
112
+ puts 'R arrow package installed.'
113
+ end
114
+
115
+ def verify_arrow_from_ruby
116
+ cmd = "bin/galaaz-jruby -I lib -e \"require 'galaaz'; df=R.data__frame(x:(1..2), y:(2..1)); t=R::Arrow.table_from(df); puts t.rclass\""
117
+ ok = system("cd #{ROOT.inspect} && #{cmd}")
118
+ puts(ok ? 'Ruby Arrow bridge check passed.' : 'Ruby Arrow bridge check failed.')
119
+ end
120
+
121
+ if mode == :apply && prompt_doc_tools
122
+ if yes_no_prompt('Will you render PDF documents with gknit (LaTeX required)?', default_yes: true)
123
+ install_tinytex
124
+
125
+ if yes_no_prompt('Also install poppler (pdftotext) for strict PDF text checks?', default_yes: true)
126
+ install_poppler
127
+ end
128
+ end
129
+
130
+ if yes_no_prompt('Will you use Arrow (Feather/Parquet) from Ruby/R?', default_yes: true)
131
+ install_arrow
132
+ verify_arrow_from_ruby if yes_no_prompt('Run a quick Ruby Arrow bridge verification now?', default_yes: true)
133
+ end
134
+ end
135
+
136
+ exit(result[:exit_code])
137
+
data/bin/galaaz-jruby ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Run jruby with Galaaz-required JVM flags and lib/ on the load path.
3
+ # Optional: GALAAZ_JRUBY_OPTS (space-separated extra -J... or jruby args).
4
+ #
5
+ # Usage: bin/galaaz-jruby path/to/script.rb [args...]
6
+ # bin/galaaz-jruby -S rspec specs/foo_spec.rb
7
+ set -e
8
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
9
+ # shellcheck source=galaaz_jruby_env.inc.sh
10
+ source "$ROOT/bin/galaaz_jruby_env.inc.sh"
11
+ exec jruby -I "$ROOT/lib" \
12
+ $GALAAZ_REQUIRED_JRUBY_J_ARGS \
13
+ ${GALAAZ_JRUBY_OPTS:-} \
14
+ "$@"
@@ -0,0 +1,6 @@
1
+ # Galaaz required JVM flags for JRuby (Apache Arrow on Java 9+).
2
+ # Source from bin/*.sh: source "$ROOT/bin/galaaz_jruby_env.inc.sh"
3
+ #
4
+ # Source of truth in Ruby/Rake: lib/galaaz_jruby.rb (GalaazJRuby::REQUIRED_JRUBY_J_ARGS).
5
+ # Optional extra -J flags: export GALAAZ_JRUBY_OPTS="-J-Xmx4g" (space-separated).
6
+ GALAAZ_REQUIRED_JRUBY_J_ARGS='-J--add-opens=java.base/java.nio=ALL-UNNAMED'
data/bin/gbookdown ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require 'optparse'
5
+ require 'shellwords'
6
+
7
+ options = {}
8
+ parser = OptionParser.new do |opts|
9
+ opts.banner = 'Usage: gbookdown [options]'
10
+
11
+ opts.on('-f', '--filename FILE', 'Bookdown input file (typically index.Rmd).') do |opt|
12
+ options[:input_file] = opt
13
+ end
14
+
15
+ opts.on('--output_format FORMAT',
16
+ "Bookdown output format (e.g. 'bookdown::gitbook', 'bookdown::pdf_book').") do |opt|
17
+ options[:output_format] = opt
18
+ end
19
+
20
+ opts.on('--bridge_timeout_sec TIMEOUT_SEC', Integer,
21
+ 'Bridge request timeout in seconds for Ruby->R eval calls.') do |opt|
22
+ options[:bridge_timeout_sec] = opt
23
+ end
24
+
25
+ opts.on('--callback_timeout_ms TIMEOUT_MS', Integer,
26
+ 'Callback timeout in milliseconds for R<->Ruby calls.') do |opt|
27
+ options[:callback_timeout_ms] = opt
28
+ end
29
+ end
30
+
31
+ remaining_args = parser.permute(ARGV.dup)
32
+ ARGV.replace(remaining_args)
33
+
34
+ options[:input_file] ||= ARGV[0]
35
+ raise 'Input file name is required. Add -f FILE. For help, type gbookdown -h' if options[:input_file].nil?
36
+
37
+ input_file = File.expand_path(options[:input_file], Dir.pwd)
38
+ raise "File #{input_file} does not exist!" unless File.exist?(input_file)
39
+
40
+ input_dir = File.dirname(input_file)
41
+ output_format = options[:output_format].nil? ? 'nil' : %("#{options[:output_format]}")
42
+ r_call = "bookdown::render_book(#{File.basename(input_file).inspect}, #{output_format})"
43
+
44
+ puts '================================'
45
+ puts "gBookdown #{input_file} with options:"
46
+ puts " * Output format: \t #{output_format}"
47
+
48
+ code = <<EOF
49
+ ENV['GALAAZ_CALLBACK_TIMEOUT_MS'] = #{options[:callback_timeout_ms].to_s.inspect} if #{!options[:callback_timeout_ms].nil?}
50
+ ENV['GALAAZ_BRIDGE_TIMEOUT_SEC'] = #{options[:bridge_timeout_sec].to_s.inspect} if #{!options[:bridge_timeout_sec].nil?}
51
+ require %q(galaaz)
52
+ require %q(gknit)
53
+
54
+ Dir.chdir(#{input_dir.inspect}) do
55
+ R.install_and_loads('bookdown')
56
+ R::Support.eval(#{r_call.inspect})
57
+ end
58
+ EOF
59
+
60
+ libx = File.expand_path('../lib', File.dirname(__FILE__))
61
+ require File.join(libx, 'galaaz_jruby')
62
+ jvm_args = GalaazJRuby.shell_j_arg_string
63
+ exec "jruby #{jvm_args} -I#{libx} -e #{Shellwords.escape(code)}"
64
+
data/bin/gknit CHANGED
@@ -1,15 +1,232 @@
1
1
  #!/usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
+ require 'optionparser'
5
+ require 'shellwords'
6
+
7
+ options = {}
8
+ parser = OptionParser.new do |opts|
9
+ opts.banner = "Usage: gknit [options]"
10
+ opts.on("-f", "--filename FILE", "The input file to be rendered.
11
+ This value can also be provided without the '-f' or '--filename'
12
+ flag by just giving the name of the file as an input parameter.") do |opt|
13
+ options[:input_file] = opt
14
+ end
15
+ opts.on("--output_format OUT_FORMAT",
16
+ "The R Markdown output format to convert to. The option 'all'
17
+ will render all formats defined within the file. The option
18
+ can be the name of a format (e.g. 'html_document') and that
19
+ will render the document to that single format. One can also
20
+ use a vector of format names to render to multiple formats.
21
+ Alternatively, you can pass an output format object (e.g.
22
+ html_document()). If using NULL then the output format is the
23
+ first one defined in the YAML frontmatter in the input file
24
+ (this defaults to HTML if no format is specified there).") do |opt|
25
+ options[:output_format] = opt
26
+ end
27
+ opts.on("-o", "--output_file OUT_FILE", "The name of the output file.
28
+ If using nil then the output filename will be based on filename for
29
+ the input file. If a filename is provided, a path to the output file
30
+ can also be provided. Note that the output_dir option allows for
31
+ specifying the output file path as well, however, if also specifying
32
+ the path, the directory must exist.") do |opt|
33
+ options[:output_file] = opt
34
+ end
35
+ opts.on("-d", "--output_dir OUT_DIR", "The output directory for
36
+ the rendered output_file. This allows for a choice of an alternate
37
+ directory to which the output file should be written (the default
38
+ output directory is that of the input file). If a path is provided
39
+ with a filename in output_file the directory specified here will
40
+ take precedence. Please note that any directory path provided will
41
+ create any necessary directories if they do not exist.") do |opt|
42
+ options[:output_dir] = opt
43
+ end
44
+ opts.on("-a", "--output_options OUT_OPT", "List of output options
45
+ that can override the options specified in metadata (e.g. could be
46
+ used to force self_contained or mathjax = 'local'). Note that this
47
+ is only valid when the output format is read from metadata (i.e.
48
+ not a custom format object passed to output_format).") do |opt|
49
+ options[:output_options] = opt
50
+ end
51
+ opts.on("-i", "--intermediates_dir INTER_DIR", "FEATURE NOT YET
52
+ IMPLEMENTED! Intermediate files directory. If a path is specified
53
+ then intermediate files will be written to that path. If nil,
54
+ intermediate files are written to the same directory as the input
55
+ file.") do |opt|
56
+ options[:intermediates_dir] = opt
57
+ end
58
+ opts.on("-n", "--no_clean", "Will not clean intermediate files
59
+ that are created during rendering.") do |opt|
60
+ options[:clean] = opt
61
+ end
62
+ opts.on("--debugR", "Log R/Ruby bridge traffic to logs; print only [RUBY] (commands sent) to stderr. Full R output is in logs/galaaz_r_stdout.log.") do
63
+ ENV["GALAAZ_DEBUG_R"] = "1"
64
+ end
65
+ opts.on("--callback_timeout_ms TIMEOUT_MS", Integer, "Callback timeout in milliseconds for R<->Ruby calls inside chunk execution. Use for long installs/computation (e.g., 7200000 for 2h).") do |opt|
66
+ options[:callback_timeout_ms] = opt
67
+ end
68
+ opts.on("--bridge_timeout_sec TIMEOUT_SEC", Integer, "Bridge request timeout in seconds for Ruby->R eval calls (default 60). Increase for long install.packages/compilation work.") do |opt|
69
+ options[:bridge_timeout_sec] = opt
70
+ end
71
+ end
72
+
73
+ remaining_args = parser.permute(ARGV.dup)
74
+ ARGV.replace(remaining_args)
75
+
76
+ # Sets the directory
4
77
  dir = Dir.pwd
5
- puts "Knitting #{dir}/#{ARGV[0]}"
6
78
 
79
+ #=========================================================================================
80
+ # Check if the name of the file to gKnit was given and that it exists. If not,
81
+ # issue error.
82
+ #=========================================================================================
83
+
84
+ options[:input_file] = ARGV[0] if !ARGV[0].nil?
85
+ raise "Input file name is required for gKnitting. Add -f FILE or --input_file FILE. For help, type gknit -h" if
86
+ options[:input_file].nil?
87
+ options[:input_file] = "#{dir}/#{options[:input_file]}"
88
+ raise "File #{options[:input_file]} does not exist!" if !File.exist?(options[:input_file])
89
+
90
+ #=========================================================================================
91
+ # Checks the output_format option. If none, pass NULL to the render function. Output
92
+ # format needs to be quoted.
93
+ #=========================================================================================
94
+
95
+ options[:output_format] =
96
+ (options[:output_format].nil?)? "nil" : "\"#{options[:output_format]}\""
97
+
98
+ #=========================================================================================
99
+ # Checks the output_file option. If none, pass NULL to the render function. Output
100
+ # file name needs to be quoted.
101
+ #=========================================================================================
102
+
103
+ options[:output_file] =
104
+ (options[:output_file].nil?)? "nil" : "\"#{options[:output_file]}\""
105
+
106
+ #=========================================================================================
107
+ # Checks if an output directory was given. If given and directory does not exist,
108
+ # create the directory. If no directory given, pass NULL to the render function.
109
+ #=========================================================================================
110
+
111
+ if (!options[:output_dir].nil?)
112
+ Dir.mkdir(options[:output_dir]) if !Dir.exist?(options[:output_dir])
113
+ options[:output_dir] = "\"#{options[:output_dir]}\""
114
+ else
115
+ # If not, pass NULL to the render function
116
+ options[:output_dir] = "nil"
117
+ end
118
+
119
+ #=========================================================================================
120
+ # Checks if any intermediate directory given. If not, pass NULL to the render function
121
+ # Calling render with options intermediates_dir is not working, requires further study
122
+ #=========================================================================================
123
+
124
+ if (!options[:intermediates_dir].nil?)
125
+ if !Dir.exist?(options[:intermediates_dir])
126
+ Dir.mkdir(options[:intermediates_dir])
127
+ options[:intermediates_dir] = "\"#{options[:intermediates_dir]}\""
128
+ else
129
+ options[:intermediates_dir] = "\"#{options[:intermediates_dir]}\""
130
+ end
131
+ else
132
+ options[:intermediates_dir] = "nil"
133
+ end
134
+
135
+ options[:clean] = (options[:clean].nil?)? "true" : "false"
136
+
137
+ #=========================================================================================
138
+ # Sends message to user that the gKniting process has started
139
+ #=========================================================================================
140
+ puts "================================"
141
+ puts "gKnitting #{options[:input_file]} with the following options:"
142
+ puts " * Output format: \t #{options[:output_format]}"
143
+ puts " * Output file: \t #{options[:output_file]}"
144
+ puts " * Output directory: \t #{options[:output_dir]}"
145
+ puts " * Clean: \t\t #{options[:clean]}"
146
+
147
+
148
+ # Code to be evaluated by the polyglot Ruby script.
149
+ # Run render with the input file's directory as current so figure paths (e.g. oh_my_files/figure-html/)
150
+ # are created and found inside the document directory (e.g. blogs/oh_my/).
151
+ input_file = options[:input_file]
152
+ input_dir = File.dirname(input_file)
7
153
  code = <<EOF
8
- eval.polyglot("ruby", "$LOAD_PATH.unshift %q(/home/rbotafogo/desenv/galaaz/lib)")
9
- eval.polyglot("ruby", "require %q(gknit)")
154
+ ENV['GALAAZ_CALLBACK_TIMEOUT_MS'] = #{options[:callback_timeout_ms].to_s.inspect} if #{!options[:callback_timeout_ms].nil?}
155
+ ENV['GALAAZ_BRIDGE_TIMEOUT_SEC'] = #{options[:bridge_timeout_sec].to_s.inspect} if #{!options[:bridge_timeout_sec].nil?}
156
+ require %q(galaaz)
157
+ require %q(gknit)
158
+
159
+ Dir.chdir(#{input_dir.inspect}) do
160
+ GknitDiagnostics.reset! if defined?(GknitDiagnostics)
161
+ begin
162
+ R::Rmarkdown.render(
163
+ %q(#{input_file}),
164
+ output_format: #{options[:output_format]},
165
+ output_file: #{options[:output_file]},
166
+ output_dir: #{options[:output_dir]},
167
+ clean: #{options[:clean]}
168
+ )
169
+ rescue StandardError => e
170
+ # Friendly handling for LaTeX/render errors (including bridge timeout wrappers):
171
+ # prefer actionable message over a Ruby stack trace.
172
+ log_file = begin
173
+ base = File.basename(%q(#{input_file}), File.extname(%q(#{input_file})))
174
+ candidate = File.join(Dir.pwd, "\#{base}.log")
175
+ File.file?(candidate) ? candidate : nil
176
+ rescue StandardError
177
+ nil
178
+ end
10
179
 
11
- gknit_file = "#{dir}/#{ARGV[0]}"
12
- rmarkdown::render("#{dir}/#{ARGV[0]}")
180
+ missing_pkg = nil
181
+ latex_fatal = nil
182
+ if log_file
183
+ begin
184
+ log_text = File.read(log_file)
185
+ m = log_text.match(/LaTeX Error: File [`']([^`']+\.sty)[`'] not found\./)
186
+ missing_pkg = m[1] if m
187
+ fatal_match = log_text.match(/!pdfTeX error:[^\n]+/)
188
+ latex_fatal = fatal_match[0] if fatal_match
189
+ rescue StandardError
190
+ missing_pkg = nil
191
+ latex_fatal = nil
192
+ end
193
+ end
194
+
195
+ STDERR.puts "gknit render failed: \#{e.message}"
196
+ if e.message.to_s.include?('no RET for')
197
+ callback_ms = ENV['GALAAZ_CALLBACK_TIMEOUT_MS'] || '120000'
198
+ bridge_sec = ENV['GALAAZ_BRIDGE_TIMEOUT_SEC'] || '60'
199
+ STDERR.puts "Likely bridge timeout during long-running Ruby->R evaluation."
200
+ STDERR.puts "Current bridge timeout: \#{bridge_sec} sec; callback timeout: \#{callback_ms} ms."
201
+ STDERR.puts "Use gknit --bridge_timeout_sec <sec> and/or --callback_timeout_ms <ms> for longer operations."
202
+ end
203
+ if missing_pkg
204
+ STDERR.puts "Likely missing LaTeX package: \#{missing_pkg} (install with tlmgr)."
205
+ elsif latex_fatal
206
+ STDERR.puts "LaTeX fatal error: \#{latex_fatal}"
207
+ elsif log_file
208
+ STDERR.puts "See LaTeX log for details: \#{log_file}"
209
+ end
210
+ exit 1
211
+ ensure
212
+ GknitDiagnostics.print_report(STDERR) if defined?(GknitDiagnostics)
213
+ end
214
+ end
13
215
  EOF
14
216
 
15
- exec "Rscript --jvm --polyglot -e '#{code}'"
217
+ libx = File.expand_path('../lib', File.dirname(__FILE__))
218
+ require File.join(libx, 'galaaz_jruby')
219
+ jvm_args = GalaazJRuby.shell_j_arg_string
220
+ ENV['GALAAZ_CALLBACK_TIMEOUT_MS'] = options[:callback_timeout_ms].to_s if !options[:callback_timeout_ms].nil?
221
+ ENV['GALAAZ_BRIDGE_TIMEOUT_SEC'] = options[:bridge_timeout_sec].to_s if !options[:bridge_timeout_sec].nil?
222
+ exec "jruby #{jvm_args} -I#{libx} -e #{Shellwords.escape(code)}"
223
+
224
+ =begin
225
+ # how to call rmarkdown::render with a parameter list
226
+ # all params need to be defined in the YAML header
227
+ rmarkdown::render("#{options[:input_file]}", output_format = #{options[:output_format]},
228
+ output_file = #{options[:output_file]},
229
+ output_dir = #{options[:output_dir]},
230
+ clean = #{options[:clean]},
231
+ params = list(rake_clean = TRUE))
232
+ =end