This commit is contained in:
Ben Lavender 2016-05-17 11:13:20 -05:00
Коммит 87496c8fb0
104 изменённых файлов: 1844 добавлений и 0 удалений

11
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,11 @@
/.bundle/
/.yardoc
/Gemfile.lock
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
/bin/
/vendor/gems

1
.ruby-version Normal file
Просмотреть файл

@ -0,0 +1 @@
2.1.6

8
Brewfile Normal file
Просмотреть файл

@ -0,0 +1,8 @@
# Helpers
tap "github/bootstrap"
# Ruby
brew "autoconf"
brew "openssl"
brew "rbenv"
brew "ruby-build"

15
Gemfile Normal file
Просмотреть файл

@ -0,0 +1,15 @@
source 'https://rubygems.org'
# Declare your gem's dependencies in chatops_controller.gemspec.
# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.
gemspec
# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
# your gem to rubygems.org.
# To use a debugger
# gem 'byebug', group: [:development, :test]

88
README.md Normal file
Просмотреть файл

@ -0,0 +1,88 @@
# ChatopsControllers
Rails helpers for JSON-RPC based easy chatops.
A minimal controller example:
```ruby
class ChatOpsController < ApplicationController
include ::ChatOps::ControllerHelpers
chatops_namespace :echo
chatop :echo,
/echo (?<text>.*)?/,
"echo <text> - Echo some text back" do
jsonrpc_success "Echoing back to you: #{jsonrpc_params[:text]}"
end
end
```
Some routing boilerplate is required in `config/routes.rb`:
```ruby
Rails.application.routes.draw do
post "/_chatops" => "chatops#execute"
get "/_chatops" => "chatops#list"
end
```
Next, tell hubot about your endpoint:
```
.rpc add https://myapp.githubapp.com/_chatops
```
You're all done. Try `.echo foo`, and you should see Hubot respond with `Echoing back to you: foo`.
## Usage
#### Namespaces
Every chatops controller has a namespace. All commands associated with this
controller will be displayed with `.help <namespace>`. Commands will also be
dispalyed with subsets of their text.
```
chatops_namespace :foo
```
#### Creating Chatops
Creating a chatop is a DSL:
```ruby
chatop :echo,
/echo (?<text>.*)?/,
"echo <text> - Echo some text back" do
jsonrpc_success "Echoing back to you: #{jsonrpc_params[:text]}"
end
```
In this example, we've created a chatop called `echo`. The next argument is a
regular expression with [named
captures](http://ruby-doc.org/core-1.9.3/Regexp.html#method-i-named_captures).
In this example, only one capture group is available, `text`.
The next line is a string, which is a single line of help that will be displayed
in chat for `.help echo`.
The DSL takes a block, which is the code that will run when the chat robot sees
this regex. Arguments will be available in a hash called `jsonrpc_params`,
similar to rails' regular `params`.
You can return `jsonrpc_success` with a string to return text to chat. In this
case, we're just echoing the text back with a prefix.
TODO: chatops are not 'controller actions' and don't work with `before_filter`
like we'd want.
## Authentication
TODO: document this, but its god tokens.
## Development
```
script/bootstrap
script/test
```

34
Rakefile Normal file
Просмотреть файл

@ -0,0 +1,34 @@
begin
require 'bundler/setup'
rescue LoadError
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
end
require 'rdoc/task'
RDoc::Task.new(:rdoc) do |rdoc|
rdoc.rdoc_dir = 'rdoc'
rdoc.title = 'ChatopsController'
rdoc.options << '--line-numbers'
rdoc.rdoc_files.include('README.rdoc')
rdoc.rdoc_files.include('lib/**/*.rb')
end
Bundler::GemHelper.install_tasks
require 'rake/testtask'
Rake::TestTask.new(:test) do |t|
t.libs << 'lib'
t.libs << 'test'
t.pattern = 'test/**/*_test.rb'
t.verbose = false
end
task default: :test

Просмотреть файл

@ -0,0 +1,20 @@
$:.push File.expand_path("../lib", __FILE__)
# Maintain your gem's version:
require "chatops_controller/version"
# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.name = "chatops_controller"
s.version = ChatopsController::VERSION
s.authors = ["Ben Lavender"]
s.email = ["bhuga@github.com"]
s.summary = %q{Rails helpers to create JSON-RPC chatops}
s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
s.test_files = Dir["test/**/*"]
s.add_dependency "rails", "~> 4.2.6"
s.add_development_dependency "rspec-rails"
end

112
lib/chatops/controller.rb Normal file
Просмотреть файл

@ -0,0 +1,112 @@
module ChatOps
module Controller
extend ActiveSupport::Concern
included do
before_filter :ensure_chatops_authenticated, :only => [:execute, :list]
before_filter :ensure_user_given, :only => [:execute, :list]
end
def execute
method = params[:method].to_sym
return jsonrpc_method_not_found unless self.class.chatops[method].present?
send method
end
def list
render :json => {
namespace: self.class.chatops_namespace,
help: self.class.chatops_help,
methods: self.class.chatops }
end
def jsonrpc_params
params["params"] || {}
end
def jsonrpc_success(message)
jsonrpc_response :result => message
end
def jsonrpc_parse_error
jsonrpc_error(-32700, 500, "Parse error")
end
def jsonrpc_invalid_request
jsonrpc_error(-32600, 400, "Invalid request")
end
def jsonrpc_method_not_found
jsonrpc_error(-32601, 404, "Method not found")
end
def jsonrpc_invalid_params(message)
message ||= "Invalid parameters"
jsonrpc_error(-32602, 400, message)
end
def jsonrpc_error(number, http_status, message)
jsonrpc_response({ :error => { :code => number, :message => message } }, http_status)
end
def jsonrpc_response(hash, http_status = nil)
http_status ||= 200
render :status => http_status,
:json => { :jsonrpc => "2.0",
:id => params[:id] }.merge(hash)
end
def ensure_user_given
return true unless params[:action] == "execute"
return true if params[:user].present?
jsonrpc_invalid_params("A username must be supplied as 'user'")
end
def ensure_chatops_authenticated
return true unless %w{execute list}.include?(params[:action])
authenticated = authenticate_with_http_basic do |u, p|
if ENV["CHATOPS_AUTH_TOKEN"].nil?
raise StandardError, "Attempting to authenticate chatops with nil token"
end
if ENV["CHATOPS_ALT_AUTH_TOKEN"].nil?
raise StandardError, "Attempting to authenticate chatops with nil alternate token"
end
Rack::Utils.secure_compare(ENV["CHATOPS_AUTH_TOKEN"], p) ||
Rack::Utils.secure_compare(ENV["CHATOPS_ALT_AUTH_TOKEN"], p)
end
unless authenticated
render :status => :forbidden, :text => "Not authorized"
end
end
module ClassMethods
def chatop(method_name, regex, help, &block)
chatops[method_name] = { help: help,
regex: regex.source,
params: regex.names }
define_method method_name, &block
end
def chatops_namespace(namespace = nil)
if namespace.present?
@chatops_namespace = namespace
end
@chatops_namespace
end
def chatops_help(help = nil)
if help.present?
@chatops_help = help
end
@chatops_help
end
def chatops
@chatops ||= {}
@chatops
end
end
end
end

Просмотреть файл

@ -0,0 +1,29 @@
module ChatOpsSpecHelpers
def chatops_auth!(user = "_", pass = ENV["CHATOPS_AUTH_TOKEN"])
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(user, pass)
end
def chatop(method, params = {})
args = params.dup.symbolize_keys
user = args.delete :user
post(:execute, {:method => method, :user => user, :params => args})
end
def chatop_response
json_response = JSON.load(response.body)
if json_response["error"].present?
raise "There was an error instead of an expected successful response: #{json_response["error"]}"
end
json_response["result"]
end
def chatop_error
json_response = JSON.load(response.body)
json_response["error"]["message"]
end
RSpec.configure do |config|
config.include self
end
end

Просмотреть файл

@ -0,0 +1,6 @@
require "chatops_controller/version"
require "chatops/controller"
::ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym("ChatOps")
end

Просмотреть файл

@ -0,0 +1,3 @@
module ChatopsController
VERSION = "0.1.0"
end

17
script/bootstrap Executable file
Просмотреть файл

@ -0,0 +1,17 @@
#!/bin/sh
set -eu
# github/strap related bootstrapping
if [ "$(uname -s)" = "Darwin" ]; then
brew update >/dev/null
brew bundle check &>/dev/null || brew bundle
brew bootstrap-rbenv-ruby
BUNDLE="brew bundle exec -- bundle"
else
BUNDLE="bundle"
fi
$BUNDLE --path vendor/gems --local --binstubs

2
spec/dummy/.rspec Normal file
Просмотреть файл

@ -0,0 +1,2 @@
--color
--require spec_helper

28
spec/dummy/README.rdoc Normal file
Просмотреть файл

@ -0,0 +1,28 @@
== README
This README would normally document whatever steps are necessary to get the
application up and running.
Things you may want to cover:
* Ruby version
* System dependencies
* Configuration
* Database creation
* Database initialization
* How to run the test suite
* Services (job queues, cache servers, search engines, etc.)
* Deployment instructions
* ...
Please feel free to use a different markup language if you do not plan to run
<tt>rake doc:app</tt>.

6
spec/dummy/Rakefile Normal file
Просмотреть файл

@ -0,0 +1,6 @@
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
Rails.application.load_tasks

Просмотреть файл

Просмотреть файл

@ -0,0 +1,13 @@
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require_tree .

Просмотреть файл

@ -0,0 +1,15 @@
/*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
* compiled file so the styles you add here take precedence over styles defined in any styles
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
* file per style scope.
*
*= require_tree .
*= require_self
*/

Просмотреть файл

@ -0,0 +1,5 @@
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
end

Просмотреть файл

Просмотреть файл

@ -0,0 +1,2 @@
module ApplicationHelper
end

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Dummy</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<%= yield %>
</body>
</html>

3
spec/dummy/bin/bundle Executable file
Просмотреть файл

@ -0,0 +1,3 @@
#!/usr/bin/env ruby
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
load Gem.bin_path('bundler', 'bundle')

4
spec/dummy/bin/rails Executable file
Просмотреть файл

@ -0,0 +1,4 @@
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'

4
spec/dummy/bin/rake Executable file
Просмотреть файл

@ -0,0 +1,4 @@
#!/usr/bin/env ruby
require_relative '../config/boot'
require 'rake'
Rake.application.run

29
spec/dummy/bin/setup Executable file
Просмотреть файл

@ -0,0 +1,29 @@
#!/usr/bin/env ruby
require 'pathname'
# path to your application root.
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
Dir.chdir APP_ROOT do
# This script is a starting point to setup your application.
# Add necessary setup steps to this file:
puts "== Installing dependencies =="
system "gem install bundler --conservative"
system "bundle check || bundle install"
# puts "\n== Copying sample files =="
# unless File.exist?("config/database.yml")
# system "cp config/database.yml.sample config/database.yml"
# end
puts "\n== Preparing database =="
system "bin/rake db:setup"
puts "\n== Removing old logs and tempfiles =="
system "rm -f log/*"
system "rm -rf tmp/cache"
puts "\n== Restarting application server =="
system "touch tmp/restart.txt"
end

4
spec/dummy/config.ru Normal file
Просмотреть файл

@ -0,0 +1,4 @@
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application

Просмотреть файл

@ -0,0 +1,24 @@
require File.expand_path('../boot', __FILE__)
require 'action_controller/railtie'
Bundler.require(*Rails.groups)
require "chatops_controller"
module Dummy
class Application < Rails::Application
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
# Do not swallow errors in after_commit/after_rollback callbacks.
end
end

Просмотреть файл

@ -0,0 +1,5 @@
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)

