tg_geometry 0.1.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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +103 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +385 -0
  6. data/Rakefile +129 -0
  7. data/benchmark/_support.rb +115 -0
  8. data/benchmark/batch_packed_vs_loop.rb +27 -0
  9. data/benchmark/falcon_concurrency.rb +25 -0
  10. data/benchmark/flat_vs_rtree.rb +27 -0
  11. data/benchmark/gvl_threshold.rb +41 -0
  12. data/benchmark/objectspace_memsize.rb +17 -0
  13. data/benchmark/parse_throughput.rb +38 -0
  14. data/benchmark/rss_stability.rb +70 -0
  15. data/docs/ACTIVE_RECORD.md +26 -0
  16. data/docs/ARCHITECTURE.md +130 -0
  17. data/docs/AUTO_STRATEGY.md +15 -0
  18. data/docs/BENCHMARKING.md +75 -0
  19. data/docs/CASUAL_EXAMPLE.md +618 -0
  20. data/docs/CONCURRENCY.md +65 -0
  21. data/docs/ERROR_HANDLING.md +55 -0
  22. data/docs/EXPANSION_E_TO_H_STATUS.md +51 -0
  23. data/docs/FORMAT_COVERAGE.md +23 -0
  24. data/docs/FULL_TG_API_COVERAGE.md +109 -0
  25. data/docs/LIMITATIONS.md +61 -0
  26. data/docs/LOW_LEVEL_GEOMETRY.md +121 -0
  27. data/docs/MEMORY_OWNERSHIP.md +94 -0
  28. data/docs/RACTOR.md +40 -0
  29. data/docs/REGISTRY.md +37 -0
  30. data/docs/RELEASE_CHECKLIST.md +39 -0
  31. data/ext/tg_geometry/extconf.rb +91 -0
  32. data/ext/tg_geometry/tg_geometry_ext.c +3054 -0
  33. data/ext/tg_geometry/tg_geometry_vendor_rtree.c +1 -0
  34. data/ext/tg_geometry/tg_geometry_vendor_tg.c +24 -0
  35. data/ext/tg_geometry/vendor/.vendored +16 -0
  36. data/ext/tg_geometry/vendor/rtree/LICENSE +20 -0
  37. data/ext/tg_geometry/vendor/rtree/README.md +202 -0
  38. data/ext/tg_geometry/vendor/rtree/VERSION +3 -0
  39. data/ext/tg_geometry/vendor/rtree/rtree.c +840 -0
  40. data/ext/tg_geometry/vendor/rtree/rtree.h +105 -0
  41. data/ext/tg_geometry/vendor/tg/LICENSE +19 -0
  42. data/ext/tg_geometry/vendor/tg/README.md +197 -0
  43. data/ext/tg_geometry/vendor/tg/VERSION +3 -0
  44. data/ext/tg_geometry/vendor/tg/tg.c +16010 -0
  45. data/ext/tg_geometry/vendor/tg/tg.h +359 -0
  46. data/lib/tg/geometry/active_record_source.rb +57 -0
  47. data/lib/tg/geometry/registry.rb +119 -0
  48. data/lib/tg/geometry/version.rb +7 -0
  49. data/lib/tg/geometry.rb +6 -0
  50. data/lib/tg_geometry.rb +3 -0
  51. data/script/vendor_libs.rb +264 -0
  52. data/spec/block_10_rtree_strategy_spec.rb +82 -0
  53. data/spec/block_11_rtree_order_spec.rb +53 -0
  54. data/spec/block_12_batch_packed_spec.rb +55 -0
  55. data/spec/block_13_error_hardening_spec.rb +65 -0
  56. data/spec/block_14_memory_gc_hardening_spec.rb +116 -0
  57. data/spec/block_1_skeleton_spec.rb +45 -0
  58. data/spec/block_20_concurrency_spec.rb +157 -0
  59. data/spec/block_20_fuzz_spec.rb +145 -0
  60. data/spec/block_2_vendor_spec.rb +79 -0
  61. data/spec/block_3_geom_parse_spec.rb +89 -0
  62. data/spec/block_4_geom_api_spec.rb +90 -0
  63. data/spec/block_5_rect_api_spec.rb +96 -0
  64. data/spec/block_6_index_build_spec.rb +111 -0
  65. data/spec/block_7_index_owned_geometry_spec.rb +143 -0
  66. data/spec/block_8_index_borrowed_geometry_spec.rb +106 -0
  67. data/spec/block_9_flat_query_spec.rb +65 -0
  68. data/spec/expansion_a_auto_strategy_spec.rb +14 -0
  69. data/spec/expansion_b_registry_spec.rb +47 -0
  70. data/spec/expansion_c_active_record_source_spec.rb +42 -0
  71. data/spec/expansion_d_format_coverage_spec.rb +30 -0
  72. data/spec/expansion_e_low_level_geometry_spec.rb +82 -0
  73. data/spec/expansion_i_ractor_spec.rb +25 -0
  74. data/spec/expansion_j_full_tg_api_coverage_spec.rb +114 -0
  75. data/spec/spec_helper.rb +15 -0
  76. metadata +157 -0
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+
5
+ MINIMUM_RUBY_VERSION = Gem::Version.new("3.0.0")
6
+ current_ruby_version = Gem::Version.new(RUBY_VERSION)
7
+
8
+ if current_ruby_version < MINIMUM_RUBY_VERSION
9
+ abort "tg_geometry requires Ruby >= #{MINIMUM_RUBY_VERSION}; current Ruby is #{RUBY_VERSION}"
10
+ end
11
+
12
+ VENDOR_DIR = File.expand_path("vendor", __dir__)
13
+ VENDORED_TG_DIR = File.join(VENDOR_DIR, "tg")
14
+ VENDORED_RTREE_DIR = File.join(VENDOR_DIR, "rtree")
15
+
16
+ required_vendor_files = [
17
+ File.join(VENDORED_TG_DIR, "tg.c"),
18
+ File.join(VENDORED_TG_DIR, "tg.h"),
19
+ File.join(VENDORED_TG_DIR, "VERSION"),
20
+ File.join(VENDORED_RTREE_DIR, "rtree.c"),
21
+ File.join(VENDORED_RTREE_DIR, "rtree.h"),
22
+ File.join(VENDORED_RTREE_DIR, "VERSION")
23
+ ]
24
+
25
+ missing_vendor_files = required_vendor_files.reject { |path| File.file?(path) }
26
+ unless missing_vendor_files.empty?
27
+ abort "tg_geometry requires vendored tidwall/tg and rtree.c sources. Missing: #{missing_vendor_files.join(", ")}. Run `ruby script/vendor_libs.rb --sync`."
28
+ end
29
+
30
+ forbidden_defines = %w[TG_NOATOMICS RTREE_NOATOMICS]
31
+ forbidden_defines.each do |macro|
32
+ if ($CFLAGS.to_s.split + $CPPFLAGS.to_s.split + $defs).any? { |flag| flag.include?(macro) }
33
+ abort "tg_geometry must not define #{macro}; atomics are required by the release-core contract"
34
+ end
35
+ end
36
+
37
+ $CFLAGS = [
38
+ $CFLAGS,
39
+ "-std=c11",
40
+ "-Wall",
41
+ "-Wextra",
42
+ "-Wpedantic",
43
+ "-O2"
44
+ ].join(" ")
45
+
46
+ $INCFLAGS = [
47
+ $INCFLAGS,
48
+ # Ruby 3.x headers intentionally use newer C attributes/macros. Treat the
49
+ # Ruby include directories as system headers so -Wpedantic reports warnings
50
+ # from tg_geometry itself, not from the embedding Ruby version.
51
+ "-isystem $(arch_hdrdir)",
52
+ "-isystem $(hdrdir)/ruby/backward",
53
+ "-isystem $(hdrdir)",
54
+ "-I$(srcdir)/vendor/tg",
55
+ "-I$(srcdir)/vendor/rtree"
56
+ ].join(" ")
57
+
58
+ unless try_compile(<<~C)
59
+ #include <stdatomic.h>
60
+ int main(void) { atomic_int x; atomic_init(&x, 0); return atomic_load(&x); }
61
+ C
62
+ abort "tg_geometry requires a C11 compiler with <stdatomic.h> support"
63
+ end
64
+
65
+ required_functions = %w[
66
+ rb_gc_mark_movable
67
+ rb_gc_location
68
+ rb_gc_adjust_memory_usage
69
+ ]
70
+
71
+ required_functions.each do |function|
72
+ next if have_func(function, "ruby.h")
73
+
74
+ abort "tg_geometry requires Ruby C API function #{function}; minimum supported Ruby is #{MINIMUM_RUBY_VERSION}"
75
+ end
76
+
77
+ if have_macro("RB_NOGVL_OFFLOAD_SAFE", "ruby/thread.h")
78
+ $defs << "-DHAVE_RB_NOGVL_OFFLOAD_SAFE"
79
+ end
80
+
81
+ if ENV["TG_DEBUG_TEST"] == "1"
82
+ $defs << "-DTG_DEBUG_TEST"
83
+ end
84
+
85
+ $srcs = [
86
+ "tg_geometry_ext.c",
87
+ "tg_geometry_vendor_tg.c",
88
+ "tg_geometry_vendor_rtree.c"
89
+ ]
90
+
91
+ create_makefile("tg_geometry_ext_geometry_ext")