feature_flag 0.1.1

Feature Flag #

Travis (.org) branch Pub Version

A dart package that provides feature flags that can be enabled and disabled by a variety of methods.

Rationale #

Some recommended reading:

Basic Example #

This is a basic example of a binary (enabled/disabled) flag with a default value only.

features.dart #
import 'package:feature_flag/feature_flag.dart';

final Feature<BinaryFeatureState> puppyParty = Feature<BinaryFeatureState>(
  name: 'puppyParty',
  defaultState: BinaryFeatureState.enabled,
);
main.dart #
import './features.dart' as features;

void main() {
  if (features.puppyParty.enabled) {
    print('Yay! A puppy party!');
  } else {
    print('nothing to see here...');
  }
}
Result #
$ dart main.dart
Yay! A puppy party!

Going Further #

Features can be supercharged through the use of decision sources, which allow the decisions regarding the state of a feature to be influenced by a variety of sources. For example, you could have a feature disabled by default, except it's enabled when a specific environment variable is set, or when a web API returns a certain response, or after a certain date has passed, or any combination of these in priority order.

Extending the above example to load feature state from an environment variable could look like:

features.dart #
import 'package:feature_flag/feature_flag.dart';

// Create the decision source
final EnvironmentVariableDecisionSource envVarDecisionSource = EnvironmentVariableDecisionSource();

// Register the features
final Feature<BinaryFeatureState> puppyParty = Feature<BinaryFeatureState>(
  name: 'puppyParty',
  defaultState: BinaryFeatureState.disabled,
  decisionSources: <DecisionFunction<BinaryFeatureState>>[
    envVarDecisionSource.checkVariable('ENABLE_PUPPIES'),
  ],
);

// Use the features in code
void main() {
  if (puppyParty.enabled) {
    print('Yay! A puppy party!');
  } else {
    print('nothing to see here...');
  }
}
Result #
$ dart main.dart
nothing to see here...

$ ENABLE_PUPPIES=false main.dart
nothing to see here...

$ ENABLE_PUPPIES=true main.dart
Yay! A puppy party!

If multiple decision sources are provided for a certain feature, then the first one in the list to return a value (and not fall through) is used as the feature's state.

Changelog #

v0.1.1 #

Fixed #

  • Apply dartfmt to all source files.
  • Add dartfmt -w . as a pre-commit hook.
  • Add example index readme

v0.1.0 #

Initial release!

example/README.md

Examples Index #

basic_example.dart #

An example of a simple binary feature with its state defined in code.

env_var_override.dart #

An example of a binary feature with a default state that can be overriden by an environment variable.

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  feature_flag: ^0.1.1

2. Install it

You can install packages from the command line:

with pub:


$ pub get

with Flutter:


$ flutter pub get

Alternatively, your editor might support pub get or flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:feature_flag/feature_flag.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
0
Health:
Code health derived from static analysis. [more]
100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
100
Overall:
Weighted score of the above. [more]
50
Learn more about scoring.

We analyzed this package on Feb 10, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.7.1
  • pana: 0.13.5

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.6.0 <3.0.0
test ^1.11.1 1.12.0
Transitive dependencies
_fe_analyzer_shared 1.0.3
analyzer 0.39.4
args 1.5.2
async 2.4.0
boolean_selector 2.0.0
charcode 1.1.2
collection 1.14.12
convert 2.1.1
coverage 0.13.5
crypto 2.1.4
csslib 0.16.1
glob 1.2.0
html 0.14.0+3
http 0.12.0+4
http_multi_server 2.2.0
http_parser 3.1.3
io 0.3.3
js 0.6.1+1
logging 0.11.4
matcher 0.12.6
meta 1.1.8
mime 0.9.6+3
multi_server_socket 1.0.2
node_interop 1.0.3
node_io 1.0.1+2
node_preamble 1.4.8
package_config 1.1.0 2.0.0
package_resolver 1.0.10
path 1.6.4
pedantic 1.9.0
pool 1.4.0
pub_semver 1.4.2
shelf 0.7.5
shelf_packages_handler 1.0.4
shelf_static 0.2.8
shelf_web_socket 0.2.3
source_map_stack_trace 1.1.5
source_maps 0.10.8
source_span 1.6.0
stack_trace 1.9.3
stream_channel 2.0.0
string_scanner 1.0.5
term_glyph 1.1.0
test_api 0.2.14
test_core 0.3.0
typed_data 1.1.6
vm_service 2.3.1
watcher 0.9.7+13
web_socket_channel 1.1.0
webkit_inspection_protocol 0.5.0
yaml 2.2.0