Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bugthesystem/scientist.js
:microscope: A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.
https://github.com/bugthesystem/scientist.js
nodejs npm-package refactoring scientist
Last synced: about 13 hours ago
JSON representation
:microscope: A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.
- Host: GitHub
- URL: https://github.com/bugthesystem/scientist.js
- Owner: bugthesystem
- License: unlicense
- Created: 2016-01-25T12:51:03.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-10-25T07:56:17.000Z (almost 6 years ago)
- Last Synced: 2024-04-28T08:41:47.530Z (5 months ago)
- Topics: nodejs, npm-package, refactoring, scientist
- Language: JavaScript
- Homepage:
- Size: 25.4 KB
- Stars: 606
- Watchers: 9
- Forks: 16
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# scientist.js
:microscope: A JavaScript interpretation of the Ruby library [Scientist](https://github.com/github/scientist), a library for carefully refactoring critical paths.[![Build Status](https://travis-ci.org/ziyasal/scientist.js.svg?branch=master)](https://travis-ci.org/ziyasal/scientist.js) [![Coverage Status](https://coveralls.io/repos/github/ziyasal/scientist.js/badge.svg?branch=master)](https://coveralls.io/github/ziyasal/scientist.js?branch=master)
**Install**
```sh
npm install scientist.js
```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 behaviours under load.
**ES6 Sample**
```js
import {Experiment, Result} from 'scientist.js';import Permission from './permission';
import Model from './model';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 wayreturn 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**.