tracco 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gitignore +28 -0
  2. data/.rspec +3 -0
  3. data/.rvmrc.template +2 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG +32 -0
  6. data/Gemfile +9 -0
  7. data/Gemfile.lock +110 -0
  8. data/LICENSE.txt +15 -0
  9. data/README.md +292 -0
  10. data/Rakefile +8 -0
  11. data/config/config.template.yml +6 -0
  12. data/config/config.yml.trackinguser_for_test +7 -0
  13. data/config/mongoid.template.yml +24 -0
  14. data/lib/patches/trello/card.rb +19 -0
  15. data/lib/patches/trello/member.rb +20 -0
  16. data/lib/startup_trello.rb +2 -0
  17. data/lib/tasks/rspec.rake +17 -0
  18. data/lib/tasks/tasks.rake +55 -0
  19. data/lib/tracco.rb +30 -0
  20. data/lib/tracco/effort.rb +35 -0
  21. data/lib/tracco/estimate.rb +25 -0
  22. data/lib/tracco/google_docs_exporter.rb +67 -0
  23. data/lib/tracco/member.rb +61 -0
  24. data/lib/tracco/mongoid_helper.rb +13 -0
  25. data/lib/tracco/tracked_card.rb +121 -0
  26. data/lib/tracco/tracking/base.rb +82 -0
  27. data/lib/tracco/tracking/card_done_tracking.rb +10 -0
  28. data/lib/tracco/tracking/effort_tracking.rb +45 -0
  29. data/lib/tracco/tracking/estimate_tracking.rb +23 -0
  30. data/lib/tracco/tracking/invalid_tracking.rb +19 -0
  31. data/lib/tracco/tracking_factory.rb +22 -0
  32. data/lib/tracco/trello_authorize.rb +16 -0
  33. data/lib/tracco/trello_configuration.rb +39 -0
  34. data/lib/tracco/trello_tracker.rb +44 -0
  35. data/lib/tracco/version.rb +3 -0
  36. data/script/ci/before_script.sh +1 -0
  37. data/script/ci/run_build.sh +2 -0
  38. data/script/crontab.template +8 -0
  39. data/script/mate.sh +1 -0
  40. data/spec/effort_spec.rb +59 -0
  41. data/spec/estimate_spec.rb +38 -0
  42. data/spec/integration/trello_authorization_spec.rb +12 -0
  43. data/spec/integration/trello_tracker_spec.rb +66 -0
  44. data/spec/member_spec.rb +81 -0
  45. data/spec/patches/trello/card_spec.rb +25 -0
  46. data/spec/spec_helper.rb +66 -0
  47. data/spec/support/database_cleaner.rb +12 -0
  48. data/spec/tracked_card_spec.rb +336 -0
  49. data/spec/tracking/card_done_tracking_spec.rb +18 -0
  50. data/spec/tracking/effort_tracking_spec.rb +114 -0
  51. data/spec/tracking/estimate_tracking_spec.rb +44 -0
  52. data/spec/tracking_factory_spec.rb +42 -0
  53. data/spec/trello_authorize_spec.rb +65 -0
  54. data/spec/trello_configuration_spec.rb +43 -0
  55. data/spec/trello_tracker_spec.rb +26 -0
  56. data/tracco.gemspec +41 -0
  57. data/tracco.sublime-project +10 -0
  58. metadata +316 -0
