github_to_trello 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 680f9c64a0e18754aefe2c430104341cefb6f09c
4
+ data.tar.gz: 75a8ff3fe437125dda094c061d45fa416ebd3ede
5
+ SHA512:
6
+ metadata.gz: 263b6997ab83caaacb0f0730e22818c498fc7053e2d5b596e5251edf0ee085516fef8c0c4a9cd1da298fa1961304d7904fb7daaa2973067ed39a3a2f7be5e48b
7
+ data.tar.gz: 00b1aad91a0d1f5c25b9faae2c35d7071282df4a31c104f7f342bb8c63d357b71270016bcd715230389c94bf4ba3f1c0c9b54d77bcc7693b6643692562448518
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .env
2
+ *.swp
3
+ *.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'ruby-trello'
4
+ gem 'octokit'
5
+ gem 'dotenv'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 chrissie
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # USAGE
2
+
3
+ After completing the [setup](#setup), run `ruby github_to_trello.rb`
4
+
5
+ ## Overview
6
+ Use the github API to grab all open issues for specified repo.
7
+ Creates a list with the repo name of the specified trello board.
8
+ For each issue, create/update a trello card on that list.
9
+
10
+ Running the script:
11
+ - Creates a list for each specified repo (if a list for that repo is not already present)
12
+ - Adds or updates cards for all open issues or PRs in that repo
13
+ - Adds or updates color labels to cards based on date last updated
14
+
15
+ ## Setup
16
+ Running this script requires:
17
+
18
+ 1. A trello account with access to the board you are populating with github issues.
19
+
20
+ 2. A .env file with with the following variables
21
+ defined:
22
+ - `BOARD_ID` - The ID of the trello board to add the cards to
23
+ - `REPOS` - The name(s) of the github repos to pull issues from
24
+ (comma separated: `REPOS=your_name/your_repo,your_name/your_other_repo`)
25
+ - `PUBLIC_KEY` - Log into trello and visit https://trello.com/app-key
26
+ - `TOKEN` - Go to
27
+ https://trello.com/1/connect?key=...&name=MyApp&response_type=token&scope=read,write
28
+ (substituting the public key for ... a unique name for MyApp)
29
+
30
+ Sites used for reference
31
+ http://www.sitepoint.com/customizing-trello-ruby/
32
+ https://github.com/jeremytregunna/ruby-trello/blob/master/lib/trello/card.rb
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'github_to_trello/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "github_to_trello"
8
+ spec.version = GithubToTrello::VERSION
9
+ spec.authors = ["chrissie"]
10
+ spec.email = ["chrissie.deist@gmail.com"]
11
+ spec.description = %q{A gem for converting github issues into trello cards}
12
+ spec.summary = %q{Pulls github issues from specified repos and automatically creates/populates trello lists with the repo names on a specified board.}
13
+ spec.homepage = "http://rubygems.org/gems/github_to_trello"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'octokit'
2
+
3
+ class GithubGateway
4
+ def initialize(repo)
5
+ @repo = repo
6
+ end
7
+
8
+ def issues
9
+ Octokit.issues @repo
10
+ end
11
+ end
@@ -0,0 +1,61 @@
1
+ require "trello"
2
+
3
+ SECONDS_PER_DAY = 60 * 60 * 24
4
+ DAYS_TIL_OLD = 14
5
+ DAYS_TIL_REALLY_OLD = 28
6
+
7
+ class TrelloGateway
8
+ def initialize(public_key, token, board_id, repo)
9
+ Trello.configure do |c|
10
+ c.developer_public_key = public_key
11
+ c.member_token = token
12
+ end
13
+
14
+ @board = _board(board_id)
15
+ @repo = repo
16
+ @list = _list
17
+ end
18
+
19
+ def create_or_update_card(issue)
20
+ existing_card = _existing_card?(issue)
21
+ card = existing_card.class == (Trello::Card) ? existing_card : _create_card(issue)
22
+ _update(issue, card)
23
+ end
24
+
25
+ def _update(issue, card)
26
+ if issue.updated_at < (Time.now - DAYS_TIL_REALLY_OLD * SECONDS_PER_DAY)
27
+ card.card_labels = [:red]
28
+ elsif issue.updated_at < (Time.now - DAYS_TIL_OLD * SECONDS_PER_DAY)
29
+ card.card_labels = [:yellow]
30
+ else
31
+ card.card_labels = []
32
+ end
33
+ card.save
34
+ card
35
+ end
36
+
37
+ def _existing_card?(issue)
38
+ @list.cards.detect do |card|
39
+ card.name == issue.title
40
+ end
41
+ end
42
+
43
+ def _create_card(issue)
44
+ Trello::Card.create(
45
+ :name => issue.title,
46
+ :list_id => @list.id,
47
+ :desc => issue.body + "\n" + issue.html_url + "\n" + issue.updated_at.to_s
48
+ )
49
+ end
50
+
51
+ def _board(id)
52
+ Trello::Board.find(id)
53
+ end
54
+
55
+ def _list
56
+ list = @board.lists.detect do |list|
57
+ list.name =~ /#{@repo}/
58
+ end
59
+ list = list || Trello::List.create(:name => @repo, :board_id => @board.id)
60
+ end
61
+ end
@@ -0,0 +1,3 @@
1
+ module GithubToTrello
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,36 @@
1
+ require_relative './github_to_trello/github_gateway'
2
+ require_relative './github_to_trello/trello_gateway'
3
+ require 'octokit'
4
+ require 'trello'
5
+ require 'dotenv'
6
+
7
+ Dotenv.load
8
+
9
+ class GithubToTrello
10
+ def initialize(public_key, token, board_id, repo_name)
11
+ @github_gateway = GithubGateway.new(repo_name)
12
+ @trello_gateway = TrelloGateway.new(public_key,
13
+ token,
14
+ board_id,
15
+ repo_name)
16
+ end
17
+
18
+ def update
19
+ @github_gateway.issues.each do |issue|
20
+ @trello_gateway.create_or_update_card(issue)
21
+ end
22
+ end
23
+ end
24
+
25
+ if __FILE__ == $PROGRAM_NAME
26
+ public_key = ENV["PUBLIC_KEY"]
27
+ token = ENV["TOKEN"]
28
+ board_id = ENV["BOARD_ID"]
29
+ repos = ENV["REPOS"].split(",")
30
+
31
+ repos.each do |repo|
32
+ puts "Updating repo: #{repo}"
33
+ GithubToTrello.new(public_key, token, board_id, repo).update
34
+ end
35
+ end
36
+
@@ -0,0 +1,14 @@
1
+ require 'rspec'
2
+ require 'github_gateway'
3
+
4
+ describe GithubGateway do
5
+ before(:all) do
6
+ @gateway = GithubGateway.new("chrissiedeist/django_blog")
7
+ end
8
+
9
+ it "can access the title and body of the issue" do
10
+ issue = @gateway.issues.first
11
+ expect(issue.title).to eq("Test")
12
+ expect(issue.body).to eq("This is a test.")
13
+ end
14
+ end
@@ -0,0 +1,53 @@
1
+ require 'dotenv'
2
+ require 'rspec'
3
+ require 'trello_gateway'
4
+
5
+ describe TrelloGateway do
6
+ before(:each) do
7
+ public_key = "56acdaa7404ebcc8bbaffab18428d4d2"
8
+ token = "748c2116942c251bf6ed8000c13196293443ddcb407422ccacd92d0001b831da"
9
+ board_id = "5jGWvKui"
10
+ repo = "django_blog"
11
+
12
+ @gateway = TrelloGateway.new(public_key, token, board_id, repo)
13
+ @issue = double(:issue,
14
+ :title => "Test",
15
+ :id => "91374795",
16
+ :updated_at => "2015-06-26T22:08:36Z",
17
+ :body => "This is a test",
18
+ :html_url => "https://github.com/chrissiedeist/django_blog/issues/1",
19
+ )
20
+ end
21
+
22
+ describe "create_or_update_card" do
23
+ it "creates a new card on the appropriate list if it does not exist" do
24
+ card = @gateway.create_or_update_card(@issue)
25
+ expect(card.class).to be(Trello::Card)
26
+ expect(card.name).to eq("Test")
27
+ expect(card.list.name).to eq("chrissiedeist/django_blog")
28
+
29
+ end
30
+
31
+ it "does not add a duplicate card if card exits" do
32
+ card = @gateway.create_or_update_card(@issue)
33
+ card = @gateway.create_or_update_card(@issue)
34
+
35
+ expect(card.list.cards.length).to eq(1)
36
+ end
37
+
38
+ it "adds a red label if card is more than 28 days old" do
39
+ card = @gateway.create_or_update_card(@issue)
40
+ expect(card.card_labels).to eq([])
41
+
42
+ updated_issue = double(:issue,
43
+ :title => "Test",
44
+ :id => "91374795",
45
+ :updated_at => "2015-01-27T22:08:36Z",
46
+ :body => "This is a test",
47
+ :html_url => "https://github.com/chrissiedeist/django_blog/issues/1",
48
+ )
49
+ card = @gateway.create_or_update_card(updated_issue)
50
+ expect(card.card_labels).to eq([:red])
51
+ end
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github_to_trello
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - chrissie
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A gem for converting github issues into trello cards
42
+ email:
43
+ - chrissie.deist@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - github_to_trello.gemspec
54
+ - lib/github_to_trello.rb
55
+ - lib/github_to_trello/github_gateway.rb
56
+ - lib/github_to_trello/trello_gateway.rb
57
+ - lib/github_to_trello/version.rb
58
+ - spec/github_gateway_spec.rb
59
+ - spec/trello_gateway_spec.rb
60
+ homepage: http://rubygems.org/gems/github_to_trello
61
+ licenses:
62
+ - MIT
63
+ metadata: {}
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.1.11
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: Pulls github issues from specified repos and automatically creates/populates
84
+ trello lists with the repo names on a specified board.
85
+ test_files:
86
+ - spec/github_gateway_spec.rb
87
+ - spec/trello_gateway_spec.rb
88
+ has_rdoc: