philiprehberger-state_bag

Tests Gem Version Last updated

Thread-local state bag for implicit context propagation

Requirements

  • Ruby >= 3.1

Installation

Add to your Gemfile:

gem "philiprehberger-state_bag"

Or install directly:

gem install philiprehberger-state_bag

Usage

require "philiprehberger/state_bag"

Philiprehberger::StateBag.set(:user_id, 42)
Philiprehberger::StateBag.get(:user_id)
# => 42

Default Values

Philiprehberger::StateBag.get(:missing, 'fallback')
# => "fallback"

Scoped Overrides

Philiprehberger::StateBag.set(:locale, 'en')

Philiprehberger::StateBag.with(locale: 'de') do
  Philiprehberger::StateBag.get(:locale)
  # => "de"
end

Philiprehberger::StateBag.get(:locale)
# => "en"

Fetch and Delete

require "philiprehberger/state_bag"

Philiprehberger::StateBag.set(:user, "Alice")
Philiprehberger::StateBag.fetch(:user)             # => "Alice"
Philiprehberger::StateBag.fetch(:missing, "default") # => "default"
Philiprehberger::StateBag.fetch(:missing) { |k| "no #{k}" } # => "no missing"

Philiprehberger::StateBag.delete(:user)  # => "Alice"
Philiprehberger::StateBag.key?(:user)    # => false

Inspection

Philiprehberger::StateBag.set(:a, 1)
Philiprehberger::StateBag.key?(:a)   # => true
Philiprehberger::StateBag.size       # => 1
Philiprehberger::StateBag.empty?     # => false
Philiprehberger::StateBag.keys       # => [:a]
Philiprehberger::StateBag.to_h       # => {:a=>1}
Philiprehberger::StateBag.clear

API

Method Description
.set(key, val) Store a value in the thread-local state bag
.get(key, default = nil) Retrieve a value or return the default
.with(**overrides, &block) Execute block with temporary state, restoring after
.fetch(key, default = UNSET, &block) Retrieve a value; raises KeyError if missing with no default/block
.delete(key) Remove a key and return its value
.clear Remove all entries from the state bag
.to_h Return a snapshot of the current state
.key?(key) Check if a key exists in the state bag
.size Number of entries in the state bag
.empty? True if the state bag has no entries
.keys Array of all keys in the state bag

Development

bundle install
bundle exec rspec
bundle exec rubocop

Support

If you find this project useful:

Star the repo

🐛 Report issues

💡 Suggest features

❤️ Sponsor development

🌐 All Open Source Projects

💻 GitHub Profile

🔗 LinkedIn Profile

License

MIT