@@ -0,0 +1,28 @@
1
+ config.yml
2
+ mongoid.yml
3
+ .rvmrc
4
+ tracco.sublime-workspace
5
+
6
+ .tmtags
7
+ .tags
8
+ .tags_sorted_by_file
9
+
10
+ .DS_Store
11
+ *.gem
12
+ *.rbc
13
+ .bundle
14
+ .config
15
+ coverage
16
+ InstalledFiles
17
+ lib/bundler/man
18
+ pkg
19
+ rdoc
20
+ spec/reports
21
+ test/tmp
22
+ test/version_tmp
23
+ tmp
24
+
25
+ # YARD artifacts
26
+ .yardoc
27
+ _yardoc
28
+ doc/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --colour
2
+ --format doc
3
+ --order rand
@@ -0,0 +1,2 @@
1
+ rvm 1.9.3-p385@spikes --create
2
+ rvm wrapper 1.9.3-p385@spikes textmate
@@ -0,0 +1,20 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+
5
+ env:
6
+ global:
7
+ - developer_public_key: e/zPNGKOwapoxFWZs/CBTAhaoqrDTkqqz+InOmCUvGBcZBpUxH398nPLv8Hi\nNQSvWuspzqanyNbbQrTA/2XhsWF1gIFX+gNexYM7S+MxtRwUD3cpVT8DzVOS\nMuckdMTEAADVsm92vIX/bUs5igxD4+zfXlhzXUNDrzRlZnsUF2M=
8
+ - access_token_key: GG1Q8oq7GkaXjP0lbMgvQLLEi+LXOZlwmELqjPk39Exfy8114QUs2ki8nr9n\ndGO+tgOSZsCd/bt9IHxS3WWWU0INSYOTgp/prfsDDgosg7/Elk/b6w1OW0At\nX3VAjMeI0yAGloT6XB58LCFyrj6S2b4vCQqyaHR3tlTHai/5bMQ=
9
+ - tracker_username=trackinguser
10
+ - MONGOID_ENV=test
11
+
12
+ services:
13
+ - mongodb
14
+
15
+ script: ./script/ci/run_build.sh
16
+
17
+ before_script:
18
+ - mongo tracco_test --eval 'db.addUser("travis", "test");'
19
+ - "./script/ci/before_script.sh"
20
+
@@ -0,0 +1,32 @@
1
+ 0.0.8 - 0.0.9
2
+ - Gem rename :)
3
+
4
+ 0.0.7
5
+ - Minor refactorings on the rake tasks
6
+
7
+ 0.0.6
8
+ - Added TrackedCard#status to track card status: :todo if no effort has been spent, :done if the card is in a DONE column, :in_progress otherwise
9
+ - Added a Members#effort_spent and #effort_spent_since to extract the overall effort tracked by a member since a given date
10
+ - Re-merged in the trello_effort_app branch to bring on the Rails app
11
+
12
+ 0.0.5
13
+ - Improved docs
14
+ - Improved use of this tool as a gem
15
+
16
+ 0.0.4
17
+ - A card moved into a DONE column is closed
18
+
19
+ 0.0.3
20
+ - When I send a tracking with "DONE" then the card is "closed" (aka "finished")
21
+ - Export all cards in a Google Docs spreadsheet
22
+ - When I card change its name, the tracked card should be updated too
23
+ - A card should tells its estimate error (3)
24
+
25
+ 0.0.2
26
+ - Very simple Rails app on a separate branch, still experimenting
27
+ - Should be able to open a Trello console with a rake task
28
+ - Avoid running the script if already run for that period
29
+ - Tracking data is now persisted in a mongo database
30
+
31
+ 0.0.1
32
+ - Initial Release.
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ # gem 'ruby-trello', :require => 'trello', :path => '../ruby-trello' # to hack on the ruby-trello gem itself
6
+
7
+ group :test do
8
+ gem 'simplecov', :require => false, :platforms => [:mri, :mri_19]
9
+ end
@@ -0,0 +1,110 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tracco (0.0.9)
5
+ bson_ext
6
+ chronic
7
+ google_drive
8
+ highline
9
+ mongoid
10
+ rainbow
11
+ ruby-trello
12
+
13
+ GEM
14
+ remote: https://rubygems.org/
15
+ specs:
16
+ activemodel (3.2.12)
17
+ activesupport (= 3.2.12)
18
+ builder (~> 3.0.0)
19
+ activesupport (3.2.12)
20
+ i18n (~> 0.6)
21
+ multi_json (~> 1.0)
22
+ addressable (2.3.2)
23
+ bson (1.8.2)
24
+ bson_ext (1.8.2)
25
+ bson (~> 1.8.2)
26
+ builder (3.0.4)
27
+ chronic (0.9.0)
28
+ columnize (0.3.6)
29
+ database_cleaner (0.9.1)
30
+ debugger (1.3.1)
31
+ columnize (>= 0.3.1)
32
+ debugger-linecache (~> 1.1.1)
33
+ debugger-ruby_core_source (~> 1.1.8)
34
+ debugger-linecache (1.1.2)
35
+ debugger-ruby_core_source (>= 1.1.1)
36
+ debugger-ruby_core_source (1.1.8)
37
+ diff-lcs (1.1.3)
38
+ faraday (0.8.5)
39
+ multipart-post (~> 1.1)
40
+ google_drive (0.3.3)
41
+ nokogiri (>= 1.4.4, != 1.5.2, != 1.5.1)
42
+ oauth (>= 0.3.6)
43
+ oauth2 (>= 0.5.0)
44
+ highline (1.6.15)
45
+ httpauth (0.2.0)
46
+ i18n (0.6.1)
47
+ json (1.7.7)
48
+ jwt (0.1.5)
49
+ multi_json (>= 1.0)
50
+ mime-types (1.21)
51
+ mongoid (3.1.0)
52
+ activemodel (~> 3.2)
53
+ moped (~> 1.4.2)
54
+ origin (~> 1.0)
55
+ tzinfo (~> 0.3.22)
56
+ mongoid-rspec (1.6.0)
57
+ mongoid (>= 3.0.1)
58
+ rake
59
+ rspec (>= 2.9)
60
+ moped (1.4.2)
61
+ multi_json (1.6.0)
62
+ multi_xml (0.5.3)
63
+ multipart-post (1.1.5)
64
+ nokogiri (1.5.6)
65
+ oauth (0.4.7)
66
+ oauth2 (0.9.0)
67
+ faraday (~> 0.8)
68
+ httpauth (~> 0.1)
69
+ jwt (~> 0.1.4)
70
+ multi_json (~> 1.0)
71
+ multi_xml (~> 0.5)
72
+ rack (~> 1.2)
73
+ origin (1.0.11)
74
+ rack (1.5.2)
75
+ rainbow (1.1.4)
76
+ rake (10.0.3)
77
+ rest-client (1.6.7)
78
+ mime-types (>= 1.16)
79
+ rspec (2.12.0)
80
+ rspec-core (~> 2.12.0)
81
+ rspec-expectations (~> 2.12.0)
82
+ rspec-mocks (~> 2.12.0)
83
+ rspec-core (2.12.2)
84
+ rspec-expectations (2.12.1)
85
+ diff-lcs (~> 1.1.3)
86
+ rspec-mocks (2.12.2)
87
+ ruby-trello (0.5.1)
88
+ activemodel
89
+ addressable (~> 2.3)
90
+ json
91
+ oauth (~> 0.4.5)
92
+ rest-client (~> 1.6.7)
93
+ simplecov (0.7.1)
94
+ multi_json (~> 1.0)
95
+ simplecov-html (~> 0.7.1)
96
+ simplecov-html (0.7.1)
97
+ tzinfo (0.3.35)
98
+
99
+ PLATFORMS
100
+ ruby
101
+
102
+ DEPENDENCIES
103
+ database_cleaner
104
+ debugger
105
+ mongoid-rspec
106
+ rake
107
+ rspec
108
+ rspec-mocks
109
+ simplecov
110
+ tracco!
@@ -0,0 +1,15 @@
1
+ Pietro Di Bello
2
+ 2012
3
+
4
+ In the original BSD license, both occurrences of the phrase "COPYRIGHT HOLDERS AND CONTRIBUTORS" in the disclaimer read "REGENTS AND CONTRIBUTORS".
5
+
6
+ Here is the license template:
7
+
8
+ Copyright (c) 2012, Pietro Di Bello
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
12
+
13
+ Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
14
+ Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,292 @@
1
+ [![Build Status](https://secure.travis-ci.org/xpepper/tracco.png)](http://travis-ci.org/xpepper/tracco)
2
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/xpepper/tracco)
3
+
4
+ # Tracco
5
+
6
+ ## What is Tracco?
7
+ Tracco is a Trello effort tracker: the purpose of Tracco is to extract and track estimates and actual efforts out of the cards on your Trello boards.
8
+ You simply notify all of your estimates and efforts tracked on your Trello cards using a conventional format.
9
+ Tracco will extract and store these estimates and actual efforts to let you mine useful key metrics (e.g. estimate errors, remaining efforts, pair programming frequencies, and so on).
10
+
11
+ ## Why Tracco?
12
+ Trello is a very good surrogate for a physical team board: it's simple and effective, and it can really help when you have a distributed team.
13
+ That said, Trello does not (still) offer a way to track time estimated and actually spent on cards, though many people [ask for that feature](https://trello.com/card/time-tracking/4d5ea62fd76aa1136000000c/1054) on Trello's development board.
14
+
15
+ Having that precise need, we defined a simple convention to track estimates and efforts on cards: we use a predefined board member (let's call him 'tracking user') which we sent special notifications to (we call them 'tracking notifications').
16
+ This 'tracking user' will then receives estimates and efforts notifications, and Tracco will collect and store them.
17
+ Moreover, a web app will be soon available to properly present card estimates and efforts (we're working on it).
18
+
19
+ ## More details
20
+ All you need to have to start using Tracco is a Trello account, a Trello board and a board member to use as 'tracking user'.
21
+ You'll also need to know your Trello developer key and generate a proper auth token to have access to the trackinguser's notifications.
22
+ To see how to have these two keys, see [the following section](#api_key).
23
+
24
+ The Trello API is used behind the scenes to read data from the team board. Tracco uses the awesome [Trello API Ruby wrapper](https://github.com/jeremytregunna/ruby-trello) for this purpose.
25
+
26
+ ## Usage
27
+ This tool can be used as a standalone gem or cloning this git repo.
28
+
29
+ ### Installation as a ruby gem
30
+
31
+ ```shell
32
+ gem install tracco
33
+ ```
34
+
35
+ ### Installation cloning the repo
36
+
37
+ ```shell
38
+ git clone git://github.com/xpepper/tracco.git
39
+ ```
40
+
41
+ Then cd in the cloned repo and copy the config template
42
+
43
+ ```shell
44
+ cd tracco
45
+ cp config/config.template.yaml config/config.yml
46
+ ```
47
+
48
+ and then fill the correct values in the placeholders in config.yml (see _"Where do I get an API key and API secret?"_ section).
49
+
50
+ Then copy the mongoid config template
51
+
52
+ ```shell
53
+ cp config/mongoid.template.yaml config/mongoid.yml
54
+ ```
55
+
56
+ and fill the correct values for the mongodb environments ([see here](http://mongoid.org/en/mongoid/docs/installation.html#configuration) to have more details).
57
+
58
+ Then run bundle to get all the required gems:
59
+
60
+ ```shell
61
+ bundle install
62
+ ```
63
+
64
+
65
+ Full Disclosure: this library is still work-in-progress, so if you find anything missing or not functioning as you expect it to, please [open an issue on github](https://github.com/xpepper/tracco/issues).
66
+
67
+ ## Requirements
68
+ * [mongoDB](http://www.mongodb.org/) - macosx users with homebrew will just run 'brew install mongodb' to have mongoDB installed on their machine.
69
+ * (optional) [rvm](https://rvm.io/rvm/install/) is useful (but optional) for development
70
+
71
+
72
+
73
+ ### <a id="api_key"></a>Where do I get an API key?
74
+ Log in to Trello with your account and visit [https://trello.com/1/appKey/generate](https://trello.com/1/appKey/generate) to get your developer\_public\_key.
75
+
76
+ ### Where do I get an API Access Token Key?
77
+ To generate a proper access token key, log in to Trello with the 'tracking user' account. Then go to this URL:
78
+
79
+ https://trello.com/1/connect?key=<YOUR_DEVELOPER_PUBLIC_KEY>&name=Trello+Effort+Tracker&response_type=token&scope=read,write&expiration=never
80
+
81
+ At the end of this process, you'll receive a valid access\_token\_key, which is needed by Tracco to fetch all the tracking notifications sent to the 'tracking user'.
82
+
83
+ ## Usage
84
+ The best way is to use one of the rake task defined, e.g.
85
+
86
+ ```ruby
87
+ rake 'run:today[test]' # will extract today's tracked data and store on the test db
88
+
89
+ rake run:today # will extract today's tracked data and store on the default (that is development) db
90
+
91
+ rake 'run:from_day[2012-11-1, production]' # will extract tracked data starting from November the 1st, 2012 and store them into the production db
92
+ ```
93
+
94
+ Or you may just create a TrelloTracker instance and execute its track method.
95
+
96
+ ```ruby
97
+ require 'tracco'
98
+
99
+ tracker = TrelloTracker.new
100
+ tracker.track
101
+ ```
102
+
103
+ ## Configuration params
104
+ ### Mongo storage configuration
105
+ Tracking data collected from Trello are stored in a MongoDB database.
106
+
107
+ There are two env variables you can set to configure mongodb
108
+
109
+ - `MONGOID_ENV` defines which mongodb env is actually used (development, test, production). Development is the default mongo environment.
110
+ - `MONGOID_CONFIG_PATH` defines the path to the mongoid configuration file (default is `config/mongoid.yml`)
111
+
112
+ A standard mongoid.yml is the following:
113
+
114
+ ```yml
115
+ development:
116
+ sessions:
117
+ default:
118
+ database: tracco_dev
119
+ hosts:
120
+ - localhost:27017
121
+ test:
122
+ sessions:
123
+ default:
124
+ database: tracco_test
125
+ hosts:
126
+ - localhost:27017
127
+ production:
128
+ autocreate_indexes: true
129
+ persist_in_safe_mode: true
130
+
131
+ sessions:
132
+ default:
133
+ database: tracco_production
134
+ hosts:
135
+ - localhost:27017
136
+ ```
137
+
138
+ #### Trello configuration params
139
+ You can set the Trello's configuration params in three ways.
140
+ Through the following environment variables (ENV object):
141
+
142
+ ```
143
+ access_token_key
144
+ developer_public_key
145
+ tracker_username
146
+ ```
147
+
148
+ Passing into the constructor a hash containing the auth values:
149
+
150
+ ```ruby
151
+ tracker = TrelloTracker.new(
152
+ developer_public_key: "487635b55e6fe9021902fa763b4d101a",
153
+ access_token_key: "33bed56f2a12a49c9ba1c2d6ad3e2002e11a34358c3f3fe260d7fba746a06203",
154
+ tracker_username: "my_personal_tracker")
155
+
156
+ tracker.track
157
+ ```
158
+
159
+ Or using the config.yml (which is the actual fallback mode, useful in development mode).
160
+
161
+ ### Console
162
+ You can open a irb console with the ruby-trello gem and this gem loaded, so that you can query the db or the Trello API and play with them
163
+
164
+ ```ruby
165
+ rake console
166
+ ```
167
+
168
+ The default env is development. To load a console in the (e.g.) production db env, execute:
169
+
170
+ ```ruby
171
+ rake "console[production]"
172
+ ```
173
+
174
+ ### Estimate format convention
175
+ To set an estimate on a card, a Trello user should send a notification from that card to the tracker username, e.g.
176
+
177
+ @trackinguser [15p]
178
+ @trackinguser [1.5d]
179
+ @trackinguser [12h]
180
+
181
+ estimates can be given in hours (h), days (d/g) or pomodori (p).
182
+
183
+ @trackinguser 22.11.2012 [4h]
184
+
185
+ will add the estimate (4 hours) in date 22.11.2012.
186
+
187
+ ### Effort format convention
188
+ To set an effort in the current day on a card, a Trello user should send a notification from that card to the tracker username, e.g.
189
+
190
+ @trackinguser +6p
191
+ @trackinguser +4h
192
+ @trackinguser +0.5g
193
+
194
+ efforts can be given in hours (h), days (d/g) or pomodori (p).
195
+
196
+ ### Tracking an effort in a specific date
197
+ To set an effort in a date different from the notification date, just add a date in the message
198
+
199
+ @trackinguser 23.10.2012 +6p
200
+
201
+ There's even a shortcut for efforts spent yesterday:
202
+
203
+ @trackinguser yesterday +6p
204
+ @trackinguser +6p yesterday
205
+
206
+ ### Tracking an effort on more members
207
+ By default, the effort is tracked on the member which sends the tracking notification.
208
+
209
+ To set an effort for more than a Trello user (e.g. pair programming), just add the other user in the message, e.g.
210
+
211
+ @trackinguser +3p @alessandrodescovi
212
+
213
+ To set an effort just for other Trello users (excluding the current user), just include the users in round brackets, e.g.
214
+
215
+ @trackinguser +3p (@alessandrodescovi @michelevincenzi)
216
+
217
+ ### Tracking a card as finished (aka DONE)
218
+ Sending a tracking notification with the word DONE
219
+
220
+ @trackinguser DONE
221
+
222
+ will mark the card as closed.
223
+
224
+ Moreover, a card moved into a DONE column (the name of the Trello list contains the word "Done") is automatically marked as done.
225
+
226
+ ## Database import/export
227
+ To export the db you can execute something like:
228
+
229
+ ```shell
230
+ mongoexport --db tracco_production --collection tracked_cards --out tracco_production.json
231
+ ```
232
+
233
+ To reimport that db:
234
+
235
+ ```shell
236
+ mongoimport --db tracco_production --collection tracked_cards --file tracco_production.json
237
+ ```
238
+
239
+ ## Google Docs exporter
240
+ To export all your tracked cards on a google docs named 'my_sheet' in the 'tracking' worksheet, run
241
+
242
+ ```ruby
243
+ rake "export:google_docs[my_sheet, tracking, production]"
244
+ ```
245
+ The default env is development.
246
+
247
+ If you provide no name for the spreadsheet, a default name will be used.
248
+ If the spreadsheet name you provide does not exists, it will be created in you google drive account.
249
+
250
+ So, running simply
251
+
252
+ ```ruby
253
+ rake export:google_docs
254
+ ```
255
+ will create (or update) a spreadsheet named "trello effort tracking" using the development db env.
256
+
257
+ ## Keeping your tracking database up to date
258
+ You may install a crontab entry to run the trello tracker periodically, for example
259
+
260
+ ```shell
261
+ SHELL=/Users/futur3/.rvm/bin/rvm-shell
262
+ GEMSET="ruby-1.9.3-p385@spikes"
263
+ PROJECT_PATH="/Users/$USER/Documents/workspace/tracco"
264
+ LC_ALL=en_US.UTF-8
265
+
266
+ # m h dom mon dow command
267
+ */10 * * * * rvm-shell $GEMSET -c "cd $PROJECT_PATH; bundle exec rake run:today[production]" >> /tmp/crontab.out 2>&1
268
+ ```
269
+
270
+ ## Roadmap and improvements
271
+ We develop Tracco using [Trello itself](https://trello.com/board/trello-effort-tracker-roadmap/509c3228dcb1ac3f1c018791).
272
+
273
+ ## Contributing
274
+ To get started, [sign the Contributor License Agreement](http://www.clahub.com/agreements/xpepper/tracco).
275
+
276
+ If you'd like to hack on Tracco, start by forking the repo on GitHub:
277
+
278
+ https://github.com/xpepper/tracco
279
+
280
+ The best way to get your changes merged back into core is as follows:
281
+
282
+ 1. Clone down your fork
283
+ 1. Create a thoughtfully named topic branch to contain your change
284
+ 1. Hack away
285
+ 1. Add tests and make sure everything still passes by running `rake spec`
286
+ 1. If you are adding new functionality, document it in the README
287
+ 1. Do not change the version number, we will do that on our end
288
+ 1. If necessary, rebase your commits into logical chunks, without errors
289
+ 1. Push the branch up to GitHub
290
+ 1. Send a pull request for your branch
291
+
292
+ [@pierodibello](http://twitter.com/pierodibello)