slack-ruby-bot-server-rtm 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +15 -0
  5. data/.rubocop_todo.yml +29 -0
  6. data/.travis.yml +21 -0
  7. data/CHANGELOG.md +5 -0
  8. data/CONTRIBUTING.md +125 -0
  9. data/Dangerfile +3 -0
  10. data/Gemfile +40 -0
  11. data/LICENSE +21 -0
  12. data/README.md +61 -0
  13. data/RELEASING.md +61 -0
  14. data/Rakefile +16 -0
  15. data/lib/slack-ruby-bot-server-rtm.rb +10 -0
  16. data/lib/slack-ruby-bot-server-rtm/config.rb +29 -0
  17. data/lib/slack-ruby-bot-server-rtm/ext.rb +3 -0
  18. data/lib/slack-ruby-bot-server-rtm/ext/slack-ruby-bot.rb +4 -0
  19. data/lib/slack-ruby-bot-server-rtm/ext/slack-ruby-bot/client.rb +14 -0
  20. data/lib/slack-ruby-bot-server-rtm/ext/slack-ruby-bot/commands/base.rb +20 -0
  21. data/lib/slack-ruby-bot-server-rtm/lifecycle.rb +31 -0
  22. data/lib/slack-ruby-bot-server-rtm/rspec.rb +5 -0
  23. data/lib/slack-ruby-bot-server-rtm/server.rb +52 -0
  24. data/lib/slack-ruby-bot-server-rtm/version.rb +7 -0
  25. data/sample_apps/sample_app_activerecord/.rspec +3 -0
  26. data/sample_apps/sample_app_activerecord/.standalone_migrations +3 -0
  27. data/sample_apps/sample_app_activerecord/Gemfile +26 -0
  28. data/sample_apps/sample_app_activerecord/Procfile +1 -0
  29. data/sample_apps/sample_app_activerecord/README.md +12 -0
  30. data/sample_apps/sample_app_activerecord/Rakefile +16 -0
  31. data/sample_apps/sample_app_activerecord/commands.rb +4 -0
  32. data/sample_apps/sample_app_activerecord/commands/help.rb +21 -0
  33. data/sample_apps/sample_app_activerecord/commands/whoami.rb +8 -0
  34. data/sample_apps/sample_app_activerecord/config.ru +24 -0
  35. data/sample_apps/sample_app_activerecord/config/newrelic.yml +217 -0
  36. data/sample_apps/sample_app_activerecord/config/postgresql.yml +17 -0
  37. data/sample_apps/sample_app_activerecord/db/migrate/20170307164946_create_teams_table.rb +14 -0
  38. data/sample_apps/sample_app_activerecord/db/migrate/20190323181453_add_activated_fields.rb +9 -0
  39. data/sample_apps/sample_app_activerecord/db/schema.rb +31 -0
  40. data/sample_apps/sample_app_activerecord/spec/api/root_spec.rb +18 -0
  41. data/sample_apps/sample_app_activerecord/spec/commands/help_spec.rb +16 -0
  42. data/sample_apps/sample_app_activerecord/spec/commands/whoami_spec.rb +16 -0
  43. data/sample_apps/sample_app_activerecord/spec/spec_helper.rb +21 -0
  44. data/sample_apps/sample_app_mongoid/.rspec +3 -0
  45. data/sample_apps/sample_app_mongoid/Gemfile +22 -0
  46. data/sample_apps/sample_app_mongoid/Procfile +1 -0
  47. data/sample_apps/sample_app_mongoid/README.md +14 -0
  48. data/sample_apps/sample_app_mongoid/Rakefile +12 -0
  49. data/sample_apps/sample_app_mongoid/commands.rb +4 -0
  50. data/sample_apps/sample_app_mongoid/commands/help.rb +21 -0
  51. data/sample_apps/sample_app_mongoid/commands/whoami.rb +8 -0
  52. data/sample_apps/sample_app_mongoid/config.ru +16 -0
  53. data/sample_apps/sample_app_mongoid/config/mongoid.yml +27 -0
  54. data/sample_apps/sample_app_mongoid/config/newrelic.yml +217 -0
  55. data/sample_apps/sample_app_mongoid/spec/api/root_spec.rb +18 -0
  56. data/sample_apps/sample_app_mongoid/spec/commands/help_spec.rb +16 -0
  57. data/sample_apps/sample_app_mongoid/spec/commands/whoami_spec.rb +16 -0
  58. data/sample_apps/sample_app_mongoid/spec/spec_helper.rb +29 -0
  59. data/slack-ruby-bot-server-rtm.gemspec +22 -0
  60. metadata +142 -0