Просмотреть файл

@ -0,0 +1,25 @@
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
<<: *default
database: db/production.sqlite3

Просмотреть файл

@ -0,0 +1,5 @@
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# Initialize the Rails application.
Rails.application.initialize!

Просмотреть файл

@ -0,0 +1,41 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
config.assets.raise_runtime_errors = true
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
end

Просмотреть файл

@ -0,0 +1,79 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
config.cache_classes = true
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
# and those relying on copy on write to perform better.
# Rake tasks automatically ignore this option for performance.
config.eager_load = true
# Full error reports are disabled and caching is turned on.
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Enable Rack::Cache to put a simple HTTP cache in front of your application
# Add `rack-cache` to your Gemfile before enabling this.
# For large-scale production use, consider using a caching reverse proxy like
# NGINX, varnish or squid.
# config.action_dispatch.rack_cache = true
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
# config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
# Use the lowest log level to ensure availability of diagnostic information
# when problems arise.
config.log_level = :debug
# Prepend all log lines with the following tags.
# config.log_tags = [ :subdomain, :uuid ]
# Use a different logger for distributed setups.
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
# Use a different cache store in production.
# config.cache_store = :mem_cache_store
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.action_controller.asset_host = 'http://assets.example.com'
# Ignore bad email addresses and do not raise email delivery errors.
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
# config.action_mailer.raise_delivery_errors = false
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify
# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
end

