galaaz 0.5.0 → 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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/LICENSE +0 -0
  4. data/README.md +1360 -636
  5. data/Rakefile +61 -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 +84 -13
  11. data/bin/gknit-draft.rb +0 -0
  12. data/bin/gstudio +5 -3
  13. data/bin/gstudio_irb.rb +0 -0
  14. data/bin/gstudio_pry.rb +0 -0
  15. data/bin/install-tinytex +6 -0
  16. data/bin/run_all_rspec +43 -0
  17. data/bin/run_example +14 -0
  18. data/bin/run_old_rspec +19 -0
  19. data/bin/run_rspec +23 -0
  20. data/bin/run_rspec_subset +38 -0
  21. data/bin/run_slow_rspec +19 -0
  22. data/blogs/R-on-Rails-Planning-Document.md +940 -0
  23. data/blogs/README.md +100 -0
  24. data/blogs/galaaz_ggplot/galaaz_ggplot.Rmd +38 -66
  25. data/blogs/galaaz_ggplot/galaaz_ggplot.log +754 -0
  26. data/blogs/galaaz_ggplot/galaaz_ggplot.md +115 -155
  27. data/blogs/galaaz_ggplot/galaaz_ggplot.tex +607 -0
  28. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/midwest_rb.png +0 -0
  29. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/scatter_plot_rb.png +0 -0
  30. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/midwest_rb.png +0 -0
  31. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/scatter_plot_rb.png +0 -0
  32. data/blogs/galaaz_ggplot/midwest.Rmd +3 -3
  33. data/blogs/galaaz_ggplot/midwest_external_png +0 -0
  34. data/blogs/gknit/gknit.Rmd +47 -52
  35. data/blogs/gknit/gknit.md +1430 -0
  36. data/blogs/gknit/gknit_files/figure-html/bubble-1.png +0 -0
  37. data/blogs/gknit/gknit_files/figure-html/diverging_bar.png +0 -0
  38. data/blogs/gknit/lst.rds +0 -0
  39. data/blogs/gknit/model.rb +1 -1
  40. data/blogs/gknit/stats.bib +0 -0
  41. data/blogs/manual/include_model_local_repro.Rmd +14 -0
  42. data/blogs/manual/include_model_local_repro.md +75 -0
  43. data/blogs/manual/lst.rds +0 -0
  44. data/blogs/manual/manual.Rmd +852 -239
  45. data/blogs/manual/manual.log +1786 -0
  46. data/blogs/manual/manual.md +1360 -636
  47. data/blogs/manual/manual.tex +1883 -1161
  48. data/blogs/manual/manual_files/figure-html/bubble-1.png +0 -0
  49. data/blogs/manual/manual_files/figure-html/diverging_bar.png +0 -0
  50. data/blogs/manual/manual_files/figure-latex/bubble-1.png +0 -0
  51. data/blogs/manual/model.rb +1 -1
  52. data/blogs/nse_dplyr/nse_dplyr.Rmd +84 -111
  53. data/blogs/nse_dplyr/nse_dplyr.log +928 -0
  54. data/blogs/nse_dplyr/nse_dplyr.md +198 -229
  55. data/blogs/oh_my/not_so.rb +0 -0
  56. data/blogs/oh_my/oh_my.Rmd +1234 -25
  57. data/blogs/oh_my/oh_my.log +804 -0
  58. data/blogs/oh_my/oh_my.md +1663 -86
  59. data/blogs/oh_my/oh_my.tex +821 -0
  60. data/blogs/oh_my/old.Rmd +15 -14
  61. data/blogs/ruby_plot/ruby_plot.Rmd +58 -82
  62. data/blogs/ruby_plot/ruby_plot.log +885 -0
  63. data/blogs/ruby_plot/ruby_plot.md +71 -102
  64. data/blogs/ruby_plot/ruby_plot.tex +940 -0
  65. data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.png +0 -0
  66. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.png +0 -0
  67. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.png +0 -0
  68. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.png +0 -0
  69. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.png +0 -0
  70. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_decorations.png +0 -0
  71. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.png +0 -0
  72. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.png +0 -0
  73. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.png +0 -0
  74. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.png +0 -0
  75. data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.png +0 -0
  76. data/blogs/ruby_plot/ruby_plot_files/figure-latex/dose_len.png +0 -0
  77. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_delivery.png +0 -0
  78. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_dose.png +0 -0
  79. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color.png +0 -0
  80. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color2.png +0 -0
  81. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_decorations.png +0 -0
  82. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_jitter.png +0 -0
  83. data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_points.png +0 -0
  84. data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_box_plot.png +0 -0
  85. data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_violin_plot.png +0 -0
  86. data/blogs/ruby_plot/ruby_plot_files/figure-latex/violin_with_jitter.png +0 -0
  87. data/blogs/test/test.Rmd +14 -0
  88. data/examples/50Plots_MasterList/Images/midwest-scatterplot.PNG +0 -0
  89. data/examples/50Plots_MasterList/ScatterPlot.rb +0 -0
  90. data/examples/50Plots_MasterList/scatter_plot.rb +0 -0
  91. data/examples/Bibliography/master.bib +0 -0
  92. data/examples/Bibliography/stats.bib +0 -0
  93. data/examples/R/calc.R +0 -0
  94. data/examples/R/java_interop.R +0 -0
  95. data/examples/bioconductor_deseq2_airway/Documentation/DESeq2-airway-walkthrough.md +56 -0
  96. data/examples/bioconductor_deseq2_airway/bench_galaaz_three_same_process.rb +53 -0
  97. data/examples/bioconductor_deseq2_airway/bench_r_three_same_process.R +34 -0
  98. data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz.rb +33 -0
  99. data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz_optimized.rb +34 -0
  100. data/examples/bioconductor_deseq2_airway/deseq2_airway_minimal.R +30 -0
  101. data/examples/bioconductor_deseq2_airway/deseq2_airway_pipeline_for_bench.R +36 -0
  102. data/examples/islr/all.rb +13 -0
  103. data/examples/islr/ch2.spec.rb +37 -7
  104. data/examples/islr/ch3.spec.rb +11 -2
  105. data/examples/islr/ch3_boston.rb +27 -0
  106. data/examples/islr/ch3_multiple_regression.rb +0 -0
  107. data/examples/islr/ch6.spec.rb +24 -1
  108. data/examples/islr/x_y_rnorm.jpg +0 -0
  109. data/examples/latex_templates/Test-acm_article/acm_proc_article-sp.cls +0 -0
  110. data/examples/latex_templates/Test-acm_article/sigproc.bib +0 -0
  111. data/examples/latex_templates/Test-acs_article/acs-Test-acs_article.bib +0 -0
  112. data/examples/latex_templates/Test-acs_article/acs-my_output.bib +0 -0
  113. data/examples/latex_templates/Test-aea_article/BibFile.bib +0 -0
  114. data/examples/latex_templates/Test-aea_article/Test-aea_article.Rmd +0 -0
  115. data/examples/latex_templates/Test-aea_article/references.bib +0 -0
  116. data/examples/latex_templates/Test-amq_article/Test-amq_article.Rmd +0 -0
  117. data/examples/latex_templates/Test-amq_article/Test-amq_article.pdfsync +0 -0
  118. data/examples/latex_templates/Test-ieee_article/IEEEtran.bst +0 -0
  119. data/examples/latex_templates/Test-ieee_article/mybibfile.bib +0 -0
  120. data/examples/latex_templates/Test-rjournal_article/RJournal.sty +0 -0
  121. data/examples/latex_templates/Test-rjournal_article/RJreferences.bib +0 -0
  122. data/examples/latex_templates/Test-rjournal_article/Test-rjournal_article.Rmd +0 -0
  123. data/examples/misc/baseball.csv +0 -0
  124. data/examples/misc/ggplot.rb +3 -2
  125. data/examples/misc/moneyball.rb +0 -0
  126. data/examples/misc/subsetting.rb +0 -0
  127. data/examples/multithread_shards_to_r/shards_to_r.rb +67 -0
  128. data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.Rmd +0 -0
  129. data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.Rmd +0 -0
  130. data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.Rmd +0 -0
  131. data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.Rmd +0 -0
  132. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/attend-grade-relationships.csv +0 -0
  133. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.Rmd +0 -0
  134. data/examples/rmarkdown/svm-xaringan-example/svm-xaringan-example.Rmd +0 -0
  135. data/examples/sthda_ggplot/README.md +0 -0
  136. data/examples/sthda_ggplot/RUN.md +41 -0
  137. data/examples/sthda_ggplot/all.rb +0 -0
  138. data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +0 -0
  139. data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +0 -0
  140. data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +2 -0
  141. data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +0 -0
  142. data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +0 -0
  143. data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +0 -0
  144. data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +0 -0
  145. data/examples/sthda_ggplot/one_variable_continuous/stat.rb +0 -0
  146. data/examples/sthda_ggplot/one_variable_discrete/bar.rb +0 -0
  147. data/examples/sthda_ggplot/qplots/box_violin_dot.rb +0 -0
  148. data/examples/sthda_ggplot/qplots/scatter_plots.rb +0 -0
  149. data/examples/sthda_ggplot/scatter_gg.rb +0 -0
  150. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +0 -0
  151. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +0 -0
  152. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +0 -0
  153. data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +0 -0
  154. data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +0 -0
  155. data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +0 -0
  156. data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +4 -3
  157. data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +0 -0
  158. data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +0 -0
  159. data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +0 -0
  160. data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +0 -0
  161. data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +0 -0
  162. data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +0 -0
  163. data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +0 -0
  164. data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +0 -0
  165. data/ext/new_bridge/Makefile +46 -0
  166. data/ext/new_bridge/galaaz_gatekeeper_phase0.cpp +12 -0
  167. data/ext/new_bridge/galaaz_gatekeeper_phase1.cpp +1639 -0
  168. data/lib/R_interface/galaaz_device.R +20 -0
  169. data/lib/R_interface/include_engine.R +109 -0
  170. data/lib/R_interface/new_bridge_adapter.rb +824 -0
  171. data/lib/R_interface/r.rb +177 -25
  172. data/lib/R_interface/r_arrow.rb +113 -0
  173. data/lib/R_interface/r_libs.R +3 -3
  174. data/lib/R_interface/r_methods.rb +13 -126
  175. data/lib/R_interface/r_module_s.rb +0 -0
  176. data/lib/R_interface/rbinary_operators.rb +20 -2
  177. data/lib/R_interface/rclosure.rb +5 -1
  178. data/lib/R_interface/rdata_frame.rb +34 -70
  179. data/lib/R_interface/rdevice.rb +125 -0
  180. data/lib/R_interface/rdevices.R +0 -0
  181. data/lib/R_interface/renvironment.rb +10 -4
  182. data/lib/R_interface/rexpression.rb +5 -1
  183. data/lib/R_interface/rindexed_object.rb +41 -13
  184. data/lib/R_interface/rlanguage.rb +20 -62
  185. data/lib/R_interface/rlist.rb +115 -25
  186. data/lib/R_interface/rlogical_operators.rb +0 -0
  187. data/lib/R_interface/rmatrix.rb +2 -11
  188. data/lib/R_interface/rmd_indexed_object.rb +5 -1
  189. data/lib/R_interface/robject.rb +348 -290
  190. data/lib/R_interface/rpkg.rb +0 -0
  191. data/lib/R_interface/rsupport.rb +609 -328
  192. data/lib/R_interface/rsupport_scope.rb +2 -1
  193. data/lib/R_interface/rsymbol.rb +50 -0
  194. data/lib/R_interface/ruby_callback.rb +2 -3
  195. data/lib/R_interface/ruby_extensions.rb +225 -175
  196. data/lib/R_interface/runary_operators.rb +0 -0
  197. data/lib/R_interface/rvector.rb +147 -31
  198. data/lib/galaaz.rb +0 -0
  199. data/lib/galaaz_jruby.rb +22 -0
  200. data/lib/gknit/diagnostics.rb +50 -0
  201. data/lib/gknit/draft.rb +23 -17
  202. data/lib/gknit/include_engine.rb +15 -7
  203. data/lib/gknit/knitr_engine.rb +223 -74
  204. data/lib/gknit/rb_engine.rb +3 -3
  205. data/lib/gknit/ruby_engine.rb +0 -0
  206. data/lib/gknit.rb +1 -0
  207. data/lib/new_bridge/bootstrap/windows_bootstrap.rb +285 -0
  208. data/lib/new_bridge/envelope.rb +51 -0
  209. data/lib/new_bridge/eval_result.rb +26 -0
  210. data/lib/new_bridge/framing.rb +39 -0
  211. data/lib/new_bridge/instance_pool_client.rb +38 -0
  212. data/lib/new_bridge/r_instance_manager.rb +404 -0
  213. data/lib/new_bridge/session_client.rb +530 -0
  214. data/lib/new_bridge/tcp_framed.rb +44 -0
  215. data/lib/new_bridge.rb +9 -0
  216. data/lib/util/exec_ruby.rb +95 -20
  217. data/lib/util/inline_file.rb +35 -30
  218. data/new_bridge_specs/benchmark_phase5_5_unboxing_spec.rb +96 -0
  219. data/new_bridge_specs/eval_r_async_spec.rb +113 -0
  220. data/new_bridge_specs/integration_phase5_1_concurrent_spec.rb +50 -0
  221. data/new_bridge_specs/integration_phase5_1_eval_spec.rb +16 -0
  222. data/new_bridge_specs/integration_phase5_1_r_api_spec.rb +25 -0
  223. data/new_bridge_specs/integration_phase5_1_smoke_spec.rb +31 -0
  224. data/new_bridge_specs/integration_phase5_2_dataframe_unboxing_spec.rb +19 -0
  225. data/new_bridge_specs/integration_phase5_2_handle_eval_unboxing_spec.rb +25 -0
  226. data/new_bridge_specs/integration_phase5_3_callback_args_spec.rb +28 -0
  227. data/new_bridge_specs/integration_phase5_3_callback_error_spec.rb +22 -0
  228. data/new_bridge_specs/integration_phase5_3_callback_timeout_spec.rb +28 -0
  229. data/new_bridge_specs/integration_phase5_3_callbacks_smoke_spec.rb +22 -0
  230. data/new_bridge_specs/integration_phase5_3_edge_cases_spec.rb +52 -0
  231. data/new_bridge_specs/integration_phase5_3_nested_spec.rb +30 -0
  232. data/new_bridge_specs/integration_phase5_4_concurrent_sessions_spec.rb +53 -0
  233. data/new_bridge_specs/integration_phase5_4_nested_session_callbacks_spec.rb +49 -0
  234. data/new_bridge_specs/integration_phase5_4_session_routing_spec.rb +38 -0
  235. data/new_bridge_specs/integration_phase5_5_stress_concurrency_spec.rb +52 -0
  236. data/new_bridge_specs/integration_phase5_5_unbox_walk_spec.rb +46 -0
  237. data/new_bridge_specs/phase0_protocol_spec.rb +96 -0
  238. data/new_bridge_specs/phase1_req_ret_spec.rb +66 -0
  239. data/new_bridge_specs/phase2_multi_instance_spec.rb +67 -0
  240. data/new_bridge_specs/phase3_callbacks_spec.rb +71 -0
  241. data/new_bridge_specs/phase4_2_hardening_spec.rb +252 -0
  242. data/new_bridge_specs/phase4_3_r_instance_manager_spec.rb +85 -0
  243. data/new_bridge_specs/phase4_nested_callbacks_spec.rb +123 -0
  244. data/r_requires/ggplot.rb +0 -0
  245. data/r_requires/knitr.rb +0 -0
  246. data/specs/all.rb +15 -11
  247. data/specs/arrow_from_ruby_batches_spec.rb +50 -0
  248. data/specs/arrow_semantics_spec.rb +64 -0
  249. data/specs/bridge_concurrent_spec.rb +46 -0
  250. data/specs/bridge_nested_spec.rb +25 -0
  251. data/specs/dataframe_semantics_spec.rb +122 -0
  252. data/specs/dataframe_single_index_logical_filter_spec.rb +21 -0
  253. data/specs/dispatch_probe_cache_spec.rb +38 -0
  254. data/specs/dispatch_probe_error_class_fallback_spec.rb +20 -0
  255. data/specs/dispatch_probe_fallback_spec.rb +18 -0
  256. data/specs/environment_semantics_spec.rb +89 -0
  257. data/specs/field_access_spec.rb +31 -0
  258. data/specs/figures/bg.jpeg +0 -0
  259. data/specs/figures/bg.png +0 -0
  260. data/specs/figures/bg.svg +168 -57
  261. data/specs/figures/dose_len.png +0 -0
  262. data/specs/figures/no_args.jpeg +0 -0
  263. data/specs/figures/no_args.png +0 -0
  264. data/specs/figures/no_args.svg +168 -57
  265. data/specs/figures/width_height.jpeg +0 -0
  266. data/specs/figures/width_height.png +0 -0
  267. data/specs/figures/width_height_units1.jpeg +0 -0
  268. data/specs/figures/width_height_units1.png +0 -0
  269. data/specs/figures/width_height_units2.jpeg +0 -0
  270. data/specs/figures/width_height_units2.png +0 -0
  271. data/specs/formula_semantics_spec.rb +81 -0
  272. data/specs/galaaz_util_exec_ruby_spec.rb +85 -0
  273. data/specs/galaaz_util_inline_file_spec.rb +54 -0
  274. data/specs/gknit_cli_option_permutation_spec.rb +24 -0
  275. data/specs/gknit_include_engine_spec.rb +72 -0
  276. data/specs/gknit_install_timeout_report_spec.rb +69 -0
  277. data/specs/gknit_internal_error_report_spec.rb +57 -0
  278. data/specs/gknit_vector_map_output_spec.rb +59 -0
  279. data/specs/globalenv_guardrail_spec.rb +52 -0
  280. data/specs/language_expression_semantics_spec.rb +145 -0
  281. data/specs/list_semantics_spec.rb +111 -0
  282. data/specs/new_bridge_bulk_dataframe_transfer_spec.rb +44 -0
  283. data/specs/new_bridge_bulk_vector_transfer_spec.rb +73 -0
  284. data/specs/new_bridge_callback_timeout_spec.rb +69 -0
  285. data/specs/new_bridge_eval_r_fallback_spec.rb +55 -0
  286. data/specs/nil_null_spec.rb +42 -0
  287. data/specs/object_build_phase2_spec.rb +53 -0
  288. data/specs/phase1_callback_bridge_spec.rb +84 -0
  289. data/specs/phase2_gknit_generic_rendering_guardrail_spec.rb +46 -0
  290. data/specs/phase2_gknit_no_raw_code_leakage_spec.rb +43 -0
  291. data/specs/phase3_gknit_generic_graphics_capture_spec.rb +71 -0
  292. data/specs/plot_device_semantics_spec.rb +28 -0
  293. data/specs/plot_snapshot_semantics_spec.rb +58 -0
  294. data/specs/protocol_result_spec.rb +236 -0
  295. data/specs/r_batch_fail_fast_spec.rb +47 -0
  296. data/specs/r_bridge_bootstrap_spec.rb +11 -0
  297. data/specs/r_devices.spec.rb +1 -1
  298. data/specs/r_eval.spec.rb +16 -18
  299. data/specs/r_function.spec.rb +1 -1
  300. data/specs/r_instance_manager_spec.rb +285 -0
  301. data/specs/r_list_apply.spec.rb +15 -15
  302. data/specs/r_matrix.spec.rb +0 -0
  303. data/specs/r_nse.spec.rb +5 -5
  304. data/specs/r_object_send_dispatch_spec.rb +13 -0
  305. data/specs/r_vector_comparator_spec.rb +8 -0
  306. data/specs/r_vector_creation.spec.rb +0 -0
  307. data/specs/r_vector_functions.spec.rb +0 -0
  308. data/specs/r_vector_object.spec.rb +0 -0
  309. data/specs/r_vector_operators.spec.rb +0 -0
  310. data/specs/r_vector_structured_scalar_reads_spec.rb +35 -0
  311. data/specs/r_vector_subsetting.spec.rb +0 -0
  312. data/specs/range_helper_spec.rb +21 -0
  313. data/specs/rsupport_scope_spec.rb +28 -0
  314. data/specs/rsupport_var_name_thread_safety_spec.rb +24 -0
  315. data/specs/scalar_character_spec.rb +44 -0
  316. data/specs/scoped_symbol_dsl_refinement_spec.rb +40 -0
  317. data/specs/session_env_bridge_spec.rb +25 -0
  318. data/specs/simplecov_bootstrap_spec.rb +10 -0
  319. data/specs/spec_helper.rb +10 -0
  320. data/specs/tmp.rb +0 -0
  321. data/specs/unboxing_recursion_regression_spec.rb +30 -0
  322. data/specs/unboxing_spec.rb +49 -0
  323. data/specs/verify_callbacks.rb +42 -0
  324. data/sty/galaaz.sty +0 -0
  325. data/version.rb +1 -1
  326. metadata +194 -64
  327. data/blogs/galaaz_ggplot/galaaz_ggplot.html +0 -520
  328. data/blogs/galaaz_ggplot/galaaz_ggplot.pdf +0 -0
  329. data/blogs/galaaz_ggplot/midwest.html +0 -188
  330. data/blogs/gknit/gknit.html +0 -2266
  331. data/blogs/gknit/gknit.pdf +0 -0
  332. data/blogs/manual/manual.html +0 -4638
  333. data/blogs/manual/manual.pdf +0 -0
  334. data/blogs/manual/manual_files/figure-latex/diverging_bar.pdf +0 -0
  335. data/blogs/nse_dplyr/nse_dplyr.html +0 -878
  336. data/blogs/nse_dplyr/nse_dplyr.pdf +0 -0
  337. data/blogs/oh_my/oh_my.html +0 -568
  338. data/blogs/ruby_plot/ruby_plot.html +0 -544
  339. data/blogs/ruby_plot/ruby_plot.pdf +0 -0
  340. data/examples/latex_templates/Test-acs_article/Test-acs_article.pdf +0 -0
  341. data/examples/latex_templates/Test-aea_article/Test-aea_article.pdf +0 -0
  342. data/examples/latex_templates/Test-amq_article/Test-amq_article.pdf +0 -0
  343. data/examples/latex_templates/Test-amq_article/pics/Figure2.pdf +0 -0
  344. data/examples/latex_templates/Test-asa_article/Test-asa_article.pdf +0 -0
  345. data/examples/latex_templates/Test-ieee_article/Test-ieee_article.pdf +0 -0
  346. data/examples/latex_templates/Test-rjournal_article/RJwrapper.pdf +0 -0
  347. data/examples/latex_templates/Test-springer_article/Test-springer_article.pdf +0 -0
  348. data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.pdf +0 -0
  349. data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.pdf +0 -0
  350. data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.pdf +0 -0
  351. data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.pdf +0 -0
  352. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.pdf +0 -0
  353. data/specs/r_dataframe.spec.rb +0 -379
  354. data/specs/r_environment.spec.rb +0 -140
  355. data/specs/r_formula.spec.rb +0 -232
  356. data/specs/r_language.spec.rb +0 -112
  357. data/specs/r_list.spec.rb +0 -293
  358. data/specs/r_plots.spec.rb +0 -72
  359. data/specs/ruby_expression.spec.rb +0 -316
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,12 +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
- @@polyglot_options = "--polyglot --jvm"
40
- @@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
41
41
 
