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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/LICENSE +0 -0
- data/README.md +3123 -882
- data/Rakefile +62 -41
- data/bin/galaaz-bootstrap +137 -0
- data/bin/galaaz-jruby +14 -0
- data/bin/galaaz_jruby_env.inc.sh +6 -0
- data/bin/gbookdown +64 -0
- data/bin/gknit +223 -6
- data/bin/gknit-draft +105 -0
- data/bin/gknit-draft.rb +28 -0
- data/bin/gknit_Rscript +127 -0
- data/bin/grun +27 -1
- data/bin/gstudio +49 -4
- data/bin/{gstudio.rb → gstudio_irb.rb} +0 -0
- data/bin/gstudio_pry.rb +7 -0
- data/bin/install-tinytex +6 -0
- data/bin/run_all_rspec +43 -0
- data/bin/run_example +14 -0
- data/bin/run_old_rspec +19 -0
- data/bin/run_rspec +23 -0
- data/bin/run_rspec_subset +38 -0
- data/bin/run_slow_rspec +19 -0
- data/blogs/R-on-Rails-Planning-Document.md +940 -0
- data/blogs/README.md +100 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot.Rmd +38 -66
- data/blogs/galaaz_ggplot/galaaz_ggplot.log +754 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot.md +364 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot.tex +607 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/midwest_rb.png +0 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/scatter_plot_rb.png +0 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/midwest_rb.png +0 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-markdown_github/scatter_plot_rb.png +0 -0
- data/blogs/galaaz_ggplot/midwest.Rmd +3 -3
- data/blogs/galaaz_ggplot/midwest_external_png +0 -0
- data/blogs/gknit/gknit.Rmd +52 -55
- data/blogs/gknit/gknit.md +94 -94
- data/blogs/gknit/gknit_files/figure-html/bubble-1.png +0 -0
- data/blogs/gknit/gknit_files/figure-html/diverging_bar.png +0 -0
- data/blogs/gknit/lst.rds +0 -0
- data/blogs/gknit/model.rb +1 -1
- data/blogs/gknit/stats.bib +0 -0
- data/blogs/manual/include_model_local_repro.Rmd +14 -0
- data/blogs/manual/include_model_local_repro.md +75 -0
- data/blogs/manual/lst.rds +0 -0
- data/blogs/manual/manual.Rmd +1582 -196
- data/blogs/manual/manual.log +1786 -0
- data/blogs/manual/manual.md +3107 -890
- data/blogs/manual/manual.tex +3018 -1086
- data/blogs/manual/manual_files/figure-html/bubble-1.png +0 -0
- data/blogs/manual/manual_files/figure-html/diverging_bar.png +0 -0
- data/blogs/manual/manual_files/figure-latex/bubble-1.png +0 -0
- data/blogs/manual/model.rb +41 -0
- data/blogs/nse_dplyr/nse_dplyr.Rmd +277 -151
- data/blogs/nse_dplyr/nse_dplyr.log +928 -0
- data/blogs/nse_dplyr/nse_dplyr.md +457 -293
- data/blogs/oh_my/not_so.rb +0 -0
- data/blogs/oh_my/oh_my.Rmd +1234 -25
- data/blogs/oh_my/oh_my.log +804 -0
- data/blogs/oh_my/oh_my.md +1808 -228
- data/blogs/oh_my/oh_my.tex +821 -0
- data/blogs/oh_my/old.Rmd +15 -14
- data/blogs/ruby_plot/ruby_plot.Rmd +58 -82
- data/blogs/ruby_plot/ruby_plot.log +885 -0
- data/blogs/ruby_plot/ruby_plot.md +71 -103
- data/blogs/ruby_plot/ruby_plot.tex +940 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_decorations.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/dose_len.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_delivery.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facet_by_dose.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_by_delivery_color2.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_decorations.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_jitter.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/facets_with_points.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_box_plot.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/final_violin_plot.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-latex/violin_with_jitter.png +0 -0
- data/blogs/test/test.Rmd +14 -0
- data/examples/50Plots_MasterList/Images/midwest-scatterplot.PNG +0 -0
- data/examples/50Plots_MasterList/ScatterPlot.rb +0 -0
- data/examples/50Plots_MasterList/scatter_plot.rb +0 -0
- data/examples/Bibliography/master.bib +50 -0
- data/examples/Bibliography/stats.bib +72 -0
- data/examples/R/calc.R +0 -0
- data/examples/R/java_interop.R +0 -0
- data/examples/bioconductor_deseq2_airway/Documentation/DESeq2-airway-walkthrough.md +56 -0
- data/examples/bioconductor_deseq2_airway/bench_galaaz_three_same_process.rb +53 -0
- data/examples/bioconductor_deseq2_airway/bench_r_three_same_process.R +34 -0
- data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz.rb +33 -0
- data/examples/bioconductor_deseq2_airway/deseq2_airway_galaaz_optimized.rb +34 -0
- data/examples/bioconductor_deseq2_airway/deseq2_airway_minimal.R +30 -0
- data/examples/bioconductor_deseq2_airway/deseq2_airway_pipeline_for_bench.R +36 -0
- data/examples/islr/all.rb +13 -0
- data/examples/islr/ch2.spec.rb +37 -7
- data/examples/islr/ch3.spec.rb +11 -2
- data/examples/islr/ch3_boston.rb +27 -0
- data/examples/islr/ch3_multiple_regression.rb +0 -0
- data/examples/islr/ch6.spec.rb +24 -1
- data/examples/islr/x_y_rnorm.jpg +0 -0
- data/examples/latex_templates/Test-acm_article/Makefile +16 -0
- data/examples/latex_templates/Test-acm_article/Test-acm_article.Rmd +65 -0
- data/examples/latex_templates/Test-acm_article/acm_proc_article-sp.cls +1670 -0
- data/examples/latex_templates/Test-acm_article/sensys-abstract.cls +703 -0
- data/examples/latex_templates/Test-acm_article/sigproc.bib +59 -0
- data/examples/latex_templates/Test-acs_article/Test-acs_article.Rmd +260 -0
- data/examples/latex_templates/Test-acs_article/acs-Test-acs_article.bib +11 -0
- data/examples/latex_templates/Test-acs_article/acs-my_output.bib +11 -0
- data/examples/latex_templates/Test-acs_article/acstest.bib +17 -0
- data/examples/latex_templates/Test-aea_article/AEA.cls +1414 -0
- data/{blogs/gknit/marshal.dump → examples/latex_templates/Test-aea_article/BibFile.bib} +0 -0
- data/examples/latex_templates/Test-aea_article/Test-aea_article.Rmd +108 -0
- data/examples/latex_templates/Test-aea_article/aea.bst +1269 -0
- data/examples/latex_templates/Test-aea_article/multicol.sty +853 -0
- data/examples/latex_templates/Test-aea_article/references.bib +0 -0
- data/examples/latex_templates/Test-aea_article/setspace.sty +546 -0
- data/examples/latex_templates/Test-amq_article/Test-amq_article.Rmd +256 -0
- data/examples/latex_templates/Test-amq_article/Test-amq_article.pdfsync +3397 -0
- data/examples/latex_templates/Test-ams_article/Test-ams_article.Rmd +215 -0
- data/examples/latex_templates/Test-ams_article/amstest.bib +436 -0
- data/examples/latex_templates/Test-asa_article/Test-asa_article.Rmd +153 -0
- data/examples/latex_templates/Test-asa_article/agsm.bst +1353 -0
- data/examples/latex_templates/Test-asa_article/bibliography.bib +233 -0
- data/examples/latex_templates/Test-ieee_article/IEEEtran.bst +2409 -0
- data/examples/latex_templates/Test-ieee_article/IEEEtran.cls +6346 -0
- data/examples/latex_templates/Test-ieee_article/Test-ieee_article.Rmd +175 -0
- data/examples/latex_templates/Test-ieee_article/mybibfile.bib +20 -0
- data/examples/latex_templates/Test-rjournal_article/RJournal.sty +335 -0
- data/examples/latex_templates/Test-rjournal_article/RJreferences.bib +18 -0
- data/examples/latex_templates/Test-rjournal_article/Test-rjournal_article.Rmd +52 -0
- data/examples/latex_templates/Test-springer_article/Test-springer_article.Rmd +65 -0
- data/examples/latex_templates/Test-springer_article/bibliography.bib +26 -0
- data/examples/latex_templates/Test-springer_article/spbasic.bst +1658 -0
- data/examples/latex_templates/Test-springer_article/spmpsci.bst +1512 -0
- data/examples/latex_templates/Test-springer_article/spphys.bst +1443 -0
- data/examples/latex_templates/Test-springer_article/svglov3.clo +113 -0
- data/examples/latex_templates/Test-springer_article/svjour3.cls +1431 -0
- data/examples/misc/baseball.csv +0 -0
- data/examples/misc/ggplot.rb +3 -2
- data/examples/misc/moneyball.rb +0 -0
- data/examples/misc/subsetting.rb +0 -0
- data/examples/multithread_shards_to_r/shards_to_r.rb +67 -0
- data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.Rmd +73 -0
- data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.Rmd +382 -0
- data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.Rmd +164 -0
- data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.Rmd +92 -0
- data/examples/rmarkdown/svm-rmarkdown-syllabus-example/attend-grade-relationships.csv +482 -0
- data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.Rmd +280 -0
- data/examples/rmarkdown/svm-xaringan-example/svm-xaringan-example.Rmd +386 -0
- data/examples/sthda_ggplot/README.md +0 -0
- data/examples/sthda_ggplot/RUN.md +41 -0
- data/examples/sthda_ggplot/all.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +2 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +0 -0
- data/examples/sthda_ggplot/one_variable_continuous/stat.rb +0 -0
- data/examples/sthda_ggplot/one_variable_discrete/bar.rb +0 -0
- data/examples/sthda_ggplot/qplots/box_violin_dot.rb +0 -0
- data/examples/sthda_ggplot/qplots/scatter_plots.rb +0 -0
- data/examples/sthda_ggplot/scatter_gg.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +0 -0
- data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +4 -3
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +0 -0
- data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +0 -0
- data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +0 -0
- data/ext/new_bridge/Makefile +46 -0
- data/ext/new_bridge/galaaz_gatekeeper_phase0.cpp +12 -0
- data/ext/new_bridge/galaaz_gatekeeper_phase1.cpp +1639 -0
- data/lib/R_interface/galaaz_device.R +20 -0
- data/lib/R_interface/include_engine.R +109 -0
- data/lib/R_interface/new_bridge_adapter.rb +824 -0
- data/lib/R_interface/r.rb +177 -25
- data/lib/R_interface/r_arrow.rb +113 -0
- data/lib/R_interface/r_libs.R +4 -4
- data/lib/R_interface/r_methods.rb +13 -116
- data/lib/R_interface/r_module_s.rb +0 -0
- data/lib/R_interface/rbinary_operators.rb +20 -2
- data/lib/R_interface/rclosure.rb +5 -1
- data/lib/R_interface/rdata_frame.rb +34 -70
- data/lib/R_interface/rdevice.rb +125 -0
- data/lib/R_interface/rdevices.R +0 -0
- data/lib/R_interface/renvironment.rb +10 -4
- data/lib/R_interface/rexpression.rb +5 -1
- data/lib/R_interface/rindexed_object.rb +41 -13
- data/lib/R_interface/rlanguage.rb +20 -62
- data/lib/R_interface/rlist.rb +115 -25
- data/lib/R_interface/rlogical_operators.rb +0 -0
- data/lib/R_interface/rmatrix.rb +2 -11
- data/lib/R_interface/rmd_indexed_object.rb +5 -1
- data/lib/R_interface/robject.rb +348 -290
- data/lib/R_interface/rpkg.rb +1 -0
- data/lib/R_interface/rsupport.rb +610 -331
- data/lib/R_interface/rsupport_scope.rb +2 -1
- data/lib/R_interface/rsymbol.rb +50 -0
- data/lib/R_interface/ruby_callback.rb +2 -3
- data/lib/R_interface/ruby_extensions.rb +225 -175
- data/lib/R_interface/runary_operators.rb +0 -0
- data/lib/R_interface/rvector.rb +147 -31
- data/lib/galaaz.rb +0 -0
- data/lib/galaaz_jruby.rb +22 -0
- data/lib/gknit/diagnostics.rb +50 -0
- data/lib/gknit/draft.rb +111 -0
- data/lib/gknit/include_engine.rb +15 -7
- data/lib/gknit/knitr_engine.rb +223 -107
- data/lib/gknit/rb_engine.rb +3 -3
- data/lib/gknit/ruby_engine.rb +0 -0
- data/lib/gknit.rb +3 -0
- data/lib/new_bridge/bootstrap/windows_bootstrap.rb +285 -0
- data/lib/new_bridge/envelope.rb +51 -0
- data/lib/new_bridge/eval_result.rb +26 -0
- data/lib/new_bridge/framing.rb +39 -0
- data/lib/new_bridge/instance_pool_client.rb +38 -0
- data/lib/new_bridge/r_instance_manager.rb +404 -0
- data/lib/new_bridge/session_client.rb +530 -0
- data/lib/new_bridge/tcp_framed.rb +44 -0
- data/lib/new_bridge.rb +9 -0
- data/lib/util/exec_ruby.rb +95 -46
- data/lib/util/inline_file.rb +35 -30
- data/new_bridge_specs/benchmark_phase5_5_unboxing_spec.rb +96 -0
- data/new_bridge_specs/eval_r_async_spec.rb +113 -0
- data/new_bridge_specs/integration_phase5_1_concurrent_spec.rb +50 -0
- data/new_bridge_specs/integration_phase5_1_eval_spec.rb +16 -0
- data/new_bridge_specs/integration_phase5_1_r_api_spec.rb +25 -0
- data/new_bridge_specs/integration_phase5_1_smoke_spec.rb +31 -0
- data/new_bridge_specs/integration_phase5_2_dataframe_unboxing_spec.rb +19 -0
- data/new_bridge_specs/integration_phase5_2_handle_eval_unboxing_spec.rb +25 -0
- data/new_bridge_specs/integration_phase5_3_callback_args_spec.rb +28 -0
- data/new_bridge_specs/integration_phase5_3_callback_error_spec.rb +22 -0
- data/new_bridge_specs/integration_phase5_3_callback_timeout_spec.rb +28 -0
- data/new_bridge_specs/integration_phase5_3_callbacks_smoke_spec.rb +22 -0
- data/new_bridge_specs/integration_phase5_3_edge_cases_spec.rb +52 -0
- data/new_bridge_specs/integration_phase5_3_nested_spec.rb +30 -0
- data/new_bridge_specs/integration_phase5_4_concurrent_sessions_spec.rb +53 -0
- data/new_bridge_specs/integration_phase5_4_nested_session_callbacks_spec.rb +49 -0
- data/new_bridge_specs/integration_phase5_4_session_routing_spec.rb +38 -0
- data/new_bridge_specs/integration_phase5_5_stress_concurrency_spec.rb +52 -0
- data/new_bridge_specs/integration_phase5_5_unbox_walk_spec.rb +46 -0
- data/new_bridge_specs/phase0_protocol_spec.rb +96 -0
- data/new_bridge_specs/phase1_req_ret_spec.rb +66 -0
- data/new_bridge_specs/phase2_multi_instance_spec.rb +67 -0
- data/new_bridge_specs/phase3_callbacks_spec.rb +71 -0
- data/new_bridge_specs/phase4_2_hardening_spec.rb +252 -0
- data/new_bridge_specs/phase4_3_r_instance_manager_spec.rb +85 -0
- data/new_bridge_specs/phase4_nested_callbacks_spec.rb +123 -0
- data/r_requires/ggplot.rb +0 -0
- data/r_requires/knitr.rb +0 -0
- data/specs/all.rb +15 -11
- data/specs/arrow_from_ruby_batches_spec.rb +50 -0
- data/specs/arrow_semantics_spec.rb +64 -0
- data/specs/bridge_concurrent_spec.rb +46 -0
- data/specs/bridge_nested_spec.rb +25 -0
- data/specs/dataframe_semantics_spec.rb +122 -0
- data/specs/dataframe_single_index_logical_filter_spec.rb +21 -0
- data/specs/dispatch_probe_cache_spec.rb +38 -0
- data/specs/dispatch_probe_error_class_fallback_spec.rb +20 -0
- data/specs/dispatch_probe_fallback_spec.rb +18 -0
- data/specs/environment_semantics_spec.rb +89 -0
- data/specs/field_access_spec.rb +31 -0
- data/specs/figures/bg.jpeg +0 -0
- data/specs/figures/bg.png +0 -0
- data/specs/figures/bg.svg +168 -57
- data/specs/figures/dose_len.png +0 -0
- data/specs/figures/no_args.jpeg +0 -0
- data/specs/figures/no_args.png +0 -0
- data/specs/figures/no_args.svg +168 -57
- data/specs/figures/width_height.jpeg +0 -0
- data/specs/figures/width_height.png +0 -0
- data/specs/figures/width_height_units1.jpeg +0 -0
- data/specs/figures/width_height_units1.png +0 -0
- data/specs/figures/width_height_units2.jpeg +0 -0
- data/specs/figures/width_height_units2.png +0 -0
- data/specs/formula_semantics_spec.rb +81 -0
- data/specs/galaaz_util_exec_ruby_spec.rb +85 -0
- data/specs/galaaz_util_inline_file_spec.rb +54 -0
- data/specs/gknit_cli_option_permutation_spec.rb +24 -0
- data/specs/gknit_include_engine_spec.rb +72 -0
- data/specs/gknit_install_timeout_report_spec.rb +69 -0
- data/specs/gknit_internal_error_report_spec.rb +57 -0
- data/specs/gknit_vector_map_output_spec.rb +59 -0
- data/specs/globalenv_guardrail_spec.rb +52 -0
- data/specs/language_expression_semantics_spec.rb +145 -0
- data/specs/list_semantics_spec.rb +111 -0
- data/specs/new_bridge_bulk_dataframe_transfer_spec.rb +44 -0
- data/specs/new_bridge_bulk_vector_transfer_spec.rb +73 -0
- data/specs/new_bridge_callback_timeout_spec.rb +69 -0
- data/specs/new_bridge_eval_r_fallback_spec.rb +55 -0
- data/specs/nil_null_spec.rb +42 -0
- data/specs/object_build_phase2_spec.rb +53 -0
- data/specs/phase1_callback_bridge_spec.rb +84 -0
- data/specs/phase2_gknit_generic_rendering_guardrail_spec.rb +46 -0
- data/specs/phase2_gknit_no_raw_code_leakage_spec.rb +43 -0
- data/specs/phase3_gknit_generic_graphics_capture_spec.rb +71 -0
- data/specs/plot_device_semantics_spec.rb +28 -0
- data/specs/plot_snapshot_semantics_spec.rb +58 -0
- data/specs/protocol_result_spec.rb +236 -0
- data/specs/r_batch_fail_fast_spec.rb +47 -0
- data/specs/r_bridge_bootstrap_spec.rb +11 -0
- data/specs/r_devices.spec.rb +1 -1
- data/specs/r_eval.spec.rb +16 -18
- data/specs/r_function.spec.rb +1 -1
- data/specs/r_instance_manager_spec.rb +285 -0
- data/specs/r_list_apply.spec.rb +15 -15
- data/specs/r_matrix.spec.rb +0 -0
- data/specs/r_nse.spec.rb +5 -5
- data/specs/r_object_send_dispatch_spec.rb +13 -0
- data/specs/r_vector_comparator_spec.rb +8 -0
- data/specs/r_vector_creation.spec.rb +0 -0
- data/specs/r_vector_functions.spec.rb +0 -0
- data/specs/r_vector_object.spec.rb +0 -0
- data/specs/r_vector_operators.spec.rb +0 -0
- data/specs/r_vector_structured_scalar_reads_spec.rb +35 -0
- data/specs/r_vector_subsetting.spec.rb +0 -0
- data/specs/range_helper_spec.rb +21 -0
- data/specs/rsupport_scope_spec.rb +28 -0
- data/specs/rsupport_var_name_thread_safety_spec.rb +24 -0
- data/specs/scalar_character_spec.rb +44 -0
- data/specs/scoped_symbol_dsl_refinement_spec.rb +40 -0
- data/specs/session_env_bridge_spec.rb +25 -0
- data/specs/simplecov_bootstrap_spec.rb +10 -0
- data/specs/spec_helper.rb +10 -0
- data/specs/tmp.rb +41 -20
- data/specs/unboxing_recursion_regression_spec.rb +30 -0
- data/specs/unboxing_spec.rb +49 -0
- data/specs/verify_callbacks.rb +42 -0
- data/sty/galaaz.sty +0 -0
- data/version.rb +1 -1
- metadata +239 -71
- data/blogs/galaaz_ggplot/galaaz_ggplot.aux +0 -41
- data/blogs/galaaz_ggplot/galaaz_ggplot.html +0 -705
- data/blogs/galaaz_ggplot/galaaz_ggplot.out +0 -10
- data/blogs/galaaz_ggplot/galaaz_ggplot.pdf +0 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-latex/midwest_rb.pdf +0 -0
- data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-latex/scatter_plot_rb.pdf +0 -0
- data/blogs/galaaz_ggplot/midwest.html +0 -188
- data/blogs/gknit/gknit.html +0 -2266
- data/blogs/gknit/gknit.pdf +0 -0
- data/blogs/gknit/gknit.tex +0 -1358
- data/blogs/manual/graph.rb +0 -29
- data/blogs/manual/manual.html +0 -2995
- data/blogs/manual/manual.pdf +0 -0
- data/blogs/manual/manual_files/figure-latex/diverging_bar.pdf +0 -0
- data/blogs/nse_dplyr/nse_dplyr.html +0 -960
- data/blogs/nse_dplyr/nse_dplyr.pdf +0 -0
- data/blogs/nse_dplyr/nse_dplyr.tex +0 -1373
- data/blogs/oh_my/oh_my.html +0 -680
- data/blogs/ruby_plot/ruby_plot.Rmd_external_figs +0 -662
- data/blogs/ruby_plot/ruby_plot.html +0 -729
- data/blogs/ruby_plot/ruby_plot.pdf +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.svg +0 -57
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.svg +0 -106
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.svg +0 -110
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.svg +0 -174
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.svg +0 -236
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.svg +0 -296
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.svg +0 -236
- data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.svg +0 -218
- data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.svg +0 -128
- data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.svg +0 -150
- data/examples/paper/paper.rb +0 -36
- data/specs/r_dataframe.spec.rb +0 -379
- data/specs/r_environment.spec.rb +0 -140
- data/specs/r_formula.spec.rb +0 -232
- data/specs/r_language.spec.rb +0 -112
- data/specs/r_list.spec.rb +0 -293
- data/specs/r_plots.spec.rb +0 -72
- 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
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
#
|
|
59
|
+
# Run example or spec with JRuby (Galaaz 2.0 Shadow Bridge)
|
|
59
60
|
#----------------------------------------------------------------------------------------
|
|
60
61
|
|
|
61
62
|
def make_task
|
|
62
|
-
@rspec
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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 '
|
|
218
|
-
task :
|
|
219
|
-
sh
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|