github_to_trello 0.1.7 → 1.0.1
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.
- checksums.yaml +4 -4
- data/README.md +12 -13
- data/Rakefile +8 -0
- data/lib/github_to_trello.rb +23 -13
- data/lib/github_to_trello/trello_gateway.rb +29 -24
- data/lib/github_to_trello/version.rb +1 -1
- data/spec/github_to_trello_spec.rb +72 -0
- data/spec/trello_gateway_spec.rb +43 -73
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd3e8b6451343b1932c592870f3be9f61380093c
|
4
|
+
data.tar.gz: 1ed2be860f48fd7fd8a3d2648b3b95323b7d9770
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e782588a8543a84222810c9ab564471e5a5ff2d3f81a6eba262cbafee3e450246c63466f329a2d6c6df321b1705adbe39c87d9c79a677ccc655fed490c055ea2
|
7
|
+
data.tar.gz: 54e6581dfe3bef43f741c374a963d6ab3bc87c790b82b364339e43af5de1c91b0aa55772e419eceedcefd149e94ec1b2e9f32016fb6a980d91622bb9c87c76b0
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
## Overview
|
2
|
-
Generates trello cards on a specified board for all open issues in specified github repo(s).
|
2
|
+
Generates trello cards on a specified board for all open issues in specified github repo(s).
|
3
3
|
|
4
4
|
## Usage
|
5
5
|
|
@@ -9,12 +9,12 @@ After completing [prerequisites](#prerequisites):
|
|
9
9
|
```
|
10
10
|
require 'github_to_trello'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
GithubToTrello.new(
|
13
|
+
:public_key => "your_public_key",
|
14
|
+
:token => "your_token",
|
15
|
+
:board_id => "your_trello_board_id",
|
16
|
+
:inbox_name => "your_name/your_repo",
|
17
|
+
).update
|
18
18
|
```
|
19
19
|
|
20
20
|
## Prerequisites
|
@@ -23,15 +23,14 @@ GithubToTrello.new(public_key, token, board_id, repo_name).update
|
|
23
23
|
2. A public key and token giving access to that trello account
|
24
24
|
- `PUBLIC_KEY` - Log into trello and visit https://trello.com/app-key
|
25
25
|
- `TOKEN` - Go to
|
26
|
-
https://trello.com/1/connect?key
|
27
|
-
(substituting
|
26
|
+
https://trello.com/1/connect?key=<...>&name=MyApp&response_type=token&scope=read,write
|
27
|
+
(substituting your public key for <...> and replacing 'MyApp' with a unique name)
|
28
28
|
|
29
29
|
## Features
|
30
|
-
- Creates a list for specified repo
|
31
|
-
-
|
32
|
-
"Done" list for recently completed issues
|
33
|
-
- Adds or updates cards for all open issues or PRs in that repo
|
30
|
+
- Creates a list for specified repo
|
31
|
+
- Adds cards for all open issues or PRs in that repo
|
34
32
|
|
35
33
|
Sites used for reference
|
36
34
|
- http://www.sitepoint.com/customizing-trello-ruby/
|
37
35
|
- https://github.com/jeremytregunna/ruby-trello/blob/master/lib/trello/card.rb
|
36
|
+
|
data/Rakefile
CHANGED
data/lib/github_to_trello.rb
CHANGED
@@ -5,12 +5,17 @@ require 'trello'
|
|
5
5
|
|
6
6
|
|
7
7
|
class GithubToTrello
|
8
|
-
def initialize(
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def initialize(options)
|
9
|
+
[:public_key, :token, :board_id, :repo_name].each do |required_field|
|
10
|
+
_raise_argument_error(required_field) unless options[required_field]
|
11
|
+
end
|
12
|
+
|
13
|
+
@github_gateway = GithubGateway.new(options[:repo_name])
|
14
|
+
@trello_gateway = TrelloGateway.new(
|
15
|
+
{
|
16
|
+
:inbox_name => options[:repo_name],
|
17
|
+
}.merge(options)
|
18
|
+
)
|
14
19
|
end
|
15
20
|
|
16
21
|
def update
|
@@ -18,19 +23,24 @@ class GithubToTrello
|
|
18
23
|
@trello_gateway.create_or_update_card(issue)
|
19
24
|
end
|
20
25
|
end
|
26
|
+
|
27
|
+
def _raise_argument_error(field)
|
28
|
+
raise ArgumentError, "Argument '#{field}' is required yet missing"
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
# Example usage with dotenv gem and .env file
|
24
33
|
#
|
25
34
|
# if __FILE__ == $PROGRAM_NAME
|
26
|
-
#
|
27
|
-
# token = ENV["TOKEN"]
|
28
|
-
# board_id = ENV["BOARD_ID"]
|
29
|
-
# repos = ENV["REPOS"].split(",")
|
30
|
-
#
|
31
|
-
# repos.each do |repo|
|
35
|
+
# ENV["REPOS"].split(",").each do |repo|
|
32
36
|
# puts "Updating repo: #{repo}"
|
33
|
-
#
|
37
|
+
#
|
38
|
+
# GithubToTrello.new(
|
39
|
+
# :public_key => ENV["PUBLIC_KEY"],
|
40
|
+
# :token => ENV["TOKEN"],
|
41
|
+
# :board_id => ENV["BOARD_ID"],
|
42
|
+
# :repo_name => repo,
|
43
|
+
# ).update
|
34
44
|
# end
|
35
45
|
# end
|
36
46
|
|
@@ -5,37 +5,48 @@ DAYS_TIL_OLD = 14
|
|
5
5
|
DAYS_TIL_REALLY_OLD = 28
|
6
6
|
|
7
7
|
class TrelloGateway
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :board, :inbox
|
9
|
+
|
10
|
+
def initialize(options)
|
11
|
+
[:public_key, :token, :board_id, :inbox_name].each do |required_field|
|
12
|
+
_raise_argument_error(required_field) unless options[required_field]
|
13
|
+
end
|
9
14
|
|
10
|
-
def initialize(public_key, token, board_id, repo_name)
|
11
15
|
Trello.configure do |c|
|
12
|
-
c.developer_public_key = public_key
|
13
|
-
c.member_token = token
|
16
|
+
c.developer_public_key = options[:public_key]
|
17
|
+
c.member_token = options[:token]
|
14
18
|
end
|
15
19
|
|
16
|
-
@board = _board(board_id)
|
17
|
-
@
|
18
|
-
@claimed_list = _list("Claimed")
|
19
|
-
@done_list = _list("Done")
|
20
|
+
@board = _board(options[:board_id])
|
21
|
+
@inbox = _list(options[:inbox_name])
|
20
22
|
end
|
21
23
|
|
22
24
|
def create_or_update_card(issue)
|
23
|
-
existing_card = _existing_card
|
25
|
+
existing_card = _existing_card(issue)
|
24
26
|
existing_card.nil? ? _create_card(issue) : existing_card
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
done_card = _list_contains_issue?(@done_list, issue)
|
29
|
+
def lists
|
30
|
+
board.lists
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
+
def _raise_argument_error(field)
|
34
|
+
raise "Argument '#{field}' is required yet missing"
|
35
|
+
end
|
36
|
+
|
37
|
+
def _existing_card(issue)
|
38
|
+
lists.each do |list|
|
39
|
+
list.cards.each do |card|
|
40
|
+
return card if card.name == issue.title
|
41
|
+
end
|
42
|
+
end
|
43
|
+
nil
|
33
44
|
end
|
34
45
|
|
35
46
|
def _create_card(issue)
|
36
47
|
card = Trello::Card.create(
|
37
48
|
:name => issue.title,
|
38
|
-
:list_id =>
|
49
|
+
:list_id => inbox.id,
|
39
50
|
:desc => issue.body + "\n" + issue.html_url + "\n" + issue.updated_at.to_s,
|
40
51
|
)
|
41
52
|
_add_checklist_to(card)
|
@@ -43,25 +54,19 @@ class TrelloGateway
|
|
43
54
|
end
|
44
55
|
|
45
56
|
def _add_checklist_to(card)
|
46
|
-
checklist = Trello::Checklist.create(:name => "Todo", :board_id =>
|
57
|
+
checklist = Trello::Checklist.create(:name => "Todo", :board_id => board.id)
|
47
58
|
checklist.add_item("Initial Response")
|
48
59
|
card.add_checklist(checklist)
|
49
60
|
end
|
50
61
|
|
51
|
-
def _list_contains_issue?(list, issue)
|
52
|
-
list.cards.detect do |card|
|
53
|
-
card.name == issue.title
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
62
|
def _board(id)
|
58
63
|
Trello::Board.find(id)
|
59
64
|
end
|
60
65
|
|
61
66
|
def _list(name)
|
62
|
-
found_list =
|
67
|
+
found_list = board.lists.detect do |list|
|
63
68
|
list.name =~ /#{name}/
|
64
69
|
end
|
65
|
-
found_list || Trello::List.create(:name => name, :board_id =>
|
70
|
+
found_list || Trello::List.create(:name => name, :board_id => board.id)
|
66
71
|
end
|
67
72
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require_relative '../lib/github_to_trello'
|
3
|
+
|
4
|
+
describe GithubToTrello do
|
5
|
+
before(:all) do
|
6
|
+
@options = {
|
7
|
+
:public_key => "abcdef",
|
8
|
+
:token => "ghilmnopqrstuvwxyz",
|
9
|
+
:board_id => "123456",
|
10
|
+
:repo_name => "chrissiedeist/django_blog",
|
11
|
+
:inbox_name => "django_blog",
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "new" do
|
16
|
+
it "sets up github and trello gateways" do
|
17
|
+
expect(GithubGateway).to receive(:new).with(@options[:repo_name])
|
18
|
+
expect(TrelloGateway).to receive(:new).with(@options)
|
19
|
+
|
20
|
+
gateway = GithubToTrello.new(@options)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "defaults to repository name when inbox isn't provided" do
|
24
|
+
allow(GithubGateway).to receive(:new).with(@options[:repo_name])
|
25
|
+
|
26
|
+
@options.delete(:inbox_name)
|
27
|
+
expected_options = {
|
28
|
+
:inbox_name => @options[:repo_name],
|
29
|
+
}.merge(@options)
|
30
|
+
|
31
|
+
expect(TrelloGateway).to receive(:new).with(expected_options)
|
32
|
+
|
33
|
+
gateway = GithubToTrello.new(@options)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "raises an error if any mandatory fields aren't passed" do
|
37
|
+
required_fields = [:public_key, :token, :board_id, :repo_name]
|
38
|
+
|
39
|
+
(1..3).each do |field_count|
|
40
|
+
required_fields.combination(field_count).to_a.each do |field_combo|
|
41
|
+
bad_options = {}
|
42
|
+
field_combo.each do |field|
|
43
|
+
bad_options[field] = @options[field]
|
44
|
+
end
|
45
|
+
|
46
|
+
expect{ GithubToTrello.new(bad_options)}.to raise_error(ArgumentError)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "update" do
|
53
|
+
it "iterates over issues" do
|
54
|
+
issues = ["first", "second", "third"]
|
55
|
+
fake_github_gateway = fake_trello_gateway = double()
|
56
|
+
|
57
|
+
|
58
|
+
allow(GithubGateway).to receive(:new).and_return(fake_github_gateway)
|
59
|
+
allow(TrelloGateway).to receive(:new).and_return(fake_trello_gateway)
|
60
|
+
|
61
|
+
gateway = GithubToTrello.new(@options)
|
62
|
+
|
63
|
+
expect(fake_github_gateway).to receive(:issues).and_return(issues)
|
64
|
+
|
65
|
+
issues.each do |issue|
|
66
|
+
expect(fake_trello_gateway).to receive(:create_or_update_card).with(issue)
|
67
|
+
end
|
68
|
+
|
69
|
+
gateway.update
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/spec/trello_gateway_spec.rb
CHANGED
@@ -3,12 +3,13 @@ require_relative '../lib/github_to_trello/trello_gateway'
|
|
3
3
|
|
4
4
|
describe TrelloGateway do
|
5
5
|
before(:each) do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
@gateway = TrelloGateway.new(
|
7
|
+
:public_key => "56acdaa7404ebcc8bbaffab18428d4d2",
|
8
|
+
:token => "08f4481d00aba0091592ad9e0ce7e025ac9e238ead31852fe4a75270fbd562e9",
|
9
|
+
:board_id => "5jGWvKui",
|
10
|
+
:inbox_name => "django_blog",
|
11
|
+
)
|
10
12
|
|
11
|
-
@gateway = TrelloGateway.new(public_key, token, board_id, repo)
|
12
13
|
@issue = double(:issue,
|
13
14
|
:title => "Test",
|
14
15
|
:id => "91374795",
|
@@ -21,23 +22,14 @@ describe TrelloGateway do
|
|
21
22
|
after(:each) do
|
22
23
|
@gateway.board.lists.each do |list|
|
23
24
|
list.cards.each(&:delete)
|
25
|
+
list.close!
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
29
|
describe "initialization" do
|
28
|
-
it "
|
29
|
-
expect(@gateway.
|
30
|
-
expect(@gateway.
|
31
|
-
end
|
32
|
-
|
33
|
-
it "has a list called 'Claimed'" do
|
34
|
-
expect(@gateway.list).to be_a Trello::List
|
35
|
-
expect(@gateway.claimed_list.name).to eq("Claimed")
|
36
|
-
end
|
37
|
-
|
38
|
-
it "has a list called 'Done'" do
|
39
|
-
expect(@gateway.list).to be_a Trello::List
|
40
|
-
expect(@gateway.done_list.name).to eq("Done")
|
30
|
+
it "creates the inbox list" do
|
31
|
+
expect(@gateway.inbox).to be_a Trello::List
|
32
|
+
expect(@gateway.inbox.name).to eq("django_blog")
|
41
33
|
end
|
42
34
|
|
43
35
|
it "has a board" do
|
@@ -45,29 +37,21 @@ describe TrelloGateway do
|
|
45
37
|
end
|
46
38
|
end
|
47
39
|
|
48
|
-
describe "_existing_card
|
49
|
-
it "returns the existing trello card if the card exists in
|
40
|
+
describe "_existing_card" do
|
41
|
+
it "returns the existing trello card if the card exists in the inbox folder" do
|
50
42
|
card = @gateway.create_or_update_card(@issue)
|
51
43
|
|
52
|
-
existing_card = @gateway._existing_card
|
44
|
+
existing_card = @gateway._existing_card(@issue)
|
53
45
|
expect(existing_card).to be_a(Trello::Card)
|
54
46
|
expect(existing_card.name).to eq("Test")
|
55
47
|
end
|
56
48
|
|
57
|
-
it "returns the existing trello card if the card exists in the
|
49
|
+
it "returns the existing trello card if the card exists in list other than the inbox" do
|
50
|
+
other_list = Trello::List.create(:name => "some other list", :board_id => @gateway.board.id)
|
58
51
|
card = @gateway.create_or_update_card(@issue)
|
59
|
-
card.move_to_list(
|
52
|
+
card.move_to_list(other_list.id)
|
60
53
|
|
61
|
-
existing_card = @gateway._existing_card
|
62
|
-
expect(existing_card).to be_a(Trello::Card)
|
63
|
-
expect(existing_card.name).to eq("Test")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "returns the existing trello card if the card exists in the 'Done' list" do
|
67
|
-
card = @gateway.create_or_update_card(@issue)
|
68
|
-
card.move_to_list(@gateway.done_list.id)
|
69
|
-
|
70
|
-
existing_card = @gateway._existing_card?(@issue)
|
54
|
+
existing_card = @gateway._existing_card(@issue)
|
71
55
|
expect(existing_card).to be_a(Trello::Card)
|
72
56
|
expect(existing_card.name).to eq("Test")
|
73
57
|
end
|
@@ -83,11 +67,23 @@ describe TrelloGateway do
|
|
83
67
|
|
84
68
|
@gateway.create_or_update_card(not_the_issue)
|
85
69
|
|
86
|
-
existing_card = @gateway._existing_card
|
70
|
+
existing_card = @gateway._existing_card(@issue)
|
87
71
|
expect(existing_card).to be_nil
|
88
72
|
end
|
89
73
|
end
|
90
74
|
|
75
|
+
describe "lists" do
|
76
|
+
it "presents all lists on the board" do
|
77
|
+
expect(@gateway.lists.count).to eq(1)
|
78
|
+
expect(@gateway.lists.first).to be_a Trello::List
|
79
|
+
expect(@gateway.lists.first.name).to eq("django_blog")
|
80
|
+
5.times do |number|
|
81
|
+
Trello::List.create(:name => "list_number_#{number}", :board_id => @gateway.board.id)
|
82
|
+
end
|
83
|
+
expect(@gateway.lists.count).to eq(6)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
91
87
|
describe "create_or_update_card" do
|
92
88
|
it "creates a new card on the appropriate list if it does not exist" do
|
93
89
|
card = @gateway.create_or_update_card(@issue)
|
@@ -113,48 +109,22 @@ describe TrelloGateway do
|
|
113
109
|
expect(card.name).to eq("Test")
|
114
110
|
end
|
115
111
|
|
116
|
-
it "does not add a duplicate card if card exists in a list
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
:updated_at => Date.today.to_s,
|
121
|
-
:body => "This is a test",
|
122
|
-
:html_url => "https://github.com/chrissiedeist/django_blog/issues/1",
|
123
|
-
)
|
124
|
-
|
125
|
-
@gateway.claimed_list.cards.length.should == 0
|
126
|
-
|
127
|
-
card = @gateway.create_or_update_card(issue)
|
128
|
-
card.list.name.should == "django_blog"
|
129
|
-
|
130
|
-
card.move_to_list(@gateway.claimed_list.id)
|
131
|
-
card = @gateway.create_or_update_card(issue)
|
132
|
-
|
133
|
-
card.list.name.should == "Claimed"
|
134
|
-
@gateway.claimed_list.cards.length.should == 1
|
135
|
-
@gateway.list.cards.length.should == 0
|
136
|
-
end
|
137
|
-
|
138
|
-
it "does not add a duplicate card if card exists in a list called 'done'" do
|
139
|
-
issue = double(:issue,
|
140
|
-
:title => "Test",
|
141
|
-
:id => "91374795",
|
142
|
-
:updated_at => Date.today.to_s,
|
143
|
-
:body => "This is a test",
|
144
|
-
:html_url => "https://github.com/chrissiedeist/django_blog/issues/1",
|
145
|
-
)
|
146
|
-
|
147
|
-
@gateway.done_list.cards.length.should == 0
|
112
|
+
it "does not add a duplicate card if card exists in a list" do
|
113
|
+
card = @gateway.create_or_update_card(@issue)
|
114
|
+
expect(card.list.name).to eq("django_blog")
|
115
|
+
expect(@gateway.inbox.cards.length).to eq(1)
|
148
116
|
|
149
|
-
|
150
|
-
|
117
|
+
other_list = Trello::List.create(:name => "some other list", :board_id => @gateway.board.id)
|
118
|
+
expect(other_list.cards.length).to eq(0)
|
151
119
|
|
152
|
-
card.move_to_list(
|
153
|
-
|
120
|
+
card.move_to_list(other_list.id)
|
121
|
+
expect(other_list.cards.length).to eq(1)
|
122
|
+
expect(@gateway.inbox.cards.length).to eq(0)
|
154
123
|
|
155
|
-
card
|
156
|
-
|
157
|
-
|
124
|
+
card = @gateway.create_or_update_card(@issue)
|
125
|
+
expect(card.list.name).to eq("some other list")
|
126
|
+
expect(other_list.cards.length).to eq(1)
|
127
|
+
expect(@gateway.inbox.cards.length).to eq(0)
|
158
128
|
end
|
159
129
|
end
|
160
130
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: github_to_trello
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chrissie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: octokit
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- lib/github_to_trello/trello_gateway.rb
|
99
99
|
- lib/github_to_trello/version.rb
|
100
100
|
- spec/github_gateway_spec.rb
|
101
|
+
- spec/github_to_trello_spec.rb
|
101
102
|
- spec/trello_gateway_spec.rb
|
102
103
|
homepage: https://github.com/chrissiedeist/github_to_trello
|
103
104
|
licenses:
|
@@ -126,4 +127,5 @@ summary: Pulls github issues from specified repos and automatically creates/popu
|
|
126
127
|
trello lists with the repo names on a specified board.
|
127
128
|
test_files:
|
128
129
|
- spec/github_gateway_spec.rb
|
130
|
+
- spec/github_to_trello_spec.rb
|
129
131
|
- spec/trello_gateway_spec.rb
|