tracco 0.0.14 → 0.0.15
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/CHANGELOG +16 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -4
- data/lib/patches/trello/card.rb +3 -2
- data/lib/patches/trello/member.rb +4 -2
- data/lib/tasks/tasks.rake +2 -2
- data/lib/tracco/google_docs_exporter.rb +50 -47
- data/lib/tracco/models/effort.rb +40 -0
- data/lib/tracco/models/estimate.rb +29 -0
- data/lib/tracco/models/member.rb +64 -0
- data/lib/tracco/models/tracked_card.rb +148 -0
- data/lib/tracco/tracking/base.rb +68 -65
- data/lib/tracco/tracking/card_done_tracking.rb +9 -6
- data/lib/tracco/tracking/effort_tracking.rb +32 -29
- data/lib/tracco/tracking/estimate_tracking.rb +16 -13
- data/lib/tracco/tracking/factory.rb +18 -16
- data/lib/tracco/tracking/invalid_tracking.rb +15 -13
- data/lib/tracco/trello_tracker.rb +34 -30
- data/lib/tracco/version.rb +2 -2
- data/lib/tracco.rb +4 -4
- data/spec/factories/effort_factory.rb +2 -2
- data/spec/factories/estimate_factory.rb +1 -1
- data/spec/factories/tracked_card_factory.rb +1 -1
- data/spec/integration/trello_tracker_spec.rb +49 -47
- data/spec/models/effort_spec.rb +61 -0
- data/spec/models/estimate_spec.rb +40 -0
- data/spec/models/member_spec.rb +83 -0
- data/spec/models/tracked_card_spec.rb +467 -0
- data/spec/support/spec_helper_methods.rb +7 -1
- data/spec/tracking/card_done_tracking_spec.rb +11 -9
- data/spec/tracking/effort_tracking_spec.rb +77 -75
- data/spec/tracking/estimate_tracking_spec.rb +30 -28
- data/spec/tracking/factory_spec.rb +39 -0
- data/spec/trello_tracker_spec.rb +20 -18
- data/tracco.gemspec +1 -1
- metadata +12 -12
- data/lib/tracco/effort.rb +0 -37
- data/lib/tracco/estimate.rb +0 -26
- data/lib/tracco/member.rb +0 -61
- data/lib/tracco/tracked_card.rb +0 -145
- data/spec/effort_spec.rb +0 -59
- data/spec/estimate_spec.rb +0 -38
- data/spec/member_spec.rb +0 -81
- data/spec/tracked_card_spec.rb +0 -465
- data/spec/tracking_factory_spec.rb +0 -42
@@ -1,114 +1,116 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
module
|
4
|
-
|
3
|
+
module Tracco
|
4
|
+
module Tracking
|
5
|
+
describe EffortTracking do
|
5
6
|
|
6
|
-
|
7
|
+
describe "#effort" do
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
9
|
+
%w{pietrodibello michelepangrazzi alessandrodescovi michelevincenzi}.each do |username|
|
10
|
+
let(username.to_sym) { Member.new(username: username) }
|
11
|
+
end
|
19
12
|
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
before(:each) do
|
14
|
+
Trello::Member.stub(:find).and_return(Member.new(username: "any"))
|
15
|
+
end
|
23
16
|
|
24
|
-
|
25
|
-
|
17
|
+
it "is nil when the notification does not contain an estimate" do
|
18
|
+
with(unrecognized_notification) { |tracking| tracking.effort.should be_nil }
|
19
|
+
end
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
21
|
+
it "does not parse effort in minutes (e.g. +30m)" do
|
22
|
+
with_message("@trackinguser +30m") { |tracking| tracking.effort.should be_nil }
|
23
|
+
end
|
30
24
|
|
31
|
-
|
32
|
-
|
25
|
+
it "is the hour-based effort when the notification contains an effort in hours" do
|
26
|
+
Trello::Member.should_receive(:find).with("michelepangrazzi").and_return(michelepangrazzi)
|
33
27
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
28
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser +2h" },
|
29
|
+
date: "2012-10-28T21:06:14.801Z",
|
30
|
+
member_creator: stub(username: "michelepangrazzi"))
|
38
31
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
32
|
+
Tracking::Factory.build_from(raw_data).effort.should == Effort.new(amount: 2.0, date: Date.parse('2012-10-28'), members: [michelepangrazzi])
|
33
|
+
end
|
42
34
|
|
43
|
-
|
44
|
-
|
45
|
-
|
35
|
+
it "converts the effort in hours when the notification contains an effort in days" do
|
36
|
+
with_message("@trackinguser +1.5d") { |t| t.effort.amount.should == 8+4 }
|
37
|
+
with_message("@trackinguser +1.5g") { |t| t.effort.amount.should == 8+4 }
|
46
38
|
end
|
47
|
-
end
|
48
39
|
|
49
|
-
|
50
|
-
|
51
|
-
tracking.effort.amount.should == 0.5
|
40
|
+
it "converts the effort in hours when the notification contains an effort in pomodori" do
|
41
|
+
with_message("@trackinguser +10p") { |t| t.effort.amount.should == 5}
|
52
42
|
end
|
53
|
-
end
|
54
43
|
|
55
|
-
|
56
|
-
|
57
|
-
|
44
|
+
it "fetch the effort from a complex effort message" do
|
45
|
+
with_message "@trackinguser ho speso +2h e spero che stavolta possiamo rilasciarla" do |tracking|
|
46
|
+
tracking.effort.amount.should == 2.0
|
47
|
+
end
|
58
48
|
end
|
59
|
-
end
|
60
49
|
|
61
|
-
|
62
|
-
|
63
|
-
|
50
|
+
it "fetch the effort even when beween square brackets" do
|
51
|
+
with_message "@trackinguser [+0.5h]" do |tracking|
|
52
|
+
tracking.effort.amount.should == 0.5
|
53
|
+
end
|
64
54
|
end
|
65
55
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
it "computes the effort considering all the mentioned team mates in the message" do
|
57
|
+
with_message "@trackinguser +2h assieme a @michelepangrazzi e @alessandrodescovi" do |tracking|
|
58
|
+
tracking.effort.amount.should == 2.0 * 3
|
59
|
+
end
|
70
60
|
end
|
71
|
-
end
|
72
61
|
|
73
|
-
|
74
|
-
|
75
|
-
|
62
|
+
it "tracks all the team mates which spent that effort on the card" do
|
63
|
+
%w{pietrodibello michelepangrazzi alessandrodescovi}.each do |username|
|
64
|
+
Trello::Member.should_receive(:find).with(username).and_return(self.send(username))
|
65
|
+
end
|
66
|
+
|
67
|
+
notification = create_notification(data: { 'text' => "@trackinguser +2h assieme a @michelepangrazzi e @alessandrodescovi" },
|
68
|
+
member_creator: stub(username: "pietrodibello"))
|
69
|
+
with notification do |tracking|
|
70
|
+
tracking.effort.members.should == [michelepangrazzi, alessandrodescovi, pietrodibello]
|
71
|
+
end
|
76
72
|
end
|
77
73
|
|
78
|
-
|
79
|
-
|
74
|
+
it "tracks the effort only on the team members listed between round brackets" do
|
75
|
+
%w{michelevincenzi alessandrodescovi}.each do |username|
|
76
|
+
Trello::Member.should_receive(:find).with(username).and_return(self.send(username))
|
77
|
+
end
|
78
|
+
|
79
|
+
notification = create_notification(data: { 'text' => "@trackinguser +3p (@alessandrodescovi @michelevincenzi)" },
|
80
|
+
member_creator: stub(username: "pietrodibello"))
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
with notification do |tracking|
|
83
|
+
tracking.effort.members.should == [alessandrodescovi, michelevincenzi]
|
84
|
+
tracking.effort.amount.should == 1.5 * 2
|
85
|
+
end
|
84
86
|
end
|
85
|
-
end
|
86
87
|
|
87
|
-
|
88
|
-
|
88
|
+
it "tracks the effort with the date given in the notification text, not the actual notification date" do
|
89
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser 22.11.2012 +6p" }, date: "2012-09-19T12:46:13.713Z")
|
89
90
|
|
90
|
-
|
91
|
+
tracking = Tracking::Factory.build_from(raw_data)
|
91
92
|
|
92
|
-
|
93
|
-
|
93
|
+
tracking.effort.date.should == Date.parse('2012-11-22')
|
94
|
+
end
|
94
95
|
|
95
|
-
|
96
|
-
|
96
|
+
it "tracks the effort to yesterday when the keyword 'yesterday' is present before the effort amount" do
|
97
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser yesterday +6p" }, date: "2012-09-19T12:46:13.713Z")
|
97
98
|
|
98
|
-
|
99
|
+
tracking = Tracking::Factory.build_from(raw_data)
|
99
100
|
|
100
|
-
|
101
|
-
|
101
|
+
tracking.effort.date.should == Date.parse('2012-09-18')
|
102
|
+
end
|
102
103
|
|
103
|
-
|
104
|
-
|
104
|
+
it "tracks the effort to yesterday when the keyword 'yesterday' is present before the effort amount" do
|
105
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser +6p yesterday" }, date: "2012-09-19T12:46:13.713Z")
|
105
106
|
|
106
|
-
|
107
|
+
tracking = Tracking::Factory.build_from(raw_data)
|
108
|
+
|
109
|
+
tracking.effort.date.should == Date.parse('2012-09-18')
|
110
|
+
end
|
107
111
|
|
108
|
-
tracking.effort.date.should == Date.parse('2012-09-18')
|
109
112
|
end
|
110
113
|
|
111
114
|
end
|
112
|
-
|
113
115
|
end
|
114
116
|
end
|
@@ -1,44 +1,46 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
module
|
4
|
-
|
3
|
+
module Tracco
|
4
|
+
module Tracking
|
5
|
+
describe EstimateTracking do
|
5
6
|
|
6
|
-
|
7
|
+
describe "#estimate" do
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
it "is nil when the notification does not contain an estimate" do
|
10
|
+
Tracking::Factory.build_from(unrecognized_notification).estimate.should be_nil
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
it "is the hour-based estimate when the notification contains an estimate in hours" do
|
14
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser [2h]" }, date: "2012-10-28T21:06:14.801Z")
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
Tracking::Factory.build_from(raw_data).estimate.should == Estimate.new(amount: 2.0, date: Date.parse('2012-10-28'))
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
it "converts the estimate in hours when the notification contains an estimate in days" do
|
20
|
+
Tracking::Factory.build_from(create_notification(data: { 'text' => "@trackinguser [1.5d]" })).estimate.amount.should == 8+4
|
21
|
+
Tracking::Factory.build_from(create_notification(data: { 'text' => "@trackinguser [1.5g]" })).estimate.amount.should == 8+4
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
it "converts the estimate in hours when the notification contains an estimate in pomodori" do
|
25
|
+
raw_data = create_notification(data: { 'text' => "@trackinguser [10p]" })
|
26
|
+
Tracking::Factory.build_from(raw_data).estimate.amount.should == 5
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
it "fetch the estimate from a complex estimate message" do
|
30
|
+
raw_data = create_notification(data: { 'text' => "@maxmazza Dobbiamo ancora lavorarci.\n@trackinguser ristimo ancora [3h] per il fix" })
|
31
|
+
Tracking::Factory.build_from(raw_data).estimate.amount.should == 3.0
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
it "tracks the effort with the date given in the notification text, not the actual notification date" do
|
35
|
+
raw_data = create_notification( data: { 'text' => "@trackinguser 22.11.2012 [6p]" }, date: "2012-09-19T12:46:13.713Z")
|
35
36
|
|
36
|
-
|
37
|
+
tracking = Tracking::Factory.build_from(raw_data)
|
37
38
|
|
38
|
-
|
39
|
-
|
39
|
+
tracking.estimate.date.should == Date.parse('2012-11-22')
|
40
|
+
end
|
40
41
|
|
42
|
+
end
|
41
43
|
end
|
42
|
-
end
|
43
44
|
|
45
|
+
end
|
44
46
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Tracco
|
4
|
+
module Tracking
|
5
|
+
describe Factory do
|
6
|
+
|
7
|
+
context "unknown tracking format" do
|
8
|
+
it "builds an invalid tracking instance" do
|
9
|
+
Tracking::Factory.build_from(unrecognized_notification).class.should == Tracking::InvalidTracking
|
10
|
+
|
11
|
+
with_message("@trackinguser +30m") { |tracking| tracking.class.should == Tracking::InvalidTracking }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
TIME_MEASUREMENTS.each_key do |time_measurement|
|
16
|
+
|
17
|
+
context "estimate tracking notification in #{time_measurement}" do
|
18
|
+
it "builds an estimate tracking instance" do
|
19
|
+
Tracking::Factory.build_from(create_estimate(time_measurement)).class.should == Tracking::EstimateTracking
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "effort tracking notification in #{time_measurement}" do
|
24
|
+
it "builds an effort tracking instance" do
|
25
|
+
Tracking::Factory.build_from(create_effort(time_measurement)).class.should == Tracking::EffortTracking
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
context "card done tracking notification" do
|
32
|
+
it "builds a card done tracking instance" do
|
33
|
+
with_message("@trackinguser DONE") { |tracking| tracking.class.should == Tracking::CardDoneTracking }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/trello_tracker_spec.rb
CHANGED
@@ -1,26 +1,28 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
module Tracco
|
4
|
+
describe TrelloTracker do
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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")
|
6
|
+
before(:each) do
|
7
|
+
@original = ENV["tracker_username"]
|
8
|
+
ENV["tracker_username"] = "my_tracker"
|
9
|
+
end
|
16
10
|
|
17
|
-
|
18
|
-
|
11
|
+
after(:each) do
|
12
|
+
ENV["tracker_username"] = @original
|
13
|
+
end
|
19
14
|
|
20
|
-
|
21
|
-
|
15
|
+
it "force the trello tracker username in the constructor" do
|
16
|
+
tracker = TrelloTracker.new(tracker_username: "any_other_tracker")
|
22
17
|
|
23
|
-
|
24
|
-
|
18
|
+
tracker.tracker_username.should == "any_other_tracker"
|
19
|
+
end
|
25
20
|
|
21
|
+
it "takes the tracker username from the ENV var tracker_username" do
|
22
|
+
tracker = TrelloTracker.new
|
23
|
+
|
24
|
+
tracker.tracker_username.should == "my_tracker"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
26
28
|
end
|
data/tracco.gemspec
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../lib/tracco/version', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = "tracco"
|
6
|
-
gem.version =
|
6
|
+
gem.version = Tracco::VERSION
|
7
7
|
gem.platform = Gem::Platform::RUBY
|
8
8
|
|
9
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."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby-trello
|
@@ -262,12 +262,12 @@ files:
|
|
262
262
|
- lib/tasks/rspec.rake
|
263
263
|
- lib/tasks/tasks.rake
|
264
264
|
- lib/tracco.rb
|
265
|
-
- lib/tracco/effort.rb
|
266
|
-
- lib/tracco/estimate.rb
|
267
265
|
- lib/tracco/google_docs_exporter.rb
|
268
|
-
- lib/tracco/
|
266
|
+
- lib/tracco/models/effort.rb
|
267
|
+
- lib/tracco/models/estimate.rb
|
268
|
+
- lib/tracco/models/member.rb
|
269
|
+
- lib/tracco/models/tracked_card.rb
|
269
270
|
- lib/tracco/mongoid_helper.rb
|
270
|
-
- lib/tracco/tracked_card.rb
|
271
271
|
- lib/tracco/tracking/base.rb
|
272
272
|
- lib/tracco/tracking/card_done_tracking.rb
|
273
273
|
- lib/tracco/tracking/effort_tracking.rb
|
@@ -282,23 +282,23 @@ files:
|
|
282
282
|
- script/ci/run_build.sh
|
283
283
|
- script/crontab.template
|
284
284
|
- script/mate.sh
|
285
|
-
- spec/effort_spec.rb
|
286
|
-
- spec/estimate_spec.rb
|
287
285
|
- spec/factories/effort_factory.rb
|
288
286
|
- spec/factories/estimate_factory.rb
|
289
287
|
- spec/factories/tracked_card_factory.rb
|
290
288
|
- spec/integration/trello_authorization_spec.rb
|
291
289
|
- spec/integration/trello_tracker_spec.rb
|
292
|
-
- spec/
|
290
|
+
- spec/models/effort_spec.rb
|
291
|
+
- spec/models/estimate_spec.rb
|
292
|
+
- spec/models/member_spec.rb
|
293
|
+
- spec/models/tracked_card_spec.rb
|
293
294
|
- spec/patches/trello/card_spec.rb
|
294
295
|
- spec/spec_helper.rb
|
295
296
|
- spec/support/database_cleaner.rb
|
296
297
|
- spec/support/spec_helper_methods.rb
|
297
|
-
- spec/tracked_card_spec.rb
|
298
298
|
- spec/tracking/card_done_tracking_spec.rb
|
299
299
|
- spec/tracking/effort_tracking_spec.rb
|
300
300
|
- spec/tracking/estimate_tracking_spec.rb
|
301
|
-
- spec/
|
301
|
+
- spec/tracking/factory_spec.rb
|
302
302
|
- spec/trello_authorize_spec.rb
|
303
303
|
- spec/trello_configuration_spec.rb
|
304
304
|
- spec/trello_tracker_spec.rb
|
@@ -318,7 +318,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
318
318
|
version: '0'
|
319
319
|
segments:
|
320
320
|
- 0
|
321
|
-
hash: -
|
321
|
+
hash: -2610639466740555589
|
322
322
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
323
323
|
none: false
|
324
324
|
requirements:
|
data/lib/tracco/effort.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
class Effort
|
2
|
-
include Mongoid::Document
|
3
|
-
include Mongoid::Timestamps
|
4
|
-
include Mongoid::MultiParameterAttributes
|
5
|
-
|
6
|
-
field :amount, type: BigDecimal
|
7
|
-
field :date, type: Date
|
8
|
-
field :tracking_notification_id
|
9
|
-
field :muted, type: Boolean, default: false
|
10
|
-
|
11
|
-
embeds_many :members
|
12
|
-
embedded_in :tracked_card
|
13
|
-
|
14
|
-
default_scope where(muted: false).asc(:date)
|
15
|
-
|
16
|
-
validates_presence_of :amount, :date, :members
|
17
|
-
|
18
|
-
def amount_per_member
|
19
|
-
amount / members.size
|
20
|
-
end
|
21
|
-
|
22
|
-
def include?(member)
|
23
|
-
members.include?(member)
|
24
|
-
end
|
25
|
-
|
26
|
-
def ==(other)
|
27
|
-
return true if other.equal?(self)
|
28
|
-
return false unless other.kind_of?(self.class)
|
29
|
-
|
30
|
-
amount == other.amount && date == other.date && Set.new(members) == Set.new(other.members)
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_s
|
34
|
-
"[#{date}] spent #{amount} hours by #{members.map(&:at_username).join(", ")}"
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
data/lib/tracco/estimate.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
class Estimate
|
2
|
-
include Mongoid::Document
|
3
|
-
include Mongoid::Timestamps
|
4
|
-
include Mongoid::MultiParameterAttributes
|
5
|
-
|
6
|
-
field :amount, type: BigDecimal
|
7
|
-
field :date, type: Date
|
8
|
-
field :tracking_notification_id
|
9
|
-
|
10
|
-
embedded_in :tracked_card
|
11
|
-
|
12
|
-
default_scope asc(:date)
|
13
|
-
|
14
|
-
validates_presence_of :amount, :date
|
15
|
-
|
16
|
-
def ==(other)
|
17
|
-
return true if other.equal?(self)
|
18
|
-
return false unless other.kind_of?(self.class)
|
19
|
-
|
20
|
-
amount == other.amount && date == other.date
|
21
|
-
end
|
22
|
-
|
23
|
-
def to_s
|
24
|
-
"[#{date}] estimated #{amount} hours"
|
25
|
-
end
|
26
|
-
end
|
data/lib/tracco/member.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
class Member
|
2
|
-
include Mongoid::Document
|
3
|
-
include Mongoid::Timestamps
|
4
|
-
|
5
|
-
field :trello_id
|
6
|
-
field :username
|
7
|
-
field :full_name
|
8
|
-
field :avatar_id
|
9
|
-
field :bio
|
10
|
-
field :url
|
11
|
-
|
12
|
-
embedded_in :effort
|
13
|
-
|
14
|
-
validates_presence_of :username
|
15
|
-
|
16
|
-
def self.build_from(trello_member)
|
17
|
-
trello_member_id = trello_member.id
|
18
|
-
trello_member.attributes.delete(:id)
|
19
|
-
new(trello_member.attributes.merge(trello_id: trello_member_id))
|
20
|
-
end
|
21
|
-
|
22
|
-
def at_username
|
23
|
-
"@#{username}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def avatar_url
|
27
|
-
trello_member.avatar_url(size: :small)
|
28
|
-
end
|
29
|
-
|
30
|
-
def effort_spent(from_date=nil)
|
31
|
-
cards = TrackedCard.with_effort_spent_by(username)
|
32
|
-
efforts = cards.map(&:efforts).compact.flatten
|
33
|
-
efforts = efforts.select {|e| e.date >= from_date} if from_date
|
34
|
-
efforts.select { |effort| effort.include?(self) }.inject(0) { |total, effort| total + effort.amount_per_member }
|
35
|
-
end
|
36
|
-
alias_method :effort_spent_since, :effort_spent
|
37
|
-
|
38
|
-
def ==(other)
|
39
|
-
return true if other.equal?(self)
|
40
|
-
return false unless other.kind_of?(self.class)
|
41
|
-
|
42
|
-
username == other.username
|
43
|
-
end
|
44
|
-
|
45
|
-
def eql?(other)
|
46
|
-
return false unless other.instance_of?(self.class)
|
47
|
-
username == other.username
|
48
|
-
end
|
49
|
-
|
50
|
-
def hash
|
51
|
-
username.hash
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def trello_member
|
57
|
-
@trello_member ||= Trello::Member.new("id" => trello_id, "fullName" => full_name, "username" => username,
|
58
|
-
"avatarHash" => avatar_id, "bio" => bio, "url" => url)
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|