Просмотреть файл

@ -0,0 +1,41 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
# preloads Rails for running tests, you may have to set it to true.
config.eager_load = false
# Configure static file server for tests with Cache-Control for performance.
config.serve_static_files = true
config.static_cache_control = 'public, max-age=3600'
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
# ActionMailer::Base.deliveries array.
# Randomize the order test cases are executed.
config.active_support.test_order = :random
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
end

Просмотреть файл

@ -0,0 +1,11 @@
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'
# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
# Rails.application.config.assets.precompile += %w( search.js )

Просмотреть файл

@ -0,0 +1,7 @@
# Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
# Rails.backtrace_cleaner.remove_silencers!

Просмотреть файл

@ -0,0 +1,3 @@
# Be sure to restart your server when you modify this file.
Rails.application.config.action_dispatch.cookies_serializer = :json

Просмотреть файл

@ -0,0 +1,4 @@
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [:password]

Просмотреть файл

@ -0,0 +1,16 @@
# Be sure to restart your server when you modify this file.
# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym 'RESTful'
# end

Просмотреть файл

@ -0,0 +1,4 @@
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf

Просмотреть файл

@ -0,0 +1,3 @@
# Be sure to restart your server when you modify this file.
Rails.application.config.session_store :cookie_store, key: '_dummy_session'

