JSPM

scientist.js

0.0.1
    • ESM via JSPM
    • ES Module Entrypoint
    • Export Map
    • Keywords
    • License
    • Repository URL
    • TypeScript Types
    • README
    • Created
    • Published
    • Downloads 7
    • Score
      100M100P100Q38853F
    • License MIT

    A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.

    Package Exports

    • scientist.js

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (scientist.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    scientist.js

    🔬 A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.

    Build Status Coverage Status

    How do I science?

    Let's pretend you're changing the way you handle permissions in a large web app. Tests can help guide your refactoring, but you really want to capture the current and refactored beahviours under load.

    import {Experiment, Result} from 'scientist.js';
    
    import Permission from './permission';
    import Model from './model';
    
    export default class MyWidget {
        constructor() {
            this.model = new Model();
        }
    
        allows(user) {
            var experiment = new Experiment("widget-permissions");
            experiment.use(() => this.model.checkUser(user).valid); // old way
            experiment.try(() => user.can(Permission.Read, this.model)); // new way
    
            return experiment.run();
        }
    }

    Use use(..) to wrap the existing original behaviour, and use try(..) to wrap the new behaviour. experiment.run(); will always return the result of the use block, but it does a bunch of stuff behind the scenes:

    • It decides whether or not to run the try block
    • Randomises order to execute try and use blocks
    • Measures the duration of both behaviours
    • Swallows (but records) any exceptions raised in the try block and
    • Set a condition to filter calls to try

    Upcoming features (these already exist in the Ruby library):

    • Compares the result of try to the result of use,
    • Publishes all this information.

    The use block is called the control. The try block is called the candidate.