trello-pipes 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWZlMzM3MWJhOGRmODk0MWIyMTIyZTFlYTUwOGIxMDRjZmUxNTZhNQ==
4
+ MjhkMGQ3YWNmZDRkYjRlN2RmN2ZlZjFlZGZjZWQ3MjJhODhhMDBmMA==
5
5
  data.tar.gz: !binary |-
6
- OWJkNjQxOWFjNDdlYjFiOWI5NmNlZWEyMDM2Yzg3MTlkMWNjNTY0NQ==
6
+ YmNkNTc2NDRkOTE2OWZhNWJlOTI3ZTM4NmM1NWNiYmNkZTA2N2I1OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MjdhZGUzOWRmM2ZlZTg2MmFiNmZjYTQ1ODhlYjg0MDRiZmQwMjQwMTRjMWRj
10
- YjkwMDQyNjUwY2QxMGZiMGE0MjBkNDg5NmQ3MjIyNGI3ZDZjNWExMWY5OGJk
11
- MTEyMWU2NTVjNTJlZjI4ZDQ0YWEyM2Q2NWU5M2Y3YWVlYjk3Zjc=
9
+ MThkN2I2OGU5MDk2ZTljZDFhMjQ3NDY2YTMwMDhiMzFiZDY5ZWRkNTk0YTc4
10
+ MTFhOWVkZTUwNDY0ODg1NmU0ODg3ZGU3OTNlZDU4M2NhNDU1OWE1ZGQwNTM0
11
+ M2ZlZTRmMjY3MTg1MTM1MjA5ZGM0YjkwYTE4NzRkNjQxODAxYjQ=
12
12
  data.tar.gz: !binary |-
13
- YjM3ODVhZDBhYTM3NWQxYzFmYWUwNzgwYWM4MmEwNzhkYWE5MDUxN2VmNDk2
14
- ZDk0OTI2ZWNiZmEzNThlNmNjOTZjMWUzNWVmMGEzYTgyZjQxMmM5MzA4YTkz
15
- NzIzYjc1YjZlMDdmY2NmYzUzZmI4YTc5NjFhNjY5NzBjZjU3M2Q=
13
+ ZTEyMDdhOTllNDQ2MWNlZmIxZTVhNjIyNDBiYTYyZTRmNTU1ODgwMDk1MDhj
14
+ MjJmNzc5M2RkNDE0NmNhMTdkZTkwZDg5ZWZmYTYxMTZkMzhjNDcwOWM5OThj
15
+ OGUyNDQ1ZmE1YTFjZTVjYTQzNTAxOGNiMmI0YWJlY2UxNjBmZGQ=
@@ -0,0 +1,26 @@
1
+ module TrelloPipes
2
+ class VelocityCalculatorAdapter
3
+ def initialize(successor)
4
+ @successor = successor
5
+ end
6
+
7
+ def push(cards)
8
+ complexity = 0
9
+ complexity = cards.inject(complexity) do |complexity, card|
10
+ complexity + CardComplexity.new(card).complexity
11
+ end
12
+ @successor.push(complexity)
13
+ end
14
+ end
15
+
16
+ class CardComplexity
17
+ attr_reader :complexity
18
+
19
+ COMPLEXITY_REGEX = /\(\d*\)/
20
+
21
+ def initialize(trello_card)
22
+ complexity_match = trello_card.name.match(COMPLEXITY_REGEX)
23
+ @complexity = (complexity_match.to_s.delete! '()').to_i
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ module TrelloPipes
2
+ class CardContainsComplexityFilter
3
+ def initialize(successor)
4
+ @successor = successor
5
+ end
6
+
7
+ def push(cards)
8
+ complexity_cards = cards.select { | card | card.name.match(/\(\d*\)/)}
9
+ @successor.push(complexity_cards)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,66 @@
1
+ require 'time'
2
+
3
+ module TrelloPipes
4
+ class EnteredListAfterDateFilter
5
+ def initialize(successor, date, list_name, trello_board)
6
+ @successor = successor
7
+ @list_name = list_name
8
+ @date = Time.parse(date.to_s)
9
+ @subsequent_list_names =
10
+ SubsequentListNameRepository.new(trello_board, list_name).get
11
+ end
12
+
13
+ def push(cards)
14
+ matching_cards = cards.select do | card |
15
+ movement_action = find_movement_action(card.actions, @list_name, @subsequent_list_names)
16
+ movement_action.date > @date
17
+ end
18
+ @successor.push(matching_cards)
19
+ end
20
+
21
+ private
22
+ def find_movement_action(actions, list_name, subsequent_list_names)
23
+ specification = MovementIntoListSpecification.new(list_name)
24
+ movement_action = actions.find do | action |
25
+ specification.is_satisified_by(action)
26
+ end
27
+ return movement_action unless movement_action.nil?
28
+ return NullMovementAction.new if subsequent_list_names.empty?
29
+ head, *tail = subsequent_list_names
30
+ return find_movement_action(actions, head, tail)
31
+ end
32
+ end
33
+
34
+ class MovementIntoListSpecification
35
+ MOVE_INTO_LIST_ACTION = 'updateCard'
36
+ def initialize(list_name)
37
+ @list_name = list_name
38
+ end
39
+
40
+ def is_satisified_by(action)
41
+ (action.type == MOVE_INTO_LIST_ACTION &&
42
+ action.data && action.data['listAfter'] &&
43
+ action.data['listAfter']['name'].include?(@list_name))
44
+ end
45
+ end
46
+
47
+ class NullMovementAction
48
+ attr_reader :date
49
+
50
+ def initialize
51
+ date = Time.at(0)
52
+ end
53
+ end
54
+
55
+ class SubsequentListNameRepository
56
+ def initialize(trello_board, list_name)
57
+ list_names = trello_board.lists.map {|list| list.name}
58
+ list_index = list_names.index {|name| name.match(list_name)}
59
+ @subsequent_list_names = list_names.slice(list_index+1, list_names.size-1)
60
+ end
61
+
62
+ def get()
63
+ @subsequent_list_names
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,27 @@
1
+ module TrelloPipes
2
+ class CardsAfterAndIncludingListProducer
3
+ def initialize(successor, trello_board)
4
+ @successor = successor
5
+ @trello_board = trello_board
6
+ end
7
+
8
+ def produce(list_name)
9
+ lists = get_lists_after_and_including(list_name)
10
+ cards = all_cards_from(lists)
11
+ @successor.push(cards)
12
+ end
13
+
14
+ private
15
+ def get_lists_after_and_including(list_name)
16
+ list_index = @trello_board.lists.index { | list | list.name.match(list_name) }
17
+ return [] if list_index.nil?
18
+ @trello_board.lists.slice(list_index, @trello_board.lists.size)
19
+ end
20
+
21
+ def all_cards_from(lists)
22
+ return [] if lists.empty?
23
+ head, *tail = lists
24
+ return head.cards + all_cards_from(tail)
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trello-pipes
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - iainjmitchell
@@ -43,7 +43,11 @@ email: iainjmitchell@gmail.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
- files: []
46
+ files:
47
+ - lib/adapters/VelocityCalculatorAdapter.rb
48
+ - lib/filters/CardContainsComplexityFilter.rb
49
+ - lib/filters/EnteredListAfterDateFilter.rb
50
+ - lib/producers/CardsAfterAndIncludingListProducer.rb
47
51
  homepage: https://github.com/iainjmitchell/trello-pipes
48
52
  licenses:
49
53
  - MIT