Просмотреть файл

@ -0,0 +1,14 @@
# Be sure to restart your server when you modify this file.
# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
end
# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
# self.include_root_in_json = true
# end

Просмотреть файл

@ -0,0 +1,23 @@
# Files in the config/locales directory are used for internationalization
# and are automatically loaded by Rails. If you want to use locales other
# than English, add the necessary files in this directory.
#
# To use the locales, use `I18n.t`:
#
# I18n.t 'hello'
#
# In views, this is aliased to just `t`:
#
# <%= t('hello') %>
#
# To use a different locale, set it with `I18n.locale`:
#
# I18n.locale = :es
#
# This would use the information in config/locales/es.yml.
#
# To learn more, please read the Rails Internationalization guide
# available at http://guides.rubyonrails.org/i18n.html.
en:
hello: "Hello world"

Просмотреть файл

@ -0,0 +1,56 @@
Rails.application.routes.draw do
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
# You can have the root of your site routed with "root"
# root 'welcome#index'
# Example of regular route:
# get 'products/:id' => 'catalog#view'
# Example of named route that can be invoked with purchase_url(id: product.id)
# get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
# Example resource route (maps HTTP verbs to controller actions automatically):
# resources :products
# Example resource route with options:
# resources :products do
# member do
# get 'short'
# post 'toggle'
# end
#
# collection do
# get 'sold'
# end
# end
# Example resource route with sub-resources:
# resources :products do
# resources :comments, :sales
# resource :seller
# end
# Example resource route with more complex sub-resources:
# resources :products do
# resources :comments
# resources :sales do
# get 'recent', on: :collection
# end
# end
# Example resource route with concerns:
# concern :toggleable do
# post 'toggle'
# end
# resources :posts, concerns: :toggleable
# resources :photos, concerns: :toggleable
# Example resource route within a namespace:
# namespace :admin do
# # Directs /admin/products/* to Admin::ProductsController
# # (app/controllers/admin/products_controller.rb)
# resources :products
# end
end

Просмотреть файл