42
42
  #----------------------------------------------------------------------------------------
43
43
  #
@@ -56,13 +56,15 @@ class MakeTask < Rake::TaskLib
56
56
  end
57
57
 
58
58
  #----------------------------------------------------------------------------------------
59
- # Actual TruffleRuby command (with options) to run the example
59
+ # Run example or spec with JRuby (Galaaz 2.0 Shadow Bridge)
60
60
  #----------------------------------------------------------------------------------------
61
61
 
62
62
  def make_task
63
- @rspec ?
64
- (sh %{ ruby #{@@polyglot_options} #{@@libs} -S rspec #{@filepath}.rb -f documentation }) :
65
- (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
66
68
  end
67
69
 
68
70
  #----------------------------------------------------------------------------------------
@@ -77,8 +79,11 @@ class MakeTask < Rake::TaskLib
77
79
 
78
80
  end
79
81
 
80
-
81
- 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
82
87
 
83
88
  geoms = FileList['examples/sthda_ggplot/**/*.rb']
84
89
  specs = FileList['specs/**/*.rb']
@@ -165,6 +170,35 @@ bugs.each do |f|
165
170
  Desc
166
171
  end
167
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
+
168
202
  #===========================================================================================
169
203
  # Creates task for running gknit
170
204
  #===========================================================================================
@@ -179,15 +213,6 @@ blogs.each do |dir|
179
213
 
180
214
  end
181
215
 
182
- #===========================================================================================
183
- # Loads R and require libraries to run Galaaz
184
- #===========================================================================================
185
-
186
- desc 'Prepare R for running'
187
- task :make_r do
188
- (sh %{ gu install r })
189
- end
190
-
191
216
  #===========================================================================================
192
217
  # Makes a gem for publishing in RubyGems
193
218
  #===========================================================================================
@@ -206,27 +231,22 @@ task :publish_gem do
206
231
  (sh %{ gem push #{$gem_name}-#{$version}.gem })
207
232
  end
208
233
 
209
- =begin
210
- desc 'default task'
211
- task :default => [:install_gem]
212
-
213
- desc 'Install the gem in the standard location'
214
- task :install_gem => [:make_gem] do
215
- sh "gem install #{$gem_name}-#{$version}-java.gem"
216
- end
234
+ #===========================================================================================
235
+ # NewBridge gatekeeper + combined spec run (JRuby; see also bin/run_all_rspec)
236
+ #===========================================================================================
217
237
 
218
- desc 'Make documentation'
219
- task :make_doc do
220
- 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' }
221
241
  end
222
242
 
223
- Rake::TestTask.new do |t|
224
- t.libs << "test"
225
- t.test_files = FileList['test/complete.rb']
226
- t.ruby_opts = ["--server", "-Xinvokedynamic.constants=true", "-J-Xmn512m",
227
- "-J-Xms1024m", "-J-Xmx1024m"]
228
- t.verbose = true
229
- 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} }
230
252
  end
231
-
232
- =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
@@ -2,10 +2,10 @@
2
2
  # coding: utf-8
3
3
 
4
4
  require 'optionparser'
5
+ require 'shellwords'
5
6
 
6
7
  options = {}
7
-
8
- OptionParser.new do |opts|
8
+ parser = OptionParser.new do |opts|
9
9
  opts.banner = "Usage: gknit [options]"
10
10
  opts.on("-f", "--filename FILE", "The input file to be rendered.
11
11
  This value can also be provided without the '-f' or '--filename'
@@ -59,7 +59,19 @@ file.") do |opt|
59
59
  that are created during rendering.") do |opt|
60
60
  options[:clean] = opt
61
61
  end
62
- end.parse!
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)
63
75
 
64
76
  # Sets the directory
65
77
  dir = Dir.pwd
@@ -133,22 +145,81 @@ puts " * Output directory: \t #{options[:output_dir]}"
133
145
  puts " * Clean: \t\t #{options[:clean]}"
134
146
 
135
147
 
136
- # Code to be evaluated by the polyglot Ruby script
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)
137
153
  code = <<EOF
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?}
138
156
  require %q(galaaz)
139
157
  require %q(gknit)
140
158
 
141
- R::Rmarkdown.render(
142
- %q(#{options[:input_file]}),
143
- output_format: #{options[:output_format]},
144
- output_file: #{options[:output_file]},
145
- output_dir: #{options[:output_dir]},
146
- clean: #{options[:clean]}
147
- )
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
179
+
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
148
215
  EOF
149
216
 
150
- libx = File.expand_path('../../lib', __FILE__)
151
- exec "ruby --polyglot --jvm --experimental-options --single-threaded -I#{libx} -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)}"
152
223
 
153
224
  =begin
154
225
  # how to call rmarkdown::render with a parameter list
data/bin/gknit-draft.rb CHANGED
File without changes
data/bin/gstudio CHANGED
@@ -23,6 +23,7 @@
23
23
  ##########################################################################################
24
24
 
25
25
  require 'optionparser'
26
+ require 'shellwords'
26
27
 
27
28
  options = {}
28
29
 
@@ -40,12 +41,13 @@ end.parse!
40
41
 
41
42
  bin_dir = File.expand_path('..', __FILE__)
42
43
  libx = File.expand_path('../../lib', __FILE__)
44
+ require File.join(libx, 'galaaz_jruby')
45
+ jvm_args = GalaazJRuby.shell_j_arg_string
43
46
 
44
47
  if options[:pry]
45
48
  puts "Loading PRY and Galaaz... Please wait!"
46
- #exec "ruby --polyglot --jvm -I#{libx} -S pry -r #{bin_dir}/gstudio_pry.rb"
47
- exec "ruby --polyglot --jvm --experimental-options --single-threaded -I#{libx} -S pry -r #{bin_dir}/gstudio_pry.rb"
49
+ exec "jruby #{jvm_args} -I#{Shellwords.escape(libx)} -S pry -r #{Shellwords.escape(File.join(bin_dir, 'gstudio_pry.rb'))}"
48
50
  else
49
51
  puts "Loading IRB and Galaaz... Please wait!"
50
- exec "ruby --polyglot --jvm -I#{libx} -S irb -r #{bin_dir}/gstudio_irb.rb"
52
+ exec "jruby #{jvm_args} -I#{Shellwords.escape(libx)} -S irb -r #{Shellwords.escape(File.join(bin_dir, 'gstudio_irb.rb'))}"
51
53
  end
data/bin/gstudio_irb.rb CHANGED
File without changes
data/bin/gstudio_pry.rb CHANGED
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ # Install TinyTeX to ~/.TinyTeX with symlinks in ~/bin (no sudo).
3
+ # Needed for rmarkdown pdf_document and specs/phase2_gknit_chunk_output_spec.rb.
4
+ set -euo pipefail
5
+ curl -fsSL https://raw.githubusercontent.com/rstudio/tinytex/master/tools/install-bin-unix.sh | sh
6
+ echo "TinyTeX installed. Ensure ~/bin is on PATH for interactive shells, or rely on the Phase 2 spec prepending it for gknit."
data/bin/run_all_rspec ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env bash
2
+ # Run default galaaz specs (specs/) and NewBridge gatekeeper specs (new_bridge_specs/)
3
+ # in a single RSpec process so SimpleCov produces one merged report under coverage/.
4
+ #
5
+ # Compiles ext/new_bridge (incremental make) first — required for integration specs.
6
+ #
7
+ # Usage:
8
+ # bin/run_all_rspec
9
+ # bin/run_all_rspec --format documentation
10
+ # bin/run_all_rspec new_bridge_specs/phase0_protocol_spec.rb
11
+ #
12
+ # If the first argument is an option (starts with -), default dirs are prepended
13
+ # so `bin/run_all_rspec --format doc` still runs specs/ + new_bridge_specs/.
14
+ #
15
+ # For specs/ only (faster day-to-day): bin/run_rspec
16
+ set -e
17
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
18
+ # shellcheck source=galaaz_jruby_env.inc.sh
19
+ source "$ROOT/bin/galaaz_jruby_env.inc.sh"
20
+
21
+ echo "[run_all_rspec] compiling gatekeeper: ext/new_bridge"
22
+ make -C "$ROOT/ext/new_bridge" -s all
23
+
24
+ # Same top-level file set as bin/run_rspec (maxdepth 1), plus whole new_bridge_specs/ tree.
25
+ DEFAULT_SPECS=()
26
+ while IFS= read -r f; do
27
+ DEFAULT_SPECS+=("$f")
28
+ done < <(find "$ROOT/specs" -maxdepth 1 -type f \( -name '*_spec.rb' -o -name '*.spec.rb' \) | sort)
29
+ DEFAULT_SPECS+=( "$ROOT/new_bridge_specs" )
30
+
31
+ # With no args, run those paths. If args are only RSpec options (e.g. --format progress),
32
+ # prepend defaults so flags alone do not mean "run zero files".
33
+ if [ $# -eq 0 ]; then
34
+ set -- "${DEFAULT_SPECS[@]}"
35
+ elif [[ "${1:-}" == -* ]]; then
36
+ set -- "${DEFAULT_SPECS[@]}" "$@"
37
+ fi
38
+ exec jruby -I "$ROOT/lib" \
39
+ $GALAAZ_REQUIRED_JRUBY_J_ARGS \
40
+ ${GALAAZ_JRUBY_OPTS:-} \
41
+ -S bundle exec rspec \
42
+ -r "$ROOT/specs/spec_helper.rb" \
43
+ "$@"
data/bin/run_example ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Run a Galaaz example with required JRuby JVM flags (lib/galaaz_jruby.rb).
3
+ # Optional: GALAAZ_JRUBY_OPTS.
4
+ #
5
+ # Usage: bin/run_example examples/sthda_ggplot/all.rb
6
+ # bin/run_example examples/sthda_ggplot/one_variable_continuous/geom_density.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
+ "$@"
data/bin/run_old_rspec ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ # Run legacy specs moved to old_specs/.
3
+ # Usage:
4
+ # bin/run_old_rspec
5
+ # bin/run_old_rspec old_specs/r_environment.spec.rb
6
+ set -e
7
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
8
+ # shellcheck source=galaaz_jruby_env.inc.sh
9
+ source "$ROOT/bin/galaaz_jruby_env.inc.sh"
10
+ if [ $# -eq 0 ]; then
11
+ shopt -s nullglob
12
+ SPECS=( "$ROOT"/old_specs/*.spec.rb "$ROOT"/old_specs/*_spec.rb )
13
+ IFS=$'\n' SPECS=( $(printf '%s\n' "${SPECS[@]}" | sort) )
14
+ set -- "${SPECS[@]}"
15
+ fi
16
+ exec jruby -I "$ROOT/lib" \
17
+ $GALAAZ_REQUIRED_JRUBY_J_ARGS \
18
+ ${GALAAZ_JRUBY_OPTS:-} \
19
+ -S bundle exec rspec "$@"
data/bin/run_rspec ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ # Run rspec with JVM options required for Apache Arrow (see lib/galaaz_jruby.rb).
3
+ # Optional JVM/jruby extras: GALAAZ_JRUBY_OPTS (space-separated).
4
+ #
5
+ # Usage:
6
+ # bin/run_rspec # run fast specs in specs/ only
7
+ # bin/run_all_rspec # top-level specs/ + new_bridge_specs/ + gatekeeper compile (see docs/testing.md)
8
+ # bin/run_slow_rspec # run slow specs in slow-specs/
9
+ # bin/run_rspec specs/protocol_result_spec.rb
10
+ # GALAAZ_DEBUG=1 bin/run_rspec specs/r_vector_subsetting.spec.rb:61 ...
11
+ set -e
12
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
13
+ # shellcheck source=galaaz_jruby_env.inc.sh
14
+ source "$ROOT/bin/galaaz_jruby_env.inc.sh"
15
+ if [ $# -eq 0 ]; then
16
+ set -- $(find "$ROOT/specs" -maxdepth 1 -type f \( -name '*_spec.rb' -o -name '*.spec.rb' \) | sort)
17
+ fi
18
+ exec jruby -I "$ROOT/lib" \
19
+ $GALAAZ_REQUIRED_JRUBY_J_ARGS \
20
+ ${GALAAZ_JRUBY_OPTS:-} \
21
+ -S bundle exec rspec \
22
+ -r "$ROOT/specs/spec_helper.rb" \
23
+ "$@"