Module: Togglefy

Defined in:
lib/togglefy.rb,
lib/togglefy/engine.rb,
lib/togglefy/errors.rb,
lib/togglefy/version.rb,
lib/togglefy/assignable.rb,
lib/togglefy/featureable.rb,
lib/togglefy/errors/error.rb,
lib/togglefy/feature_query.rb,
app/models/togglefy/feature.rb,
lib/togglefy/feature_manager.rb,
lib/togglefy/scoped_bulk_wrapper.rb,
lib/togglefy/services/bulk_toggler.rb,
lib/togglefy/errors/feature_not_found.rb,
app/models/togglefy/feature_assignment.rb,
lib/togglefy/errors/bulk_toggle_failed.rb,
lib/togglefy/errors/dependency_missing.rb,
lib/togglefy/feature_assignable_manager.rb,
lib/generators/togglefy/install_generator.rb,
lib/togglefy/errors/assignables_not_found.rb,
lib/togglefy/errors/invalid_feature_attribute.rb

Overview

The Togglefy module provides a feature management system. It includes methods for querying, creating, updating, toggling, and managing features. It also provides a way to manage features for assignable objects.

Features

The Togglefy module provides a variety of features, including:

  • Querying features by type, group, environment, tenant, and custom filters

  • Creating, updating, and deleting features

  • Managing features for Assignables

For more detailed information on each method, please refer to the README, individual method documentation in this file or the usage documentation.

Usage

Main usage for this always starts with the Togglefy module.

Below are a few examples on how to use Togglefy:

Examples

  • Togglefy.feature(:super_powers)

  • Togglefy.for_type(User)

  • Togglefy.for_group(group)

  • Togglefy.for_filters(filters: {group: :admin})

  • Togglefy.with_status(:active)

  • Togglefy.create(name: “Feature Name”, identifier: :feature_name, description: “Feature description”)

  • Togglefy.update(:feature_name, name: “Updated Feature Name”)

  • Togglefy.destroy(:feature_name)

  • Togglefy.toggle(:feature_name)

  • Togglefy.inactive!(:feature_name)

  • Togglefy.for(assignable).enable(:feature_name)

  • Togglefy.for(assignable).has?(:feature_name)

  • Togglefy.mass_for(Assignable).bulk.enable(:feature_name)

  • Togglefy.mass_for(Assignable).bulk.enable(:feature_name, percentage: 35)

  • Togglefy.mass_for(Assignable).bulk.disable([:feature_name, :another_feature])

Aliases

The following aliases are available for convenience:

  • for_role is an alias for for_group

  • without_role is an alias for without_group

  • for_env is an alias for for_environment

  • without_env is an alias for without_environment

  • create_feature is an alias for create

  • update_feature is an alias for update

  • toggle_feature is an alias for toggle

  • activate_feature is an alias for active!

  • inactivate_feature is an alias for inactive!

  • destroy_feature is an alias for destroy

Defined Under Namespace

Modules: Assignable, Generators Classes: AssignablesNotFound, BulkToggleFailed, BulkToggler, DependencyMissing, Engine, Error, Feature, FeatureAssignableManager, FeatureAssignment, FeatureManager, FeatureNotFound, FeatureQuery, InvalidFeatureAttribute, ScopedBulkWrapper

Constant Summary collapse

StandardError =

Overwrites the default StandardError class to provide a custom error class for Togglefy.

Class.new(Error)
VERSION =

The VERSION constant defines the current version of the Togglefy gem.

"1.2.1"
Featureable =
Deprecated.

Use Togglefy::Assignable instead.

Featureable is an alias for Assignable.

Assignable

Class Method Summary collapse

Class Method Details

.active!(identifier) ⇒ boolean Also known as: activate_feature

Activates a feature.

Parameters:

  • identifier (Symbol, String)

    The unique identifier of the feature.

Returns:

  • (boolean)

    True if the feature was activated, false otherwise.

Raises:



210
211
212
213
214
# File 'lib/togglefy.rb', line 210

