lita-trello-lists 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b5589affaa09d28ead829b122e3a4acef7ee1b31
4
+ data.tar.gz: daa551cfd3916ab97f3c766fee20e939e9f5db2a
5
+ SHA512:
6
+ metadata.gz: e44ab14419499e9a1a48dd279f88e8575d6b2c08953b058c4e2bc09e62dfdd882b2ad16de119371d42076c80d938e8624febbe6fe0afe791982f833f6d0b2c60
7
+ data.tar.gz: f042a9f7f9b94d2154c0c2d3c588b727b7a8bd2cae89ad07879bdc7c91199d99f0176691dc7da4097b618a92f42f1fa6fb0abbdda91b3f19d4bd04d7168089ef
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,38 @@
1
+ # lita-trello-lists
2
+
3
+ This is a Lita handler for displaying your Trello lists through Lita.
4
+
5
+ ## Installation
6
+
7
+ Add lita-trello-lists to your Lita instance's Gemfile:
8
+
9
+ ``` ruby
10
+ gem "lita-trello-lists"
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ You will need to set at least one configuration variable:
16
+
17
+ ``` ruby
18
+ lita.handlers.trello_lists.boards = ['123456', 'abcsfgf']
19
+ ```
20
+
21
+ You can find the ID of one of your boards through its URL.
22
+
23
+ Additionally, if your boards are private, you will need to supply your Trello API key and a token. You can find out how to get these things through the [Trello API documentation](https://trello.com/docs/).
24
+
25
+ ``` ruby
26
+ lita.handlers.trello_lists.key = "2345n32b42oijkn3b24j34jn34"
27
+ lita.handlers.trello_lists.token = "sahfiu23kjriuejknr239r0ofiwjben023ork2inw"
28
+ ```
29
+
30
+ ## Usage
31
+
32
+ Say you have a board names "Engineering" and a list in it called "In Progress". The following are all equivalent:
33
+
34
+ ```
35
+ > @robot trello list in progress
36
+ > @robot trello list progress in engineering
37
+ > @robot trello list in progress in eng
38
+ ```
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,12 @@
1
+ require "lita"
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require "lita/handlers/trello_lists"
8
+
9
+ Lita::Handlers::TrelloLists.template_root File.expand_path(
10
+ File.join("..", "..", "templates"),
11
+ __FILE__
12
+ )
@@ -0,0 +1,139 @@
1
+ module Lita
2
+ module Handlers
3
+ class TrelloLists < Handler
4
+ config :key, type: String, required: false
5
+ config :token, type: String, required: false
6
+ config :boards, type: Array, required: true
7
+
8
+ TRELLO_API_URL = "https://api.trello.com/1"
9
+
10
+ route(/^trello list (.*)$/, :list_summary, command: true, help: {
11
+ "trello list LIST NAME" => "Show a summary of the cards in a certain list on Trello."
12
+ })
13
+
14
+ route(/^trello list (.+) in (.+)?$/, :list_summary, command: true, help: {
15
+ "trello list LIST NAME in BOARD NAME" => "Show a summary of the cards in a list on a specific board on Trello."
16
+ })
17
+
18
+ def list_summary(message)
19
+ list_name_fragment = message.matches[0][0]
20
+ board_name_fragment = message.matches[0][1]
21
+
22
+ board_name = find_board_from_fragment(board_name_fragment)
23
+ list_name = find_list_from_fragment(list_name_fragment, board_name)
24
+
25
+ if board_name_fragment && board_name.nil?
26
+ message.reply("We couldn't find a board from the name \"#{board_name}\".")
27
+ return
28
+ end
29
+
30
+ if list_name.nil?
31
+ message.reply("We couldn't find a list from the name \"#{list_name}\".")
32
+ return
33
+ end
34
+
35
+ if board_name.nil? && list_exists_in_multiple_boards?(list_name)
36
+ response = "The list \"#{list_name}\" appears in multiple Trello boards. Try this:\n"
37
+ response += "> everbot trello list #{list_name_fragment} in BOARD NAME"
38
+ message.reply(response)
39
+ return
40
+ end
41
+
42
+ response = "**Cards in #{list_name}:** \n"
43
+ response += get_cards_for(list_name, board_name).map do |card|
44
+ members = card[:members].map { |m| " #{m}\n" }
45
+ [
46
+ "- _#{card[:name]}_",
47
+ " Assigned To:",
48
+ card[:members].map { |m| " #{m}" }
49
+ ].flatten.join("\n")
50
+ end.join("\n\n")
51
+ message.reply(response)
52
+ end
53
+
54
+ def get_cards_for(list, board)
55
+ possible_lists = board ? lists_in_board(board) : lists_in_all_boards
56
+ list_id = possible_lists.select { |l| l["name"] == list }.first["id"]
57
+
58
+ cards = trello_get("/lists/#{list_id}", cards: "open")["cards"]
59
+ cards.map do |card|
60
+ {
61
+ members: card["idMembers"].map { |id| trello_get("/members/#{id}")["fullName"] },
62
+ name: card["name"],
63
+ url: card["shortUrl"]
64
+ }
65
+ end
66
+ end
67
+
68
+ def list_exists_in_multiple_boards?(fragment)
69
+ list_name = best_match_in_array(fragment, all_list_names)
70
+ all_list_names.select { |name| name == list_name }.count > 1
71
+ end
72
+
73
+ def find_list_from_fragment(fragment, board)
74
+ list_names = if board
75
+ lists_in_board(board).map { |list| list["name"] }
76
+ else
77
+ all_list_names
78
+ end
79
+
80
+ best_match_in_array(fragment, list_names)
81
+ end
82
+
83
+ def find_board_from_fragment(fragment)
84
+ best_match_in_array(fragment, all_board_names)
85
+ end
86
+
87
+ def best_match_in_array(fragment, collection)
88
+ findings = collection.map do |thing|
89
+ match = thing[/#{fragment}/i]
90
+
91
+ length_of_match = match ? match.length : 0
92
+
93
+ [length_of_match, thing]
94
+ end.to_h
95
+
96
+ findings[findings.keys.sort.last] unless findings.keys.all?(&:zero?)
97
+ end
98
+
99
+ def lists_in_all_boards
100
+ boards.map { |board| board["lists"] }.flatten
101
+ end
102
+
103
+ def lists_in_board(board_name)
104
+ boards.select { |board| board["name"] == board_name }.first["lists"]
105
+ end
106
+
107
+ def all_board_names
108
+ boards.map { |board| board["name"] }
109
+ end
110
+
111
+ def all_list_names
112
+ boards.map do |board|
113
+ board["lists"].map { |list| list["name"] }
114
+ end.flatten
115
+ end
116
+
117
+ def boards
118
+ if @cached_data.nil? || (Time.now.sec - @last_access.sec) >= 5
119
+ @cached_data = config.boards.map do |board_id|
120
+ trello_get("/boards/#{board_id}", lists: "open")
121
+ end
122
+ @last_access = Time.now
123
+ end
124
+ @cached_data
125
+ end
126
+
127
+ def trello_get(url, params={})
128
+ params.merge!({
129
+ key: config.key,
130
+ token: config.token
131
+ })
132
+
133
+ MultiJson.load(http.get(TRELLO_API_URL + url, params).body)
134
+ end
135
+ end
136
+
137
+ Lita.register_handler(TrelloLists)
138
+ end
139
+ end
@@ -0,0 +1,24 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-trello-lists"
3
+ spec.version = "0.1.0"
4
+ spec.authors = ["Taylor Lapeyre"]
5
+ spec.email = ["taylorlapeyre@gmail.com"]
6
+ spec.description = "Display your Trello lists through Lita."
7
+ spec.summary = "Display your Trello lists through Lita."
8
+ spec.homepage = "https://github.com/taylorlapeyre/lita-trello-lists"
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_runtime_dependency "lita", ">= 4.3"
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "pry-byebug"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rack-test"
23
+ spec.add_development_dependency "rspec", ">= 3.0.0"
24
+ end
@@ -0,0 +1,4 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ trello_lists:
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::TrelloLists, lita_handler: true do
4
+ before do
5
+ # Trello's "welcome" boards
6
+ Lita.config.handlers.trello_lists.boards = ["bKbdmCKB", "9dnaRkNt", "VVPQBpZE"]
7
+ end
8
+
9
+ it { is_expected.to route_command("trello list Basics").to(:list_summary) }
10
+ it { is_expected.to route_command("trello list Basics Things").to(:list_summary) }
11
+ it { is_expected.to route_command("trello list Basics in Welcome Board").to(:list_summary) }
12
+
13
+ it "responds with a summary when given a list name" do
14
+ send_command "trello list Basics"
15
+ expect(replies).to_not be_empty
16
+ expect(replies.last).to match /Welcome to Trello/
17
+ end
18
+
19
+ it "can list the cards of a list in a specific board" do
20
+ send_command "trello list Getting Started in How to Use Trello for Android"
21
+ expect(replies).to_not be_empty
22
+ expect(replies.last).to match /Tap on a card/
23
+ end
24
+
25
+ it "can find a list with a partial string match" do
26
+ send_command "trello list interm"
27
+ expect(replies).to_not be_empty
28
+ expect(replies.last).to match /Intermediate/
29
+ end
30
+
31
+ it "responds with a helpful message when the list is in multiple boards" do
32
+ send_command "trello list Getting Started"
33
+ expect(replies).to_not be_empty
34
+ expect(replies.last).to match /appears in multiple Trello boards/
35
+ end
36
+
37
+ it "responds with a helpful message when the list isn't found" do
38
+ send_command "trello list foobar"
39
+ expect(replies).to_not be_empty
40
+ expect(replies.last).to match /We couldn't find a list/
41
+ end
42
+
43
+ it "responds with a helpful message when the board isn't found" do
44
+ send_command "trello list Basics in Foobar"
45
+ expect(replies).to_not be_empty
46
+ expect(replies.last).to match /We couldn't find a board/
47
+ end
48
+ end
@@ -0,0 +1,6 @@
1
+ require "lita-trello-lists"
2
+ require "lita/rspec"
3
+
4
+ # A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
5
+ # was generated with Lita 4, the compatibility mode should be left disabled.
6
+ Lita.version_3_compatibility_mode = false
File without changes
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-trello-lists
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Taylor Lapeyre
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 3.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 3.0.0
97
+ description: Display your Trello lists through Lita.
98
+ email:
99
+ - taylorlapeyre@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - Gemfile
106
+ - README.md
107
+ - Rakefile
108
+ - lib/lita-trello-lists.rb
109
+ - lib/lita/handlers/trello_lists.rb
110
+ - lita-trello-lists.gemspec
111
+ - locales/en.yml
112
+ - spec/lita/handlers/trello_lists_spec.rb
113
+ - spec/spec_helper.rb
114
+ - templates/.gitkeep
115
+ homepage: https://github.com/taylorlapeyre/lita-trello-lists
116
+ licenses:
117
+ - MIT
118
+ metadata:
119
+ lita_plugin_type: handler
120
+ post_install_message:
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 2.4.5
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Display your Trello lists through Lita.
140
+ test_files:
141
+ - spec/lita/handlers/trello_lists_spec.rb
142
+ - spec/spec_helper.rb