@ -0,0 +1,22 @@
# Be sure to restart your server when you modify this file.
# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.
# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.
development:
secret_key_base: 76c272b42d660a907faacdc0d8d47b20139d72954e32605e3d3e361008dfee9628ae6944ee08ea75937e210e5c9f406ade4a001595a2b8746a6638227995eeee
test:
secret_key_base: c3afc12cfdec7f850e7faabbc07ade9edbb1ef5c32d76e6ab939b04bba3904212d03949e7a84882777b89721899fb8673a39a7538f77b001ddcf03b2b2618b41
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Двоичные данные
spec/dummy/db/development.sqlite3 Normal file

Двоичный файл не отображается.

16
spec/dummy/db/schema.rb Normal file
Просмотреть файл

@ -0,0 +1,16 @@
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 0) do
end

Просмотреть файл

Просмотреть файл

0
spec/dummy/log/.keep Normal file
Просмотреть файл

Просмотреть файл

@ -0,0 +1,4 @@
 (1.6ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL) 
 (0.4ms) select sqlite_version(*)
 (1.3ms) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations".* FROM "schema_migrations"

416
spec/dummy/log/test.log Normal file
Просмотреть файл

@ -0,0 +1,416 @@
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 7ms (Views: 6.5ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 4ms (Views: 3.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 6ms (Views: 5.6ms)
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 4ms (Views: 3.5ms)
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 2ms (Views: 1.8ms)
Processing by AnonymousController#list as HTML
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 500 Internal Server Error in 0ms
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 5ms (Views: 5.1ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 1.0ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.4ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.3ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 2ms (Views: 2.0ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 1ms (Views: 0.5ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 1ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 1ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 5ms (Views: 5.1ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 1ms (Views: 0.4ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 1ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 2ms (Views: 2.1ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.3ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 5ms (Views: 4.6ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.4ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.5ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 1ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 2ms (Views: 1.9ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 1ms (Views: 0.3ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 5ms (Views: 4.4ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 2ms (Views: 1.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 1ms (Views: 0.4ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 1ms (Views: 0.4ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 1ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 5ms (Views: 4.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 2ms (Views: 1.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#list as HTML
Rendered text template (0.0ms)
Filter chain halted as :ensure_chatops_authenticated rendered or redirected
Completed 403 Forbidden in 0ms (Views: 0.2ms)
Processing by AnonymousController#non_chatop_method as HTML
Rendered text template (0.0ms)
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#list as HTML
Completed 200 OK in 0ms (Views: 0.3ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar"}
Filter chain halted as :ensure_user_given rendered or redirected
Completed 400 Bad Request in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"barfoo", "user"=>"foo"}
Completed 404 Not Found in 1ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"foobar", "user"=>"foo"}
Completed 200 OK in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.1ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"foo"}}
Completed 200 OK in 0ms (Views: 0.2ms)
Processing by AnonymousController#execute as HTML
Parameters: {"method"=>"wcid", "user"=>"foo", "params"=>{"app"=>"nope"}}
Completed 400 Bad Request in 0ms (Views: 0.2ms)

Просмотреть файл

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<title>The page you were looking for doesn't exist (404)</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body {
background-color: #EFEFEF;
color: #2E2F30;
text-align: center;
font-family: arial, sans-serif;
margin: 0;
}
div.dialog {
width: 95%;
max-width: 33em;
margin: 4em auto 0;
}
div.dialog > div {
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #BBB;
border-top: #B00100 solid 4px;
border-top-left-radius: 9px;
border-top-right-radius: 9px;
background-color: white;
padding: 7px 12% 0;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
h1 {
font-size: 100%;
color: #730E15;
line-height: 1.5em;
}
div.dialog > p {
margin: 0 0 1em;
padding: 1em;
background-color: #F7F7F7;
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #999;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-top-color: #DADADA;
color: #666;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
</style>
</head>
<body>
<!-- This file lives in public/404.html -->
<div class="dialog">
<div>
<h1>The page you were looking for doesn't exist.</h1>
<p>You may have mistyped the address or the page may have moved.</p>
</div>
<p>If you are the application owner check the logs for more information.</p>
</div>
</body>
</html>

Просмотреть файл

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<title>The change you wanted was rejected (422)</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body {
background-color: #EFEFEF;
color: #2E2F30;
text-align: center;
font-family: arial, sans-serif;
margin: 0;
}
div.dialog {
width: 95%;
max-width: 33em;
margin: 4em auto 0;
}
div.dialog > div {
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #BBB;
border-top: #B00100 solid 4px;
border-top-left-radius: 9px;
border-top-right-radius: 9px;
background-color: white;
padding: 7px 12% 0;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
h1 {
font-size: 100%;
color: #730E15;
line-height: 1.5em;
}
div.dialog > p {
margin: 0 0 1em;
padding: 1em;
background-color: #F7F7F7;
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #999;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-top-color: #DADADA;
color: #666;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
</style>
</head>
<body>
<!-- This file lives in public/422.html -->
<div class="dialog">
<div>
<h1>The change you wanted was rejected.</h1>
<p>Maybe you tried to change something you didn't have access to.</p>
</div>
<p>If you are the application owner check the logs for more information.</p>
</div>
</body>
</html>

Просмотреть файл

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html>
<head>
<title>We're sorry, but something went wrong (500)</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body {
background-color: #EFEFEF;
color: #2E2F30;
text-align: center;
font-family: arial, sans-serif;
margin: 0;
}
div.dialog {
width: 95%;
max-width: 33em;
margin: 4em auto 0;
}
div.dialog > div {
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #BBB;
border-top: #B00100 solid 4px;
border-top-left-radius: 9px;
border-top-right-radius: 9px;
background-color: white;
padding: 7px 12% 0;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
h1 {
font-size: 100%;
color: #730E15;
line-height: 1.5em;
}
div.dialog > p {
margin: 0 0 1em;
padding: 1em;
background-color: #F7F7F7;
border: 1px solid #CCC;
border-right-color: #999;
border-left-color: #999;
border-bottom-color: #999;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-top-color: #DADADA;
color: #666;
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
}
</style>
</head>
<body>
<!-- This file lives in public/500.html -->
<div class="dialog">
<div>
<h1>We're sorry, but something went wrong.</h1>
</div>
<p>If you are the application owner check the logs for more information.</p>
</div>
</body>
</html>

Просмотреть файл

1
spec/dummy/spec Symbolic link
Просмотреть файл

@ -0,0 +1 @@
../../spec

Просмотреть файл

@ -0,0 +1,170 @@
require 'rails_helper'
describe ActionController::Base, type: :controller do
controller do
include ChatOps::Controller
chatops_namespace :test
chatops_help "ChatOps of and relating to testing"
chatop :wcid,
/(?:where can i deploy|wcid)(?: (?<app>\S+))?/,
"where can i deploy?" do
return jsonrpc_invalid_params("I need nope, sorry") if jsonrpc_params[:app] == "nope"
jsonrpc_success "You can deploy #{jsonrpc_params[:app]} just fine."
end
chatop :foobar,
/(?:how can i foo and bar all at once)?/,
"how to foo and bar" do
raise "there's always params" unless jsonrpc_params.respond_to?(:[])
jsonrpc_success "You just foo and bar like it just don't matter"
end
def non_chatop_method
render :text => "Why would you have something thats not a chatop?"
end
end
before :each do
routes.draw do
post "/_chatops" => "anonymous#execute"
get "/_chatops" => "anonymous#list"
get "/other" => "anonymous#non_chatop_method"
end
ENV["CHATOPS_AUTH_TOKEN"] = "foo"
ENV["CHATOPS_ALT_AUTH_TOKEN"] = "bar"
end
it "requires authentication" do
get :list
expect(response.status).to eq 403
expect(response.body).to eq "Not authorized"
end
it "allows authentication" do
chatops_auth! "_", ENV["CHATOPS_AUTH_TOKEN"]
get :list
expect(response.status).to eq 200
expect(response).to be_valid_json
end
it "allows authentication from a second token" do
chatops_auth! "_", ENV["CHATOPS_ALT_AUTH_TOKEN"]
get :list
expect(response.status).to eq 200
expect(response).to be_valid_json
end
it "requires a correct password" do
chatops_auth! "_", "oogaboogawooga"
get :list
expect(response.status).to eq 403
expect(response.body).to eq "Not authorized"
end
it "does not add authentication to non-chatops routes" do
get :non_chatop_method
expect(response.status).to eq 200
expect(response.body).to eq "Why would you have something thats not a chatop?"
end
context "when authenticated" do
before do
chatops_auth!
end
it "provides a list method" do
get :list
expect(response.status).to eq 200
expect(json_response).to eq({
"namespace" => "test",
"help" => "ChatOps of and relating to testing",
"methods" => {
"wcid" => {
"help" => "where can i deploy?",
"regex" => /(?:where can i deploy|wcid)(?: (?<app>\S+))?/.source,
"params" => ["app"]
},
"foobar" => {
"help" => "how to foo and bar",
"regex" => /(?:how can i foo and bar all at once)?/.source,
"params" => []
}
}
})
end
it "requires a user be sent to chatops" do
post :execute, :method => "foobar"
expect(response.status).to eq 400
expect(json_response).to eq({
"jsonrpc" => "2.0",
"id" => nil,
"error" => {
"code" => -32602,
"message" => "A username must be supplied as 'user'"
}
})
end
it "returns method not found for a not found method" do
post :execute, :method => "barfoo", :user => "foo"
expect(json_response).to eq({
"jsonrpc" => "2.0",
"id" => nil,
"error" => {
"code" => -32601,
"message" => "Method not found"
}
})
expect(response.status).to eq 404
end
it "runs a known method" do
post :execute, :method => "foobar", :user => "foo"
expect(json_response).to eq({
"jsonrpc" => "2.0",
"id" => nil,
"result" => "You just foo and bar like it just don't matter"
})
expect(response.status).to eq 200
end
it "passes parameters to methods" do
post :execute, :method => "wcid", :user => "foo", :params => { "app" => "foo" }
expect(json_response).to eq({
"jsonrpc" => "2.0",
"id" => nil,
"result" => "You can deploy foo just fine."
})
expect(response.status).to eq 200
end
it "allows methods to return invalid params with a message" do
post :execute, :method => "wcid", :user => "foo", :params => { "app" => "nope" }
expect(response.status).to eq 400
expect(json_response).to eq({
"jsonrpc" => "2.0",
"id" => nil,
"error" => {
"code" => -32602,
"message" => "I need nope, sorry"
}
})
end
context "rspec helpers" do
it "makes it easy to test a response" do
chatop "wcid", :user => "foo", :app => "foo"
expect(chatop_response).to eq "You can deploy foo just fine."
end
it "makes it easy to test an error message" do
chatop "wcid", :user => "foo", :app => "nope"
expect(chatop_error).to eq "I need nope, sorry"
end
end
end
end

61
spec/rails_helper.rb Normal file
Просмотреть файл

@ -0,0 +1,61 @@
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path("../dummy/config/environment", __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'chatops/controller/rspec'
# Add additional requires below this line. Rails is not loaded until this point!
# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
# Checks for pending migration and applies them before tests are run.
# If you are not using ActiveRecord, you can remove this line.
Dir[Rails.root.join "spec/support/**/*.rb"].each {|f| require f}
RSpec.configure do |config|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# RSpec Rails can automatically mix in different behaviours to your tests
# based on their file location, for example enabling you to call `get` and
# `post` in specs under `spec/controllers`.
#
# You can disable this behaviour by removing the line below, and instead
# explicitly tag your specs with their type, e.g.:
#
# RSpec.describe UsersController, :type => :controller do
# # ...
# end
#
# The different available types are documented in the features, such as in
# https://relishapp.com/rspec/rspec-rails/docs
config.infer_spec_type_from_file_location!
# Filter lines from Rails gems in backtraces.
config.filter_rails_from_backtrace!
# arbitrary gems may also be filtered via:
# config.filter_gems_from_backtrace("gem name")
end

92
spec/spec_helper.rb Normal file
Просмотреть файл

@ -0,0 +1,92 @@
# This file was generated by the `rails generate rspec:install` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# The generated `.rspec` file contains `--require spec_helper` which will cause
# this file to always be loaded, without a need to explicitly require it in any
# files.
#
# Given that it is always loaded, you are encouraged to keep this file as
# light-weight as possible. Requiring heavyweight dependencies from this file
# will add to the boot time of your test suite on EVERY test run, even for an
# individual file that may not need all of that loaded. Instead, consider making
# a separate helper file that requires the additional dependencies and performs
# the additional setup, and require it from the spec files that actually need
# it.
#
# The `.rspec` file also contains a few flags that are not defaults but that
# users commonly want.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
# rspec-expectations config goes here. You can use an alternate
# assertion/expectation library such as wrong or the stdlib/minitest
# assertions if you prefer.
config.expect_with :rspec do |expectations|
# This option will default to `true` in RSpec 4. It makes the `description`
# and `failure_message` of custom matchers include text for helper methods
# defined using `chain`, e.g.:
# be_bigger_than(2).and_smaller_than(4).description
# # => "be bigger than 2 and smaller than 4"
# ...rather than:
# # => "be bigger than 2"
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
# rspec-mocks config goes here. You can use an alternate test double
# library (such as bogus or mocha) by changing the `mock_with` option here.
config.mock_with :rspec do |mocks|
# Prevents you from mocking or stubbing a method that does not exist on
# a real object. This is generally recommended, and will default to
# `true` in RSpec 4.
mocks.verify_partial_doubles = true
end
# The settings below are suggested to provide a good initial experience
# with RSpec, but feel free to customize to your heart's content.
=begin
# These two settings work together to allow you to limit a spec run
# to individual examples or groups you care about by tagging them with
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
# get run.
config.filter_run :focus
config.run_all_when_everything_filtered = true
# Allows RSpec to persist some state between runs in order to support
# the `--only-failures` and `--next-failure` CLI options. We recommend
# you configure your source control system to ignore this file.
config.example_status_persistence_file_path = "spec/examples.txt"
# Limits the available syntax to the non-monkey patched syntax that is
# recommended. For more details, see:
# - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
config.disable_monkey_patching!
# Many RSpec users commonly either run the entire suite or an individual
# file, and it's useful to allow more verbose output when running an
# individual spec file.
if config.files_to_run.one?
# Use the documentation formatter for detailed output,
# unless a formatter has already been configured
# (e.g. via a command-line flag).
config.default_formatter = 'doc'
end
# Print the 10 slowest examples and example groups at the
# end of the spec run, to help surface which specs are running
# particularly slow.
config.profile_examples = 10
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = :random
# Seed global randomization in this process using the `--seed` CLI option.
# Setting this allows you to use `--seed` to deterministically reproduce
# test failures related to randomization by passing the same `--seed` value
# as the one that triggered the failure.
Kernel.srand config.seed
=end
end

Просмотреть файл

@ -0,0 +1,28 @@
module RSpec
module JSONResponse
def json_response(response = @response)
@json_responses ||= {}
@json_responses[response] ||= JSON.load(response.body)
end
RSpec::Matchers.define :be_valid_json do
match do |response|
begin
json_response(response)
true
rescue StandardError => ex
@exception = ex
false
end
end
failure_message do |response|
%{Expected response body to be valid json, but there was an error parsing it:\n #{@exception.inspect}}
end
end
::RSpec.configure do |config|
config.include self
end
end
end

Двоичные данные
vendor/cache/actionmailer-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/actionpack-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/actionview-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/activejob-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/activemodel-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/activerecord-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/activesupport-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/arel-6.0.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/builder-3.2.2.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/concurrent-ruby-1.0.2.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/diff-lcs-1.2.5.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/erubis-2.7.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/globalid-0.3.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/i18n-0.7.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/json-1.8.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/loofah-2.0.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/mail-2.6.4.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/mime-types-3.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/mime-types-data-3.2016.0221.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/mini_portile2-2.0.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/minitest-5.9.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/nokogiri-1.6.7.2.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rack-1.6.4.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rack-test-0.6.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rails-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rails-deprecated_sanitizer-1.0.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rails-dom-testing-1.0.7.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rails-html-sanitizer-1.0.3.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/railties-4.2.6.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rake-11.1.2.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rspec-core-3.4.4.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rspec-expectations-3.4.0.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rspec-mocks-3.4.1.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rspec-rails-3.4.2.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/rspec-support-3.4.1.gem поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
vendor/cache/sprockets-3.6.0.gem поставляемый Normal file

Двоичный файл не отображается.

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше