rita 0.1.0 → 5.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +19 -0
- data/.rubocop.yml +51 -0
- data/.ruby-version +1 -0
- data/.travis.yml +16 -0
- data/CONTRIBUTING.md +18 -0
- data/Gemfile +5 -0
- data/{LICENSE.txt → LICENSE} +1 -3
- data/README.md +17 -24
- data/Rakefile +5 -5
- data/bin/lita +7 -0
- data/lib/lita/adapter.rb +147 -0
- data/lib/lita/adapters/shell.rb +126 -0
- data/lib/lita/adapters/test.rb +62 -0
- data/lib/lita/authorization.rb +112 -0
- data/lib/lita/callback.rb +39 -0
- data/lib/lita/cli.rb +218 -0
- data/lib/lita/configurable.rb +47 -0
- data/lib/lita/configuration_builder.rb +247 -0
- data/lib/lita/configuration_validator.rb +95 -0
- data/lib/lita/default_configuration.rb +122 -0
- data/lib/lita/errors.rb +25 -0
- data/lib/lita/handler/chat_router.rb +141 -0
- data/lib/lita/handler/common.rb +208 -0
- data/lib/lita/handler/event_router.rb +84 -0
- data/lib/lita/handler/http_router.rb +31 -0
- data/lib/lita/handler.rb +15 -0
- data/lib/lita/handlers/authorization.rb +129 -0
- data/lib/lita/handlers/help.rb +171 -0
- data/lib/lita/handlers/info.rb +66 -0
- data/lib/lita/handlers/room.rb +36 -0
- data/lib/lita/handlers/users.rb +37 -0
- data/lib/lita/http_callback.rb +46 -0
- data/lib/lita/http_route.rb +83 -0
- data/lib/lita/logger.rb +43 -0
- data/lib/lita/message.rb +124 -0
- data/lib/lita/middleware_registry.rb +39 -0
- data/lib/lita/namespace.rb +29 -0
- data/lib/lita/plugin_builder.rb +43 -0
- data/lib/lita/rack_app.rb +100 -0
- data/lib/lita/registry.rb +164 -0
- data/lib/lita/response.rb +65 -0
- data/lib/lita/robot.rb +273 -0
- data/lib/lita/room.rb +119 -0
- data/lib/lita/route_validator.rb +82 -0
- data/lib/lita/rspec/handler.rb +127 -0
- data/lib/lita/rspec/matchers/chat_route_matcher.rb +53 -0
- data/lib/lita/rspec/matchers/event_route_matcher.rb +29 -0
- data/lib/lita/rspec/matchers/http_route_matcher.rb +34 -0
- data/lib/lita/rspec.rb +48 -0
- data/lib/lita/source.rb +81 -0
- data/lib/lita/store.rb +23 -0
- data/lib/lita/target.rb +3 -0
- data/lib/lita/template.rb +71 -0
- data/lib/lita/template_resolver.rb +52 -0
- data/lib/lita/timer.rb +49 -0
- data/lib/lita/user.rb +157 -0
- data/lib/lita/util.rb +31 -0
- data/lib/lita/version.rb +6 -0
- data/lib/lita.rb +166 -0
- data/rita.gemspec +50 -0
- data/spec/lita/adapter_spec.rb +54 -0
- data/spec/lita/adapters/shell_spec.rb +99 -0
- data/spec/lita/authorization_spec.rb +122 -0
- data/spec/lita/configuration_builder_spec.rb +247 -0
- data/spec/lita/configuration_validator_spec.rb +114 -0
- data/spec/lita/default_configuration_spec.rb +242 -0
- data/spec/lita/handler/chat_router_spec.rb +236 -0
- data/spec/lita/handler/common_spec.rb +289 -0
- data/spec/lita/handler/event_router_spec.rb +121 -0
- data/spec/lita/handler/http_router_spec.rb +155 -0
- data/spec/lita/handler_spec.rb +62 -0
- data/spec/lita/handlers/authorization_spec.rb +111 -0
- data/spec/lita/handlers/help_spec.rb +124 -0
- data/spec/lita/handlers/info_spec.rb +67 -0
- data/spec/lita/handlers/room_spec.rb +24 -0
- data/spec/lita/handlers/users_spec.rb +35 -0
- data/spec/lita/logger_spec.rb +28 -0
- data/spec/lita/message_spec.rb +178 -0
- data/spec/lita/plugin_builder_spec.rb +41 -0
- data/spec/lita/response_spec.rb +62 -0
- data/spec/lita/robot_spec.rb +285 -0
- data/spec/lita/room_spec.rb +136 -0
- data/spec/lita/rspec/handler_spec.rb +33 -0
- data/spec/lita/rspec_spec.rb +162 -0
- data/spec/lita/source_spec.rb +68 -0
- data/spec/lita/store_spec.rb +23 -0
- data/spec/lita/template_resolver_spec.rb +42 -0
- data/spec/lita/template_spec.rb +52 -0
- data/spec/lita/timer_spec.rb +32 -0
- data/spec/lita/user_spec.rb +167 -0
- data/spec/lita/util_spec.rb +18 -0
- data/spec/lita_spec.rb +227 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/templates/basic.erb +1 -0
- data/spec/templates/basic.irc.erb +1 -0
- data/spec/templates/helpers.erb +1 -0
- data/spec/templates/interpolated.erb +1 -0
- data/templates/locales/en.yml +137 -0
- data/templates/plugin/Gemfile +5 -0
- data/templates/plugin/README.tt +29 -0
- data/templates/plugin/Rakefile +8 -0
- data/templates/plugin/gemspec.tt +27 -0
- data/templates/plugin/gitignore +18 -0
- data/templates/plugin/lib/lita/plugin_type/plugin.tt +19 -0
- data/templates/plugin/lib/plugin.tt +16 -0
- data/templates/plugin/locales/en.yml.tt +4 -0
- data/templates/plugin/spec/lita/plugin_type/plugin_spec.tt +6 -0
- data/templates/plugin/spec/spec_helper.tt +8 -0
- data/templates/plugin/templates/gitkeep +0 -0
- data/templates/robot/Gemfile +5 -0
- data/templates/robot/lita_config.rb +28 -0
- metadata +386 -21
- data/.standard.yml +0 -3
- data/CHANGELOG.md +0 -5
- data/CODE_OF_CONDUCT.md +0 -132
- data/lib/rita/version.rb +0 -5
- data/lib/rita.rb +0 -8
- data/sig/rita.rbs +0 -4
data/spec/lita_spec.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Lita do
|
6
|
+
let(:registry) { Lita::Registry.new }
|
7
|
+
before { described_class.register_adapter(:shell, Lita::Adapters::Shell) }
|
8
|
+
|
9
|
+
it "memoizes a Configuration" do
|
10
|
+
expect(described_class.config).to eql(described_class.config)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "keeps track of registered hooks" do
|
14
|
+
hook = double("hook")
|
15
|
+
described_class.register_hook("Foo ", hook)
|
16
|
+
described_class.register_hook(:foO, hook)
|
17
|
+
expect(described_class.hooks[:foo]).to eq(Set.new([hook]))
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".configure" do
|
21
|
+
it "yields the Configuration object" do
|
22
|
+
described_class.configure { |c| c.robot.name = "Not Lita" }
|
23
|
+
expect(described_class.config.robot.name).to eq("Not Lita")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".load_locales" do
|
28
|
+
let(:load_path) do
|
29
|
+
load_path = double("Array")
|
30
|
+
allow(load_path).to receive(:concat)
|
31
|
+
load_path
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:new_locales) { %w[foo bar] }
|
35
|
+
|
36
|
+
before do
|
37
|
+
allow(I18n).to receive(:load_path).and_return(load_path)
|
38
|
+
allow(I18n).to receive(:reload!)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "appends the locale files to I18n.load_path" do
|
42
|
+
expect(I18n.load_path).to receive(:concat).with(new_locales)
|
43
|
+
described_class.load_locales(new_locales)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "reloads I18n" do
|
47
|
+
expect(I18n).to receive(:reload!)
|
48
|
+
described_class.load_locales(new_locales)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "wraps single paths in an array" do
|
52
|
+
expect(I18n.load_path).to receive(:concat).with(["foo"])
|
53
|
+
described_class.load_locales("foo")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".locale=" do
|
58
|
+
it "sets I18n.locale to the normalized locale" do
|
59
|
+
expect(I18n).to receive(:locale=).with("es-MX.UTF-8")
|
60
|
+
described_class.locale = "es_MX.UTF-8"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".default_locale=" do
|
65
|
+
it "sets I18n.default_locale to the normalized locale" do
|
66
|
+
expect(I18n).to receive(:default_locale=).with("zh-TW")
|
67
|
+
described_class.default_locale = "zh_TW"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe ".redis" do
|
72
|
+
let(:redis_namespace) { instance_double("Redis") }
|
73
|
+
|
74
|
+
before do
|
75
|
+
if described_class.instance_variable_defined?(:@redis)
|
76
|
+
described_class.remove_instance_variable(:@redis)
|
77
|
+
end
|
78
|
+
|
79
|
+
allow(redis_namespace).to receive(:ping).and_return("PONG")
|
80
|
+
allow(Redis::Namespace).to receive(:new).and_return(redis_namespace)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "memoizes a Redis::Namespace" do
|
84
|
+
expect(described_class.redis).to equal(redis_namespace)
|
85
|
+
expect(described_class.redis).to eql(described_class.redis)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "raises a RedisError if it can't connect to Redis" do
|
89
|
+
allow(redis_namespace).to receive(:ping).and_raise(Redis::CannotConnectError)
|
90
|
+
expect { Lita.redis }.to raise_error(Lita::RedisError, /could not connect to Redis/)
|
91
|
+
end
|
92
|
+
|
93
|
+
context "with test mode off" do
|
94
|
+
around do |example|
|
95
|
+
test_mode = Lita.test_mode?
|
96
|
+
Lita.test_mode = false
|
97
|
+
example.run
|
98
|
+
Lita.test_mode = test_mode
|
99
|
+
end
|
100
|
+
|
101
|
+
it "logs a fatal warning and raises an exception if it can't connect to Redis" do
|
102
|
+
allow(redis_namespace).to receive(:ping).and_raise(Redis::CannotConnectError)
|
103
|
+
|
104
|
+
expect(Lita.logger).to receive(:fatal)
|
105
|
+
expect { Lita.redis }.to raise_error(SystemExit)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe ".register_adapter" do
|
111
|
+
let(:robot) { Lita::Robot.new(registry) }
|
112
|
+
|
113
|
+
it "builds an adapter out of a provided block" do
|
114
|
+
# rubocop:disable Lint/EmptyBlock
|
115
|
+
described_class.register_adapter(:foo) {}
|
116
|
+
# rubocop:enable Lint/EmptyBlock
|
117
|
+
|
118
|
+
expect(Lita.logger).to receive(:warn).with(/not implemented/)
|
119
|
+
|
120
|
+
Lita.adapters[:foo].new(robot).run
|
121
|
+
end
|
122
|
+
|
123
|
+
it "raises if a non-class object is passed as the adapter" do
|
124
|
+
expect do
|
125
|
+
described_class.register_adapter(:foo, :bar)
|
126
|
+
end.to raise_error(ArgumentError, /requires a class/)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe ".register_handler" do
|
131
|
+
it "builds a handler out of a provided block" do
|
132
|
+
# rubocop:disable Lint/EmptyBlock
|
133
|
+
described_class.register_handler(:foo) {}
|
134
|
+
# rubocop:enable Lint/EmptyBlock
|
135
|
+
#
|
136
|
+
expect(described_class.handlers.to_a.last.namespace).to eq("foo")
|
137
|
+
end
|
138
|
+
|
139
|
+
it "raises if a non-class object is the only argument" do
|
140
|
+
expect do
|
141
|
+
described_class.register_handler(:foo)
|
142
|
+
end.to raise_error(ArgumentError, /requires a class/)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe ".reset" do
|
147
|
+
it "clears the config" do
|
148
|
+
described_class.config.robot.name = "Foo"
|
149
|
+
described_class.reset
|
150
|
+
expect(described_class.config.robot.name).to eq("Lita")
|
151
|
+
end
|
152
|
+
|
153
|
+
it "clears adapters" do
|
154
|
+
described_class.register_adapter(:foo, Class.new)
|
155
|
+
described_class.reset
|
156
|
+
expect(described_class.adapters).to be_empty
|
157
|
+
end
|
158
|
+
|
159
|
+
it "clears handlers" do
|
160
|
+
described_class.register_handler(Class.new)
|
161
|
+
described_class.reset
|
162
|
+
expect(described_class.handlers).to be_empty
|
163
|
+
end
|
164
|
+
|
165
|
+
it "clears hooks" do
|
166
|
+
described_class.register_hook(:foo, double)
|
167
|
+
described_class.reset
|
168
|
+
expect(described_class.hooks).to be_empty
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe ".load_config" do
|
173
|
+
let(:hook) { double("Hook") }
|
174
|
+
let(:validator) { instance_double("Lita::ConfigurationValidator", call: nil) }
|
175
|
+
|
176
|
+
before do
|
177
|
+
allow(
|
178
|
+
Lita::ConfigurationValidator
|
179
|
+
).to receive(:new).with(described_class).and_return(validator)
|
180
|
+
end
|
181
|
+
|
182
|
+
after { described_class.reset }
|
183
|
+
|
184
|
+
it "calls before_run hooks" do
|
185
|
+
described_class.register_hook(:before_run, hook)
|
186
|
+
expect(hook).to receive(:call).with(config_path: "path/to/config")
|
187
|
+
described_class.load_config("path/to/config")
|
188
|
+
end
|
189
|
+
|
190
|
+
it "calls config_finalized hooks" do
|
191
|
+
described_class.register_hook(:config_finalized, hook)
|
192
|
+
expect(hook).to receive(:call).with(config_path: "path/to/config")
|
193
|
+
described_class.load_config("path/to/config")
|
194
|
+
end
|
195
|
+
|
196
|
+
it "raises if the configuration is not valid" do
|
197
|
+
allow(validator).to receive(:call).and_raise(SystemExit)
|
198
|
+
|
199
|
+
expect { described_class.load_config }.to raise_error(SystemExit)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe ".run" do
|
204
|
+
let(:validator) { instance_double("Lita::ConfigurationValidator", call: nil) }
|
205
|
+
let(:robot) { double("Lita::Robot", run: nil) }
|
206
|
+
|
207
|
+
before do
|
208
|
+
allow(Lita::Robot).to receive(:new).and_return(robot)
|
209
|
+
allow(Lita::ConfigurationBuilder).to receive(:load_user_config)
|
210
|
+
allow(
|
211
|
+
Lita::ConfigurationValidator
|
212
|
+
).to receive(:new).with(described_class).and_return(validator)
|
213
|
+
end
|
214
|
+
|
215
|
+
after { described_class.reset }
|
216
|
+
|
217
|
+
it "runs a new Robot" do
|
218
|
+
expect(robot).to receive(:run)
|
219
|
+
described_class.run
|
220
|
+
end
|
221
|
+
|
222
|
+
it "loads configuration from a config file" do
|
223
|
+
expect(described_class).to receive(:load_config).with("path/to/config")
|
224
|
+
described_class.run("path/to/config")
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Generate code coverage metrics outside CI.
|
4
|
+
unless ENV["CI"]
|
5
|
+
require "simplecov"
|
6
|
+
SimpleCov.start { add_filter "/spec/" }
|
7
|
+
end
|
8
|
+
|
9
|
+
require "pry"
|
10
|
+
require "lita/rspec"
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.mock_with :rspec do |mocks_config|
|
14
|
+
mocks_config.verify_doubled_constant_names = true
|
15
|
+
mocks_config.verify_partial_doubles = true
|
16
|
+
end
|
17
|
+
|
18
|
+
# Lita calls `exit(false)` in a few places. If an RSpec example hits one of these calls and it
|
19
|
+
# wasn't explicitly stubbed, the example will stop at exactly that point, but will be reported by
|
20
|
+
# RSpec as having passed, and will also change RSpec's exit code to 1. This situation indicates
|
21
|
+
# either a missing stub or a real bug, so we catch it here and fail loudly.
|
22
|
+
#
|
23
|
+
# https://github.com/rspec/rspec-core/issues/2246
|
24
|
+
config.around do |example|
|
25
|
+
example.run
|
26
|
+
rescue SystemExit => e
|
27
|
+
raise <<~ERROR
|
28
|
+
Unhandled SystemExit! This will cause RSpec to exit 1 but show the example as passing!"
|
29
|
+
|
30
|
+
Full backtrace:
|
31
|
+
|
32
|
+
#{e.backtrace.join("\n")}
|
33
|
+
ERROR
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Template rendered from a file!
|
@@ -0,0 +1 @@
|
|
1
|
+
IRC template rendered from a file!
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= reverse_name(@first, @last) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
I love <%= @first %> <%= @last %>!
|
@@ -0,0 +1,137 @@
|
|
1
|
+
en:
|
2
|
+
lita:
|
3
|
+
adapters:
|
4
|
+
shell:
|
5
|
+
startup_message: Type "exit" or "quit" to end the session.
|
6
|
+
core:
|
7
|
+
register_adapter:
|
8
|
+
block_or_class_required: Lita.register_adapter requires a class in its two argument form.
|
9
|
+
register_handler:
|
10
|
+
block_or_class_required: Lita.register_handler requires a class in its single argument form.
|
11
|
+
adapter:
|
12
|
+
method_not_implemented: "This adapter has not implemented #%{method}."
|
13
|
+
cli:
|
14
|
+
no_gemfile_warning: >-
|
15
|
+
The default command "start" must be run inside a Lita project. Try running `lita new` to
|
16
|
+
generate a new Lita project or `lita help` to see all commands.
|
17
|
+
license_notice: >-
|
18
|
+
If you plan to release this plugin as open source software, consider adding a LICENSE file
|
19
|
+
to the root of the repository.
|
20
|
+
|
21
|
+
Common open source software licenses can be found at https://choosealicense.com/.
|
22
|
+
github_user_question: What is your GitHub username?
|
23
|
+
config:
|
24
|
+
exception: |
|
25
|
+
Lita configuration file could not be processed. The exception was:
|
26
|
+
%{message}
|
27
|
+
Full backtrace:
|
28
|
+
%{backtrace}
|
29
|
+
locale_deprecated: >-
|
30
|
+
`config.robot.locale` and `config.robot.default_locale` are deprecated and will be removed
|
31
|
+
in Lita 6.0. Use the environment variable LC_ALL, LC_MESSAGES, or LANG to set the program's
|
32
|
+
locale instead.
|
33
|
+
missing_required_adapter_attribute: >-
|
34
|
+
Configuration attribute "%{attribute}" is required for "%{adapter}" adapter.
|
35
|
+
missing_required_handler_attribute: >-
|
36
|
+
Configuration attribute "%{attribute}" is required for "%{handler}" handler.
|
37
|
+
type_error: >-
|
38
|
+
Configuration type error: "%{attribute}" must be one of: %{types}.
|
39
|
+
validation_error: >-
|
40
|
+
Validation error on attribute "%{attribute}": %{message}
|
41
|
+
handler:
|
42
|
+
dispatch: "Dispatching message to %{handler}#%{method}."
|
43
|
+
exception: |
|
44
|
+
%{handler} crashed. The exception was:
|
45
|
+
%{message}
|
46
|
+
Full backtrace:
|
47
|
+
%{backtrace}
|
48
|
+
handlers:
|
49
|
+
authorization:
|
50
|
+
help:
|
51
|
+
add_key: auth add USER GROUP
|
52
|
+
add_value: Add USER to authorization group GROUP. Requires admin privileges.
|
53
|
+
remove_key: auth remove USER GROUP
|
54
|
+
remove_value: Remove USER from authorization group GROUP. Requires admin privileges.
|
55
|
+
list_key: "auth list [GROUP]"
|
56
|
+
list_value: >-
|
57
|
+
List authorization groups and the users in them. If GROUP is supplied,
|
58
|
+
only lists that group.
|
59
|
+
user_added: "%{user} was added to %{group}."
|
60
|
+
user_already_in: "%{user} was already in %{group}."
|
61
|
+
user_removed: "%{user} was removed from %{group}."
|
62
|
+
user_not_in: "%{user} was not in %{group}."
|
63
|
+
empty_state: There are no authorization groups yet.
|
64
|
+
empty_state_group: "There is no authorization group named %{group}."
|
65
|
+
format: "Format"
|
66
|
+
admin_management: Administrators can only be managed via Lita config.
|
67
|
+
no_user_found: 'No user was found with the identifier "%{identifier}".'
|
68
|
+
help:
|
69
|
+
handler_contains: Handler "%{handler}" defines the following commands
|
70
|
+
help:
|
71
|
+
help_value: Lists help information for terms and command the robot will respond to.
|
72
|
+
help_query_key: "help QUERY"
|
73
|
+
help_query_value: Lists help information for commands matching QUERY.
|
74
|
+
info: >-
|
75
|
+
Send the message "%{address}help QUERY" to see matching help messages. QUERY may be the
|
76
|
+
name of a handler, text matching a message pattern a handler responds to, or text
|
77
|
+
matching the description of a message pattern a handler responds to. The following
|
78
|
+
handlers are installed:
|
79
|
+
no_help_found: "No matching handlers, message patterns, or descriptions found."
|
80
|
+
pattern_or_description_contains: Message patterns or descriptions that match "%{query}"
|
81
|
+
unauthorized: " [Unauthorized]"
|
82
|
+
info:
|
83
|
+
help:
|
84
|
+
info_value: Replies with the current version of Lita.
|
85
|
+
room:
|
86
|
+
help:
|
87
|
+
join_key: join ROOM_ID
|
88
|
+
join_value: Makes the robot join the room with room ID ROOM_ID.
|
89
|
+
part_key: part ROOM_ID
|
90
|
+
part_value: Makes the robot part from the room with room ID ROOM_ID.
|
91
|
+
users:
|
92
|
+
find_empty_state: No matching users found.
|
93
|
+
help:
|
94
|
+
find_key: users find SEARCH_TERM
|
95
|
+
find_value: Find a Lita user by ID, name, or mention name.
|
96
|
+
http:
|
97
|
+
exception: |
|
98
|
+
Lita's built-in web server could not be started. The exception was:
|
99
|
+
%{message}
|
100
|
+
Full backtrace:
|
101
|
+
%{backtrace}
|
102
|
+
plugin:
|
103
|
+
name_required: Plugins that are anonymous classes must set a namespace or define self.name.
|
104
|
+
redis:
|
105
|
+
exception: |
|
106
|
+
Lita could not connect to Redis. The exception was:
|
107
|
+
%{message}
|
108
|
+
Full backtrace:
|
109
|
+
%{backtrace}
|
110
|
+
test_mode_exception: |
|
111
|
+
Lita could not connect to Redis. The exception was:
|
112
|
+
%{message}
|
113
|
+
robot:
|
114
|
+
unknown_adapter: "Unknown adapter: :%{adapter}."
|
115
|
+
rspec:
|
116
|
+
full_suite_required: Lita::RSpec requires both RSpec::Mocks and RSpec::Expectations.
|
117
|
+
version_3_required: RSpec::Core 3 or greater is required to use Lita::RSpec.
|
118
|
+
rack_test_required: Rack::Test is required to use the `http` method of Lita::RSpec.
|
119
|
+
lita_3_compatibility_mode: >-
|
120
|
+
WARNING: Lita 3 compatibility mode is deprecated in Lita 5 and will be removed in Lita 6.
|
121
|
+
It no longer has any effect. Please remove any calls to `Lita.version_3_compatibility_mode`.
|
122
|
+
route_failure: |-
|
123
|
+
Expected message "%{message}" to route to :%{route}, but didn't.
|
124
|
+
negative_route_failure: |-
|
125
|
+
Expected message "%{message}" not to route to :%{route}, but did.
|
126
|
+
http_route_failure: |-
|
127
|
+
Expected request "%{method} %{path}" to route to :%{route}, but didn't.
|
128
|
+
negative_http_route_failure: |-
|
129
|
+
Expected request "%{method} %{path}" not to route to :%{route}, but did.
|
130
|
+
event_subscription_failure: |-
|
131
|
+
Expected triggering event "%{event}" to invoke :%{route}, but didn't.
|
132
|
+
negative_event_subscription_failure: |-
|
133
|
+
Expected triggering event "%{event}" not to invoke :%{route}, but did.
|
134
|
+
source:
|
135
|
+
user_or_room_required: Either a user or a room is required.
|
136
|
+
template:
|
137
|
+
missing_template: Missing template file at %{path}.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# <%= config[:gem_name] %>
|
2
|
+
|
3
|
+
TODO: Add a description of the plugin.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
<%- if config[:plugin_type] == "extension" -%>
|
8
|
+
Add <%= config[:gem_name] %> to your Lita plugin's gemspec:
|
9
|
+
|
10
|
+
``` ruby
|
11
|
+
spec.add_runtime_dependency "<%= config[:gem_name] %>"
|
12
|
+
```
|
13
|
+
<%- else -%>
|
14
|
+
Add <%= config[:gem_name] %> to your Lita instance's Gemfile:
|
15
|
+
|
16
|
+
``` ruby
|
17
|
+
gem "<%= config[:gem_name] %>"
|
18
|
+
```
|
19
|
+
<%- end -%>
|
20
|
+
|
21
|
+
<%- unless config[:plugin_type] == "extension" -%>
|
22
|
+
## Configuration
|
23
|
+
|
24
|
+
TODO: Describe any configuration attributes the plugin exposes.
|
25
|
+
|
26
|
+
<%- end -%>
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
TODO: Describe the plugin's features and how to use them.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "<%= config[:gem_name] %>"
|
3
|
+
spec.version = "0.1.0"
|
4
|
+
spec.authors = ["<%= config[:author] %>"]
|
5
|
+
spec.email = ["<%= config[:email] %>"]
|
6
|
+
spec.description = "TODO: Add a description"
|
7
|
+
spec.summary = "TODO: Add a summary"
|
8
|
+
spec.homepage = "TODO: Add a homepage"
|
9
|
+
spec.license = "TODO: Add a license"
|
10
|
+
spec.metadata = { "lita_plugin_type" => "<%= config[:plugin_type] %>" }
|
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", ">= <%= config[:required_lita_version] %>"
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
20
|
+
if RUBY_PLATFORM != 'java'
|
21
|
+
spec.add_development_dependency "pry-byebug"
|
22
|
+
end
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rack-test"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "simplecov"
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lita
|
4
|
+
module <%= config[:constant_namespace] %>
|
5
|
+
class <%= config[:constant_name] %><% unless config[:plugin_type] == "extension" %> < <%= config[:plugin_type].capitalize %><% end %>
|
6
|
+
# insert <%= config[:plugin_type] %> code here
|
7
|
+
|
8
|
+
<%- if config[:plugin_type] == "adapter" -%>
|
9
|
+
Lita.register_adapter(:<%= config[:name] %>, self)
|
10
|
+
<%- elsif config[:plugin_type] == "handler" -%>
|
11
|
+
Lita.register_handler(self)
|
12
|
+
<%- else -%>
|
13
|
+
# If your extension needs to register with a Lita hook, uncomment the
|
14
|
+
# following line and change the hook name to the appropriate value:
|
15
|
+
# Lita.register_hook(:hook_name, self)
|
16
|
+
<%- end -%>
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lita"
|
4
|
+
|
5
|
+
Lita.load_locales Dir[File.expand_path(
|
6
|
+
File.join("..", "..", "locales", "*.yml"), __FILE__
|
7
|
+
)]
|
8
|
+
|
9
|
+
require "lita/<%= config[:namespace] %>/<%= config[:name] %>"
|
10
|
+
<%- if config[:plugin_type] == "handler" -%>
|
11
|
+
|
12
|
+
Lita::<%= config[:constant_namespace] %>::<%= config[:constant_name] %>.template_root File.expand_path(
|
13
|
+
File.join("..", "..", "templates"),
|
14
|
+
__FILE__
|
15
|
+
)
|
16
|
+
<%- end -%>
|
File without changes
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Lita.configure do |config|
|
4
|
+
# The name your robot will use.
|
5
|
+
config.robot.name = "Lita"
|
6
|
+
|
7
|
+
## An array identifiers for users who are considered administrators. These
|
8
|
+
## users have the ability to add and remove other users from authorization
|
9
|
+
## groups. What is considered a user ID will change depending on which adapter
|
10
|
+
## you use.
|
11
|
+
# config.robot.admins = ["1", "2"]
|
12
|
+
|
13
|
+
# The adapter you want to connect with. Make sure you've added the
|
14
|
+
# appropriate gem to the Gemfile.
|
15
|
+
config.robot.adapter = :shell
|
16
|
+
|
17
|
+
## Example: Set options for the chosen adapter.
|
18
|
+
# config.adapter.username = "myname"
|
19
|
+
# config.adapter.password = "secret"
|
20
|
+
|
21
|
+
## Example: Set options for the Redis connection.
|
22
|
+
# config.redis[:host] = "127.0.0.1"
|
23
|
+
# config.redis[:port] = 1234
|
24
|
+
|
25
|
+
## Example: Set configuration for any loaded handlers. See the handler's
|
26
|
+
## documentation for options.
|
27
|
+
# config.handlers.example_handler.example_attribute = "example value"
|
28
|
+
end
|