source "https://rubygems.org"

# Bundled gems, not default ones, since Ruby 3.4: they ship with the
# interpreter but are NOT on the load path under bundler unless a
# Gemfile names them. `boot.rb` requires bigdecimal, and the runtime
# requires base64 and resolv, so an emitted tree that leaves them
# unnamed cannot load at all.
#
# Unconditional, and above the trimmed blocks on purpose: the asset
# group's Rails gems depend on all three, which is why an app WITH an
# asset pipeline never noticed, and an app without one could not boot.
gem "bigdecimal"
gem "base64"
gem "resolv"

# SQLite backend. CRuby/Spinel use the `sqlite3` C-ext gem (swapped in
# as runtime/db.rb at transpile time). The JRuby target has no C-ext
# build, so `bin/rh transpile jruby` rewrites this line to `jdbc-sqlite3`
# in its emitted tree (see src/project.rs::jruby_runtime_files) and
# reaches SQLite through the Xerial sqlite-jdbc driver — keeping this
# committed scaffold Gemfile (and its frozen lock) MRI-only. An app whose
# primary database is PostgreSQL gets `gem "pg"` here instead, and no
# lock (src/project.rs::apply_postgresql_tree).
gem "sqlite3"
gem "minitest"
gem "rake"

# In-process Rack driving for oracle-style suites (the roda-blog
# toolchain gate runs its behavioral oracle through Rack::Test against
# config.ru's app instead of booting Puma).
gem "rack-test"

# CRuby HTTP serving — `rake dev` runs Puma against `config.ru`'s
# Rack adapter to `Main.run`. Spinel-target builds don't reference
# these at runtime (the compiled binary uses sphttp via FFI); the
# gems are still bundle-installed for the toolchain (rake test +
# rubocop run under CRuby in both target trees).
gem "puma"
gem "rack"

# The cable reactor's selector. Already in the bundle as a Puma
# dependency; named here because cable.rb requires it directly, so the
# dependency is ours and must not vanish if Puma ever drops it.
gem "nio4r", "~> 2.0"

# Spinel-subset compliance gate (CI). Runs against the shipped tree
# (scaffold + runtime + lowered emit) after toolchain-spinel emits
# into the scratch dir; catches reflection/concurrency/singleton-class
# patterns spinel rejects but CRuby silently accepts. Interim while
# spinel itself isn't yet runnable as a target.
group :development do
  gem "rubocop", "~> 1.86"
  gem "rubocop_spinel", "~> 0.1"
end
gem "bcrypt"
gem "htmlentities"
gem "rotp"
gem "markly", "= 0.15.2"
gem "nokogiri"
gem "rqrcode"
gem "rack-mini-profiler"

# Required by emitted application constants.
gem "oauth", "= 1.1.0"

# Required by emitted application constants.
gem "rack-attack", "= 6.7.0"

# Required by emitted application constants.
gem "svg-graph", "= 2.2.2"
gem "cgi"
gem "json"
gem "ostruct"
