Skip to content

YusukeTakeuchi/flagset

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FlagSet

FlagSet is a Ruby library to make sets of finite flags.

Installation

gem install flagset

Usage

define

You define a class with FlagSet.define:

Auth = FlagSet.define{
  flag :allow_read_name
  flag :allow_read_email
  flag :allow_read_posts
}

Simpler ways are also available:

Auth = FlagSet.define{
  flag :allow_read_name, :allow_read_email, :allow_read_posts
}

Or

Auth = FlagSet.define(:allow_read_name, :allow_read_email, :allow_read_posts)

create

Auth.new
# => #<Auth: []> (empty set)
Auth.new(:allow_read_name, :allow_read_posts)
# => #<Auth: [:allow_read_name,:allow_read_posts]>
Auth[:allow_read_name, :allow_read_posts]
# => #<Auth: [:allow_read_name,:allow_read_posts]> (same as above)

create with class methods

Auth.allow_read_email
# => #<Auth: [:allow_read_email]> (same as Auth.new(:allow_read_email))

Auth.allow_read_name | Auth.allow_read_posts
# => #<Auth: [:allow_read_name,:allow_read_posts]>

You can use special name all and none

Auth.all
# => #<Auth: [:allow_read_name,:allow_read_email,:allow_read_posts]>
Auth.none
# => #<Auth: []>

aliases

all and none are aliases that denotes set of flags. You can also define aliases your own.

Auth2 = FlagSet.define{
  aliased :read_all, [:read_name, :read_email, :read_posts]
  flag :read_name, :read_email, :read_posts

  flag :write_posts, :write_messages
  aliased :write_all, [:write_posts, :write_messages]
  # You can put aliased before or after the original names

  aliased :read_write_all, [:read_all, :write_all]
}

Auth2.read_all
# => #<Auth2: [:read_name,:read_email,:read_posts]>
Auth2.write_all
# => #<Auth2: [:write_posts,:write_messages]>
Auth2.read_write_all == Auth2.all
# => true

Queries

You can check the state of the flags with has_all_of? and has_any_of? methods:

Auth2.read_name.has_all_of?(:read_all)
# => false
Auth2.read_all.has_all_of?(:read_name, :read_email)
# => true
Auth2.write_all.has_all_of?(Auth2[:write_posts, :write_messages])
# => true
Auth2[:read_all].has_any_of?(:read_posts)
# => true
Auth2.read_all.has_any_of?(:write_all)
# => false
Auth2.all.has_any_of?(:none)
# => false

You can also use named query methods:

Auth2.read_all.read_name?
# => true
Auth2.write_posts.write_all?
# => true

Note that the query method #foo? is equivalent to has_any_of?(:foo), so aliases can be confusing when used as query methods.

There are special query methods all?, any?, none?

# #all? returns true if self is equal to class.all
Auth2.read_all.all? #=> false
(Auth2.read_all | Auth2.write_all).all? #=> true

# #any? returns true if self is not equal to class.none
Auth2.read_email.any? # => true
Auth2.new.any? # => false

# #none? returns true if self is equal to class.none
Auth2.read_posts.none? #=> false
Auth2.none.none? #=> true

Set operations

Basic set operations are supported.

Auth2.read_all & Auth2.read_name
# => #<Auth2: [:read_name]>

Auth2.read_name | Auth2.read_email
# => #<Auth2: [:read_name,:read_email]>

Auth2.read_all - :read_posts
# => #<Auth2: [:read_name,:read_email]>

Auth2[:read_name, :read_email] ^ [:read_email, :read_posts]
# => #<Auth2: [:read_name,:read_posts]>

~Auth2[:write_all]
# => #<Auth2: [:read_name,:read_email,:read_posts]>

The arguments of .new and set operations can be one of these:

  • Symbol
  • the same class as self
  • Integer

or a single Array of above.

License

MIT License

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published