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.
- data/.gitignore +28 -0
- data/.rspec +3 -0
- data/.rvmrc.template +2 -0
- data/.travis.yml +20 -0
- data/CHANGELOG +32 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +110 -0
- data/LICENSE.txt +15 -0
- data/README.md +292 -0
- data/Rakefile +8 -0
- data/config/config.template.yml +6 -0
- data/config/config.yml.trackinguser_for_test +7 -0
- data/config/mongoid.template.yml +24 -0
- data/lib/patches/trello/card.rb +19 -0
- data/lib/patches/trello/member.rb +20 -0
- data/lib/startup_trello.rb +2 -0
- data/lib/tasks/rspec.rake +17 -0
- data/lib/tasks/tasks.rake +55 -0
- data/lib/tracco.rb +30 -0
- data/lib/tracco/effort.rb +35 -0
- data/lib/tracco/estimate.rb +25 -0
- data/lib/tracco/google_docs_exporter.rb +67 -0
- data/lib/tracco/member.rb +61 -0
- data/lib/tracco/mongoid_helper.rb +13 -0
- data/lib/tracco/tracked_card.rb +121 -0
- data/lib/tracco/tracking/base.rb +82 -0
- data/lib/tracco/tracking/card_done_tracking.rb +10 -0
- data/lib/tracco/tracking/effort_tracking.rb +45 -0
- data/lib/tracco/tracking/estimate_tracking.rb +23 -0
- data/lib/tracco/tracking/invalid_tracking.rb +19 -0
- data/lib/tracco/tracking_factory.rb +22 -0
- data/lib/tracco/trello_authorize.rb +16 -0
- data/lib/tracco/trello_configuration.rb +39 -0
- data/lib/tracco/trello_tracker.rb +44 -0
- data/lib/tracco/version.rb +3 -0
- data/script/ci/before_script.sh +1 -0
- data/script/ci/run_build.sh +2 -0
- data/script/crontab.template +8 -0
- data/script/mate.sh +1 -0
- data/spec/effort_spec.rb +59 -0
- data/spec/estimate_spec.rb +38 -0
- data/spec/integration/trello_authorization_spec.rb +12 -0
- data/spec/integration/trello_tracker_spec.rb +66 -0
- data/spec/member_spec.rb +81 -0
- data/spec/patches/trello/card_spec.rb +25 -0
- data/spec/spec_helper.rb +66 -0
- data/spec/support/database_cleaner.rb +12 -0
- data/spec/tracked_card_spec.rb +336 -0
- data/spec/tracking/card_done_tracking_spec.rb +18 -0
- data/spec/tracking/effort_tracking_spec.rb +114 -0
- data/spec/tracking/estimate_tracking_spec.rb +44 -0
- data/spec/tracking_factory_spec.rb +42 -0
- data/spec/trello_authorize_spec.rb +65 -0
- data/spec/trello_configuration_spec.rb +43 -0
- data/spec/trello_tracker_spec.rb +26 -0
- data/tracco.gemspec +41 -0
- data/tracco.sublime-project +10 -0
- 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
|
data/tracco.gemspec
ADDED
@@ -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
|
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: []
|