def self.active!(identifier)
  FeatureManager.new(identifier).active!
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.create(**params) ⇒ Feature Also known as: create_feature

Note:

All parameters are optional, except for the name. If sent, it should be a keyword argument.

Creates a new feature.

Examples:

Togglefy.create(name: "New Feature", identifier: :new_feature, description: "A new feature")
Togglefy.create(name: "New Feature", identifier: nil, description: "A new feature", group: :admin)
Togglefy.create(name: "New Feature", description: "A new feature", environment: :production, tenant_id: "123abc")

Parameters:

  • name (String)

    The name of the feature.

  • identifier (Symbol, String, nil)

    The unique identifier for the feature. Optional, it can also be nil or blank

  • description (String)

    A description of the feature.

  • group (String, Symbol, nil)

    The group the feature belongs to.

  • environment (String, Symbol, nil)

    The environment the feature is for.

  • tenant_id (String)

    The tenant ID the feature is for.

  • status (String, Symbol, Integer)

    The status of the feature.

Returns:

  • (Feature)

    The created feature.



159
160
161
# File 'lib/togglefy.rb', line 159

def self.create(**params)
  FeatureManager.new.create(**params)
end

.destroy(identifier) ⇒ boolean Also known as: destroy_feature

Deletes a feature.

Parameters:

  • identifier (Symbol, String)

    The unique identifier of the feature.

Returns:

  • (boolean)

    True if the feature was deleted, false otherwise.

Raises:



190
191
192
193
194
# File 'lib/togglefy.rb', line 190

def self.destroy(identifier)
  FeatureManager.new(identifier).destroy
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.feature(identifier) ⇒ Feature

Finds a feature by its identifier.

Parameters:

  • identifier (String, Symbol)

    The unique identifier of the feature.

Returns:

  • (Feature)

    The feature object.

Raises:



78
79
80
81
82
# File 'lib/togglefy.rb', line 78

def self.feature(identifier)
  FeatureQuery.new.feature(identifier)
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.featuresArray

Returns all features.

Returns:

  • (Array)

    List of all features.



70
71
72
# File 'lib/togglefy.rb', line 70

def self.features
  FeatureQuery.new.features
end

.for(assignable) ⇒ FeatureAssignableManager

Manages features for a specific assignable object.

Parameters:

  • assignable (Object)

    The assignable object.

Returns:



229
230
231
# File 'lib/togglefy.rb', line 229

def self.for(assignable)
  FeatureAssignableManager.new(assignable)
end

.for_environment(environment) ⇒ Array Also known as: for_env

Queries features for a specific environment.

Parameters:

  • environment (String, Symbol)

    The environment name to filter features by.

Returns:

  • (Array)

    List of features for the given environment.



107
108
109
# File 'lib/togglefy.rb', line 107

def self.for_environment(environment)
  FeatureQuery.new.for_environment(environment)
end

.for_filters(filters: {}) ⇒ Array

Queries features based on custom filters.

Parameters:

  • filters (Hash) (defaults to: {})

    A hash of filters to apply.

Returns:

  • (Array)

    List of features matching the filters.



133
134
135
# File 'lib/togglefy.rb', line 133

def self.for_filters(filters: {})
  FeatureQuery.new.for_filters(filters)
end

.for_group(group) ⇒ Array Also known as: for_role

Queries features for a specific group.

Parameters:

  • group (String, Symbol)

    The group name to filter features by.

Returns:

  • (Array)

    List of features for the given group.



94
95
96
# File 'lib/togglefy.rb', line 94

def self.for_group(group)
  FeatureQuery.new.for_group(group)
end

.for_tenant(tenant_id) ⇒ Array

Queries features for a specific tenant.

Parameters:

  • tenant_id (String)

    The tenant ID to filter features by.

Returns:

  • (Array)

    List of features for the given tenant.



120
121
122
# File 'lib/togglefy.rb', line 120

def self.for_tenant(tenant_id)
  FeatureQuery.new.for_tenant(tenant_id)
