lita-elasticsearch-indexer 0.1.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 +7 -0
- data/.gitignore +56 -0
- data/Docker.README.md +323 -0
- data/Dockerfile +15 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +46 -0
- data/Rakefile +6 -0
- data/docker-compose.dev.yml +24 -0
- data/docker-compose.yml +28 -0
- data/lib/lita-elasticsearch-indexer.rb +12 -0
- data/lib/lita/handlers/elasticsearch_indexer.rb +55 -0
- data/lita-elasticsearch-indexer.gemspec +31 -0
- data/lita.env.example +11 -0
- data/lita_config.rb +43 -0
- data/locales/en.yml +4 -0
- data/spec/lita/handlers/elasticsearch_indexer_spec.rb +116 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/elasticsearch_shared_examples.rb +31 -0
- data/templates/.gitkeep +0 -0
- metadata +185 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 11fd7fd834da4c9ca3378b5b3fe9c9176c33fa10
|
4
|
+
data.tar.gz: d6ded8af78eac2d21bc3ef1899c6c1170f74f29e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 66d84027258f128f8f49cb76c7a57b903ead954522f48fdd52b80a2ad0c0d1aeb8ea1f81962cf45f1d84ea047006006f5804068614091330855bc2977a0bf9b8
|
7
|
+
data.tar.gz: 1019e35ce7fd1e357d52e25b7c0629a8c7c3e40c6f15b6f37bafe491452b4e1aac99449a9de0d3348d9c2d488f33dba63264f214d1d716f92e0a9a4e81ec4dbc
|
data/.gitignore
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
# This is only used for development
|
14
|
+
docker-compose.override.yml
|
15
|
+
|
16
|
+
# lita.env contains secrets
|
17
|
+
/lita.env
|
18
|
+
|
19
|
+
# Used by dotenv library to load environment variables.
|
20
|
+
# .env
|
21
|
+
|
22
|
+
## Specific to RubyMotion:
|
23
|
+
.dat*
|
24
|
+
.repl_history
|
25
|
+
build/
|
26
|
+
*.bridgesupport
|
27
|
+
build-iPhoneOS/
|
28
|
+
build-iPhoneSimulator/
|
29
|
+
|
30
|
+
## Specific to RubyMotion (use of CocoaPods):
|
31
|
+
#
|
32
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
33
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
34
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
35
|
+
#
|
36
|
+
# vendor/Pods/
|
37
|
+
|
38
|
+
## Documentation cache and generated files:
|
39
|
+
/.yardoc/
|
40
|
+
/_yardoc/
|
41
|
+
/doc/
|
42
|
+
/rdoc/
|
43
|
+
|
44
|
+
## Environment normalization:
|
45
|
+
/.bundle/
|
46
|
+
/vendor/bundle
|
47
|
+
/lib/bundler/man/
|
48
|
+
|
49
|
+
# for a library or gem, you might want to ignore these files since the code is
|
50
|
+
# intended to run in multiple environments; otherwise, check them in:
|
51
|
+
Gemfile.lock
|
52
|
+
# .ruby-version
|
53
|
+
# .ruby-gemset
|
54
|
+
|
55
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
56
|
+
.rvmrc
|
data/Docker.README.md
ADDED
@@ -0,0 +1,323 @@
|
|
1
|
+
Development with Docker
|
2
|
+
===
|
3
|
+
We use [Docker](https://www.docker.com/) to run, test, and debug our application.
|
4
|
+
The following documents how to install and use Docker on a Mac. There are
|
5
|
+
[instructions](https://docs.docker.com/installation) for installing and using
|
6
|
+
docker on other operating systems.
|
7
|
+
|
8
|
+
On the mac, we use [docker for mac](https://docs.docker.com/engine/installation/mac/#/docker-for-mac).
|
9
|
+
|
10
|
+
We use [docker-compose](https://docs.docker.com/compose/) to automate most of
|
11
|
+
our interactions with the application.
|
12
|
+
|
13
|
+
Table of Contents
|
14
|
+
===
|
15
|
+
* [Installation and Upgrade](#installation-and-upgrade)
|
16
|
+
* [Launching the Application](#launching-the-application)
|
17
|
+
* [Docker Compose](#docker-compose)
|
18
|
+
* [Dockerfile](#dockerfile)
|
19
|
+
* [Useful Docker Commands](#useful-docker-commands)
|
20
|
+
* [Bash Profile](#bash-profile)
|
21
|
+
|
22
|
+
Installation and Upgrade
|
23
|
+
===
|
24
|
+
Docker makes it easy to install docker for mac, which includes docker, and docker-compose
|
25
|
+
on your mac, and keep them upgraded in sync. Follow the instructions
|
26
|
+
to install [Docker 4 Mac]((https://docs.docker.com/engine/installation/mac/#/docker-for-mac).
|
27
|
+
|
28
|
+
Once you have docker running, you can run any of the following commands to test
|
29
|
+
that docker is working:
|
30
|
+
```
|
31
|
+
docker ps
|
32
|
+
```
|
33
|
+
This should always return a table with the following headers, and 0 or more
|
34
|
+
entries:
|
35
|
+
|
36
|
+
`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES`
|
37
|
+
|
38
|
+
```
|
39
|
+
docker images
|
40
|
+
```
|
41
|
+
Similar to above, it should always return a table with the following headers, and
|
42
|
+
0 or more entries:
|
43
|
+
|
44
|
+
`REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE`
|
45
|
+
|
46
|
+
Launching the Application
|
47
|
+
===
|
48
|
+
|
49
|
+
Create lita.env in the Application root, using lita.env.example. If you are using
|
50
|
+
slack, you will need to create a [Slack API Token](https://my.slack.com/services/new/lita)
|
51
|
+
and add it to the LITA_SLACK_TOKEN variable.
|
52
|
+
|
53
|
+
In the Application root, run the following:
|
54
|
+
```bash
|
55
|
+
touch Gemfile.lock
|
56
|
+
docker-compose up -d
|
57
|
+
```
|
58
|
+
|
59
|
+
Docker Compose
|
60
|
+
===
|
61
|
+
|
62
|
+
Once you have docker installed, you can use docker-compose to run all of the
|
63
|
+
commands that you would normally run when developing and testing the application.
|
64
|
+
Docker Compose uses one or more yml files to specify everything required to build
|
65
|
+
and run the application and any other support application (databases, volume
|
66
|
+
containers, etc.) it requires. There are multiple docker-compose yml files in
|
67
|
+
the Application Root, explained below.
|
68
|
+
|
69
|
+
docker-compose.yml
|
70
|
+
---
|
71
|
+
This is the base docker-compose file used to manage the server.
|
72
|
+
|
73
|
+
Anyone with docker and docker-compose can run the following command from within
|
74
|
+
the Application Root (where this file you are reading resides), to build the server
|
75
|
+
image (You must be connected to the internet so that docker can
|
76
|
+
pull down any base docker images, or package/gem installs, for this to work).
|
77
|
+
|
78
|
+
```
|
79
|
+
docker-compose build
|
80
|
+
```
|
81
|
+
Once you have built the images, you can launch containers of all services
|
82
|
+
required by the app (docker calls a running instance of a docker image a docker
|
83
|
+
container):
|
84
|
+
```
|
85
|
+
docker-compose up -d
|
86
|
+
```
|
87
|
+
|
88
|
+
The docker-compose definition for the 'server' service mounts the Application
|
89
|
+
Root as /var/www/app in the server docker container. Since the Dockerfile specifies
|
90
|
+
/var/www/app as its default WORKDIR, this allows you to make changes to the files
|
91
|
+
on your machine and see them reflected live in the running server (although see
|
92
|
+
[below](#dockerfile) for **important information about modifying the Gemfile**).
|
93
|
+
|
94
|
+
The Dockerfile hosts the application on port 3000 inside the container,
|
95
|
+
and the docker-compose service definition attaches this to port 3000 on the
|
96
|
+
host machine (this will fail if you have another service of any kind attached to
|
97
|
+
port 3000 on the same host).
|
98
|
+
To connect to this host you can use curl, or your browser to connect to
|
99
|
+
http://localhost:3000/api/v1/app/status to check the status of
|
100
|
+
the application. All other parts of the application are served at
|
101
|
+
http://localhost:3000.
|
102
|
+
|
103
|
+
docker-compose.dev.yml
|
104
|
+
---
|
105
|
+
This file extends docker-compose.yml to add service definitions to make it possible
|
106
|
+
to easily run things like bundle, rspec, rails, rake, etc (see below for more).
|
107
|
+
|
108
|
+
You can use this by adding the -f docker-compose.yml -f docker-compose.dev.yml flag
|
109
|
+
to all of your docker-compose commands, e.g.
|
110
|
+
```
|
111
|
+
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run rails c
|
112
|
+
```
|
113
|
+
|
114
|
+
Alternatively, you can use the fact that docker-compose looks for both docker-compose.yml
|
115
|
+
and docker-compose.override.yml by default, and create a symlink from docker-compose.dev.yml
|
116
|
+
to docker-compose.override.yml that will make docker-compose use both by default, without
|
117
|
+
any of the extra -f flags.
|
118
|
+
```
|
119
|
+
ln -s docker-compose.dev.yml docker-compose.override.yml
|
120
|
+
```
|
121
|
+
Note, you should add docker-compose.override.yml to your .gitignore, so it will
|
122
|
+
never be committed to the repo. This ensures that the default behavior for those
|
123
|
+
not wishing to use the extra functionality in docker-compose.dev.yml is preserved.
|
124
|
+
|
125
|
+
You should always specify the exact service (e.g. top level key
|
126
|
+
in the docker-compose.dev.yml file) when running docker-compose commands using this
|
127
|
+
docker-compose.dev.yml file. Otherwise, docker-compose will try to run all services,
|
128
|
+
which will cause things to run that do not need to run (such as bundle).
|
129
|
+
|
130
|
+
default docker-compose commands
|
131
|
+
---
|
132
|
+
Using just the docker-compose.yml, e.g. docker-compose.override.yml file/symlink
|
133
|
+
is not present:
|
134
|
+
|
135
|
+
Launch the server to interact with the application:
|
136
|
+
```
|
137
|
+
docker-compose up -d server
|
138
|
+
```
|
139
|
+
Docker-compose is smart enough to realize all of the linked services required,
|
140
|
+
and spin them up in order. This will not launch a swift service.
|
141
|
+
|
142
|
+
Bring down and delete running containers:
|
143
|
+
```
|
144
|
+
docker-compose down
|
145
|
+
```
|
146
|
+
|
147
|
+
docker-compose.dev.yml docker-compose commands
|
148
|
+
---
|
149
|
+
Either use -f docker-compose.yml -f docker-compose.dev.yml, like so:
|
150
|
+
Run rspec
|
151
|
+
```
|
152
|
+
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run rspec
|
153
|
+
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run rspec spec/requests
|
154
|
+
```
|
155
|
+
|
156
|
+
Or create a symlink from docker-compose.dev.yml to docker-compose.override.yml.
|
157
|
+
This is the recommended way to use docker-compose.dev.yml, as it will be more
|
158
|
+
permanent between invocations of the shell terminal.
|
159
|
+
```
|
160
|
+
ln -s docker-compose.dev.yml docker-compose.override.yml
|
161
|
+
```
|
162
|
+
|
163
|
+
Then you can run services like rspec without the extra -f flags:
|
164
|
+
```
|
165
|
+
docker-compose run rspec
|
166
|
+
docker-compose run rspec spec/requests
|
167
|
+
```
|
168
|
+
|
169
|
+
The following commands assume the symlink exists.
|
170
|
+
Run bundle (see
|
171
|
+
[below](#dockerfile) for **important information about modifying the Gemfile**)):
|
172
|
+
```
|
173
|
+
docker-compose run bundle
|
174
|
+
```
|
175
|
+
|
176
|
+
Run rake commands (default RAILS_ENV=development):
|
177
|
+
```
|
178
|
+
docker-compose run rake db:migrate
|
179
|
+
docker-compose run rake db:seed
|
180
|
+
docker-compose run rake db:migrate RAILS_ENV=test
|
181
|
+
```
|
182
|
+
|
183
|
+
Run rails commands (default RAILS_ENV=docker):
|
184
|
+
```
|
185
|
+
docker-compose run rails c
|
186
|
+
docker-compose run rails c RAILS_ENV=test
|
187
|
+
```
|
188
|
+
|
189
|
+
**Note about docker-compose down**
|
190
|
+
You should run docker-compose down using the same docker-compose yml file context,
|
191
|
+
e.g. with COMPOSE_FILE set, or the docker-compose.override.yml file in existence,
|
192
|
+
or using the -f flags for all docker-compose yml files. Otherwise, services defined
|
193
|
+
in the missing docker-compose.yml file will not be shut down and removed, and a warning
|
194
|
+
may come up in your output that says containers were 'orphaned'.
|
195
|
+
|
196
|
+
Dockerfile
|
197
|
+
===
|
198
|
+
Docker uses a [Dockerfile](https://docs.docker.com/reference/builder/) to
|
199
|
+
specify how to build an image to host an application. We have created a
|
200
|
+
Dockerfile in the Application Root. This Dockerfile:
|
201
|
+
* installs required libraries for ruby, rails, node, etc.
|
202
|
+
* installs specific versions of ruby
|
203
|
+
* installs the sqlite client libraries
|
204
|
+
* creates /var/www/app and sets this to the default working directory
|
205
|
+
* adds Gemfile and Gemfile.lock (see below)
|
206
|
+
* bundles to install required gems into the image
|
207
|
+
* exposes 3000
|
208
|
+
* sets up to run the rails server to host the service by default
|
209
|
+
|
210
|
+
**Important information about modifying the Gemfile**
|
211
|
+
When you need to add a gem to your Gemfile, you will also need to rebuild
|
212
|
+
the server. This will permenently install the new gem into the server image.
|
213
|
+
|
214
|
+
```
|
215
|
+
docker-compose build server
|
216
|
+
```
|
217
|
+
You then need to run bundle, which will update Gemfile.lock in the Application
|
218
|
+
Root
|
219
|
+
```
|
220
|
+
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run bundle
|
221
|
+
```
|
222
|
+
You should then commit and push the new Gemfile and Gemfile.lock to the repository.
|
223
|
+
|
224
|
+
Docker basics
|
225
|
+
===
|
226
|
+
|
227
|
+
To stop all running docker containers (you must stop a container before you can
|
228
|
+
remove it or its image):
|
229
|
+
```
|
230
|
+
docker-compose stop
|
231
|
+
```
|
232
|
+
|
233
|
+
To stop and/or remove all containers, use the following:
|
234
|
+
```
|
235
|
+
docker-compose down
|
236
|
+
```
|
237
|
+
|
238
|
+
When a docker container stops for any reason, docker keeps it around in its
|
239
|
+
system. There are ways you can start and attach to a stopped container, but
|
240
|
+
in many cases this is not useful. You should remove containers on a regular basis.
|
241
|
+
When you start up the machines from scratch, you will need to run rake db:migrate,
|
242
|
+
etc. to get the database ready.
|
243
|
+
|
244
|
+
You can list all running containers using the following command:
|
245
|
+
```
|
246
|
+
docker ps
|
247
|
+
```
|
248
|
+
You can list all containers (both running and stopped):
|
249
|
+
```
|
250
|
+
docker ps -a
|
251
|
+
```
|
252
|
+
|
253
|
+
Each docker container is given a long UUID by docker (called the CONTAINERID).
|
254
|
+
You can use this UUID (or even the first 4 or more characters) to stop
|
255
|
+
and remove a container using the docker commandline instead of
|
256
|
+
using docker-compose (see Docker [commandline documentation](https://docs.docker.com/engine/reference/commandline)
|
257
|
+
for other things you can find out about a running container using the docker command):
|
258
|
+
```
|
259
|
+
docker stop UUID
|
260
|
+
docker rm -v UUID
|
261
|
+
```
|
262
|
+
|
263
|
+
Sometimes docker will leave files from a container on the host, which can build
|
264
|
+
up over time and cause your VM to become sluggish or behave strangely. We
|
265
|
+
recommend adding the -v (volumes) flag to docker rm commands to make sure these
|
266
|
+
files are cleaned up appropriately. Also, docker ps allows you to pass the -q
|
267
|
+
flag, and get only the UUID of the containers it lists. Using the following
|
268
|
+
command, you can easily stop all running containers:
|
269
|
+
```
|
270
|
+
docker stop $(docker ps -q)
|
271
|
+
```
|
272
|
+
|
273
|
+
Similarly, to remove all stopped containers (this will skip running containers, but
|
274
|
+
print a warning for each):
|
275
|
+
```
|
276
|
+
docker rm -v $(docker ps -aq)
|
277
|
+
```
|
278
|
+
|
279
|
+
You may also need to check for volumes that have been left behind when containers
|
280
|
+
were removed without explicitly using docker rm -v, such as when docker-compose down
|
281
|
+
is run. To list all volumes on the docker host:
|
282
|
+
```
|
283
|
+
docker volume ls
|
284
|
+
```
|
285
|
+
|
286
|
+
The output from this is very similar to all other docker outputs. Each volume is
|
287
|
+
assigned a UUID. You can remove a specific volume with:
|
288
|
+
```
|
289
|
+
docker volume rm UUID
|
290
|
+
```
|
291
|
+
|
292
|
+
You can remove all volumes using the -q pattern used in other docker commands
|
293
|
+
```
|
294
|
+
docker volume rm $(docker volume ls -q)
|
295
|
+
```
|
296
|
+
|
297
|
+
We recommend running some of these frequently to clean up containers and volumes that
|
298
|
+
build up over time. Sometimes, when running a combination docker rm $(docker ls -q)
|
299
|
+
pattern command when there is nothing to remove, docker will print a warning that
|
300
|
+
it requires 1 or more arguments, but this is ok. It can be useful to put some or
|
301
|
+
all of these in your Bash Profile.
|
302
|
+
|
303
|
+
Bash Profile
|
304
|
+
===
|
305
|
+
The following can be placed in the .bash_profile file located in your
|
306
|
+
HOME directory (e.g. ~/.bash_profile)
|
307
|
+
|
308
|
+
```bash_profile
|
309
|
+
# Docker configurations and helpers
|
310
|
+
alias docker_stop_all='docker stop $(docker ps -q)'
|
311
|
+
alias docker_cleanup='docker rm -v $(docker ps -aq)'
|
312
|
+
alias docker_images_cleanup='docker rmi $(docker images -f dangling=true -q)'
|
313
|
+
alias docker_volume_cleanup='docker volume rm $(docker volume ls -q)'
|
314
|
+
|
315
|
+
# fake rake/rails/rspec using docker under the hood
|
316
|
+
# this depends on either a docker-compose.override.yml, or COMPOSE_FILE
|
317
|
+
# environment variable
|
318
|
+
alias rails="docker-compose run rails"
|
319
|
+
alias rake="docker-compose run rake"
|
320
|
+
alias rspec="docker-compose run rspec"
|
321
|
+
alias bundle="docker-compose run bundle"
|
322
|
+
alias dcdown="docker-compose down"
|
323
|
+
```
|
data/Dockerfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
FROM ruby:2.3
|
2
|
+
MAINTAINER Darin London <darin.london@duke.edu>
|
3
|
+
RUN gem install -N bundler lita
|
4
|
+
|
5
|
+
#miscellaneous
|
6
|
+
RUN ["mkdir","-p","/var/www"]
|
7
|
+
WORKDIR /var/www/app
|
8
|
+
ADD Gemfile /var/www/app/Gemfile
|
9
|
+
ADD Gemfile.lock /var/www/app/Gemfile.lock
|
10
|
+
ADD lita-elasticsearch-indexer.gemspec /var/www/app/lita-elasticsearch-indexer.gemspec
|
11
|
+
|
12
|
+
RUN ["bundle", "install", "--jobs=4"]
|
13
|
+
|
14
|
+
# run the app by defualt
|
15
|
+
CMD ["lita"]
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Research Application Development Group
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# lita-elasticsearch-indexer
|
2
|
+
|
3
|
+
A [Lita](https://www.lita.io/) handler plugin that indexes messages to
|
4
|
+
[Elasticsearch](https://www.elastic.co/).
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add lita-elasticsearch-indexer to your Lita instance's Gemfile:
|
9
|
+
|
10
|
+
``` ruby
|
11
|
+
gem "lita-elasticsearch-indexer"
|
12
|
+
```
|
13
|
+
|
14
|
+
## Configuration
|
15
|
+
|
16
|
+
### Required
|
17
|
+
* `elasticsearch_url` (String) - Host url for the Elasticsearch instance
|
18
|
+
* `elasticsearch_index_name` (String) - The name of the Elasticsearch index
|
19
|
+
|
20
|
+
### Optional
|
21
|
+
* `elasticsearch_index_type` (String) - The
|
22
|
+
Elasticsearch document type. (default: 'message')
|
23
|
+
* `elasticsearch_index_options` (Proc) - A ruby `Proc` or `lambda` used to set index parameters or override the index body.
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
lita-elasticsearch-indexer is a lurker-bot that silently indexes all messages posted
|
28
|
+
by all users in any room to which it has been invited. It can also index
|
29
|
+
private messages sent directly to the bot. The bot will not index any messages
|
30
|
+
posted to rooms to which it has not been invited.
|
31
|
+
|
32
|
+
### Setting elasticsearch index options with a Proc
|
33
|
+
|
34
|
+
Any of the optional arguments for [Elasticsearch::API::Actions index](http://www.rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Actions#index-instance_method) can be set via `elasticsearch_index_options` by creating a Proc
|
35
|
+
(or lambda) that returns a Hash. The hash will be merged with the required
|
36
|
+
parameters and passed directly to the elasticsearch client index method.
|
37
|
+
|
38
|
+
```
|
39
|
+
config.handlers.elasticsearch_indexer.elasticsearch_index_options = lambda {|response|
|
40
|
+
options = {}
|
41
|
+
if response.message.extensions[:slack]
|
42
|
+
options[:id] = response.room.id + '-' + response.message.extensions[:slack][:timestamp]
|
43
|
+
end
|
44
|
+
options
|
45
|
+
}
|
46
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
version: '2'
|
2
|
+
services:
|
3
|
+
bundle:
|
4
|
+
image: "lita-elasticsearch-indexer_server"
|
5
|
+
volumes_from:
|
6
|
+
- workdir
|
7
|
+
entrypoint: ['bundle']
|
8
|
+
rake:
|
9
|
+
image: "lita-elasticsearch-indexer_server"
|
10
|
+
volumes_from:
|
11
|
+
- workdir
|
12
|
+
entrypoint: ['rake']
|
13
|
+
rspec:
|
14
|
+
image: "lita-elasticsearch-indexer_server"
|
15
|
+
environment:
|
16
|
+
- LITA_REDIS_HOST=redis
|
17
|
+
- LITA_ELASTICSEARCH_URL=elastic.local:9200
|
18
|
+
volumes_from:
|
19
|
+
- workdir
|
20
|
+
links:
|
21
|
+
- redis
|
22
|
+
- elasticsearch:elastic.local
|
23
|
+
entrypoint: ['rspec']
|
24
|
+
command: spec
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
version: '2'
|
2
|
+
services:
|
3
|
+
workdir:
|
4
|
+
image: ruby:2.3 # Reducing footprint by matching image to Dockerfile FROM
|
5
|
+
command: ['df'] # Just a quick command that exits. Mount info is a bonus.
|
6
|
+
volumes:
|
7
|
+
- .:/var/www/app
|
8
|
+
lita:
|
9
|
+
build: .
|
10
|
+
image: lita-elasticsearch-indexer_server
|
11
|
+
volumes_from:
|
12
|
+
- workdir
|
13
|
+
restart: always
|
14
|
+
links:
|
15
|
+
- redis
|
16
|
+
- elasticsearch:elastic.local
|
17
|
+
ports:
|
18
|
+
- 8080:8080
|
19
|
+
env_file:
|
20
|
+
- lita.env
|
21
|
+
redis:
|
22
|
+
image: redis
|
23
|
+
volumes:
|
24
|
+
- ./redis:/var/lib/redis
|
25
|
+
elasticsearch:
|
26
|
+
image: elasticsearch:2.2.2
|
27
|
+
ports:
|
28
|
+
- 9200
|
@@ -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/elasticsearch_indexer"
|
8
|
+
|
9
|
+
Lita::Handlers::ElasticsearchIndexer.template_root File.expand_path(
|
10
|
+
File.join("..", "..", "templates"),
|
11
|
+
__FILE__
|
12
|
+
)
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'elasticsearch'
|
2
|
+
module Lita
|
3
|
+
module Handlers
|
4
|
+
class ElasticsearchIndexer < Handler
|
5
|
+
config :elasticsearch_url, type: String, required: true
|
6
|
+
config :elasticsearch_index_name, type: String, required: true
|
7
|
+
config :elasticsearch_index_type, type: String, default: "message"
|
8
|
+
config :elasticsearch_index_options, type: Proc
|
9
|
+
|
10
|
+
route(/^(.+)/,
|
11
|
+
:index_conversation,
|
12
|
+
help: { "info" =>
|
13
|
+
"Stores conversations in elasticsearch"
|
14
|
+
})
|
15
|
+
|
16
|
+
def elasticsearch_client
|
17
|
+
@@elasticsearch_client ||= Elasticsearch::Client.new(
|
18
|
+
urls: config.elasticsearch_url
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def index_conversation(response)
|
23
|
+
user = response.user
|
24
|
+
message = response.message
|
25
|
+
room = message.room_object
|
26
|
+
index_body = {
|
27
|
+
user: {id: user.id, name: user.name},
|
28
|
+
message: {
|
29
|
+
private: message.private_message?,
|
30
|
+
body: message.body
|
31
|
+
}
|
32
|
+
}
|
33
|
+
index_body[:room] = {id: room.id, name: room.name} if room
|
34
|
+
index_params = {
|
35
|
+
body: index_body
|
36
|
+
}.merge(elasticsearch_index_options(response))
|
37
|
+
index_params[:index] = config.elasticsearch_index_name
|
38
|
+
index_params[:type] = config.elasticsearch_index_type
|
39
|
+
index = elasticsearch_client.index(index_params)
|
40
|
+
end
|
41
|
+
|
42
|
+
Lita.register_handler(self)
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def elasticsearch_index_options(response)
|
47
|
+
if config.elasticsearch_index_options
|
48
|
+
config.elasticsearch_index_options.call(response)
|
49
|
+
else
|
50
|
+
{}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "lita-elasticsearch-indexer"
|
3
|
+
spec.version = "0.1.1"
|
4
|
+
spec.authors = ["Darrin Mann", "Darin London"]
|
5
|
+
spec.email = ["darrin.mann@duke.edu", "darin.london@duke.edu"]
|
6
|
+
spec.description = <<-EOF
|
7
|
+
lita-elasticsearch-indexer is a lurker-bot that silently indexes all messages posted
|
8
|
+
by all users in any room to which it has been invited. It can also index
|
9
|
+
private messages sent directly to the bot. The bot will not index any messages
|
10
|
+
posted to rooms to which it has not been invited.
|
11
|
+
EOF
|
12
|
+
spec.summary = "Listens to channel conversations and stores them to elasticsearch"
|
13
|
+
spec.homepage = "https://github.com/ORI-RAD/lita-elasticsearch-indexer"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.metadata = { "lita_plugin_type" => "handler" }
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($/)
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_runtime_dependency "lita", ">= 4.7"
|
23
|
+
spec.add_runtime_dependency "elasticsearch"
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
26
|
+
spec.add_development_dependency "pry-byebug"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "rack-test"
|
29
|
+
spec.add_development_dependency "rspec", ">= 3.0.0"
|
30
|
+
spec.add_development_dependency "faker"
|
31
|
+
end
|
data/lita.env.example
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#----------------------------------------------------------------------
|
2
|
+
# Copy this file to lita.env and configure lita secrets there.
|
3
|
+
# DO NOT ADD SECRETS TO THIS [lita.env.example] FILE!
|
4
|
+
#----------------------------------------------------------------------
|
5
|
+
|
6
|
+
# Slack API token for the bot. For more information, see:
|
7
|
+
# https://github.com/litaio/lita-slack#configuration
|
8
|
+
LITA_SLACK_TOKEN=REPLACE-THIS-WITH-YOUR-API-TOKEN
|
9
|
+
LITA_ELASTICSEARCH_URL=elastic.local:9200
|
10
|
+
LITA_ELASTICSEARCH_INDEX_NAME=rad-chats
|
11
|
+
LITA_REDIS_HOST=redis
|
data/lita_config.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
Lita.configure do |config|
|
2
|
+
# The name your robot will use.
|
3
|
+
# config.robot.name = "Lita"
|
4
|
+
|
5
|
+
# The locale code for the language to use.
|
6
|
+
# config.robot.locale = :en
|
7
|
+
|
8
|
+
# The severity of messages to log. Options are:
|
9
|
+
# :debug, :info, :warn, :error, :fatal
|
10
|
+
# Messages at the selected level and above will be logged.
|
11
|
+
config.robot.log_level = :debug
|
12
|
+
|
13
|
+
# An array of user IDs that are considered administrators. These users
|
14
|
+
# the ability to add and remove other users from authorization groups.
|
15
|
+
# What is considered a user ID will change depending on which adapter you use.
|
16
|
+
# config.robot.admins = ["1", "2"]
|
17
|
+
|
18
|
+
# The adapter you want to connect with. Make sure you've added the
|
19
|
+
# appropriate gem to the Gemfile.
|
20
|
+
config.robot.adapter = :slack
|
21
|
+
config.adapters.slack.token = ENV['LITA_SLACK_TOKEN']
|
22
|
+
|
23
|
+
## Example: Set options for the chosen adapter.
|
24
|
+
# config.adapter.username = "myname"
|
25
|
+
# config.adapter.password = "secret"
|
26
|
+
|
27
|
+
## Example: Set options for the Redis connection.
|
28
|
+
config.redis[:host] = ENV['LITA_REDIS_HOST']
|
29
|
+
# config.redis.port = 1234
|
30
|
+
|
31
|
+
## Example: Set configuration for any loaded handlers. See the handler's
|
32
|
+
## documentation for options.
|
33
|
+
# config.handlers.some_handler.some_config_key = "value"
|
34
|
+
config.handlers.elasticsearch_indexer.elasticsearch_url = ENV['LITA_ELASTICSEARCH_URL']
|
35
|
+
config.handlers.elasticsearch_indexer.elasticsearch_index_name = ENV['LITA_ELASTICSEARCH_INDEX_NAME']
|
36
|
+
config.handlers.elasticsearch_indexer.elasticsearch_index_options = lambda {|response|
|
37
|
+
options = {}
|
38
|
+
if response.message.extensions[:slack]
|
39
|
+
options[:id] = response.room.id + '-' + response.message.extensions[:slack][:timestamp]
|
40
|
+
end
|
41
|
+
options
|
42
|
+
}
|
43
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "faker"
|
3
|
+
|
4
|
+
describe Lita::Handlers::ElasticsearchIndexer, lita_handler: true do
|
5
|
+
describe 'config' do
|
6
|
+
let(:config) { Hash[described_class.configuration_builder.children.collect {|x| [x.name, x]}] }
|
7
|
+
# Elasticsearch::Transport Client setting hosts documentation:
|
8
|
+
# http://www.rubydoc.info/gems/elasticsearch-transport/file/README.md#Setting_Hosts
|
9
|
+
it { expect(config).to have_key(:elasticsearch_url) }
|
10
|
+
it { expect(config[:elasticsearch_url]).to be_required }
|
11
|
+
it { expect(config[:elasticsearch_url].types).to contain_exactly(String) }
|
12
|
+
|
13
|
+
# Elasticsearch::API::Actions#index documentation:
|
14
|
+
# http://www.rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Actions#index-instance_method
|
15
|
+
it { expect(config).to have_key(:elasticsearch_index_name) }
|
16
|
+
it { expect(config[:elasticsearch_index_name]).to be_required }
|
17
|
+
it { expect(config[:elasticsearch_index_name].types).to contain_exactly(String) }
|
18
|
+
|
19
|
+
it { expect(config).to have_key(:elasticsearch_index_type) }
|
20
|
+
it { expect(config[:elasticsearch_index_type]).not_to be_required }
|
21
|
+
it { expect(config[:elasticsearch_index_type].types).to contain_exactly(String) }
|
22
|
+
|
23
|
+
it { expect(config).to have_key(:elasticsearch_index_options) }
|
24
|
+
it { expect(config[:elasticsearch_index_options]).not_to be_required }
|
25
|
+
it { expect(config[:elasticsearch_index_options].types).to contain_exactly(Proc) }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#index_conversation' do
|
29
|
+
it { is_expected.to respond_to(:index_conversation).with(1).argument }
|
30
|
+
|
31
|
+
context 'with a non-empty message' do
|
32
|
+
let(:message) { Faker::Hacker.say_something_smart }
|
33
|
+
let(:room_id) { Faker::Internet.slug }
|
34
|
+
let(:private_message) { false }
|
35
|
+
|
36
|
+
it { is_expected.to route(message).to(:index_conversation) }
|
37
|
+
|
38
|
+
context 'send_message' do
|
39
|
+
let(:method) { send_message(message, from: room_id, privately: private_message) }
|
40
|
+
let(:registry_config) { registry.config.handlers.elasticsearch_indexer }
|
41
|
+
let(:index_name) { "test-#{Faker::Internet.slug}" }
|
42
|
+
let(:index_type) { "test-#{Faker::Internet.slug}" }
|
43
|
+
let(:index_body) { {
|
44
|
+
"user" => {
|
45
|
+
"id" => user.id,
|
46
|
+
"name" => user.name
|
47
|
+
},
|
48
|
+
"message" => {
|
49
|
+
"private" => private_message,
|
50
|
+
"body" => message
|
51
|
+
}
|
52
|
+
} }
|
53
|
+
let(:elasticsearch_url) { ENV['LITA_ELASTICSEARCH_URL'] }
|
54
|
+
|
55
|
+
before do
|
56
|
+
registry_config.elasticsearch_url = elasticsearch_url
|
57
|
+
registry_config.elasticsearch_index_name = index_name
|
58
|
+
registry_config.elasticsearch_index_type = index_type
|
59
|
+
|
60
|
+
expect(registry_config.elasticsearch_url).not_to be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'does not send a reply' do
|
64
|
+
expect{ method }.not_to raise_error
|
65
|
+
expect(replies).to be_empty
|
66
|
+
end
|
67
|
+
|
68
|
+
it_behaves_like 'an elasticsearch indexer' do
|
69
|
+
include_context 'with a single document indexed'
|
70
|
+
|
71
|
+
it { expect(document["_index"]).to eq(index_name) }
|
72
|
+
it { expect(document["_type"]).to eq(index_type) }
|
73
|
+
it { expect(document["_source"]).to include(index_body) }
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when elasticsearch_index_options' do
|
77
|
+
let(:id) { Faker::Internet.slug }
|
78
|
+
before do
|
79
|
+
expect {
|
80
|
+
registry_config.elasticsearch_index_options = index_options
|
81
|
+
}.not_to raise_error
|
82
|
+
end
|
83
|
+
context 'is a Proc' do
|
84
|
+
let(:index_options) {
|
85
|
+
Proc.new { |response|
|
86
|
+
{id: id}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
it_behaves_like 'an elasticsearch indexer' do
|
90
|
+
include_context 'with a single document indexed'
|
91
|
+
|
92
|
+
it { expect(document["_id"]).to eq(id) }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'is a lambda' do
|
97
|
+
let(:index_options) {
|
98
|
+
lambda { |response|
|
99
|
+
{id: id}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
it_behaves_like 'an elasticsearch indexer' do
|
103
|
+
include_context 'with a single document indexed'
|
104
|
+
|
105
|
+
it { expect(document["_id"]).to eq(id) }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'with an empty message' do
|
113
|
+
it { is_expected.not_to route('').to(:index_conversation) }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "lita-elasticsearch-indexer"
|
2
|
+
require "lita/rspec"
|
3
|
+
|
4
|
+
# loading shared examples
|
5
|
+
Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
|
6
|
+
|
7
|
+
# A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
|
8
|
+
# was generated with Lita 4, the compatibility mode should be left disabled.
|
9
|
+
Lita.version_3_compatibility_mode = false
|
10
|
+
|
11
|
+
Lita.configure do |config|
|
12
|
+
config.redis[:host] = ENV['LITA_REDIS_HOST']
|
13
|
+
# config.redis.port = 1234
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
shared_examples 'an elasticsearch indexer' do |method_sym: :method, elasticsearch_url_sym: :elasticsearch_url|
|
2
|
+
let(:elasticsearch_client) {
|
3
|
+
Elasticsearch::Client.new(urls: send(elasticsearch_url_sym))
|
4
|
+
}
|
5
|
+
let(:existing_documents) { elasticsearch_client.search["hits"]["hits"] }
|
6
|
+
let(:new_documents) { elasticsearch_client.search["hits"]["hits"] - existing_documents }
|
7
|
+
before do
|
8
|
+
expect{ existing_documents }.not_to raise_error
|
9
|
+
expect{ send(method_sym) }.not_to raise_error
|
10
|
+
expect{ elasticsearch_client.indices.flush }.not_to raise_error
|
11
|
+
expect{ new_documents }.not_to raise_error
|
12
|
+
expect(new_documents).not_to be_empty
|
13
|
+
end
|
14
|
+
after do
|
15
|
+
new_documents.each do |d|
|
16
|
+
elasticsearch_client.delete(
|
17
|
+
id: d["_id"],
|
18
|
+
index: d["_index"],
|
19
|
+
type: d["_type"]
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
shared_context 'with a single document indexed' do
|
26
|
+
let(:document) { new_documents.first }
|
27
|
+
before do
|
28
|
+
expect(new_documents.length).to eq(1)
|
29
|
+
expect(document).not_to be_nil
|
30
|
+
end
|
31
|
+
end
|
data/templates/.gitkeep
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lita-elasticsearch-indexer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Darrin Mann
|
8
|
+
- Darin London
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-01-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: lita
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4.7'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '4.7'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: elasticsearch
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.3'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.3'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: pry-byebug
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rake
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rack-test
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rspec
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 3.0.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 3.0.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: faker
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: |2
|
127
|
+
lita-elasticsearch-indexer is a lurker-bot that silently indexes all messages posted
|
128
|
+
by all users in any room to which it has been invited. It can also index
|
129
|
+
private messages sent directly to the bot. The bot will not index any messages
|
130
|
+
posted to rooms to which it has not been invited.
|
131
|
+
email:
|
132
|
+
- darrin.mann@duke.edu
|
133
|
+
- darin.london@duke.edu
|
134
|
+
executables: []
|
135
|
+
extensions: []
|
136
|
+
extra_rdoc_files: []
|
137
|
+
files:
|
138
|
+
- .gitignore
|
139
|
+
- Docker.README.md
|
140
|
+
- Dockerfile
|
141
|
+
- Gemfile
|
142
|
+
- LICENSE
|
143
|
+
- README.md
|
144
|
+
- Rakefile
|
145
|
+
- docker-compose.dev.yml
|
146
|
+
- docker-compose.yml
|
147
|
+
- lib/lita-elasticsearch-indexer.rb
|
148
|
+
- lib/lita/handlers/elasticsearch_indexer.rb
|
149
|
+
- lita-elasticsearch-indexer.gemspec
|
150
|
+
- lita.env.example
|
151
|
+
- lita_config.rb
|
152
|
+
- locales/en.yml
|
153
|
+
- spec/lita/handlers/elasticsearch_indexer_spec.rb
|
154
|
+
- spec/spec_helper.rb
|
155
|
+
- spec/support/elasticsearch_shared_examples.rb
|
156
|
+
- templates/.gitkeep
|
157
|
+
homepage: https://github.com/ORI-RAD/lita-elasticsearch-indexer
|
158
|
+
licenses:
|
159
|
+
- MIT
|
160
|
+
metadata:
|
161
|
+
lita_plugin_type: handler
|
162
|
+
post_install_message:
|
163
|
+
rdoc_options: []
|
164
|
+
require_paths:
|
165
|
+
- lib
|
166
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - '>='
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0'
|
171
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
requirements: []
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 2.0.14.1
|
179
|
+
signing_key:
|
180
|
+
specification_version: 4
|
181
|
+
summary: Listens to channel conversations and stores them to elasticsearch
|
182
|
+
test_files:
|
183
|
+
- spec/lita/handlers/elasticsearch_indexer_spec.rb
|
184
|
+
- spec/spec_helper.rb
|
185
|
+
- spec/support/elasticsearch_shared_examples.rb
|