trello_lead_time 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ebb46d164441714720302263800024ee5fc651cd
4
- data.tar.gz: 3105c32a61a10087082469f5e665a397e66d2e26
3
+ metadata.gz: 96f6e51efeac5483b81f0d5e226f9494accc8f5e
4
+ data.tar.gz: 0e1b9d7901f5ca08cc9e9b60bfb1444cfbe9cf19
5
5
  SHA512:
6
- metadata.gz: c58c18473e497d0bd1938b63dd01b6547c649539fc037c363561503b648a05eed5ae825f6b3df255e220a15010d1ff3a04e6c42cca32254b8505e8f30976fd18
7
- data.tar.gz: b208697cb6bc6e399dc43c6ca2e86f0708940ccca139ec07d60e0e23420ab1adf1643fdc1f593fed2ce94a1e856114458a3d86fa3e97ad5900dae29e849ff8e6
6
+ metadata.gz: 3e88d94eedadfd18d2220be613ff13ed068ac1f19f8f2b21996ee34a3a98db1f83aba20e0118b8af805b5ea541fef7d7fd3ca3b5e454ef9b2f509254324e7582
7
+ data.tar.gz: c5b5f7c476a369b9fc7f9c7fdfeeecf6da4305a4519a3f1316eefed4ff986938dbfb067c05d879fe83d38986053267179e3b90f8722bc983b5599ca8539e59bd
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trello_lead_time (0.1.0)
4
+ trello_lead_time (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -21,28 +21,28 @@ module TrelloLeadTime
21
21
  @trello_board.name
22
22
  end
23
23
 
24
- def average_age(name_of_list_with_done_cards)
24
+ def totals(name_of_list_with_done_cards)
25
25
  list = find_list_by_name(name_of_list_with_done_cards)
26
- return 0 if list.nil?
27
- list.average_age
28
- end
26
+ response = default_format
27
+ return response if list.nil?
29
28
 
30
- def average_lead_time(name_of_list_with_done_cards)
31
- list = find_list_by_name(name_of_list_with_done_cards)
32
- return 0 if list.nil?
33
- list.average_lead_time
29
+ response[:lead_time][:overall] = list.total_lead_time
30
+ response[:queue_time][:overall] = list.total_queue_time
31
+ response[:cycle_time][:overall] = list.total_cycle_time
32
+ response[:age][:overall] = list.total_age
33
+ response
34
34
  end
35
35
 
36
- def average_queue_time(name_of_list_with_done_cards)
36
+ def averages(name_of_list_with_done_cards)
37
37
  list = find_list_by_name(name_of_list_with_done_cards)
38
- return 0 if list.nil?
39
- list.average_queue_time
40
- end
38
+ response = default_format
39
+ return response if list.nil?
41
40
 
42
- def average_cycle_time(name_of_list_with_done_cards)
43
- list = find_list_by_name(name_of_list_with_done_cards)
44
- return 0 if list.nil?
45
- list.average_cycle_time
41
+ response[:lead_time][:overall] = list.average_lead_time
42
+ response[:queue_time][:overall] = list.average_queue_time
43
+ response[:cycle_time][:overall] = list.average_cycle_time
44
+ response[:age][:overall] = list.average_age
45
+ response
46
46
  end
47
47
 
48
48
  private
@@ -56,5 +56,22 @@ module TrelloLeadTime
56
56
  @_lists[name]
57
57
  end
58
58
 
59
+ def default_format
60
+ {
61
+ lead_time: default_entry,
62
+ queue_time: default_entry,
63
+ cycle_time: default_entry,
64
+ age: default_entry,
65
+ }
66
+ end
67
+
68
+ def default_entry
69
+ {
70
+ overall: 0,
71
+ initiatives: {},
72
+ finance_types: {}
73
+ }
74
+ end
75
+
59
76
  end
60
77
  end
@@ -37,11 +37,33 @@ module TrelloLeadTime
37
37
  @_cycle_time ||= sum_of_times_in_lists(Config.cycle_time_lists)
38
38
  end
39
39
 
40
+ def has_label_name?(name)
41
+ match = labels.find { |l| l.name =~ /^#{Regexp.quote(name)}$/i }
42
+ !match.nil?
43
+ end
44
+
45
+ def has_label_color?(color)
46
+ match = labels.find { |l| l.color =~ /^#{Regexp.quote(color)}$/i }
47
+ !match.nil?
48
+ end
49
+
50
+ def hash_tags
51
+ comments.select { |comment| comment =~ /^#(.+)$/ } || []
52
+ end
53
+
40
54
  private
41
55
 
42
56
  def sum_of_times_in_lists(lists)
43
57
  lists.inject(0) { |sum, list_name| sum + @timeline.seconds_in_list(list_name) }
44
58
  end
45
59
 
60
+ def labels
61
+ @_labels ||= @trello_card.labels
62
+ end
63
+
64
+ def comments
65
+ @_comments ||= @trello_card.actions(filter:"commentCard").map { |comment| comment.data['text'] }
66
+ end
67
+
46
68
  end
47
69
  end
@@ -8,6 +8,7 @@ module TrelloLeadTime
8
8
  attr_accessor :organization_name, :queue_time_lists, :cycle_time_lists, :list_name_matcher_for_done
9
9
 
10
10
  def configure
11
+ reset!
11
12
  yield self
12
13
  end
13
14
 
@@ -33,4 +34,13 @@ module TrelloLeadTime
33
34
  @list_name_matcher_for_done
34
35
  end
35
36
  end
37
+
38
+ private
39
+
40
+ def reset!
41
+ @organization_name = nil
42
+ @queue_time_lists = nil
43
+ @cycle_time_lists = nil
44
+ @list_name_matcher_for_done = nil
45
+ end
36
46
  end
@@ -12,50 +12,58 @@ module TrelloLeadTime
12
12
  @trello_list.name
13
13
  end
14
14
 
15
- def average_age
16
- calculate_average_age_of_cards
15
+ def total_lead_time
16
+ times = done_or_closed_cards.collect(&:lead_time)
17
+ total(times)
17
18
  end
18
19
 
19
20
  def average_lead_time
20
- calculate_average_lead_time_of_cards
21
+ times = done_or_closed_cards.collect(&:lead_time)
22
+ average(times)
21
23
  end
22
24
 
23
- def average_queue_time
24
- calculate_average_queue_time_of_cards
25
+ def total_queue_time
26
+ times = done_or_closed_cards.collect(&:queue_time)
27
+ total(times)
25
28
  end
26
29
 
27
- def average_cycle_time
28
- calculate_average_cycle_time_of_cards
30
+ def average_queue_time
31
+ times = done_or_closed_cards.collect(&:queue_time)
32
+ average(times)
29
33
  end
30
34
 
31
- private
35
+ def total_cycle_time
36
+ times = done_or_closed_cards.collect(&:cycle_time)
37
+ total(times)
38
+ end
32
39
 
33
- def done_or_closed_cards
34
- @_done_or_closed_cards ||= cards.select { |c| c.done? || c.closed? }
40
+ def average_cycle_time
41
+ times = done_or_closed_cards.collect(&:cycle_time)
42
+ average(times)
35
43
  end
36
44
 
37
- def cards
38
- @_cards ||= @trello_list.cards.map { |c| TrelloLeadTime::Card.from_trello_card(c) }
45
+ def total_age
46
+ times = done_or_closed_cards.collect(&:age_in_seconds)
47
+ total(times)
39
48
  end
40
49
 
41
- def calculate_average_age_of_cards
42
- times = done_or_closed_cards.map { |c| c.age_in_seconds }
50
+ def average_age
51
+ times = done_or_closed_cards.collect(&:age_in_seconds)
43
52
  average(times)
44
53
  end
45
54
 
46
- def calculate_average_lead_time_of_cards
47
- times = done_or_closed_cards.map { |c| c.lead_time }
48
- average(times)
55
+ private
56
+
57
+ def done_or_closed_cards
58
+ @_done_or_closed_cards ||= cards.select { |c| c.done? || c.closed? }
49
59
  end
50
60
 
51
- def calculate_average_queue_time_of_cards
52
- times = done_or_closed_cards.map { |c| c.queue_time }
53
- average(times)
61
+ def cards
62
+ @_cards ||= @trello_list.cards.map { |c| TrelloLeadTime::Card.from_trello_card(c) }
54
63
  end
55
64
 
56
- def calculate_average_cycle_time_of_cards
57
- times = done_or_closed_cards.map { |c| c.cycle_time }
58
- average(times)
65
+ def total(times)
66
+ times.inject(0) { |sum, el| sum + el }
59
67
  end
60
68
 
61
69
  def average(times)
@@ -1,3 +1,3 @@
1
1
  module TrelloLeadTime
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -0,0 +1,56 @@
1
+ [
2
+ {
3
+ "id": "666666",
4
+ "idMemberCreator": "555555",
5
+ "data": {
6
+ "board": {
7
+ "shortLink": "87361",
8
+ "name": "Mobile",
9
+ "id": "123456"
10
+ },
11
+ "card": {
12
+ "shortLink": "876361",
13
+ "idShort": 122,
14
+ "name": "some card name",
15
+ "id": "83716489"
16
+ },
17
+ "text": "This is not a hashtag"
18
+ },
19
+ "type": "commentCard",
20
+ "date": "2014-05-12T14:14:59.223Z",
21
+ "memberCreator": {
22
+ "id": "981736",
23
+ "avatarHash": "813747ajsdb",
24
+ "fullName": "John Tyler",
25
+ "initials": "JT",
26
+ "username": "johntyler"
27
+ }
28
+ },
29
+ {
30
+ "id": "666666",
31
+ "idMemberCreator": "555555",
32
+ "data": {
33
+ "board": {
34
+ "shortLink": "87361",
35
+ "name": "Mobile",
36
+ "id": "123456"
37
+ },
38
+ "card": {
39
+ "shortLink": "876361",
40
+ "idShort": 122,
41
+ "name": "some card name",
42
+ "id": "83716489"
43
+ },
44
+ "text": "#myhashtag"
45
+ },
46
+ "type": "commentCard",
47
+ "date": "2014-05-12T14:14:59.223Z",
48
+ "memberCreator": {
49
+ "id": "981736",
50
+ "avatarHash": "813747ajsdb",
51
+ "fullName": "John Tyler",
52
+ "initials": "JT",
53
+ "username": "johntyler"
54
+ }
55
+ }
56
+ ]
@@ -0,0 +1 @@
1
+ [{"color":"green","name":"iOS"},{"color":"red","name":"API"}]
@@ -4,79 +4,99 @@ describe TrelloLeadTime::Board do
4
4
  let(:key) { "key" }
5
5
  let(:token) { "token" }
6
6
 
7
- describe ".from_url" do
8
- let(:organization_id) { "myorg_id" }
9
- let(:organization_name) { "myorg_name" }
10
- let(:url) { "https://trello.com/#{organization_name}" }
11
- let(:board_url) { "http://trello.com/b/1234/board_name" }
12
- let(:board_id) { "myboard_id" }
13
- let(:board_name) { "Development Team" }
14
- let(:list_with_done_cards) { "Done for 2014-03" }
15
- let(:list_id) { "mylist_id" }
16
- let(:card_id) { "mycard_id" }
17
-
18
- let(:organization_json) {
19
- File.read(File.expand_path("../../../fixtures/organization.json", __FILE__))
7
+ let(:organization_id) { "myorg_id" }
8
+ let(:organization_name) { "myorg_name" }
9
+ let(:url) { "https://trello.com/#{organization_name}" }
10
+ let(:board_url) { "http://trello.com/b/1234/board_name" }
11
+ let(:board_id) { "myboard_id" }
12
+ let(:board_name) { "Development Team" }
13
+ let(:list_with_done_cards) { "Done for 2014-03" }
14
+ let(:list_id) { "mylist_id" }
15
+ let(:card_id) { "mycard_id" }
16
+
17
+ let(:organization_json) {
18
+ File.read(File.expand_path("../../../fixtures/organization.json", __FILE__))
19
+ }
20
+
21
+ let(:boards_json) {
22
+ File.read(File.expand_path("../../../fixtures/boards.json", __FILE__))
23
+ }
24
+
25
+ let(:lists_json) {
26
+ File.read(File.expand_path("../../../fixtures/lists.json", __FILE__))
27
+ }
28
+
29
+ let(:cards_json) {
30
+ File.read(File.expand_path("../../../fixtures/cards.json", __FILE__))
31
+ }
32
+
33
+ let(:actions_json) {
34
+ {
35
+ "1111" => File.read(File.expand_path("../../../fixtures/actions.1111.json", __FILE__)),
36
+ "2222" => File.read(File.expand_path("../../../fixtures/actions.2222.json", __FILE__)),
37
+ "3333" => File.read(File.expand_path("../../../fixtures/actions.3333.json", __FILE__)),
38
+ "4444" => File.read(File.expand_path("../../../fixtures/actions.4444.json", __FILE__))
20
39
  }
40
+ }
21
41
 
22
- let(:boards_json) {
23
- File.read(File.expand_path("../../../fixtures/boards.json", __FILE__))
24
- }
42
+ subject { TrelloLeadTime::Board.from_url(board_url) }
25
43
 
26
- let(:lists_json) {
27
- File.read(File.expand_path("../../../fixtures/lists.json", __FILE__))
28
- }
44
+ describe ".totals" do
45
+ let(:totals) { subject.totals(list_with_done_cards) }
29
46
 
30
- let(:cards_json) {
31
- File.read(File.expand_path("../../../fixtures/cards.json", __FILE__))
32
- }
47
+ it "should have an overall lead time" do
48
+ stub_all_requests
49
+ totals[:lead_time][:overall].should == 4512370
50
+ end
33
51
 
34
- let(:actions_json) {
35
- {
36
- "1111" => File.read(File.expand_path("../../../fixtures/actions.1111.json", __FILE__)),
37
- "2222" => File.read(File.expand_path("../../../fixtures/actions.2222.json", __FILE__)),
38
- "3333" => File.read(File.expand_path("../../../fixtures/actions.3333.json", __FILE__)),
39
- "4444" => File.read(File.expand_path("../../../fixtures/actions.4444.json", __FILE__))
40
- }
41
- }
52
+ it "should have an overall queue time" do
53
+ stub_all_requests
54
+ totals[:queue_time][:overall].should == 2697355
55
+ end
42
56
 
43
- subject { TrelloLeadTime::Board.from_url(board_url) }
57
+ it "should have an overall cycle time" do
58
+ stub_all_requests
59
+ totals[:cycle_time][:overall].should == 1815015
60
+ end
44
61
 
45
- it "should return a board" do
46
- stub_board_requests
47
- subject.should be_an_instance_of(TrelloLeadTime::Board)
62
+ it "should have an overall age" do
63
+ stub_all_requests
64
+ totals[:age][:overall].should == 4512370
65
+ end
66
+ end
67
+
68
+ describe ".averages" do
69
+ let(:averages) { subject.averages(list_with_done_cards) }
70
+
71
+ it "should have an overall lead time" do
72
+ stub_all_requests
73
+ averages[:lead_time][:overall].should == 1128093
48
74
  end
49
75
 
50
- it "should have a lead time" do
51
- stub_board_requests
52
- stub_list_requests
53
- stub_card_requests
54
- lead_time = subject.average_lead_time(list_with_done_cards)
55
- # 13 days 1 hours 21 minutes 33 seconds
56
- lead_time.should == 1128093
76
+ it "should have an overall queue time" do
77
+ stub_all_requests
78
+ averages[:queue_time][:overall].should == 674339
57
79
  end
58
80
 
59
- it "should have a queue time" do
60
- stub_board_requests
61
- stub_list_requests
62
- stub_card_requests
63
- queue_time = subject.average_queue_time(list_with_done_cards)
64
- # 7 days 19 hours 18 minutes 59 seconds
65
- queue_time.should == 674339
81
+ it "should have an overall cycle time" do
82
+ stub_all_requests
83
+ averages[:cycle_time][:overall].should == 453754
66
84
  end
67
85
 
68
- it "should have a cycle time" do
69
- stub_board_requests
70
- stub_list_requests
71
- stub_card_requests
72
- cycle_time = subject.average_cycle_time(list_with_done_cards)
73
- # 5 days 6 hours 2 minutes 34 seconds
74
- cycle_time.should == 453754
86
+ it "should have an overall age" do
87
+ stub_all_requests
88
+ averages[:age][:overall].should == 1128093
75
89
  end
76
90
  end
77
91
 
78
92
  private
79
93
 
94
+ def stub_all_requests
95
+ stub_board_requests
96
+ stub_list_requests
97
+ stub_card_requests
98
+ end
99
+
80
100
  def stub_board_requests
81
101
  stub_request(:get, "https://api.trello.com/1/organizations/wellmatch?key=#{key}&token=#{token}").
82
102
  with(headers).
@@ -9,16 +9,64 @@ describe TrelloLeadTime::Card do
9
9
  let(:actions_json) {
10
10
  File.read(File.expand_path("../../../fixtures/actions.1111.json", __FILE__))
11
11
  }
12
+ let(:labels_json) {
13
+ File.read(File.expand_path("../../../fixtures/labels.json", __FILE__))
14
+ }
15
+ let(:comments_json) {
16
+ File.read(File.expand_path("../../../fixtures/comments.json", __FILE__))
17
+ }
12
18
 
13
- describe ".done" do
14
- subject { TrelloLeadTime::Card.from_trello_card(Trello::Card.parse(card_json)) }
19
+ subject { TrelloLeadTime::Card.from_trello_card(Trello::Card.parse(card_json)) }
15
20
 
16
- it "should be a card" do
17
- stub_request(:get, "https://api.trello.com/1/cards/533dd01513e035206902124c/actions?filter=createCard,updateCard:idList,updateCard:closed&key=#{key}&token=#{token}").
18
- with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'}).
19
- to_return(:status => 200, :body => actions_json, :headers => {})
21
+ def do_stubs(key, token)
22
+ stub_request(:get, "https://api.trello.com/1/cards/533dd01513e035206902124c/actions?filter=createCard,updateCard:idList,updateCard:closed&key=#{key}&token=#{token}").
23
+ with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'}).
24
+ to_return(:status => 200, :body => actions_json, :headers => {})
25
+
26
+ stub_request(:get, "https://api.trello.com/1/cards/533dd01513e035206902124c/labels?key=#{key}&token=#{token}").
27
+ with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'}).
28
+ to_return(:status => 200, :body => labels_json, :headers => {})
20
29
 
30
+ stub_request(:get, "https://api.trello.com/1/cards/533dd01513e035206902124c/actions?filter=commentCard&key=#{key}&token=#{token}").
31
+ with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'}).
32
+ to_return(:status => 200, :body => comments_json, :headers => {})
33
+ end
34
+
35
+ describe ".done" do
36
+ it "should be a card" do
37
+ do_stubs(key, token)
21
38
  subject.should be_an_instance_of(TrelloLeadTime::Card)
22
39
  end
23
40
  end
41
+
42
+ describe ".hash_tags" do
43
+ it "should have a hash tag" do
44
+ do_stubs(key, token)
45
+ expect(subject.hash_tags).to eq(['#myhashtag'])
46
+ end
47
+ end
48
+
49
+ describe ".has_label_name?" do
50
+ it "should not have a named label" do
51
+ do_stubs(key, token)
52
+ subject.has_label_name?("blah").should be_false
53
+ end
54
+
55
+ it "should have a named label" do
56
+ do_stubs(key, token)
57
+ subject.has_label_name?("ios").should be_true
58
+ end
59
+ end
60
+
61
+ describe ".has_label_color?" do
62
+ it "should not have a color label" do
63
+ do_stubs(key, token)
64
+ subject.has_label_color?("yellow").should be_false
65
+ end
66
+
67
+ it "should have a color label" do
68
+ do_stubs(key, token)
69
+ subject.has_label_color?("Green").should be_true
70
+ end
71
+ end
24
72
  end
@@ -1,50 +1,63 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe TrelloLeadTime::Config do
4
- describe ".add_queue_time_list" do
5
- subject { TrelloLeadTime::Config }
6
-
7
- it "should have default empty list for queue time lists" do
8
- TrelloLeadTime.configure do |cfg|
9
- cfg.queue_time_lists = nil
10
- end
11
- subject.queue_time_lists.should be_empty
4
+ subject { TrelloLeadTime::Config }
5
+ before(:all) do
6
+ @cfg = {
7
+ organization_name: TrelloLeadTime::Config.organization_name,
8
+ queue_time_lists: TrelloLeadTime::Config.queue_time_lists,
9
+ cycle_time_lists: TrelloLeadTime::Config.cycle_time_lists,
10
+ list_name_matcher_for_done: TrelloLeadTime::Config.list_name_matcher_for_done
11
+ }
12
+ end
13
+
14
+ after(:all) do
15
+ TrelloLeadTime.configure do |cfg|
16
+ cfg.queue_time_lists = @cfg[:queue_time_lists]
17
+ cfg.cycle_time_lists = @cfg[:cycle_time_lists]
18
+ cfg.organization_name = @cfg[:organization_name]
19
+ cfg.list_name_matcher_for_done = @cfg[:list_name_matcher_for_done]
12
20
  end
21
+ end
13
22
 
14
- it "should set queue time lists" do
15
- TrelloLeadTime.configure do |cfg|
16
- cfg.queue_time_lists = ["my list"]
17
- end
18
- subject.queue_time_lists.should include("my list")
23
+ it "should have default empty list for queue time lists" do
24
+ TrelloLeadTime.configure do |cfg|
25
+ cfg.queue_time_lists = nil
19
26
  end
27
+ subject.queue_time_lists.should be_empty
28
+ end
20
29
 
21
- it "should have default empty list for cycle time lists" do
22
- TrelloLeadTime.configure do |cfg|
23
- cfg.cycle_time_lists = nil
24
- end
25
- subject.cycle_time_lists.should be_empty
30
+ it "should set queue time lists" do
31
+ TrelloLeadTime.configure do |cfg|
32
+ cfg.queue_time_lists = ["my list"]
26
33
  end
34
+ subject.queue_time_lists.should include("my list")
35
+ end
27
36
 
28
- it "should set cycle time lists" do
29
- TrelloLeadTime.configure do |cfg|
30
- cfg.cycle_time_lists = ["my list"]
31
- end
32
- subject.cycle_time_lists.should include("my list")
37
+ it "should have default empty list for cycle time lists" do
38
+ TrelloLeadTime.configure do |cfg|
39
+ cfg.cycle_time_lists = nil
33
40
  end
41
+ subject.cycle_time_lists.should be_empty
42
+ end
34
43
 
35
- it "should have default done matcher" do
36
- TrelloLeadTime.configure do |cfg|
37
- cfg.list_name_matcher_for_done = nil
38
- end
39
- expect(subject.list_name_matcher_for_done).to eq(/^Done/i)
44
+ it "should set cycle time lists" do
45
+ TrelloLeadTime.configure do |cfg|
46
+ cfg.cycle_time_lists = ["my list"]
40
47
  end
48
+ subject.cycle_time_lists.should include("my list")
49
+ end
41
50
 
42
- it "should set a default done matcher" do
43
- TrelloLeadTime.configure do |cfg|
44
- cfg.list_name_matcher_for_done = /^Live/
45
- end
46
- expect(subject.list_name_matcher_for_done).to eq(/^Live/)
51
+ it "should have default done matcher" do
52
+ TrelloLeadTime.configure do |cfg|
53
+ cfg.list_name_matcher_for_done = nil
47
54
  end
55
+ expect(subject.list_name_matcher_for_done).to eq(/^Done/i)
56
+ end
48
57
 
58
+ it "should set a default done matcher" do
59
+ TrelloLeadTime.configure do |cfg|
60
+ cfg.list_name_matcher_for_done = /^Live/ end
61
+ expect(subject.list_name_matcher_for_done).to eq(/^Live/)
49
62
  end
50
63
  end
@@ -1,6 +1,100 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe TrelloLeadTime::List do
4
- describe ".average_lead_time" do
4
+ let(:key) { "key" }
5
+ let(:token) { "token" }
6
+
7
+ let(:list) {
8
+ l = Trello::List.new
9
+ l.attributes[:id] = 12345
10
+ l.attributes[:name] = 'Test List'
11
+ l.attributes[:closed] = false
12
+ l.attributes[:board_id] = 67890
13
+ l.attributes[:pos] = 1
14
+ l
15
+ }
16
+
17
+ let(:cards_json) {
18
+ File.read(File.expand_path("../../../fixtures/cards.json", __FILE__))
19
+ }
20
+
21
+ let(:actions_json) {
22
+ {
23
+ "1111" => File.read(File.expand_path("../../../fixtures/actions.1111.json", __FILE__)),
24
+ "2222" => File.read(File.expand_path("../../../fixtures/actions.2222.json", __FILE__)),
25
+ "3333" => File.read(File.expand_path("../../../fixtures/actions.3333.json", __FILE__)),
26
+ "4444" => File.read(File.expand_path("../../../fixtures/actions.4444.json", __FILE__))
27
+ }
28
+ }
29
+
30
+ subject { TrelloLeadTime::List.from_trello_list(list) }
31
+
32
+ it "should have an average age" do
33
+ stub_all_requests
34
+ subject.average_age.should == 1128093
35
+ end
36
+
37
+ it "should have a total age" do
38
+ stub_all_requests
39
+ subject.total_age.should == 4512370
40
+ end
41
+
42
+ it "should have a average lead time" do
43
+ stub_all_requests
44
+ subject.average_lead_time.should == 1128093
45
+ end
46
+
47
+ it "should have a total lead time" do
48
+ stub_all_requests
49
+ subject.total_lead_time.should == 4512370
50
+ end
51
+
52
+ it "should have a average queue time" do
53
+ stub_all_requests
54
+ subject.average_queue_time.should == 674339
55
+ end
56
+
57
+ it "should have a total queue time" do
58
+ stub_all_requests
59
+ subject.total_queue_time.should == 2697355
60
+ end
61
+
62
+ it "should have a average cycle time" do
63
+ stub_all_requests
64
+ subject.average_cycle_time.should == 453754
65
+ end
66
+
67
+ it "should have a total cycle time" do
68
+ stub_all_requests
69
+ subject.total_cycle_time.should == 1815015
70
+ end
71
+
72
+ private
73
+
74
+ def stub_all_requests
75
+ stub_list_requests
76
+ stub_card_requests
77
+ end
78
+
79
+ def stub_list_requests
80
+ stub_request(:get, "https://api.trello.com/1/lists/#{list.id}/cards?filter=open&key=#{key}&token=#{token}").
81
+ with(headers).
82
+ to_return(stub_returns(cards_json))
83
+ end
84
+
85
+ def stub_card_requests
86
+ %w{1111 2222 3333 4444}.each do |card_id|
87
+ stub_request(:get, "https://api.trello.com/1/cards/#{card_id}/actions?filter=createCard,updateCard:idList,updateCard:closed&key=#{key}&token=#{token}").
88
+ with(headers).
89
+ to_return(stub_returns(actions_json[card_id]))
90
+ end
91
+ end
92
+
93
+ def headers
94
+ { headers: {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'} }
95
+ end
96
+
97
+ def stub_returns(json)
98
+ { status: 200, body: json, headers: {} }
5
99
  end
6
100
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trello_lead_time
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Baldwin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-07 00:00:00.000000000 Z
11
+ date: 2014-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,6 +86,8 @@ files:
86
86
  - spec/fixtures/boards.json
87
87
  - spec/fixtures/card.json
88
88
  - spec/fixtures/cards.json
89
+ - spec/fixtures/comments.json
90
+ - spec/fixtures/labels.json
89
91
  - spec/fixtures/lists.json
90
92
  - spec/fixtures/organization.json
91
93
  - spec/lib/trello_lead_time/array_matcher_spec.rb
@@ -129,6 +131,8 @@ test_files:
129
131
  - spec/fixtures/boards.json
130
132
  - spec/fixtures/card.json
131
133
  - spec/fixtures/cards.json
134
+ - spec/fixtures/comments.json
135
+ - spec/fixtures/labels.json
132
136
  - spec/fixtures/lists.json
133
137
  - spec/fixtures/organization.json
134
138
  - spec/lib/trello_lead_time/array_matcher_spec.rb