Initial commit
This commit is contained in:
commit
fea8f3f8e3
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2023 David Heinemeier Hansson
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,68 @@
|
||||||
|
# Flaggle Rock
|
||||||
|
|
||||||
|
[View on RubyGems](https://rubygems.org/gems/flaggle_rock)
|
||||||
|
|
||||||
|
Flaggle Rock is a simple feature flagging gem for use with Ruby on Rails applications.
|
||||||
|
|
||||||
|
It is designed for easily hiding features from end users to help enable a fast-moving
|
||||||
|
CI workflow. It currently does not aim to support more advanced features such as A/B
|
||||||
|
testing.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add Flaggle Rock to your Gemfile:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
gem "flaggle_rock"
|
||||||
|
```
|
||||||
|
|
||||||
|
And install
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bundle install
|
||||||
|
```
|
||||||
|
|
||||||
|
Generate the migrations, and run them to add feature flags to your database:
|
||||||
|
```sh
|
||||||
|
bundle exec rails generate flaggle_rock:install
|
||||||
|
bundle exec rails db:migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
All flags are _off by default_. There is no need to explicitly create a new flag—turning
|
||||||
|
it on will do this.
|
||||||
|
|
||||||
|
To enable/disable a flag:
|
||||||
|
```ruby
|
||||||
|
Rock.on(:flag_name)
|
||||||
|
Rock.off(:flag_name)
|
||||||
|
```
|
||||||
|
To check whether a flag is on:
|
||||||
|
```ruby
|
||||||
|
Rock.on?(:flag_name)
|
||||||
|
Rock.off?(:flag_name)
|
||||||
|
```
|
||||||
|
|
||||||
|
To remove a flag which is no longer used:
|
||||||
|
```ruby
|
||||||
|
Rock.delete(:flag_name)
|
||||||
|
```
|
||||||
|
|
||||||
|
To remove all disabled flags:
|
||||||
|
```ruby
|
||||||
|
Rock.delete_all_disabled
|
||||||
|
```
|
||||||
|
|
||||||
|
## Future
|
||||||
|
|
||||||
|
Goals with Flaggle Rock include the creation of a web UI for easily administering flags.
|
||||||
|
|
||||||
|
## Compatibility
|
||||||
|
|
||||||
|
Flaggle Rock has been tested with Rails 7 and PostgreSQL 11, but should work with older versions of
|
||||||
|
Rails and other database engines.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Flaggle Rock is released under the [MIT License](MIT-LICENSE.md).
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,11 @@
|
||||||
|
Gem::Specification.new do |s|
|
||||||
|
s.name = "flaggle_rock"
|
||||||
|
s.version = "0.1.1"
|
||||||
|
s.summary = "A simple feature flag gem"
|
||||||
|
s.authors = ["T S Vallender"]
|
||||||
|
s.email = "t@tsvallender.co.uk"
|
||||||
|
s.homepage = "https://git.tsvallender.co.uk/tsv/flaggle_rock"
|
||||||
|
s.files = Dir["lib/**/*", "MIT-LICENSE", "README.md"]
|
||||||
|
s.license = "MIT"
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
class Rock
|
||||||
|
def self.on(flag_name)
|
||||||
|
enable(flag_name, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.off(flag_name)
|
||||||
|
enable(flag_name, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.on?(flag_name)
|
||||||
|
result = sql <<-SQL
|
||||||
|
SELECT enabled FROM feature_flags
|
||||||
|
WHERE name = '#{flag_name}';
|
||||||
|
SQL
|
||||||
|
result&.first&.dig("enabled") || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.off?(flag_name)
|
||||||
|
!on?(flag_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.delete(flag_name)
|
||||||
|
sql <<-SQL
|
||||||
|
DELETE FROM feature_flags
|
||||||
|
WHERE name = '#{flag_name}';
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.delete_all_disabled
|
||||||
|
sql <<-SQL
|
||||||
|
DELETE FROM feature_flags
|
||||||
|
WHERE enabled = false;
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def self.enable(flag_name, enabled)
|
||||||
|
sql <<-SQL
|
||||||
|
INSERT INTO feature_flags (name, enabled, created_at, updated_at)
|
||||||
|
VALUES ('#{flag_name}', #{enabled}, now(), now())
|
||||||
|
ON CONFLICT (name) DO UPDATE SET enabled = #{enabled};
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.sql(query_string)
|
||||||
|
ActiveRecord::Base.connection.execute(query_string)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
require "rails/generators"
|
||||||
|
require "rails/generators/migration"
|
||||||
|
|
||||||
|
module FlaggleRock
|
||||||
|
module Generators
|
||||||
|
class InstallGenerator < Rails::Generators::Base
|
||||||
|
include Rails::Generators::Migration
|
||||||
|
source_root File.expand_path("templates", __dir__)
|
||||||
|
desc "Generates a migration to create the feature flags table"
|
||||||
|
|
||||||
|
def self.next_migration_number(path)
|
||||||
|
next_migration_number = current_migration_number(path) + 1
|
||||||
|
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
||||||
|
end
|
||||||
|
|
||||||
|
def copy_migrations
|
||||||
|
migration_template "create_feature_flags.rb", "db/migrate/create_feature_flags.rb"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,10 @@
|
||||||
|
class CreateFeatureFlags < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
create_table :feature_flags do |t|
|
||||||
|
t.string :name, null: false, index: { unique: true }
|
||||||
|
t.boolean :enabled, null: false, default: false
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue