lita-digitalocean 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: 5444464dba3faf90e5b413c215bda59c1a797fdf
4
+ data.tar.gz: 9397be0387a7e3be5f012ee09dc3d0479e573003
5
+ SHA512:
6
+ metadata.gz: 3d8e15cb823eefde8069e2a908eefbeb365be41b3df69eedbb39d2af2ace2f79dac6242f2f2b62b7d1ea97fff09ee1af98763384f3048daca2d1dfd8e2b0e7e3
7
+ data.tar.gz: 769db7c17a2f6e3f05b4e64d0cb515b7a6093a505f695739a97b140553a040ffbfcfa603b5de79165601ad231fd87ba13948903e136a755a9ae777dbb028dcd5
data/.gitignore ADDED
@@ -0,0 +1,18 @@
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
18
+ lita_config.rb
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ script: bundle exec rake
5
+ before_install:
6
+ - gem update --system
7
+ services:
8
+ - redis-server
9
+ notifications:
10
+ webhooks:
11
+ urls:
12
+ - https://lita-freenode.herokuapp.com/travis
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 Jimmy Cuadra
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # lita-digitalocean
2
+
3
+ [![Build Status](https://travis-ci.org/jimmycuadra/lita-digitalocean.png?branch=master)](https://travis-ci.org/jimmycuadra/lita-digitalocean)
4
+ [![Code Climate](https://codeclimate.com/github/jimmycuadra/lita-digitalocean.png)](https://codeclimate.com/github/jimmycuadra/lita-digitalocean)
5
+ [![Coverage Status](https://coveralls.io/repos/jimmycuadra/lita-digitalocean/badge.png)](https://coveralls.io/r/jimmycuadra/lita-digitalocean)
6
+
7
+ **lita-digitalocean** is a handler plugin for [Lita](https://www.lita.io/) that manages [DigitalOcean](https://www.digitalocean.com/) services.
8
+
9
+ ## Installation
10
+
11
+ Add lita-digitalocean to your Lita instance's Gemfile:
12
+
13
+ ``` ruby
14
+ gem "lita-digitalocean"
15
+ ```
16
+
17
+ ## Configuration
18
+
19
+ ### Required attributes
20
+
21
+ * `client_id` (String) - The client ID for the account to manage.
22
+ * `api_key` (String) - The API key for the account to manage.
23
+
24
+ ### Example
25
+
26
+ ``` ruby
27
+ Lita.configure do |config|
28
+ config.handlers.digitalocean.client_id = "BdCsMEJYPv2tu7xQtLRB3"
29
+ config.handlers.digitalocean.api_key = "3df020a0441731e5ca47243b5515cbb7"
30
+ end
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ To use any of the DigitalOcean commands, the user sending the message must be in the `:digitalocean_admins` authorization group.
36
+
37
+ ### Domain commands
38
+
39
+ Not yet implemented. Coming soon!
40
+
41
+ ### Droplet commands
42
+
43
+ Not yet implemented. Coming soon!
44
+
45
+ ### Image commands
46
+
47
+ Not yet implemented. Coming soon!
48
+
49
+ ### Region commands
50
+
51
+ Not yet implemented. Coming soon!
52
+
53
+ ### SSH key commands
54
+
55
+ To add a new SSH key and get back its ID:
56
+
57
+ ```
58
+ Lita: do ssh keys add NAME PUBLIC_KEY
59
+ ```
60
+
61
+ To delete an SSH key by its ID:
62
+
63
+ ```
64
+ Lita: do ssh keys delete ID
65
+ ```
66
+
67
+ To edit the name and/or public key of an existing SSH key:
68
+
69
+ ```
70
+ Lita: do ssh keys edit ID [name=NAME] [public_key=PUBLIC_KEY]
71
+ ```
72
+
73
+ To list the names and IDs of all SSH keys:
74
+
75
+ ```
76
+ Lita: do ssh keys list
77
+ ```
78
+
79
+ To show the name and public key of an SSH key by ID:
80
+
81
+ ```
82
+ Lita: do ssh keys show ID
83
+ ```
84
+
85
+ ### Size commands
86
+
87
+ Not yet implemented. Coming soon!
88
+
89
+ ## License
90
+
91
+ [MIT](http://opensource.org/licenses/MIT)
data/Rakefile ADDED
@@ -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,159 @@
1
+ require "digital_ocean"
2
+
3
+ module Lita
4
+ module Handlers
5
+ class Digitalocean < Handler
6
+ def self.default_config(config)
7
+ config.client_id = nil
8
+ config.api_key = nil
9
+ end
10
+
11
+ private
12
+
13
+ def self.do_route(regexp, route_name, help)
14
+ route(regexp, route_name, command: true, restrict_to: :digitalocean_admins, help: help)
15
+ end
16
+
17
+ public
18
+
19
+ do_route /^do\s+ssh\s+keys?\s+add\s+.+$/i, :ssh_keys_add, {
20
+ t("help.ssh_keys.add_key") => t("help.ssh_keys.add_value")
21
+ }
22
+
23
+ do_route /^do\s+ssh\s+keys?\s+delete\s+(\d+)$/i, :ssh_keys_delete, {
24
+ t("help.ssh_keys.delete_key") => t("help.ssh_keys.delete_value")
25
+ }
26
+
27
+ do_route /^do\s+ssh\s+keys?\s+edit\s+(\d+)\s+.+$/i, :ssh_keys_edit, {
28
+ t("help.ssh_keys.edit_key") => t("help.ssh_keys.edit_value")
29
+ }
30
+
31
+ do_route /^do\s+ssh\s+keys?\s+list$/i, :ssh_keys_list, {
32
+ t("help.ssh_keys.list_key") => t("help.ssh_keys.list_value")
33
+ }
34
+
35
+ do_route /^do\s+ssh\s+keys?\s+show\s+(\d+)$/i, :ssh_keys_show, {
36
+ t("help.ssh_keys.show_key") => t("help.ssh_keys.show_value"),
37
+ }
38
+
39
+ def ssh_keys_add(response)
40
+ name, public_key = response.args[3..4]
41
+
42
+ unless name && public_key
43
+ return response.reply("#{t('format')}: #{t('help.ssh_keys.add_key')}")
44
+ end
45
+
46
+ do_response = do_call(response) do |client|
47
+ client.ssh_keys.add(name: name, ssh_pub_key: public_key)
48
+ end or return
49
+
50
+ key = do_response.ssh_key
51
+ response.reply(
52
+ t("ssh_keys.add.created", message: "#{key.id} (#{key.name}): #{key.ssh_pub_key}")
53
+ )
54
+ end
55
+
56
+ def ssh_keys_delete(response)
57
+ key_id = response.matches[0][0]
58
+
59
+ do_call(response) do |client|
60
+ client.ssh_keys.delete(key_id)
61
+ end or return
62
+
63
+ response.reply(t("ssh_keys.delete.deleted", key_id: key_id))
64
+ end
65
+
66
+ def ssh_keys_edit(response)
67
+ args = extract_named_args(response.args, :name, :public_key)
68
+
69
+ if args[:public_key]
70
+ args[:ssh_pub_key] = args.delete(:public_key)
71
+ end
72
+
73
+ do_response = do_call(response) do |client|
74
+ client.ssh_keys.edit(response.matches[0][0], args)
75
+ end or return
76
+
77
+ key = do_response.ssh_key
78
+ response.reply(
79
+ t("ssh_keys.edit.updated", message: "#{key.id} (#{key.name}): #{key.ssh_pub_key}")
80
+ )
81
+ end
82
+
83
+ def ssh_keys_list(response)
84
+ do_response = do_call(response) do |client|
85
+ client.ssh_keys.list
86
+ end or return
87
+
88
+ if do_response.ssh_keys.empty?
89
+ response.reply(t("ssh_keys.list.empty"))
90
+ else
91
+ do_response.ssh_keys.each do |key|
92
+ response.reply("#{key.id} (#{key.name})")
93
+ end
94
+ end
95
+ end
96
+
97
+ def ssh_keys_show(response)
98
+ do_response = do_call(response) do |client|
99
+ client.ssh_keys.show(response.matches[0][0])
100
+ end or return
101
+
102
+ key = do_response.ssh_key
103
+ response.reply("#{key.id} (#{key.name}): #{key.ssh_pub_key}")
104
+ end
105
+
106
+ private
107
+
108
+ def api_key
109
+ config.api_key
110
+ end
111
+
112
+ def client
113
+ @client ||= ::DigitalOcean::API.new(client_id: client_id, api_key: api_key)
114
+ end
115
+
116
+ def client_id
117
+ config.client_id
118
+ end
119
+
120
+ def config
121
+ Lita.config.handlers.digitalocean
122
+ end
123
+
124
+ def do_call(response)
125
+ unless api_key && client_id
126
+ response.reply(t("credentials_missing"))
127
+ return
128
+ end
129
+
130
+ do_response = yield client
131
+
132
+ if do_response.status != "OK"
133
+ response.reply(t("error", message: do_response.message))
134
+ return
135
+ end
136
+
137
+ do_response
138
+ end
139
+
140
+ def extract_named_args(args, *keys)
141
+ args.inject({}) do |hash, arg|
142
+ key, value = arg.split("=", 2)
143
+
144
+ if value
145
+ normalized_key = key.downcase.to_sym
146
+
147
+ if keys.include?(normalized_key)
148
+ hash[normalized_key] = value.gsub(/\A["']|["']\Z/, "")
149
+ end
150
+ end
151
+
152
+ hash
153
+ end
154
+ end
155
+ end
156
+
157
+ Lita.register_handler(Digitalocean)
158
+ end
159
+ end
@@ -0,0 +1,7 @@
1
+ require "lita"
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require "lita/handlers/digitalocean"
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-digitalocean"
3
+ spec.version = "0.0.1"
4
+ spec.authors = ["Jimmy Cuadra"]
5
+ spec.email = ["jimmy@jimmycuadra.com"]
6
+ spec.description = %q{A Lita handler for managing DigitalOcean services.}
7
+ spec.summary = %q{A Lita handler for managing DigitalOcean services.}
8
+ spec.homepage = "https://github.com/jimmycuadra/lita-digitalocean"
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", ">= 3.1"
18
+ spec.add_runtime_dependency "digital_ocean", ">= 1.3.0"
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rspec", ">= 3.0.0.beta2"
23
+ spec.add_development_dependency "simplecov"
24
+ spec.add_development_dependency "coveralls"
25
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,30 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ digitalocean:
5
+ credentials_missing: >-
6
+ client_id and api_key must be set in Lita's configuration to
7
+ use the DigitalOcean commands.
8
+ error: "DigitalOcean API error: %{message}"
9
+ format: Format
10
+ help:
11
+ ssh_keys:
12
+ add_key: do ssh keys add NAME PUBLIC_KEY
13
+ add_value: Adds a new SSH key.
14
+ delete_key: do ssh keys delete ID
15
+ delete_value: Delete the SSH key with the given ID.
16
+ edit_key: "do ssh keys edit ID [name=NAME] [public_key=PUBLIC_KEY]"
17
+ edit_value: Change the NAME and/or PUBLIC_KEY of the SSH key with the given ID.
18
+ list_key: do ssh keys list
19
+ list_value: Lists all SSH keys.
20
+ show_key: do ssh keys show ID
21
+ show_value: Shows the public key for SSH key with the given ID.
22
+ ssh_keys:
23
+ add:
24
+ created: "Created new SSH key: %{message}"
25
+ delete:
26
+ deleted: "Deleted SSH key: %{key_id}"
27
+ edit:
28
+ updated: "Updated SSH key: %{message}"
29
+ list:
30
+ empty: No SSH keys have been added yet.
@@ -0,0 +1,130 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Digitalocean, lita_handler: true do
4
+ it { routes_command("do ssh keys add 'foo bar' 'ssh-rsa abcdefg'").to(:ssh_keys_add) }
5
+ it { routes_command("do ssh keys delete 123").to(:ssh_keys_delete) }
6
+ it do
7
+ routes_command(
8
+ "do ssh keys edit 123 name=foo public_key='ssh-rsa changed'"
9
+ ).to(:ssh_keys_edit)
10
+ end
11
+ it { routes_command("do ssh keys list").to(:ssh_keys_list) }
12
+ it { routes_command("do ssh keys show 123").to(:ssh_keys_show) }
13
+
14
+ let(:client) do
15
+ instance_double(
16
+ "::DigitalOcean::API",
17
+ ssh_keys: client_ssh_keys
18
+ )
19
+ end
20
+
21
+ let(:client_ssh_keys) { instance_double("::DigitalOcean::Resource::SSHKey") }
22
+
23
+ before do
24
+ Lita.config.handlers.digitalocean.tap do |config|
25
+ config.client_id = "CLIENT_ID"
26
+ config.api_key = "API_KEY"
27
+ end
28
+
29
+ allow(Lita::Authorization).to receive(:user_in_group?).with(
30
+ user,
31
+ :digitalocean_admins
32
+ ).and_return(true)
33
+
34
+ allow(::DigitalOcean::API).to receive(:new).and_return(client)
35
+ end
36
+
37
+ describe "ssh key commands" do
38
+ let(:do_list) do
39
+ instance_double(
40
+ "Hashie::Rash",
41
+ status: "OK",
42
+ ssh_keys: [
43
+ instance_double("Hashie::Rash", id: 123, name: "My Key"),
44
+ instance_double("Hashie::Rash", id: 456, name: "Your Key"),
45
+ ]
46
+ )
47
+ end
48
+
49
+ let(:do_list_empty) do
50
+ instance_double(
51
+ "Hashie::Rash",
52
+ status: "OK",
53
+ ssh_keys: []
54
+ )
55
+ end
56
+
57
+ let(:do_key) do
58
+ instance_double(
59
+ "Hashie::Rash",
60
+ status: "OK",
61
+ ssh_key: instance_double(
62
+ "Hashie::Rash",
63
+ id: 123,
64
+ name: "My Key",
65
+ ssh_pub_key: "ssh-rsa abcdefg"
66
+ )
67
+ )
68
+ end
69
+
70
+ let(:do_delete) { instance_double("Hashie::Rash", status: "OK") }
71
+
72
+ describe "#ssh_keys_add" do
73
+ it "responds with the details of the new key" do
74
+ allow(client_ssh_keys).to receive(:add).with(
75
+ name: "My Key",
76
+ ssh_pub_key: "ssh-rsa abcdefg"
77
+ ).and_return(do_key)
78
+ send_command("do ssh keys add 'My Key' 'ssh-rsa abcdefg'")
79
+ expect(replies.last).to eq("Created new SSH key: 123 (My Key): ssh-rsa abcdefg")
80
+ end
81
+
82
+ it "responds with an error message if name or public key is missing" do
83
+ send_command("do ssh keys add foo")
84
+ expect(replies.last).to eq("Format: do ssh keys add NAME PUBLIC_KEY")
85
+ end
86
+ end
87
+
88
+ describe "#ssh_keys_delete" do
89
+ it "responds with a success message" do
90
+ allow(client_ssh_keys).to receive(:delete).with("123").and_return(do_delete)
91
+ send_command("do ssh keys delete 123")
92
+ expect(replies.last).to eq("Deleted SSH key: 123")
93
+ end
94
+ end
95
+
96
+ describe "#ssh_keys_edit" do
97
+ it "responds with the edited key's values" do
98
+ allow(client_ssh_keys).to receive(:edit).with(
99
+ "123",
100
+ name: "My Key",
101
+ ssh_pub_key: "ssh-rsa abcdefg"
102
+ ).and_return(do_key)
103
+ send_command(%{do ssh keys edit 123 name='My Key' public_key="ssh-rsa abcdefg"})
104
+ expect(replies.last).to eq("Updated SSH key: 123 (My Key): ssh-rsa abcdefg")
105
+ end
106
+ end
107
+
108
+ describe "#ssh_keys_list" do
109
+ it "returns a list of key IDs and names" do
110
+ allow(client_ssh_keys).to receive(:list).and_return(do_list)
111
+ send_command("do ssh keys list")
112
+ expect(replies).to eq(["123 (My Key)", "456 (Your Key)"])
113
+ end
114
+
115
+ it "returns an empty state message if there are no SSH keys" do
116
+ allow(client_ssh_keys).to receive(:list).and_return(do_list_empty)
117
+ send_command("do ssh keys list")
118
+ expect(replies.last).to eq("No SSH keys have been added yet.")
119
+ end
120
+ end
121
+
122
+ describe "#ssh_keys_show" do
123
+ it "responds with the public key" do
124
+ allow(client_ssh_keys).to receive(:show).with("123").and_return(do_key)
125
+ send_command("do ssh keys show 123")
126
+ expect(replies.last).to eq("123 (My Key): ssh-rsa abcdefg")
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,10 @@
1
+ require "simplecov"
2
+ require "coveralls"
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+ SimpleCov.start { add_filter "/spec/" }
8
+
9
+ require "lita-digitalocean"
10
+ require "lita/rspec"
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-digitalocean
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jimmy Cuadra
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-11 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: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: digital_ocean
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
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: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0.beta2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0.beta2
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A Lita handler for managing DigitalOcean services.
112
+ email:
113
+ - jimmy@jimmycuadra.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".travis.yml"
120
+ - Gemfile
121
+ - LICENSE
122
+ - README.md
123
+ - Rakefile
124
+ - lib/lita-digitalocean.rb
125
+ - lib/lita/handlers/digitalocean.rb
126
+ - lita-digitalocean.gemspec
127
+ - locales/en.yml
128
+ - spec/lita/handlers/digitalocean_spec.rb
129
+ - spec/spec_helper.rb
130
+ homepage: https://github.com/jimmycuadra/lita-digitalocean
131
+ licenses:
132
+ - MIT
133
+ metadata:
134
+ lita_plugin_type: handler
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.2.2
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: A Lita handler for managing DigitalOcean services.
155
+ test_files:
156
+ - spec/lita/handlers/digitalocean_spec.rb
157
+ - spec/spec_helper.rb