TrelloCycleTime 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/AverageCycleTimeCalculator.rb +16 -0
- data/lib/CardHistory.rb +23 -0
- data/lib/CardRepository.rb +22 -0
- data/lib/CompletedCard.rb +11 -0
- data/lib/CompletedCardFactory.rb +23 -0
- data/lib/CompletedCardRepository.rb +26 -0
- data/lib/TrelloCredentials.rb +10 -0
- data/lib/TrelloCycleTime.rb +25 -0
- data/lib/TrelloFactory.rb +23 -0
- metadata +80 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Y2RhOTdkNGY4M2E0YTQ0MTAyMWZiZDMzZjRlNTFiZTQxN2Y1ZmI5Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NGMwMzFiZGViYjViYzRmMzY3OWU4MzMxNTM4YTMxYmY3OTFhNmZhMw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NzA3ODVlYzFjYTM4NzljZjVlMmI5NjIxYjkyY2FmYjVmOTQ3MTI1M2MwYmZm
|
10
|
+
YWE1NTczODRjZTQyN2FkZGQwMmVkOGI0YWE1MTBkMDY5OWQzNmNlMDY3ZmEy
|
11
|
+
ZTFlNmM4OWMxNmUwYTE3MDkzZjg1ZTRjZDUwY2RhYjQwZTM4MTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MTdiZGFiYWQ3NzZiNjk5YmFlY2QyZWE2NWMyMDMzM2JjZTRmN2NkMTFhMDky
|
14
|
+
ZDFjYTU3YzE3ODY0OWM3OGI2OGJhNzRlNjUyOWJhYjkwNDFjOTMzMjg5NDQy
|
15
|
+
ZjhmMjFlNjk0MWRlMDliNzMwYjAzOGI1YWVmYTk5MDQ2ZTVhZTc=
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AgileTrello
|
2
|
+
class AverageCycleTimeCalculator
|
3
|
+
def initialize
|
4
|
+
@cycle_times = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def add(cycle_time)
|
8
|
+
@cycle_times.push(cycle_time)
|
9
|
+
end
|
10
|
+
|
11
|
+
def average
|
12
|
+
return 0 if @cycle_times.length == 0
|
13
|
+
(@cycle_times.reduce(:+) / @cycle_times.length).round(2)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/CardHistory.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module AgileTrello
|
2
|
+
class CardHistory
|
3
|
+
MOVEMENT_ACTION_TYPE = 'updateCard'
|
4
|
+
MOVEMENT_DATA_ATTRIBUTE = 'listAfter'
|
5
|
+
MOVEMENT_DATA_LIST_NAME = 'name'
|
6
|
+
|
7
|
+
def initialize(trello_card, all_lists_on_board)
|
8
|
+
@card_movements = trello_card.actions.select do | action |
|
9
|
+
action.type == MOVEMENT_ACTION_TYPE && !action.data[MOVEMENT_DATA_ATTRIBUTE].nil?
|
10
|
+
end
|
11
|
+
@all_lists_on_board = all_lists_on_board
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_date_entered_list(list_name)
|
15
|
+
@card_movements.each do |movement|
|
16
|
+
return movement.date if movement.data[MOVEMENT_DATA_ATTRIBUTE][MOVEMENT_DATA_LIST_NAME].include?(list_name)
|
17
|
+
end
|
18
|
+
current_index = @all_lists_on_board.index { |board_list_name| board_list_name.include? list_name }
|
19
|
+
next_list_name = @all_lists_on_board[current_index + 1]
|
20
|
+
find_date_entered_list(next_list_name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module AgileTrello
|
2
|
+
class CardRepository
|
3
|
+
def initialize(trello, parameters)
|
4
|
+
@trello_board = trello.get_board(parameters[:board_id])
|
5
|
+
@end_list = parameters[:end_list]
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_cards_after
|
9
|
+
cards_after = []
|
10
|
+
ignore = true
|
11
|
+
@trello_board.lists.each do | list |
|
12
|
+
ignore = !list.name.include?(@end_list) if ignore
|
13
|
+
if !ignore
|
14
|
+
list.cards.each do | card |
|
15
|
+
cards_after.push(card)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
return cards_after
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'CompletedCard'
|
2
|
+
require_relative 'CardHistory'
|
3
|
+
|
4
|
+
module AgileTrello
|
5
|
+
class CompletedCardFactory
|
6
|
+
MOVEMENT_ACTION_TYPE = 'updateCard'
|
7
|
+
MOVEMENT_DATA_ATTRIBUTE = 'listAfter'
|
8
|
+
MOVEMENT_DATA_LIST_NAME = 'name'
|
9
|
+
|
10
|
+
def initialize(parameters)
|
11
|
+
@start_list = parameters[:start_list]
|
12
|
+
@end_list = parameters[:end_list]
|
13
|
+
@all_lists = parameters[:all_lists]
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(trello_card)
|
17
|
+
card_history = CardHistory.new(trello_card, @all_lists)
|
18
|
+
start_date = card_history.find_date_entered_list(@start_list)
|
19
|
+
end_date = card_history.find_date_entered_list(@end_list)
|
20
|
+
CompletedCard.new(start_date, end_date)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './CompletedCardFactory'
|
2
|
+
require_relative './CardRepository'
|
3
|
+
|
4
|
+
module AgileTrello
|
5
|
+
class CompletedCardRepository
|
6
|
+
def initialize(trello, parameters)
|
7
|
+
trello_board = trello.get_board(parameters[:board_id])
|
8
|
+
all_lists_on_board = trello_board.lists.map do |list|
|
9
|
+
list.name
|
10
|
+
end
|
11
|
+
@card_repository = CardRepository.new(trello, parameters)
|
12
|
+
@completed_card_factory = CompletedCardFactory.new(
|
13
|
+
start_list: parameters[:start_list],
|
14
|
+
end_list: parameters[:end_list],
|
15
|
+
all_lists: all_lists_on_board
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get
|
20
|
+
completed_cards = @card_repository.get_cards_after
|
21
|
+
completed_cards.map do |card|
|
22
|
+
@completed_card_factory.create(card)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'peach'
|
2
|
+
require_relative './TrelloFactory'
|
3
|
+
require_relative './TrelloCredentials'
|
4
|
+
require_relative './AverageCycleTimeCalculator'
|
5
|
+
require_relative './CompletedCardRepository'
|
6
|
+
|
7
|
+
module AgileTrello
|
8
|
+
class TrelloCycleTime
|
9
|
+
def initialize(parameters = {})
|
10
|
+
trello_credentials = TrelloCredentials.new(parameters[:public_key], parameters[:access_token])
|
11
|
+
trello_factory = parameters[:trello_factory].nil? ? TrelloFactory.new : parameters[:trello_factory]
|
12
|
+
@trello = trello_factory.create(trello_credentials)
|
13
|
+
@average_cycle_time_calculator = AverageCycleTimeCalculator.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(parameters)
|
17
|
+
completed_card_repository = CompletedCardRepository.new(@trello, parameters)
|
18
|
+
finished_cards = completed_card_repository.get
|
19
|
+
finished_cards.peach do | card |
|
20
|
+
@average_cycle_time_calculator.add(card.cycle_time)
|
21
|
+
end
|
22
|
+
return @average_cycle_time_calculator.average
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'trello'
|
2
|
+
|
3
|
+
module AgileTrello
|
4
|
+
class TrelloFactory
|
5
|
+
include Trello
|
6
|
+
include Trello::Authorization
|
7
|
+
|
8
|
+
def create(trello_credentials)
|
9
|
+
Trello::Authorization.const_set :AuthPolicy, OAuthPolicy
|
10
|
+
OAuthPolicy.consumer_credential = OAuthCredential.new trello_credentials.public_key, 'SECRET'
|
11
|
+
OAuthPolicy.token = OAuthCredential.new trello_credentials.access_token, nil
|
12
|
+
TrelloRepository.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TrelloRepository
|
17
|
+
include Trello
|
18
|
+
|
19
|
+
def get_board(board_id)
|
20
|
+
Board.find board_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: TrelloCycleTime
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- iainjmitchell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-trello
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: peach
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description:
|
42
|
+
email: iainjmitchell@gmail.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/AverageCycleTimeCalculator.rb
|
48
|
+
- lib/CardHistory.rb
|
49
|
+
- lib/CardRepository.rb
|
50
|
+
- lib/CompletedCard.rb
|
51
|
+
- lib/CompletedCardFactory.rb
|
52
|
+
- lib/CompletedCardRepository.rb
|
53
|
+
- lib/TrelloCredentials.rb
|
54
|
+
- lib/TrelloCycleTime.rb
|
55
|
+
- lib/TrelloFactory.rb
|
56
|
+
homepage: https://github.com/code-computerlove/trello-cycletime
|
57
|
+
licenses:
|
58
|
+
- MIT
|
59
|
+
metadata: {}
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 2.2.2
|
77
|
+
signing_key:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Calculates cycle time from cards on a trello board
|
80
|
+
test_files: []
|