This library was π© inspired by π©, the Wolverine project, which implemented a clever workaround to the official non-support of anonymous classes by ActiveRecord.
Warning: Use of this gem is a security risk, due to the use of Ruby's eval
. It is intended for use in a test suite, or other non-critical environment.
Project | AnonymousActiveRecord |
---|---|
gem name | anonymous_active_record |
documentation | on Github.com, on RDoc.info, |
code triage | |
expert support | |
... π |
Install the gem and add to the application's Gemfile by executing,
adding the --group test
on the end if you will only use it for testing
(which is the only way it should be used):
$ bundle add anonymous_active_record --group test
If bundler is not being used to manage dependencies, install the gem by executing:
$ gem install anonymous_active_record
This gem is compatible with, as of Sep 2024: β’ Ruby 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, ruby-head, truffleruby-head
Require the library in your spec_helper
or other test suite boot file.
require "anonymous_active_record"
Let's say you want to write specs for a module, HasBalloon
, which provides a method has_balloon?
, and will be mixed into ActiveRecord classes.
module HasBalloon
def has_balloon?
name == "Spot" # only Spot has a balloon
end
end
This won't work (really!):
let(:ar_with_balloon) do
Class.new(ActiveRecord::Base) do
attr_accessor :name
include HasBalloon
def flowery_name
"#{b_f}#{name}#{b_f}"
end
def b_f
has_balloon? ? "π" : "πΈ"
end
end
end
So do this instead:
let(:ar_with_balloon) do
AnonymousActiveRecord.generate(columns: ["name"]) do
include HasBalloon
def flowery_name
"#{b_f}#{name}#{b_f}"
end
def b_f
has_balloon? ? "π" : "πΈ"
end
end
end
it "can test the module" do
expect(ar_with_balloon.new(name: "Spot").flowery_name).to(eq("πSpotπ"))
expect(ar_with_balloon.new(name: "Not Spot").flowery_name).to(eq("πΈNot SpotπΈ"))
end
AnonymousActiveRecord.generate(
table_name: "a_table_name",
# if table_name is not set klass_basename will be used to derive a unique random table_name
# default is a unique random table name
klass_basename: "anons", # is default
columns: ["name"],
# columns default is [],
# meaning class will have ['id', 'created_at', 'updated_at'], as the AR defaults
# Optionally provide an array of hashes and thereby designate column type:
# [{name: 'name', type: 'string'}, {name: 'baked_at', type: 'time'}]
timestamps: true, # is default
indexes: [{columns: ["name"], unique: true}],
# indexes default is [],
# meaning class will have no indexes, as the AR defaults
# Optionally provide an array of hashes of index options (similar to those used in Rails migrations):
# [{columns: ['name'], unique: true}, {columns: ['baked_at']}]
connection_params: {adapter: "sqlite3", encoding: "utf8", database: ":memory:"}, # is default
) do
# code which becomes part of the class definition
end
The block is optional.
AnonymousActiveRecord.factory(
source_data: [{name: "Phil"}, {name: "Vickie"}],
# Array of hashes, where each hash represents a record that will be created
# ... The rest of the options are the same as for generate, see above.
) do
# same as for generate, see above.
end
The block is optional.
There is also a factory!
method that will raise if the create fails, accomplished by calling create!
instead of create
.
See CONTRIBUTING.md
If you need some ideas of where to help, you could work on adding more code coverage.
Made with contributors-img.
Everyone interacting in this project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
This Library adheres to Semantic Versioning 2.0.0. Violations of this scheme should be reported as bugs. Specifically, if a minor or patch version is released that breaks backward compatibility, a new version should be immediately released that restores compatibility. Breaking changes to the public API will only be introduced with new major versions.
To get a better understanding of how SemVer is intended to work over a project's lifetime, read this article from the creator of SemVer:
As a result of this policy, you can (and should) specify a dependency on these libraries using the Pessimistic Version Constraint with two digits of precision.
For example:
spec.add_dependency("anonymous_active_record", "~> 1.0")
See CHANGELOG.md for list of releases.
The gem is available as open source under the terms of
the MIT License .
See LICENSE.txt for the official Copyright Notice.
- Copyright (c) 2017 - 2022, 2024 Peter H. Boling of Rails Bling