@@ -0,0 +1,17 @@
1
+ default: &default
2
+ adapter: postgresql
3
+ pool: 10
4
+ timeout: 5000
5
+ encoding: unicode
6
+
7
+ development:
8
+ <<: *default
9
+ database: slack_ruby_bot_server_development
10
+
11
+ test:
12
+ <<: *default
13
+ database: slack_ruby_bot_server_test
14
+
15
+ production:
16
+ <<: *default
17
+ url: <%= ENV["DATABASE_URL"] %>
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateTeamsTable < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :teams, force: true do |t|
6
+ t.string :team_id
7
+ t.string :name
8
+ t.boolean :active, default: true
9
+ t.string :domain
10
+ t.string :token
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddActivatedFields < ActiveRecord::Migration[5.0]
4
+ def change
5
+ add_column :teams, :bot_user_id, :string
6
+ add_column :teams, :activated_user_id, :string
7
+ add_column :teams, :activated_user_access_token, :string
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is auto-generated from the current state of the database. Instead
4
+ # of editing this file, please use the migrations feature of Active Record to
5
+ # incrementally modify your database, and then regenerate this schema definition.
6
+ #
7
+ # Note that this schema.rb definition is the authoritative source for your
8
+ # database schema. If you need to create the application database on another
9
+ # system, you should be using db:schema:load, not running all the migrations
10
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
11
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
12
+ #
13
+ # It's strongly recommended that you check this file into your version control system.
14
+
15
+ ActiveRecord::Schema.define(version: 20_190_323_181_453) do
16
+ # These are extensions that must be enabled in order to support this database
17
+ enable_extension 'plpgsql'
18
+
19
+ create_table 'teams', force: :cascade do |t|
20
+ t.string 'team_id'
21
+ t.string 'name'
22
+ t.boolean 'active', default: true
23
+ t.string 'domain'
24
+ t.string 'token'
25
+ t.datetime 'created_at', null: false
26
+ t.datetime 'updated_at', null: false
27
+ t.string 'bot_user_id'
28
+ t.string 'activated_user_id'
29
+ t.string 'activated_user_access_token'
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ def app
6
+ SlackRubyBotServer::Api::Middleware.instance
7
+ end
8
+
9
+ describe 'API' do
10
+ include Rack::Test::Methods
11
+
12
+ it 'root' do
13
+ get '/api'
14
+ expect(last_response.status).to eq 200
15
+ links = JSON.parse(last_response.body)['_links']
16
+ expect(links.keys.sort).to eq(%w[self status team teams].sort)
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'commands/help'
5
+
6
+ describe Help do
7
+ let!(:team) { Fabricate(:team) }
8
+ let(:app) { SlackRubyBotServer::RealTime::Server.new(team: team) }
9
+ let(:client) { app.send(:client) }
10
+ let(:message_hook) { SlackRubyBot::Hooks::Message.new }
11
+ it 'default' do
12
+ expect(client).to receive(:say).with(channel: 'channel', text: [Help::HELP, SlackRubyBotServer::INFO].join("\n"))
13
+ expect(client).to receive(:say).with(channel: 'channel')
14
+ message_hook.call(client, Hashie::Mash.new(channel: 'channel', text: "#{SlackRubyBot.config.user} help"))
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'commands/whoami'
5
+
6
+ describe Whoami do
7
+ let(:team) { Fabricate(:team) }
8
+ let(:app) { SlackRubyBotServer::Server.new(team: team) }
9
+ context 'whoami' do
10
+ it 'returns username' do
11
+ expect(message: "#{SlackRubyBot.config.user} whoami", channel: 'channel', user: 'user').to respond_with_slack_message(
12
+ '<@user>'
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('..', __dir__)
4
+
5
+ ENV['RACK_ENV'] = 'test'
6
+
7
+ require 'active_record'
8
+ require 'database_cleaner'
9
+ require 'slack-ruby-bot-server-rtm/rspec'
10
+
11
+ db_config = YAML.safe_load(File.read(File.expand_path('../config/postgresql.yml', __dir__)), [], [], true)[ENV['RACK_ENV']]
12
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
13
+ ActiveRecord::Base.establish_connection(db_config)
14
+
15
+ RSpec.configure do |config|
16
+ config.around :each do |example|
17
+ DatabaseCleaner.cleaning do
18
+ example.run
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=documentation
3
+
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'mongoid'
6
+ gem 'newrelic-slack-ruby-bot'
7
+ gem 'slack-ruby-bot-server-rtm', path: '../../'
8
+
9
+ gem 'kaminari-mongoid'
10
+ gem 'mongoid-scroll'
11
+ gem 'unicorn'
12
+
13
+ group :test do
14
+ gem 'database_cleaner'
15
+ gem 'fabrication'
16
+ gem 'faker'
17
+ gem 'rack-test'
18
+ gem 'rake'
19
+ gem 'rspec'
20
+ gem 'vcr'
21
+ gem 'webmock'
22
+ end
@@ -0,0 +1 @@
1
+ web: bundle exec unicorn -p $PORT
@@ -0,0 +1,14 @@
1
+ ### What's this?
2
+
3
+ This is a sample slack-ruby-bot-server with ActiveRecord.
4
+
5
+ ### Run
6
+
7
+ ```
8
+ bundle install
9
+ rackup
10
+ ```
11
+
12
+ ### Demo
13
+
14
+ This app is deployed from [github.com/slack-ruby/slack-ruby-bot-server-sample](https://github.com/slack-ruby/slack-ruby-bot-server-sample).
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+
5
+ require 'rspec/core'
6
+ require 'rspec/core/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new(:spec) do |spec|
9
+ spec.pattern = FileList['spec/**/*_spec.rb']
10
+ end
11
+
12
+ task default: [:spec]
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'commands/help'
4
+ require_relative 'commands/whoami'
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Help < SlackRubyBot::Commands::Base
4
+ HELP = <<~EOS
5
+ ```
6
+ I am your friendly slack-ruby-bot-server, here to help.
7
+
8
+ General
9
+ -------
10
+
11
+ help - get this helpful message
12
+ whoami - print your username
13
+
14
+ ```
15
+ EOS
16
+ def self.call(client, data, _match)
17
+ client.say(channel: data.channel, text: [HELP, SlackRubyBotServer::INFO].join("\n"))
18
+ client.say(channel: data.channel)
19
+ logger.info "HELP: #{client.owner}, user=#{data.user}"
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Whoami < SlackRubyBot::Commands::Base
4
+ def self.call(client, data, _match)
5
+ client.say(channel: data.channel, text: "<@#{data.user}>")
6
+ logger.info "UNAME: #{client.owner}, user=#{data.user}"
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV['RACK_ENV'] ||= 'development'
4
+
5
+ Bundler.require :default
6
+
7
+ require_relative 'commands'
8
+
9
+ Mongoid.load!(File.expand_path('config/mongoid.yml', __dir__), ENV['RACK_ENV'])
10
+
11
+ NewRelic::Agent.manual_start
12
+
13
+ SlackRubyBotServer::App.instance.prepare!
14
+ SlackRubyBotServer::Service.start!
15
+
16
+ run SlackRubyBotServer::Api::Middleware.instance
@@ -0,0 +1,27 @@
1
+ development:
2
+ clients:
3
+ default:
4
+ database: bot-server_development
5
+ hosts:
6
+ - 127.0.0.1:27017
7
+ options:
8
+ raise_not_found_error: false
9
+ use_utc: true
10
+
11
+ test:
12
+ clients:
13
+ default:
14
+ database: bot-server_test
15
+ hosts:
16
+ - 127.0.0.1:27017
17
+ options:
18
+ raise_not_found_error: false
19
+ use_utc: true
20
+
21
+ production:
22
+ clients:
23
+ default:
24
+ uri: <%= ENV['MONGO_URL'] || ENV['MONGOHQ_URI'] || ENV['MONGOLAB_URI'] || ENV['MONGODB_URI'] %>
25
+ options:
26
+ raise_not_found_error: false
27
+ use_utc: true
@@ -0,0 +1,217 @@
1
+ # Here are the settings that are common to all environments
2
+ common: &default_settings
3
+ # ============================== LICENSE KEY ===============================
4
+
5
+ # You must specify the license key associated with your New Relic
6
+ # account. This key binds your Agent's data to your account in the
7
+ # New Relic service.
8
+ license_key: '<%= ENV["NEW_RELIC_LICENSE_KEY"] %>'
9
+
10
+ # Application Name Set this to be the name of your application as
11
+ # you'd like it show up in New Relic. The service will then auto-map
12
+ # instances of your application into an "application" on your
13
+ # dashboard page. If you want to map this instance into multiple
14
+ # apps, like "AJAX Requests" and "All UI" then specify a semicolon
15
+ # separated list of up to three distinct names, or a yaml list.
16
+ app_name: <%= ENV["NEW_RELIC_APP_NAME"] || 'SlackRubyBotServer' %>
17
+
18
+ # When "true", the agent collects performance data about your
19
+ # application and reports this data to the New Relic service at
20
+ # newrelic.com. This global switch is normally overridden for each
21
+ # environment below. (formerly called 'enabled')
22
+ monitor_mode: true
23
+
24
+ # Developer mode should be off in every environment but
25
+ # development as it has very high overhead in memory.
26
+ developer_mode: false
27
+
28
+ # The newrelic agent generates its own log file to keep its logging
29
+ # information separate from that of your application. Specify its
30
+ # log level here.
31
+ log_level: info
32
+
33
+ # Optionally set the path to the log file This is expanded from the
34
+ # root directory (may be relative or absolute, e.g. 'log/' or
35
+ # '/var/log/') The agent will attempt to create this directory if it
36
+ # does not exist.
37
+ # log_file_path: 'log'
38
+
39
+ # Optionally set the name of the log file, defaults to 'newrelic_agent.log'
40
+ # log_file_name: 'newrelic_agent.log'
41
+
42
+ # The newrelic agent communicates with the service via http by
43
+ # default. If you want to communicate via https to increase
44
+ # security, then turn on SSL by setting this value to true. Note,
45
+ # this will result in increased CPU overhead to perform the
46
+ # encryption involved in SSL communication, but this work is done
47
+ # asynchronously to the threads that process your application code,
48
+ # so it should not impact response times.
49
+ ssl: false
50
+
51
+ # EXPERIMENTAL: enable verification of the SSL certificate sent by
52
+ # the server. This setting has no effect unless SSL is enabled
53
+ # above. This may block your application. Only enable it if the data
54
+ # you send us needs end-to-end verified certificates.
55
+ #
56
+ # This means we cannot cache the DNS lookup, so each request to the
57
+ # service will perform a lookup. It also means that we cannot
58
+ # use a non-blocking lookup, so in a worst case, if you have DNS
59
+ # problems, your app may block indefinitely.
60
+ # verify_certificate: true
61
+
62
+ # Set your application's Apdex threshold value with the 'apdex_t'
63
+ # setting, in seconds. The apdex_t value determines the buckets used
64
+ # to compute your overall Apdex score.
65
+ # Requests that take less than apdex_t seconds to process will be
66
+ # classified as Satisfying transactions; more than apdex_t seconds
67
+ # as Tolerating transactions; and more than four times the apdex_t
68
+ # value as Frustrating transactions.
69
+ # For more about the Apdex standard, see
70
+ # http://newrelic.com/docs/general/apdex
71
+
72
+ apdex_t: 0.5
73
+
74
+ #============================== Browser Monitoring ===============================
75
+ # New Relic Real User Monitoring gives you insight into the performance real users are
76
+ # experiencing with your website. This is accomplished by measuring the time it takes for
77
+ # your users' browsers to download and render your web pages by injecting a small amount
78
+ # of JavaScript code into the header and footer of each page.
79
+ browser_monitoring:
80
+ # By default the agent automatically injects the monitoring JavaScript
81
+ # into web pages. Set this attribute to false to turn off this behavior.
82
+ auto_instrument: true
83
+
84
+ # Proxy settings for connecting to the service.
85
+ #
86
+ # If a proxy is used, the host setting is required. Other settings
87
+ # are optional. Default port is 8080.
88
+ #
89
+ # proxy_host: hostname
90
+ # proxy_port: 8080
91
+ # proxy_user:
92
+ # proxy_pass:
93
+
94
+
95
+ # Tells transaction tracer and error collector (when enabled)
96
+ # whether or not to capture HTTP params. When true, frameworks can
97
+ # exclude HTTP parameters from being captured.
98
+ # Rails: the RoR filter_parameter_logging excludes parameters
99
+ # Java: create a config setting called "ignored_params" and set it to
100
+ # a comma separated list of HTTP parameter names.
101
+ # ex: ignored_params: credit_card, ssn, password
102
+ capture_params: true
103
+
104
+
105
+ # Transaction tracer captures deep information about slow
106
+ # transactions and sends this to the service once a
107
+ # minute. Included in the transaction is the exact call sequence of
108
+ # the transactions including any SQL statements issued.
109
+ transaction_tracer:
110
+
111
+ # Transaction tracer is enabled by default. Set this to false to
112
+ # turn it off. This feature is only available at the Professional
113
+ # and above product levels.
114
+ enabled: true
115
+
116
+ # Threshold in seconds for when to collect a transaction
117
+ # trace. When the response time of a controller action exceeds
118
+ # this threshold, a transaction trace will be recorded and sent to
119
+ # the service. Valid values are any float value, or (default)
120
+ # "apdex_f", which will use the threshold for an dissatisfying
121
+ # Apdex controller action - four times the Apdex T value.
122
+ transaction_threshold: apdex_f
123
+
124
+ # When transaction tracer is on, SQL statements can optionally be
125
+ # recorded. The recorder has three modes, "off" which sends no
126
+ # SQL, "raw" which sends the SQL statement in its original form,
127
+ # and "obfuscated", which strips out numeric and string literals
128
+ record_sql: obfuscated
129
+
130
+ # Threshold in seconds for when to collect stack trace for a SQL
131
+ # call. In other words, when SQL statements exceed this threshold,
132
+ # then capture and send the current stack trace. This is
133
+ # helpful for pinpointing where long SQL calls originate from
134
+ stack_trace_threshold: 0.500
135
+
136
+ # Determines whether the agent will capture query plans for slow
137
+ # SQL queries. Only supported in mysql and postgres. Should be
138
+ # set to false when using other adapters.
139
+ # explain_enabled: true
140
+
141
+ # Threshold for query execution time below which query plans will not
142
+ # not be captured. Relevant only when `explain_enabled` is true.
143
+ # explain_threshold: 0.5
144
+
145
+ # Error collector captures information about uncaught exceptions and
146
+ # sends them to the service for viewing
147
+ error_collector:
148
+
149
+ # Error collector is enabled by default. Set this to false to turn
150
+ # it off. This feature is only available at the Professional and above
151
+ # product levels
152
+ enabled: true
153
+
154
+ # Rails Only - tells error collector whether or not to capture a
155
+ # source snippet around the place of the error when errors are View
156
+ # related.
157
+ capture_source: true
158
+
159
+ # To stop specific errors from reporting to New Relic, set this property
160
+ # to comma separated values. Default is to ignore routing errors
161
+ # which are how 404's get triggered.
162
+ #
163
+ ignore_errors: ActionController::RoutingError
164
+
165
+ # (Advanced) Uncomment this to ensure the cpu and memory samplers
166
+ # won't run. Useful when you are using the agent to monitor an
167
+ # external resource
168
+ # disable_samplers: true
169
+
170
+ # If you aren't interested in visibility in these areas, you can
171
+ # disable the instrumentation to reduce overhead.
172
+ #
173
+ # disable_view_instrumentation: true
174
+ # disable_activerecord_instrumentation: true
175
+ # disable_memcache_instrumentation: true
176
+ # disable_dj: true
177
+
178
+ # If you're interested in capturing memcache keys as though they
179
+ # were SQL uncomment this flag. Note that this does increase
180
+ # overhead slightly on every memcached call, and can have security
181
+ # implications if your memcached keys are sensitive
182
+ # capture_memcache_keys: true
183
+
184
+ # Certain types of instrumentation such as GC stats will not work if
185
+ # you are running multi-threaded. Please let us know.
186
+ # multi_threaded = false
187
+
188
+ # Application Environments
189
+ # ------------------------------------------
190
+
191
+ development:
192
+ <<: *default_settings
193
+ # Turn off communication to New Relic service in development mode (also
194
+ # 'enabled').
195
+ # NOTE: for initial evaluation purposes, you may want to temporarily
196
+ # turn the agent on in development mode.
197
+ monitor_mode: false
198
+
199
+ # Rails Only - when running in Developer Mode, the New Relic Agent will
200
+ # present performance information on the last 100 transactions you have
201
+ # executed since starting the mongrel.
202
+ # NOTE: There is substantial overhead when running in developer mode.
203
+ # Do not use for production or load testing.
204
+ developer_mode: true
205
+
206
+ # Enable textmate links
207
+ # textmate: true
208
+
209
+ test:
210
+ <<: *default_settings
211
+ # It almost never makes sense to turn on the agent when running
212
+ # unit, functional or integration tests or the like.
213
+ monitor_mode: false
214
+
215
+ production:
216
+ <<: *default_settings
217
+ monitor_mode: true