tracco 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,18 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracking
4
+ describe CardDoneTracking do
5
+
6
+ describe "#add_to" do
7
+ it "marks the card as done" do
8
+ card = TrackedCard.new
9
+
10
+ done_tracking = TrackingFactory.build_from(notification_with_message("DONE"))
11
+ done_tracking.add_to(card)
12
+
13
+ card.done?.should be_true
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracking
4
+ describe EffortTracking do
5
+
6
+ describe "#effort" do
7
+
8
+ %w{pietrodibello michelepangrazzi alessandrodescovi michelevincenzi}.each do |username|
9
+ let(username.to_sym) { Member.new(username: username) }
10
+ end
11
+
12
+ before(:each) do
13
+ Trello::Member.stub(:find).and_return(Member.new(username: "any"))
14
+ end
15
+
16
+ it "is nil when the notification does not contain an estimate" do
17
+ with(unrecognized_notification) { |tracking| tracking.effort.should be_nil }
18
+ end
19
+
20
+ it "does not parse effort in minutes (e.g. +30m)" do
21
+ with_message("@trackinguser +30m") { |tracking| tracking.effort.should be_nil }
22
+ end
23
+
24
+ it "is the hour-based effort when the notification contains an effort in hours" do
25
+ Trello::Member.should_receive(:find).with("michelepangrazzi").and_return(michelepangrazzi)
26
+
27
+ raw_data = create_notification(data: { 'text' => "@trackinguser +2h" },
28
+ date: "2012-10-28T21:06:14.801Z",
29
+ member_creator: stub(username: "michelepangrazzi"))
30
+
31
+ TrackingFactory.build_from(raw_data).effort.should == Effort.new(amount: 2.0, date: Date.parse('2012-10-28'), members: [michelepangrazzi])
32
+ end
33
+
34
+ it "converts the effort in hours when the notification contains an effort in days" do
35
+ with_message("@trackinguser +1.5d") { |t| t.effort.amount.should == 8+4 }
36
+ with_message("@trackinguser +1.5g") { |t| t.effort.amount.should == 8+4 }
37
+ end
38
+
39
+ it "converts the effort in hours when the notification contains an effort in pomodori" do
40
+ with_message("@trackinguser +10p") { |t| t.effort.amount.should == 5}
41
+ end
42
+
43
+ it "fetch the effort from a complex effort message" do
44
+ with_message "@trackinguser ho speso +2h e spero che stavolta possiamo rilasciarla" do |tracking|
45
+ tracking.effort.amount.should == 2.0
46
+ end
47
+ end
48
+
49
+ it "fetch the effort even when beween square brackets" do
50
+ with_message "@trackinguser [+0.5h]" do |tracking|
51
+ tracking.effort.amount.should == 0.5
52
+ end
53
+ end
54
+
55
+ it "computes the effort considering all the mentioned team mates in the message" do
56
+ with_message "@trackinguser +2h assieme a @michelepangrazzi e @alessandrodescovi" do |tracking|
57
+ tracking.effort.amount.should == 2.0 * 3
58
+ end
59
+ end
60
+
61
+ it "tracks all the team mates which spent that effort on the card" do
62
+ %w{pietrodibello michelepangrazzi alessandrodescovi}.each do |username|
63
+ Trello::Member.should_receive(:find).with(username).and_return(self.send(username))
64
+ end
65
+
66
+ notification = create_notification(data: { 'text' => "@trackinguser +2h assieme a @michelepangrazzi e @alessandrodescovi" },
67
+ member_creator: stub(username: "pietrodibello"))
68
+ with notification do |tracking|
69
+ tracking.effort.members.should == [michelepangrazzi, alessandrodescovi, pietrodibello]
70
+ end
71
+ end
72
+
73
+ it "tracks the effort only on the team members listed between round brackets" do
74
+ %w{michelevincenzi alessandrodescovi}.each do |username|
75
+ Trello::Member.should_receive(:find).with(username).and_return(self.send(username))
76
+ end
77
+
78
+ notification = create_notification(data: { 'text' => "@trackinguser +3p (@alessandrodescovi @michelevincenzi)" },
79
+ member_creator: stub(username: "pietrodibello"))
80
+
81
+ with notification do |tracking|
82
+ tracking.effort.members.should == [alessandrodescovi, michelevincenzi]
83
+ tracking.effort.amount.should == 1.5 * 2
84
+ end
85
+ end
86
+
87
+ it "tracks the effort with the date given in the notification text, not the actual notification date" do
88
+ raw_data = create_notification(data: { 'text' => "@trackinguser 22.11.2012 +6p" }, date: "2012-09-19T12:46:13.713Z")
89
+
90
+ tracking = TrackingFactory.build_from(raw_data)
91
+
92
+ tracking.effort.date.should == Date.parse('2012-11-22')
93
+ end
94
+
95
+ it "tracks the effort to yesterday when the keyword 'yesterday' is present before the effort amount" do
96
+ raw_data = create_notification(data: { 'text' => "@trackinguser yesterday +6p" }, date: "2012-09-19T12:46:13.713Z")
97
+
98
+ tracking = TrackingFactory.build_from(raw_data)
99
+
100
+ tracking.effort.date.should == Date.parse('2012-09-18')
101
+ end
102
+
103
+ it "tracks the effort to yesterday when the keyword 'yesterday' is present before the effort amount" do
104
+ raw_data = create_notification(data: { 'text' => "@trackinguser +6p yesterday" }, date: "2012-09-19T12:46:13.713Z")
105
+
106
+ tracking = TrackingFactory.build_from(raw_data)
107
+
108
+ tracking.effort.date.should == Date.parse('2012-09-18')
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracking
4
+ describe EstimateTracking do
5
+
6
+ describe "#estimate" do
7
+
8
+ it "is nil when the notification does not contain an estimate" do
9
+ TrackingFactory.build_from(unrecognized_notification).estimate.should be_nil
10
+ end
11
+
12
+ it "is the hour-based estimate when the notification contains an estimate in hours" do
13
+ raw_data = create_notification(data: { 'text' => "@trackinguser [2h]" }, date: "2012-10-28T21:06:14.801Z")
14
+
15
+ TrackingFactory.build_from(raw_data).estimate.should == Estimate.new(amount: 2.0, date: Date.parse('2012-10-28'))
16
+ end
17
+
18
+ it "converts the estimate in hours when the notification contains an estimate in days" do
19
+ TrackingFactory.build_from(create_notification(data: { 'text' => "@trackinguser [1.5d]" })).estimate.amount.should == 8+4
20
+ TrackingFactory.build_from(create_notification(data: { 'text' => "@trackinguser [1.5g]" })).estimate.amount.should == 8+4
21
+ end
22
+
23
+ it "converts the estimate in hours when the notification contains an estimate in pomodori" do
24
+ raw_data = create_notification(data: { 'text' => "@trackinguser [10p]" })
25
+ TrackingFactory.build_from(raw_data).estimate.amount.should == 5
26
+ end
27
+
28
+ it "fetch the estimate from a complex estimate message" do
29
+ raw_data = create_notification(data: { 'text' => "@maxmazza Dobbiamo ancora lavorarci.\n@trackinguser ristimo ancora [3h] per il fix" })
30
+ TrackingFactory.build_from(raw_data).estimate.amount.should == 3.0
31
+ end
32
+
33
+ it "tracks the effort with the date given in the notification text, not the actual notification date" do
34
+ raw_data = create_notification( data: { 'text' => "@trackinguser 22.11.2012 [6p]" }, date: "2012-09-19T12:46:13.713Z")
35
+
36
+ tracking = TrackingFactory.build_from(raw_data)
37
+
38
+ tracking.estimate.date.should == Date.parse('2012-11-22')
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe TrackingFactory do
4
+
5
+ TIME_MEASUREMENTS = {
6
+ hours: 'h',
7
+ days: 'd',
8
+ giorni: 'g',
9
+ pomodori: 'p'
10
+ }
11
+
12
+ context "unknown tracking format" do
13
+ it "builds an invalid tracking instance" do
14
+ TrackingFactory.build_from(unrecognized_notification).class.should == Tracking::InvalidTracking
15
+
16
+ with_message("@trackinguser +30m") { |tracking| tracking.class.should == Tracking::InvalidTracking }
17
+ end
18
+ end
19
+
20
+ TIME_MEASUREMENTS.each_key do |time_measurement|
21
+
22
+ context "estimate tracking notification in #{time_measurement}" do
23
+ it "builds an estimate tracking instance" do
24
+ TrackingFactory.build_from(create_estimate(time_measurement)).class.should == Tracking::EstimateTracking
25
+ end
26
+ end
27
+
28
+ context "effort tracking notification in #{time_measurement}" do
29
+ it "builds an effort tracking instance" do
30
+ TrackingFactory.build_from(create_effort(time_measurement)).class.should == Tracking::EffortTracking
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ context "card done tracking notification" do
37
+ it "builds a card done tracking instance" do
38
+ with_message("@trackinguser DONE") { |tracking| tracking.class.should == Tracking::CardDoneTracking }
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+ require 'trello'
3
+
4
+ describe TrelloAuthorize do
5
+ include Trello::Authorization
6
+ include TrelloAuthorize
7
+
8
+ before(:each) do
9
+ keep_original_auth_envs
10
+ end
11
+
12
+ after(:each) do
13
+ reset_original_auth_envs
14
+ end
15
+
16
+ describe "#authorize_on_trello" do
17
+
18
+ it "creates oath credentials using auth params given as params when present as arguments, ignoring env vars or config YML vars" do
19
+ ENV["developer_public_key"] = ENV["access_token_key"] = "anything"
20
+ YAML.should_receive(:load_file).never
21
+
22
+ authorize_on_trello(developer_public_key: "custom_dpk", access_token_key: "custom_atk")
23
+
24
+ Trello.client.auth_policy.developer_public_key.should == "custom_dpk"
25
+ Trello.client.auth_policy.member_token.should == "custom_atk"
26
+ end
27
+
28
+ it "creates oath credentials using auth params taken from env variables when auth params are not given as arguments" do
29
+ ENV["developer_public_key"] = "my_dpk"
30
+ ENV["access_token_key"] = "my_atk"
31
+
32
+ YAML.should_receive(:load_file).never
33
+
34
+ authorize_on_trello(any: "thing")
35
+
36
+ Trello.client.auth_policy.developer_public_key.should == "my_dpk"
37
+ Trello.client.auth_policy.member_token.should == "my_atk"
38
+ end
39
+
40
+ it "creates oath credentials using auth params from config file when auth env variables are not set" do
41
+ ENV["developer_public_key"] = ENV["access_token_key"] = nil
42
+
43
+ config_hash = {"trello" => { "developer_public_key" => "any_dpk", "access_token_key" => "any_atk"}}
44
+ YAML.should_receive(:load_file).with("config/config.yml").and_return(config_hash)
45
+
46
+ authorize_on_trello(any: "thing")
47
+
48
+ Trello.client.auth_policy.developer_public_key.should == "any_dpk"
49
+ Trello.client.auth_policy.member_token.should == "any_atk"
50
+ end
51
+
52
+ end
53
+
54
+ private
55
+
56
+ def keep_original_auth_envs
57
+ @original_developer_public_key = ENV["developer_public_key"]
58
+ @original_access_token_key = ENV["access_token_key"]
59
+ end
60
+
61
+ def reset_original_auth_envs
62
+ ENV["developer_public_key"] = @original_developer_public_key
63
+ ENV["access_token_key"] = @original_access_token_key
64
+ end
65
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'trello'
3
+
4
+ describe TrelloConfiguration do
5
+ include TrelloConfiguration
6
+
7
+ describe "#authorization_params_from_config_file" do
8
+ it "loads the default trello auth params from config yml" do
9
+ config_hash = { "trello" => { "developer_public_key" => "any_dpk", "access_token_key" => "any_atk" } }
10
+ YAML.should_receive(:load_file).with("config/config.yml").and_return(config_hash)
11
+
12
+ authorization_params_from_config_file["developer_public_key"].should == "any_dpk"
13
+ authorization_params_from_config_file["access_token_key"].should == "any_atk"
14
+ end
15
+ end
16
+
17
+ describe "#tracker_username" do
18
+ before(:each) do
19
+ @original = ENV["tracker_username"]
20
+ end
21
+
22
+ after(:each) do
23
+ ENV["tracker_username"] = @original
24
+ end
25
+
26
+ it "searches for the trello tracker username first from an env var" do
27
+ ENV["tracker_username"] = "my_tracker"
28
+ YAML.should_receive(:load_file).never
29
+
30
+ tracker_username.should == "my_tracker"
31
+ end
32
+
33
+ it "searches for the trello tracker username in the config yml file if the env var is not set" do
34
+ ENV["tracker_username"] = nil
35
+ config_hash = {"tracker_username" => "my_trello_tracker" }
36
+ YAML.should_receive(:load_file).with("config/config.yml").and_return(config_hash)
37
+
38
+ tracker_username.should == "my_trello_tracker"
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe TrelloTracker do
4
+
5
+ before(:each) do
6
+ @original = ENV["tracker_username"]
7
+ ENV["tracker_username"] = "my_tracker"
8
+ end
9
+
10
+ after(:each) do
11
+ ENV["tracker_username"] = @original
12
+ end
13
+
14
+ it "force the trello tracker username in the constructor" do
15
+ tracker = TrelloTracker.new(tracker_username: "any_other_tracker")
16
+
17
+ tracker.tracker_username.should == "any_other_tracker"
18
+ end
19
+
20
+ it "takes the tracker username from the ENV var tracker_username" do
21
+ tracker = TrelloTracker.new
22
+
23
+ tracker.tracker_username.should == "my_tracker"
24
+ end
25
+
26
+ end
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/tracco/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "tracco"
6
+ gem.version = TrelloEffortTracker::VERSION
7
+ gem.platform = Gem::Platform::RUBY
8
+
9
+ gem.description = "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."
10
+ gem.summary = <<-DESC
11
+ You notify all the estimates and efforts of your Trello cards.
12
+ This tool will extract and store these estimates and actual efforts
13
+ to let you extract useful key metrics (e.g. estimate errors)
14
+ DESC
15
+ gem.authors = ['Pietro Di Bello']
16
+ gem.email = 'pierodibello@gmail.com'
17
+ gem.homepage = 'http://xplayer.github.com'
18
+ gem.date = Time.now.strftime "%Y-%m-%d"
19
+
20
+ gem.require_paths = ["lib"]
21
+ gem.files = `git ls-files`.split("\n")
22
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
23
+ gem.extra_rdoc_files = ["README.md"]
24
+
25
+ gem.required_rubygems_version = ">= 1.3.6"
26
+
27
+ gem.add_runtime_dependency 'ruby-trello'
28
+ gem.add_runtime_dependency 'mongoid'
29
+ gem.add_runtime_dependency 'bson_ext'
30
+ gem.add_runtime_dependency 'google_drive'
31
+ gem.add_runtime_dependency 'rainbow'
32
+ gem.add_runtime_dependency 'chronic'
33
+ gem.add_runtime_dependency 'highline'
34
+
35
+ gem.add_development_dependency 'rake'
36
+ gem.add_development_dependency 'rspec'
37
+ gem.add_development_dependency 'rspec-mocks'
38
+ gem.add_development_dependency 'mongoid-rspec'
39
+ gem.add_development_dependency 'database_cleaner'
40
+ gem.add_development_dependency 'debugger'
41
+ end
@@ -0,0 +1,10 @@
1
+ {
2
+ "folders":
3
+ [
4
+ {
5
+ "path": ".",
6
+ "folder_exclude_patterns": ["tmp", "log", "coverage"],
7
+ "file_exclude_patterns": ["tracco.sublime-workspace"]
8
+ }
9
+ ]
10
+ }
metadata ADDED
@@ -0,0 +1,316 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tracco
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pietro Di Bello
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ruby-trello
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mongoid
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bson_ext
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: google_drive
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rainbow
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: chronic
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: highline
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rspec
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rspec-mocks
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: mongoid-rspec
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: database_cleaner
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: debugger
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ description: ! 'Tracco is a Trello effort tracker: the purpose of Tracco is to extract
223
+ and track estimates and actual efforts out of the cards on your Trello boards.'
224
+ email: pierodibello@gmail.com
225
+ executables: []
226
+ extensions: []
227
+ extra_rdoc_files:
228
+ - README.md
229
+ files:
230
+ - .gitignore
231
+ - .rspec
232
+ - .rvmrc.template
233
+ - .travis.yml
234
+ - CHANGELOG
235
+ - Gemfile
236
+ - Gemfile.lock
237
+ - LICENSE.txt
238
+ - README.md
239
+ - Rakefile
240
+ - config/config.template.yml
241
+ - config/config.yml.trackinguser_for_test
242
+ - config/mongoid.template.yml
243
+ - lib/patches/trello/card.rb
244
+ - lib/patches/trello/member.rb
245
+ - lib/startup_trello.rb
246
+ - lib/tasks/rspec.rake
247
+ - lib/tasks/tasks.rake
248
+ - lib/tracco.rb
249
+ - lib/tracco/effort.rb
250
+ - lib/tracco/estimate.rb
251
+ - lib/tracco/google_docs_exporter.rb
252
+ - lib/tracco/member.rb
253
+ - lib/tracco/mongoid_helper.rb
254
+ - lib/tracco/tracked_card.rb
255
+ - lib/tracco/tracking/base.rb
256
+ - lib/tracco/tracking/card_done_tracking.rb
257
+ - lib/tracco/tracking/effort_tracking.rb
258
+ - lib/tracco/tracking/estimate_tracking.rb
259
+ - lib/tracco/tracking/invalid_tracking.rb
260
+ - lib/tracco/tracking_factory.rb
261
+ - lib/tracco/trello_authorize.rb
262
+ - lib/tracco/trello_configuration.rb
263
+ - lib/tracco/trello_tracker.rb
264
+ - lib/tracco/version.rb
265
+ - script/ci/before_script.sh
266
+ - script/ci/run_build.sh
267
+ - script/crontab.template
268
+ - script/mate.sh
269
+ - spec/effort_spec.rb
270
+ - spec/estimate_spec.rb
271
+ - spec/integration/trello_authorization_spec.rb
272
+ - spec/integration/trello_tracker_spec.rb
273
+ - spec/member_spec.rb
274
+ - spec/patches/trello/card_spec.rb
275
+ - spec/spec_helper.rb
276
+ - spec/support/database_cleaner.rb
277
+ - spec/tracked_card_spec.rb
278
+ - spec/tracking/card_done_tracking_spec.rb
279
+ - spec/tracking/effort_tracking_spec.rb
280
+ - spec/tracking/estimate_tracking_spec.rb
281
+ - spec/tracking_factory_spec.rb
282
+ - spec/trello_authorize_spec.rb
283
+ - spec/trello_configuration_spec.rb
284
+ - spec/trello_tracker_spec.rb
285
+ - tracco.gemspec
286
+ - tracco.sublime-project
287
+ homepage: http://xplayer.github.com
288
+ licenses: []
289
+ post_install_message:
290
+ rdoc_options: []
291
+ require_paths:
292
+ - lib
293
+ required_ruby_version: !ruby/object:Gem::Requirement
294
+ none: false
295
+ requirements:
296
+ - - ! '>='
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ segments:
300
+ - 0
301
+ hash: 499793914169184539
302
+ required_rubygems_version: !ruby/object:Gem::Requirement
303
+ none: false
304
+ requirements:
305
+ - - ! '>='
306
+ - !ruby/object:Gem::Version
307
+ version: 1.3.6
308
+ requirements: []
309
+ rubyforge_project:
310
+ rubygems_version: 1.8.25
311
+ signing_key:
312
+ specification_version: 3
313
+ summary: You notify all the estimates and efforts of your Trello cards. This tool
314
+ will extract and store these estimates and actual efforts to let you extract useful
315
+ key metrics (e.g. estimate errors)
316
+ test_files: []