mobiusloop 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/README.md +179 -117
  4. data/bin/a2h +17 -0
  5. data/bin/bcat +17 -0
  6. data/bin/btee +17 -0
  7. data/bin/coderay +17 -0
  8. data/bin/coveralls +17 -0
  9. data/bin/htmldiff +17 -0
  10. data/bin/kramdown +17 -0
  11. data/bin/ldiff +17 -0
  12. data/bin/{mobiusloop → mobius} +0 -0
  13. data/bin/nokogiri +17 -0
  14. data/bin/pry +17 -0
  15. data/bin/rackup +17 -0
  16. data/bin/rake +17 -0
  17. data/bin/rspec +17 -0
  18. data/bin/term_cdiff +17 -0
  19. data/bin/term_colortab +17 -0
  20. data/bin/term_decolor +17 -0
  21. data/bin/term_display +17 -0
  22. data/bin/term_mandel +17 -0
  23. data/bin/thor +17 -0
  24. data/bin/tilt +17 -0
  25. data/bin/yard +17 -0
  26. data/bin/yardoc +17 -0
  27. data/bin/yri +17 -0
  28. data/build +7 -0
  29. data/docs/Outcome_Options.docx +0 -0
  30. data/examples/mobiusloop/increase_readers.goal +6 -8
  31. data/gherkin-languages.json +6 -3
  32. data/lib/cucumber/cli/main.rb +1 -1
  33. data/lib/cucumber/project_initializer.rb +11 -6
  34. data/lib/mobiusloop/config/config.yml +9 -0
  35. data/lib/mobiusloop/config/config_file.rb +20 -0
  36. data/lib/mobiusloop/hooks.rb +22 -0
  37. data/lib/mobiusloop/mobius_steps.rb +7 -5
  38. data/lib/mobiusloop/objective.rb +67 -1
  39. data/lib/mobiusloop/outcome.rb +68 -12
  40. data/lib/mobiusloop/scale.rb +3 -16
  41. data/lib/mobiusloop/version +1 -0
  42. data/mobiusloop.gemspec +17 -15
  43. data/mobiusloop.gemspec.lock +10 -0
  44. data/spec/mobiusloop/measure_spec.rb +17 -0
  45. data/spec/mobiusloop/objective_spec.rb +52 -0
  46. data/spec/mobiusloop/outcome_spec.rb +59 -0
  47. data/spec/mobiusloop/page_response_scale_spec.rb +16 -0
  48. data/spec/mobiusloop/scale_error.rb +16 -0
  49. data/spec/mobiusloop/scale_sample.rb +18 -0
  50. data/spec/mobiusloop/scale_spec.rb +23 -0
  51. metadata +183 -25
  52. data/CONTRIBUTING.md +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e6bd4113018108ce0d474e02243c13e5e8701f9
4
- data.tar.gz: ccda4bfa5a8026be4c646f884cf5aaaf8b8275d0
3
+ metadata.gz: cc0c13ef43aafb60ae151d24308f553385c76ea4
4
+ data.tar.gz: d3cc8fddea44193199a35da90ffa1d839d706f79
5
5
  SHA512:
6
- metadata.gz: 8fc115d1b44f03d233997ee9dde71744b75ae8377bbf6e6b5d9d1ab1abf22d3f275fc0f76cd523783b1c8a51d0fa1212c37d23ccc3ce71e78322d1dc6896eaf7
7
- data.tar.gz: 8b20b671d419e975385d6e7ea87bf98fad1475c16648be055cd3f0f85d00778240617f5fc105fe6731114fb48e6830992d5a342d821bcfbbbb3de3af61e1f2d9
6
+ metadata.gz: 472298f62f78c1795e98f232738d146705854208789bfebab79298cd0041beb27ae36ec6a46454a809e1f36625ab72db7239cf629037879faf5249d0502b1e34
7
+ data.tar.gz: b1a8bf86d267231a68f7e866463649a0d836f601c70541dd1bef899996a88ac64258198cabf22bafe522ac09d2df7444b66777a508e6887144ed3a8fa78d249f
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
- gem "cucumber-pro", "0.0.13", :group => :test
1
+ gem "cucumber-pro", "0.0.13"
2
2
  source "https://rubygems.org"