end

.for_type(klass) ⇒ Array

Queries features for a specific type.

Parameters:

  • klass (Class)

    The class type to filter features by.

Returns:

  • (Array)

    List of features for the given type.



87
88
89
# File 'lib/togglefy.rb', line 87

def self.for_type(klass)
  FeatureQuery.new.for_type(klass)
end

.inactive!(identifier) ⇒ boolean Also known as: inactivate_feature

Deactivates a feature.

Parameters:

  • identifier (Symbol, String)

    The unique identifier of the feature.

Returns:

  • (boolean)

    True if the feature was inactivated, false otherwise.

Raises:



220
221
222
223
224
# File 'lib/togglefy.rb', line 220

def self.inactive!(identifier)
  FeatureManager.new(identifier).inactive!
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.mass_for(klass) ⇒ ScopedBulkWrapper

Provides bulk management for a specific class.

Parameters:

  • klass (Class)

    The class to manage features for.

Returns:



236
237
238
# File 'lib/togglefy.rb', line 236

def self.mass_for(klass)
  Togglefy::ScopedBulkWrapper.new(klass)
end

.toggle(identifier) ⇒ boolean Also known as: toggle_feature

Toggles the status of a feature.

Parameters:

  • identifier (Symbol, String)

    The unique identifier of the feature.

Returns:

  • (boolean)

    True if the feature was toggled, false otherwise.

Raises:



200
201
202
203
204
# File 'lib/togglefy.rb', line 200

def self.toggle(identifier)
  FeatureManager.new(identifier).toggle
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.update(identifier, **params) ⇒ Feature Also known as: update_feature

Note:

All parameters but the first (identifier) should be keyword arguments.

Updates an existing feature.

Examples:

Togglefy.update(:new_feature, name: "Updated Feature", description: "Updated feature description")
Togglefy.update(:new_feature, identifier: :updated_feature, group: :support)
Togglefy.update(:new_feature, environment: :staging, tenant_id: "abc123")

Parameters:

  • identifier (Symbol, String)

    The unique identifier of the feature.

  • name (String)

    The name of the feature.

  • identifier (Symbol, String, nil)

    The unique identifier for the feature. Optional, it can also be nil or blank

  • description (String)

    A description of the feature.

  • group (String, Symbol, nil)

    The group the feature belongs to.

  • environment (String, Symbol, nil)

    The environment the feature is for.

  • tenant_id (String)

    The tenant ID the feature is for.

  • status (String, Symbol, Integer)

    The status of the feature.

Returns:

  • (Feature)

    The updated feature.

Raises:



180
181
182
183
184
# File 'lib/togglefy.rb', line 180

def self.update(identifier, **params)
  FeatureManager.new(identifier).update(**params)
rescue ActiveRecord::RecordNotFound
  raise Togglefy::FeatureNotFound, "Couldn't find Togglefy::Feature with identifier '#{identifier}'"
end

.with_status(status) ⇒ Array

Queries features by their status.

Parameters:

  • status (String, Symbol, Integer)

    The status to filter features by.

Returns:

  • (Array)

    List of features with the given status.



140
141
142
# File 'lib/togglefy.rb', line 140

def self.with_status(status)
  FeatureQuery.new.with_status(status)
end

.without_environmentArray Also known as: without_env

Queries features without an environment.

Returns:

  • (Array)

    List of features without an environment.



113
114
115
# File 'lib/togglefy.rb', line 113

def self.without_environment
  FeatureQuery.new.without_environment
end

.without_groupArray Also known as: without_role

Queries features without a group.

Returns:

  • (Array)

    List of features without a group.



100
101
102
# File 'lib/togglefy.rb', line 100

def self.without_group
  FeatureQuery.new.without_group
end

.without_tenantArray

Queries features without a tenant.

Returns:

  • (Array)

    List of features without a tenant.



126
127
128
# File 'lib/togglefy.rb', line 126

def self.without_tenant
  FeatureQuery.new.without_tenant
end