Feature Flagging - internetarchive/openlibrary GitHub Wiki

Feature flags is a way to have features under development live on production and visible only to admins/beta-users.

The idea of Feature Flags came from Flicker. They manage their development on a single branch using feature flags. Here is a link

Using Feature Flags

Feature flags are used in templates and in controller classes. To make some part of the template visible only if a feature-flag is enabled:

$if "lists" in ctx.features:
    <h3>Lists</h3>
    $for list in page.get_lists():
        ...

To enable a url only if a feature flag is enabled:

class home(delegate.page):
    path = "/"

    def is_enabled(self):
        return "home-v2" in web.ctx.features

    def GET(self):
        return render_template("home")

Setting Feature Flags

In Open Library, the feature flags are specified in the openlibrary.yml file as follows:

features:
    merge-authors: enabled
    lists: admin
    lending_v2:
        filter: usergroup
        usergroup: beta-users

The value of a feature flag is called a filter. A filter can be specified either as its name or as a dict containing its name and parameters. For example, the following 2 example mean the same.

features:
    lists: admin

features:
    lists:
        filter: admin

Available filters are:

  • enabled Enabled for all users.

  • disabled Disabled for all users.

  • loggedin Enabled only for logged-in users.

  • admin Enabled for admin users.

  • usergroup Enabled for the users part of the specified usergroup.

lending_v2:
    filter: usergroup
    usergroup: beta-users
  • queryparam Enabled only if the url has a specified query parameter.
debug:
    filter: queryparam
    name: debug
    value: true
⚠️ **GitHub.com Fallback** ⚠️