3
- gemspec
3
+ gemspec :name => 'mobiusloop'
4
4
 
5
5
  gem 'mime-types', '~>2.99'
data/README.md CHANGED
@@ -1,18 +1,19 @@
1
- # building the right things with mobiusloop
1
+ # building the right things with mobius
2
2
 
3
- `mobiusloop` provides continuous feedback to people on whether they are **building the right things**, not just **building things right**.
3
+ `mobius` provides continuous feedback to people on whether they are **building the right things**, not just **building things right**.
4
4
 
5
5
  Most product development tools focus on **building things right** meaning on time, on budget and with high quality.
6
- `mobiusloop` is different. It uses a simple language to define the desired business and product goals, such as Increase
7
- Customer Conversion or Improve App Responsiveness. Then `mobiusloop` uses automation to measure and report on progress
8
- towards these goals daily, weekly or whenever you want.
6
+ `mobius` is different. It uses a simple language to define the desired business and product goals, such as Increase
7
+ Customer Conversion or Improve App Responsiveness. Then `mobius` uses automation to measure and report on progress
8
+ towards these goals whenever you want.
9
9
 
10
- With `mobiusloop` teams get realtime feedback on whether their new features are delivering the expected value. Leaders get
10
+ With `mobius` teams get realtime feedback on whether their new features are delivering the expected value. Leaders get
11
11
  clear visibility on whether their investments are delivering the desired return. Everyone gets feedback on whether they are
12
12
  **building the right things**.
13
13
 
14
- Use `mobiusloop` with methods like [Objectives and Key Results (OKR's)](https://www.amazon.com/Radical-Focus-Achieving-Important-Objectives-ebook/dp/B01BFKJA0Y)
15
- and [Mobius](http://mobiusloop.com) to define and measure the value of your product or service.
14
+ Use `mobius` with our method [Mobius](http://mobiusloop.com) and other methods like
15
+ [Objectives and Key Results (OKR's)](https://www.amazon.com/Radical-Focus-Achieving-Important-Objectives-ebook/dp/B01BFKJA0Y)
16
+ to define and measure the value of your product or service.
16
17
 
17
18
 
18
19
  ## how it works
@@ -21,10 +22,10 @@ Today many teams write automated feature tests using open source tools like [Cuc
21
22
  tests in a simple, readable format using the [Gherkin](https://cucumber.io/docs/reference) language. Whenever these tests are run, teams get realtime feedback
22
23
  on the quality of their product.
23
24
 
24
- `mobiusloop` takes this concept and applies it to strategic business and product goals. Instead of tests that report on
25
- product quality when run, `mobiusloop` reports on progress towards desired goals.
25
+ `mobius` builds up this concept to apply automation towards product goals and business objectives. Instead of tests that report on
26
+ product quality, `mobius` reports on progress towards desired goals.
26
27
 
27
- Under the covers `mobiusloop` is built on [Cucumber](http://cucumber.io) and consists of three main parts:
28
+ Under the covers `mobius` is built on the popular open source testing tool [Cucumber](http://cucumber.io). It consists of three main parts:
28
29
  1. `.goal` files
29
30
  1. step definitions
30
31
  1. custom `Scale`'s
@@ -36,7 +37,7 @@ Frameworks like [Objectives and Key Results (OKR's)](https://www.amazon.com/Radi
36
37
  and [Mobius](http://mobiusloop.com) encourage qualitative statements (problems or objectives) together with quantitative
37
38
  measures of success (outcomes or key results).
38
39
 
39
- Using `mobiusloop`, leaders and teams collaboratively write these in a `.goal` text file. Here's an example:
40
+ Using `mobius`, leaders and teams collaboratively write these in a `.goal` text file. Here's an example:
40
41
 
41
42
  ```ruby
42
43
  Objective: Reach a million paying customers by Q3 2016!
@@ -44,8 +45,7 @@ Objective: Reach a million paying customers by Q3 2016!
44
45
  Key Result: Increase Journal Readership
45
46
  Given a baseline of 500,000 readers on Oct 1, 2015
46
47
  And a target of 1,000,000 readers by Oct 1, 2016
47
- When we measure progress with "Total Readers Scale"
48
- Then report progress towards target
48
+ Then measure progress with "Total Readers Scale"
49
49
  ```
50
50
  Here's another one:
51
51
 
@@ -55,15 +55,14 @@ Problem: Slow app response times are causing us to lose customers
55
55
  Outcome: Improve App Responsiveness
56
56
  Given a baseline of 4.5 seconds average response time on May 1, 2016
57
57
  And a target of 1.5 seconds average response time by Jun 30, 2016
58
- When we measure progress with "Peak User Performance Scale"
59
- Then report progress towards target
58
+ Then measure progress with "Peak User Performance Scale"
60
59
  ```
61
60
  The syntax is based [Gherkin](https://cucumber.io/docs/reference), the language used to write Cucumber acceptance tests.
62
- `mobiusloop` introduces a four new keywords to Gherkin: **Objective**, **Problem**, **Outcome** and **Key Result**.
61
+ `mobius` introduces a four new keywords to Gherkin: **Objective**, **Problem**, **Outcome** and **Key Result**.
63
62
 
64
63
  Each `.goal` file contains **one** Objective or Problem and **one or more** Outcomes or Key Results.
65
64
 
66
- When the `.goal` files are run from a command line, they report progress towards your targets like this:
65
+ When the `.goal` files are run with `mobius`, they report progress towards your targets like this:
67
66
 
68
67
  ```ruby
69
68
  Objective: Top a million paying customers by Q3 2016!
@@ -73,45 +72,45 @@ Objective: Top a million paying customers by Q3 2016!
73
72
  And a target of 1000000 readers by "Oct 1, 2016"
74
73
  When we measure progress with "Total Readers Scale"
75
74
  Success! found 820,000 readers in 1.2 seconds!
76
- Then report progress towards targets
75
+ Then measure progress with "Total Readers Scale"
77
76
  Hooray! You are on track!
78
77
  64% progress to target using 61% of the time (222 days)
79
78
  36% remaining to target in 143 days
80
79
  ````
81
80
 
82
- Progress is reported as text or optionally saved in a [web page](results.html) for sharing.
81
+ Progress is reported on the screen an optionally saved to a file.
83
82
 
84
- With `mobiusloop` teams can measure progress towards their goals daily, weekly, monthly or whatever cadence makes sense.
85
- Integrating `mobiusloop` into your continuous delivery pipeline helps measure the impacts of each new release on your outcomes or key results.
83
+ With `mobius` teams can measure progress towards their goals daily, weekly, monthly or whatever cadence makes sense.
84
+ Integrating `mobius` into your continuous delivery pipeline helps measure the impacts of each new release on your outcomes or key results.
86
85
 
87
86
 
88
87
  #### 2. step definitions
89
- Under the covers, `mobiusloop` is built on a forked copy of [cucumber-ruby](https://github.com/cucumber/cucumber-ruby).
90
- It uses Gherkin to parse the `.goal` file and call Cucumber [step definitions](https://github.com/cucumber/cucumber/wiki/Step-Definitions).
91
- `mobiusloop` ships with one step definition [mobius_steps.rb](lib/mobiusloop/mobius_steps.rb) that can be modified or extended.
88
+ Under the covers, `mobius` is built on a forked copy of [cucumber-ruby](https://github.com/cucumber/cucumber-ruby).
89
+ It uses Gherkin to parse the `.goal` files and call Cucumber [step definitions](https://github.com/cucumber/cucumber/wiki/Step-Definitions).
90
+ `mobius` ships with one step definition [mobius_steps.rb](lib/mobiusloop/mobius_steps.rb) that can be modified or extended.
92
91
 
93
- In `mobius_steps.rb`, the lines beginning with `Given` save the baseline and target values.
92
+ Inside `mobius_steps.rb`, the lines beginning with `Given` and `And` save the baseline and target values, respectively.
94
93
  The line beginning with `When` creates an `Outcome` with a custom `Scale`, sets the baselines and targets, then calls
95
94
  the `measure` method to perform the measurement. The line beginning with `Then` reports the progress towards targets.
96
95
 
97
96
  This `Given, When, Then` syntax is identical to Gherkin, easing the learning curve for teams already using Cucumber.
98
- Teams can either use `mobius_steps.rb` or create their own step definitions.
97
+ Teams can choose to use the built-in `mobius_steps.rb` or create their own step definitions.
99
98
 
100
99
 
101
100
  #### 3. custom `Scale`'s
102
101
 
103
102
  At creation time, each outcome (or key result) is associated with a custom `Scale` of measure.
104
- `Scale`'s are the code that collects your data in your environment to report progress.
105
- `mobiusloop` ships with a few example scales, however teams are encouraged to create custom scales to meet their needs.
103
+ Scale's are the code that collects your data in your environment to report progress.
104
+ `mobius` ships with a few example scales, however teams are encouraged to create custom scales to meet their needs.
106
105
 
107
106
  To create a Scale, create a new Ruby class that extends `Scale` and then implement the `measure` method. Next, update the `.goal`
108
- file to reference your new `Scale` class. When `mobiusloop` parses this line:
107
+ file to reference your new `Scale` class. When `mobius` parses this line:
109
108
 
110
109
  ```we measure progress with "Total Readers Scale"```
111
110
 
112
111
  it creates a new instance of the Ruby class `TotalReadersScale` and calls the `measure` method, which returns a new `Measure`.
113
112
 
114
- In this example, you would implement the method `collect_total_readers` with your custom logic.
113
+ Here's an example:
115
114
 
116
115
  ```Ruby
117
116
  require 'mobiusloop/scale'
@@ -126,147 +125,189 @@ class TotalReadersScale < Scale
126
125
  end
127
126
  ````
128
127
 
128
+ In this example you would implement the method `collect_total_readers` with your custom logic.
129
+
129
130
 
130
131
  ## getting started
131
132
 
132
- Adding `mobiusloop` to your product is easy, but requires some command-line chops.
133
- If this section looks like Greek, then as nicely as possible ask a developer on your team for help.
133
+ Adding `mobius` to your product is relatively easy, but requires some command-line chops and about 20 minutes of your time.
134
+ If the following section looks like Greek, then as nicely as possible ask a developer on your team for help. Come bearing gifts!
134
135
 
135
136
  **Note:** Currently only Ruby on Linux and OSX are tested platforms. Windows will be added in the future.
136
137
 
137
138
  If [Ruby](https://www.ruby-lang.org/en/), [gem](https://rubygems.org) and [bundle](http://bundler.io) are not installed, install them first.
138
139
 
139
- Then install `mobiusloop` with this command:
140
+ Then install `mobius` with this command:
140
141
 
141
142
  $ gem install mobiusloop
142
143
 
143
- Once installed, create a symbolic link for the `mobiusloop` command. First locate your ruby executable path:
144
+ Once installed, create a symbolic link for the `mobius` command. First locate your ruby executable path:
144
145
 
145
146
  $ gem env
146
147
 
147
148
  Look for the value of `EXECUTABLE DIRECTORY`, something like `/usr/local/Cellar/ruby/2.2.3/bin/`.
148
149
  Then create a symbolic link:
149
150
 
150
- $ ln -s </path/to/executable/directory/mobiusloop /usr/local/bin/mobiusloop
151
+ $ ln -s /path/to/executable/directory/mobius /usr/local/bin/mobius
151
152
 
152
- **TODO:** Find a way to create symbolic link as part of gem install to remove this manual step
153
+ **TODO:** Simplify to find a way to create symbolic link as part of gem install
153
154
 
154
155
 
155
- ## adding mobiusloop to your app
156
+ ## adding mobius to your app
156
157
 
157
158
  To create and run your own goals, let's start with a working example and modify it.
158
159
 
159
- Change to the root directory of your app and run `mobiusloop`:
160
+ Change to the root directory of your app and run `mobius`:
161
+
162
+ $ cd product_root_directory
163
+ $ mobius
164
+
165
+ You get feedback that `mobius` is not initialized. So let's do that:
166
+
167
+ $ mobius --init
168
+
169
+ `mobius` creates a `goals/` directory and put some files in there. Let's run it again:
170
+
171
+ $ mobius
172
+
173
+ You got feedback that `mobius` is running for your product!
160
174
 
161
- $ cd product_home
162
- $ mobiusloop
175
+ If you get an error instead, attempt to debug the issue and [let us know](https://github.com/ryanshriver/mobiusloop-ruby/issues)
176
+ so we can fix it.
163
177
 
164
- You get feedback that `mobiousloop` is not initialized. So let's do that:
178
+ Now let's customize `mobius` for your needs.
165
179
 
166
- $ mobiusloop --init
167
180
 
168
- `mobiusloop` just created a `goals/` directory and put some files in there. Let's run our example:
181
+ # create your first goal
169
182
 
170
- $ mobiusloop
183
+ Mobius ships with a working goal to get you started.
171
184
 
172
- If all goes well, you get feedback that `mobiusloop` is running for your product! Now let's customize it for your needs.
185
+ Open `goals/increase_readers.goal` in your favorite text editor,
186
+ change the *baseline* or *target value*. Save and run `mobius` again. Notice changes in the progress?
173
187
 
188
+ Change the *baseline* or *target dates* and run `mobius` again. See more changes? Getting the hang of it?
174
189
 
175
- ## create your first .goal
190
+ As you experiment you may notice the progress being displayed in green, yellow or red font color.
191
+ In addition to the quantitative progress, `mobius` reports on whether you are *on track*. All this is configurable
192
+ but more on that later.
176
193
 
177
- First, open `goals/increase_readers.goal` in a text editor, change the baseline or target value, save and run again.
178
- Did you notice changes in the progress and status? Change the baseline and target dates and try again. Getting the hang of it?
179
194
 
180
- Now let's pretend you have a product outcome to **improve response time** for your product from 4.5 seconds to 1 second.
195
+ #### step 1: create .goal file
196
+
197
+ Let's pretend you have a product outcome to **improve response time** for your product from 5 seconds to 1 second.
181
198
  Start by copying our working example:
182
199
 
183
- $ cp goals/increase_readers.goal goals/improve_response_time.goal
200
+ $ cp goals/increase_readers.goal goals/improve_experience.goal
201
+
184
202
 
203
+ #### step 2: create objectives and outcomes
185
204
 
186
- #### create objectives and outcomes
205
+ Open `improve_experience.goal` in your text editor and make some changes:
187
206
 
188
- Open the new `improve_response_time.goal` in your text editor and make some changes:
207
+ 1. Update `Objective:` to reflect our new goal. How about `Improve our digital customer experience this year`
208
+ 1. Let's only start with one `Outcome`, so delete from `Outcome: Increase Published Articles by 25%` to the end of the file
209
+ 1. Now update your `Outcome:` keeping it short and sweet. How about `Improve Response Time`
189
210
 
190
- - Update `Objective:` to reflect our new goal. How about <i>Improve our digital customer experience this year</i>.
191
- - Let's only start with one `Outcome`, so delete from `Outcome: Increase Published Articles by 25%` to the end of the file
192
- - Now update your `Outcome:` keeping it short and sweet. Something like <i>Improve Response Time</i>
211
+ When done it should look like this:
193
212
 
194
- Now save the file and run again:
213
+ ```
214
+ Objective: Improve our digital customer experience this year
195
215
 
196
- $ mobiusloop
216
+ Outcome: Improve Response Time
217
+ Given a baseline of 500000 "readers" on "Oct 1, 2016"
218
+ And a target of 1000000 "readers" by "Oct 1, 2017"
219
+ Then measure progress with "Total Readers Scale"
220
+ ```
197
221
 
198
- This runs all the `.goal` files to `goals/` folder. We can just run our new one with this command:
222
+ Save your new goal and run `mobuis` again. Notice that `mobius` runs all the `.goal` files in the `goals/` folder by default.
223
+ We can just run our new one with this command:
199
224
 
200
- $ mobiusloop goals/improve_response_time.goal
225
+ $ mobius goals/improve_experience.goal
201
226
 
202
- We don't need the example anymore, so let's remove it:
227
+ Since we don't need the example anymore, let's remove it:
203
228
 
204
229
  $ rm goals/increase_readers.goal
205
230
 
206
231
 
207
- #### define baselines and targets
232
+ #### step 3: define baselines and targets
208
233
 
209
- Open `improve_response_time.goal` again and let's update the baselines and targets.
210
- Let's pretend as of October 1, 2015 your app's home page takes 5 seconds to load. That's your baseline. Make a change:
234
+ Let's pretend as of October 1, 2016 your app's home page takes 5 seconds to load. That's your baseline.
235
+ Since your product owner has requested *sub-second response time*, that's your target.
211
236
 
212
- - In the row starting with `Given`, change 50000 to 5 and "readers" to "seconds"
237
+ Open `improve_experience.goal` in your text editor and make some changes:
213
238
 
214
- Your product owner has said <i>sub-second</i> is their goal. That's your target. Make another change:
239
+ 1. In the row starting with `Given`, change `50000` to `5` and `readers` to `seconds`
240
+ 1. In the row starting with `And`, change `1000000` to `1` and `readers` to `second`
215
241
 
216
- - In the row starting with `And`, change 1000000 to 1 and "readers" to "second"
242
+ When done it should look like this:
217
243
 
218
- Now save the file and run again:
244
+ ```
245
+ Objective: Improve our digital customer experience this year
219
246
 
220
- $ mobiusloop
247
+ Outcome: Improve Response Time
248
+ Given a baseline of 5 "seconds" on "Oct 1, 2016"
249
+ And a target of 1 "second" by "Oct 1, 2017"
250
+ Then measure progress with "Total Readers Scale"
251
+ ```
221
252
 
222
- This works, but we have 820,000 seconds! That's not right, so let's fix it.
253
+ Now save the file and run `mobius` again.
223
254
 
255
+ This works, but we have *820,000 seconds!* That's not right, so let's fix it.
224
256
 
225
- #### define scales
226
257
 
227
- Open `improve_response_time.goal` again and let's change the scale to record response times, not total readers.
258
+ #### step 4: define scales
228
259
 
229
- - In the row starting with `When`, change "Total Readers Scale" to "Page Response Scale"
260
+ Open `improve_experience.goal` in your text editor and make some changes:
230
261
 
231
- Now save the file and run again.
262
+ 1. In the row starting with `When`, change "Total Readers Scale" to "Page Response Scale"
232
263
 
233
- $ mobiusloop
264
+ When done it should look like this:
234
265
 
235
- Wow, much better! The "Page Response Scale" requested google.com and compared the response time to your target.
266
+ ```
267
+ Objective: Improve our digital customer experience this year
236
268
 
237
- How did you do? Did you hit the target?
269
+ Outcome: Improve Response Time
270
+ Given a baseline of 5 "seconds" on "Oct 1, 2016"
271
+ And a target of 1 "second" by "Oct 1, 2017"
272
+ Then measure progress with "Page Response Scale"
273
+ ```
238
274
 
275
+ Now save the file and run `mobius` again.
239
276
 
240
- ## developing with mobiusloop
277
+ Wow, much better! The *Page Response Scale* generated a request to [google.com](http://google.com) and compared the
278
+ response time to your target of 1 second. It reported what percentage progress you had made to your
279
+ target in your scheduled time. The color text indicates whether you are on track or not.
241
280
 
242
- Hopefully by now you're getting the hang of `mobiusloop`. During development there are three basic steps:
281
+ Hopefully by now you know how to edit a `.goal` file with confidence and run them to report
282
+ progress towards your objectives and outcomes. But unless all of your goals are related to page
283
+ response time, you'll need to customize `mobius` to meet your needs.
243
284
 
244
285
 
245
- #### step 1: create a new .goal file in the goals/ directory
286
+ # mobius development guide
246
287
 
247
- You can copy an example or start from scratch. When done, do a dry run to ensure your syntax is valid:
288
+ Customizing `mobius` for your product is a 3 step process:
248
289
 
249
- $ mobiusloop goals/your_objective.goal --dry-run
250
290
 
251
- Replacing `your_objective.goal` with your filename. If there's any syntax problems, fix them and run again until you get a clean run.
291
+ #### step 1: create a new .goal file in the goals/ directory
252
292
 
293
+ We recommend copying a working example and modifying to meet your needs. For the .goal filename, we recommend naming it
294
+ after your objective or problem statement. Something like this:
253
295
 
254
- #### step 2: optionally create a step definition
296
+ $ cp goals/increase_readers.goal goals/improve_quality.goal
255
297
 
256
- `mobiusloop` ships with one step definition `goals/step_definitions/mobius_steps.rb`. If you write your objectives,
257
- problems, outcomes and key results in the format above there's no need to create one. However if you want to create your own
258
- format, you will need to create a custom step definition. To verify, run:
298
+ Add your objectives, outcomes and the correct target and baseline values. When done, do a *dry run*:
259
299
 
260
- $ mobiusloop goals/your_objective.goal
300
+ $ mobius goals/improve_quality.goal --dry-run
261
301
 
262
- If `mobiusloop` cannot find a matching step definition for your `.goal` file, it will tell you the step definition to create.
263
- Copy and paste this into a new file `your_name_steps.rb` and save it to the `goals/step_definitions` folder. For more
264
- info on step definitions, see [Cucumber's reference](https://cucumber.io/docs/reference#step-definitions).
302
+ Dry runs valid the `.goal` syntax is correct without actually running the scales that measure progress. Ensure your
303
+ syntax is valid before moving on.
265
304
 
266
305
 
267
306
  #### step 3: create a new Scale
268
307
 
269
- Create a new Ruby class to perform the measurement. For example, if your .`goal` file contains "My Custom Scale", the Ruby class would be:
308
+ Currently the only way to create a custom scale is to write some Ruby code. Specifically you must create a new Ruby class
309
+ that extends the `Scale` class and implements a `measure` method. For example, if your .`goal` file contains
310
+ "My Custom Scale", the Ruby class would be:
270
311
 
271
312
  ```Ruby
272
313
  require 'mobiusloop/scale'
@@ -281,51 +322,72 @@ class MyCustomScale < Scale
281
322
 
282
323
  end
283
324
  ```
284
- This code lives in `my_custom.scale.rb`.
285
- Replace the line `total = fetch_your_total` with your custom logic.
286
- The last line `Measure.new(total)` returns a new measure.
325
+ This class is saved to `goals/step_definitions/my_custom.scale.rb`. The line `total = fetch_your_total` would be replaced
326
+ with your custom logic. The last line `Measure.new(total)` returns a new measure, as required by all Scales.
287
327
 
288
- We recommend writing unit tests around any custom scales you create to ensure they work as expected before integrating with `mobiusloop`
328
+ We recommend writing unit tests around any custom scales you create to ensure they work as expected before integrating with `mobius`.
289
329
 
290
- To run a single `.goal`, try this:
330
+ TODO: Add methods to write custom Scales without writing Ruby. Pre-ship a few common ones.
291
331
 
292
- $ mobiusloop goals/your_objective.goal
293
332
 
294
- Where `your_objective.goal` is the name of your custom goal. You can run all the `.goal` files in `/goals` folder with this:
333
+ #### step 3: configure mobius
295
334
 
296
- $ mobiusloop
335
+ Certain features of `mobius` are configurable in the `goals/support/config.yml` file. Specifically:
297
336
 
337
+ ```YAML
338
+ measures:
339
+ save: false
340
+ ```
341
+ Setting this to `true` records each `mobius` run's progress in a small `.json` file inside the `goals/measures` directory.
342
+ The name of the file is the timestamp of when it was run. If you would like to report on trending
343
+ progress of your objectives and outcomes over time, you incorporate these values.
298
344
 
299
- ## advanced features
345
+ TODO: Identify an relatively easy method to use these to report trending
300
346
 
301
- Because `mobiusloop` is an extension of [Cucumber](http://cucumber.io), there are many features in Cucumber that also
302
- exist in `mobiusloop`. A few examples:
303
347
 
304
- **Tags** - Use tags to create logical groups of Objectives, Problems, Outcomes or Key Results that you want run together.
305
- For example, adding `@mytag` to the line immediately above a definition and running it with:
348
+ ```YAML
349
+ progress:
350
+ green_threshold: 10%
351
+ red_threshold: 30%
352
+ ```
353
+ `mobius` reports progress in green, yellow or red font to indicate whether you are on track to hit your target by the
354
+ target date. This is configurable with the values `green_threshold` and `red_threshold`.
306
355
 
307
- $ mobiusloop --tags @mytag
356
+ It is easiest to explain this with a picture:
308
357
 
309
- Will only run those Objectives, Problems, Outcomes or Key Results associated with that tag.
358
+ TODO: Picture of progress with thresholds
310
359
 
311
- **Reports** - By default `mobiusloop` outputs the results to the command line. But you can also output reports in HTML,
312
- JSON or other formats. See [Cucumber reports](https://cucumber.io/docs/reference#reports) for more details.
313
360
 
361
+ ## advanced features
314
362
 
315
- ## Testing
363
+ Because `mobius` is an extension of [Cucumber](http://cucumber.io), there are many features in Cucumber that also
364
+ exist in `mobius`. A few examples:
316
365
 
317
- `mobiusloop` is built using a test-first approach. We're proud of our tests, but we're always looking to add more.
318
- If you downloaded the source code to `/workspace/mobiusloop-ruby`, you can run the tests using this command from the source code folder:
366
+ **Tags** - Use tags to create logical groups of Objectives, Problems, Outcomes or Key Results that you want run together.
367
+ For example, add `@performance` to the line immediately above a definition:
368
+
369
+ ```ruby
370
+ @performance
371
+ Problem: Slow app response times are causing us to lose customers
319
372
 
320
- $ rake spec
373
+ ```
374
+ Then run with this:
375
+
376
+ $ mobius --tags @performance
321
377
 
378
+ Only those definitions with the @performance tag are run.
322
379
 
323
- ## Report Defects
324
380
 
325
- See a missing test or found a defect? [Let us know](https://github.com/ryanshriver/mobius/issues) by creating a new issue.
381
+ ## tests
382
+
383
+ `mobius` is built using a test-first approach. We're proud of our tests, but we're always looking to add more.
384
+ If you downloaded the source code to `/workspace/mobiusloop-ruby`, you can run the tests using this command from the source code folder:
326
385
 
386
+ $ rspec spec/mobiusloop/
327
387
 
328
- ## Contributing
329
388
 
330
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/mobius.
389
+ ## further reading
331
390
 
391
+ I have personally found [The Cucumber Book](https://pragprog.com/book/hwcuc/the-cucumber-book) a great reference and
392
+ worthy of purchase if you would like to get the most of out `mobius`.
393
+ [Cucumber.io](http://cucumber.io) is also a reference I use.