redis_monitor 0.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/engine/app/controllers/application_controller.rb +3 -0
  3. data/lib/engine/app/controllers/content_controller.rb +12 -6
  4. data/lib/engine/app/controllers/info_controller.rb +1 -1
  5. data/lib/engine/app/controllers/performance_controller.rb +1 -1
  6. data/lib/engine/app/helpers/database_helper.rb +5 -9
  7. data/lib/engine/app/lib/backend.rb +10 -36
  8. data/lib/engine/app/lib/backend_connection.rb +11 -0
  9. data/lib/engine/app/lib/commands/change_database.rb +6 -0
  10. data/lib/engine/app/lib/commands/database_list.rb +5 -0
  11. data/lib/engine/app/lib/{performance_stats.rb → commands/performance_stats.rb} +1 -1
  12. data/lib/engine/app/lib/commands/remove_key.rb +7 -0
  13. data/lib/engine/app/lib/commands/search_key.rb +5 -0
  14. data/lib/engine/app/lib/security/authentication.rb +3 -6
  15. data/lib/engine/app/lib/security/authorization.rb +7 -5
  16. data/lib/engine/app/views/content/_search_form.haml +1 -1
  17. data/lib/engine/app/views/content/search.haml +1 -1
  18. data/lib/engine/config/environments/production.rb +1 -1
  19. data/lib/engine/config/initializers/configuration.rb +6 -3
  20. data/lib/engine/spec/controllers/content_controller_spec.rb +7 -3
  21. data/lib/engine/spec/controllers/info_controller_spec.rb +4 -1
  22. data/lib/engine/spec/controllers/performance_controller_spec.rb +1 -1
  23. data/lib/engine/spec/lib/backend_spec.rb +4 -56
  24. data/lib/engine/spec/lib/commands/change_database_spec.rb +24 -0
  25. data/lib/engine/spec/lib/commands/database_list_spec.rb +15 -0
  26. data/lib/engine/spec/lib/{performance_stats_spec.rb → commands/performance_stats_spec.rb} +5 -5
  27. data/lib/engine/spec/lib/commands/remove_key_spec.rb +21 -0
  28. data/lib/engine/spec/lib/commands/search_key_spec.rb +25 -0
  29. data/lib/engine/spec/lib/security/authentication_spec.rb +3 -3
  30. data/lib/engine/spec/spec_helper.rb +7 -3
  31. data/lib/redis_monitor.rb +1 -2
  32. data/lib/version.rb +1 -1
  33. metadata +13 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ff1b1686ad016eb88f4b708cac2efb620c32add
4
- data.tar.gz: 7724f8bb31f5823191ebdd6ea088c92128f0ff58
3
+ metadata.gz: ff13da4a5a6d6d3b4965964e669d6790b8aa88eb
4
+ data.tar.gz: db3f048bdb23af208771e50116923c962b4b520f
5
5
  SHA512:
6
- metadata.gz: a75d85f681f8f0ef8c7c25b16c63a96bd670fb9d45be4273299ca288bf8508b918b7b27bddbb7ddcc0fa4095143f1a3f88543ea5365725ef7636d8140c5db651
7
- data.tar.gz: 16f7a6580468f0daff350e9b24cb9afd120d8879e9d637353f4dcaf4d9550c94bd10cddb17a347867fa938387f7adfd3d5bf2e6de9454b87434aaa5e5651a3f4
6
+ metadata.gz: 0008c8e625d7c73d2fe4ad6f554f4ea648557c6d308b4538e870000df576ad8cf052cd78d4931d1f2f62983622356851a2d47fd3444b79e964366250127942cf
7
+ data.tar.gz: b63cd187913745965bc002e4928f9b72df5a6490ed7febe98615290ed9646ed6bd13e57c76e11bdb7bb73de50fe6f593e51fbad437b2f9503cc296e36e3b81d3
@@ -7,4 +7,7 @@ class ApplicationController < ActionController::Base
7
7
  http_basic_authenticate_with name: Authentication.credentials[:user], password: Authentication.credentials[:password]
8
8
  end
9
9
 
10
+ def backend
11
+ @backend ||= BackendConnection.build(current_database: session[:database])
12
+ end
10
13
  end
@@ -1,21 +1,24 @@
1
1
  class ContentController < ApplicationController
2
2
  skip_before_action :verify_authenticity_token
3
3
  before_action :load_section
4
+ before_action :load_database_list, only: [:index, :search]
5
+ before_action :load_current_database, only: [:index, :search]
4
6
 
5
7
  def index
6
8
  end
7
9
 
8
10
  def search
9
- @results = Backend.search(params[:key]).paginate(:page => params[:page], :per_page => 20)
11
+ results = SearchKey.new(backend, params[:key]).result
12
+ @results = results.paginate(:page => params[:page], :per_page => 20)
10
13
  end
11
14
 
12
15
  def delete
13
- Backend.remove(params[:key])
16
+ RemoveKey.new(backend, params[:key]).execute
14
17
  redirect_to :back
15
18
  end
16
19
 
17
20
  def change_database
18
- set_database(params[:database])
21
+ ChangeDatabase.new(backend, session, params[:database]).execute
19
22
  redirect_to :back
20
23
  end
21
24
 
@@ -24,9 +27,12 @@ class ContentController < ApplicationController
24
27
  @section = 'content'
25
28
  end
26
29
 
27
- def set_database(database)
28
- session[:database] = database
29
- Backend.change_database(database)
30
+ def load_database_list
31
+ @databases = DatabaseList.new(backend).result
32
+ end
33
+
34
+ def load_current_database
35
+ @current_database = backend.current_database
30
36
  end
31
37
  end
32
38
 
@@ -1,6 +1,6 @@
1
1
  class InfoController < ApplicationController
2
2
  def index
3
3
  @section = 'info'
4
- @info = Backend.info
4
+ @info = backend.info
5
5
  end
6
6
  end
@@ -3,6 +3,6 @@ class PerformanceController < ApplicationController
3
3
  end
4
4
 
5
5
  def check
6
- @stats = Backend.performance_stats
6
+ @stats = PerformanceStats.new(backend).result
7
7
  end
8
8
  end
@@ -1,21 +1,17 @@
1
1
  module DatabaseHelper
2
- def current_database
3
- session[:database].to_i
4
- end
5
-
6
- def databases
7
- Backend.databases.each do |database|
2
+ def databases(dbs)
3
+ dbs.each do |database|
8
4
  database_option(database)
9
5
  end
10
6
  end
11
7
 
12
8
  def database_option(database)
13
- haml_tag :option, {selected: (database.to_i == current_database.to_i)} do
9
+ haml_tag :option, {selected: (database.to_i == @current_database.to_i)} do
14
10
  haml_concat database
15
11
  end
16
12
  end
17
13
 
18
- def choose_database_select
14
+ def choose_database_select(dbs)
19
15
  capture_haml do
20
16
  haml_tag :form, action: '/content/change_database', method: 'post' do
21
17
  haml_tag :div, class: 'form-group' do
@@ -24,7 +20,7 @@ module DatabaseHelper
24
20
  end
25
21
 
26
22
  haml_tag :select, id: 'database_select', name: 'database', class: 'selectpicker form-control', data: {style: 'btn-info'} do
27
- databases
23
+ databases(dbs)
28
24
  end
29
25
  end
30
26
  end
@@ -1,45 +1,19 @@
1
1
  require 'redis'
2
- require 'forwardable'
3
2
 
4
3
  class Backend
5
- extend SingleForwardable
4
+ attr_accessor :host, :port, :current_database
6
5
 
7
- def_delegators :redis, :get, :set, :info, :keys, :dbsize, :select
6
+ delegate :get, :set, :info, :keys, :select, :del, :to => :redis
8
7
 
9
- def self.config(arguments)
10
- @@host = arguments[:redis_host]
11
- @@port = arguments[:redis_port]
8
+ def initialize(opts = {})
9
+ @host = opts[:host]
10
+ @port = opts[:port]
11
+ @current_database = opts[:current_database]
12
12
  end
13
13
 
14
- def self.host
15
- @@host
16
- end
17
-
18
- def self.port
19
- @@port
20
- end
21
-
22
- def self.redis
23
- @@redis ||= Redis.new(:host => host, :port => port)
24
- end
25
-
26
- def self.performance_stats
27
- PerformanceStats.new(self).results
28
- end
29
-
30
- def self.search(key)
31
- keys(key).map{|found| {key: found, value: get(found)} }
32
- end
33
-
34
- def self.change_database(*args)
35
- select(*args)
36
- end
37
-
38
- def self.remove(key)
39
- redis.del(key) if Authorization.authorized_for?(:remove_content)
40
- end
41
-
42
- def self.databases
43
- info.keys.map{|d| d.match(/db(\d+)/);$1}.compact
14
+ def redis
15
+ @redis ||= Redis.new(host: host, port: port)
16
+ @redis.select(current_database)
17
+ @redis
44
18
  end
45
19
  end
@@ -0,0 +1,11 @@
1
+ class BackendConnection
2
+ cattr_accessor :host, :port, :current_database
3
+
4
+ def self.setup
5
+ yield(self) if block_given?
6
+ end
7
+
8
+ def self.build(opts = {})
9
+ Backend.new(opts.merge(host: host, port: port))
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class ChangeDatabase < Struct.new(:backend, :session, :database)
2
+ def execute
3
+ backend.current_database = database
4
+ session[:database] = database
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class DatabaseList < Struct.new(:backend)
2
+ def result
3
+ backend.info.keys.map{|d| d.match(/db(\d+)/);$1}.compact
4
+ end
5
+ end
@@ -36,7 +36,7 @@ class PerformanceStats < Struct.new(:backend)
36
36
  time.real / CREATE_AND_DELETE_ACCESS_TIMES
37
37
  end
38
38
 
39
- def results
39
+ def result
40
40
  { average_access: format_result_in_ms(average_access),
41
41
  average_write: format_result_in_ms(average_write),
42
42
  average_create_and_delete: format_result_in_ms(average_create_and_delete)}
@@ -0,0 +1,7 @@
1
+ class RemoveKey < Struct.new(:backend, :key)
2
+ def execute
3
+ Authorization.execute_if_authorized_for(:remove_content) do
4
+ backend.del(key)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class SearchKey < Struct.new(:backend, :key)
2
+ def result
3
+ backend.keys(key).map{|found| {key: found, value: backend.get(found)} }
4
+ end
5
+ end
@@ -1,14 +1,11 @@
1
- module Authentication
1
+ class Authentication
2
+ cattr_accessor :credentials
2
3
 
3
- def self.config(credentials)
4
+ def self.setup(credentials)
4
5
  @@credentials = credentials
5
6
  end
6
7
 
7
8
  def self.authentication_required?
8
9
  !!credentials
9
10
  end
10
-
11
- def self.credentials
12
- @@credentials
13
- end
14
11
  end
@@ -1,16 +1,18 @@
1
1
  class Authorization
2
+ cattr_accessor :permissions
3
+
2
4
  DEFAULTS = {remove_content: true}
3
5
 
4
- def self.config(opts = {})
6
+ def self.setup(opts = {})
5
7
  opts = {} unless opts
6
8
  @@permissions = DEFAULTS.merge(opts)
7
9
  end
8
10
 
9
- def self.permissions
10
- @@permissions
11
- end
12
-
13
11
  def self.authorized_for?(action)
14
12
  !!permissions[action]
15
13
  end
14
+
15
+ def self.execute_if_authorized_for(action)
16
+ yield if authorized_for?(action) && block_given?
17
+ end
16
18
  end
@@ -1,6 +1,6 @@
1
1
  - search_term ||= nil
2
2
 
3
- = choose_database_select
3
+ = choose_database_select(@databases)
4
4
  %hr
5
5
 
6
6
  %form{action: '/content/search', method: 'get', style: 'margin-top: 5px'}
@@ -1,4 +1,4 @@
1
- = render 'search_form', locals: {search_term: params[:key]}
1
+ = render 'search_form', search_term: params[:key]
2
2
 
3
3
  %table.table.table-striped
4
4
  %thead
@@ -20,7 +20,7 @@ Engine::Application.configure do
20
20
  # config.action_dispatch.rack_cache = true
21
21
 
22
22
  # Disable Rails's static asset server (Apache or nginx will already do this).
23
- config.serve_static_assets = false
23
+ #config.serve_static_assets = false
24
24
 
25
25
 
26
26
  # Specifies the header that your server uses for sending files.
@@ -1,5 +1,8 @@
1
1
  if defined?(REDIS_MONITOR_OPTS)
2
- Backend.config(redis_host: REDIS_MONITOR_OPTS[:redis_host], redis_port: REDIS_MONITOR_OPTS[:redis_port])
3
- Authorization.config(REDIS_MONITOR_OPTS[:permissions])
4
- Authentication.config(REDIS_MONITOR_OPTS[:credentials])
2
+ BackendConnection.setup do |config|
3
+ config.host = REDIS_MONITOR_OPTS[:redis_host]
4
+ config.port = REDIS_MONITOR_OPTS[:redis_port]
5
+ end
6
+ Authorization.setup(REDIS_MONITOR_OPTS[:permissions])
7
+ Authentication.setup(REDIS_MONITOR_OPTS[:credentials])
5
8
  end
@@ -1,27 +1,31 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe ContentController do
4
+ let(:backend){ double() }
4
5
  before :each do
5
6
  request.env['HTTP_REFERER'] = '/'
7
+ controller.stub(:backend){ backend }
8
+ controller.stub(:load_database_list)
9
+ controller.stub(:load_current_database)
6
10
  end
7
11
 
8
12
  describe 'search action' do
9
13
  it 'should search on backend' do
10
- Backend.should_receive(:search){ [] }
14
+ SearchKey.any_instance.should_receive(:result){ [] }
11
15
  get :search
12
16
  end
13
17
  end
14
18
 
15
19
  describe 'delete action' do
16
20
  it 'should call remove on Backend' do
17
- Backend.should_receive(:remove)
21
+ RemoveKey.any_instance.should_receive(:execute)
18
22
  post :delete
19
23
  end
20
24
  end
21
25
 
22
26
  describe 'change_database' do
23
27
  it 'should call set_database' do
24
- controller.should_receive(:set_database)
28
+ ChangeDatabase.any_instance.should_receive(:execute)
25
29
  post :change_database
26
30
  end
27
31
  end
@@ -1,9 +1,12 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe InfoController do
4
+ let(:backend){ BackendConnection.build }
5
+
4
6
  describe 'index action' do
5
7
  it 'should get info from backend' do
6
- Backend.should_receive(:info)
8
+ controller.stub(:backend){ backend }
9
+ backend.should_receive(:info)
7
10
  get :index
8
11
  end
9
12
  end
@@ -3,7 +3,7 @@ require_relative '../spec_helper'
3
3
  describe PerformanceController do
4
4
  describe 'check action' do
5
5
  it 'should get performance stats from backend' do
6
- Backend.should_receive(:performance_stats)
6
+ PerformanceStats.any_instance.should_receive(:result)
7
7
  get :check
8
8
  end
9
9
  end
@@ -1,63 +1,11 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe Backend do
4
- let(:redis){ double(del: '') }
4
+ let(:backend){ BackendConnection.build }
5
5
 
6
- before :each do
7
- Backend.stub(:host)
8
- Backend.stub(:port)
9
- Backend.stub(:redis){ redis }
10
- end
11
-
12
- describe 'performance_stats' do
13
- before :each do
14
- PerformanceStats.any_instance.stub(:results){ {} }
15
- end
16
-
17
- it 'should return a hash with the stats' do
18
- Backend.performance_stats.should be_kind_of(Hash)
19
- end
20
- end
21
-
22
- describe 'search' do
23
- let(:keys){ ['k1', 'k2', 'k3'] }
24
-
25
- before :each do
26
- Backend.stub(:keys){ keys }
27
- Backend.stub(:get){ 'value' }
28
- end
29
-
30
- it 'should return an array of hashes' do
31
- Backend.search('*').should be_kind_of(Array)
32
- Backend.search('*')[0].should be_kind_of(Hash)
33
- end
34
-
35
- it 'every entry should have key and value data' do
36
- Backend.search('*')[0][:key].should_not be_nil
37
- Backend.search('*')[0][:value].should_not be_nil
38
- end
39
- end
40
-
41
- describe 'del' do
42
- it 'should not delete content if not allowed' do
43
- Authorization.stub(:authorized_for?).with(:remove_content){ false }
44
- redis.should_receive(:del).never
45
- Backend.remove('key')
46
- end
47
-
48
- it 'should remove content if allowed' do
49
- Authorization.stub(:authorized_for?).with(:remove_content){ true }
50
- redis.should_receive(:del)
51
- Backend.remove('key')
52
- end
53
- end
54
-
55
- describe 'databases' do
56
- it 'should retrieve databases' do
57
- info_keys = {db0: '', db1: '', example: ''}
58
- Backend.stub(:info){ info_keys }
59
- Backend.databases.should include('0')
60
- Backend.databases.should include('1')
6
+ it 'should respond to basic redis methods' do
7
+ [:get, :set, :del, :info, :keys, :select].each do |method|
8
+ backend.should respond_to(method)
61
9
  end
62
10
  end
63
11
  end
@@ -0,0 +1,24 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe ChangeDatabase do
4
+ let(:backend){ Struct.new(:current_database).new(0) }
5
+ let(:database){ '2' }
6
+ let(:session){ Struct.new(:database).new(0) }
7
+ let(:command){ ChangeDatabase.new(backend, session, database) }
8
+
9
+ describe 'execute' do
10
+ before :each do
11
+ backend.stub(:select)
12
+ end
13
+
14
+ it 'should change current_database' do
15
+ command.execute
16
+ backend.current_database.should eq(database)
17
+ end
18
+
19
+ it 'should save current_database in session' do
20
+ command.execute
21
+ session[:database].should eq(database)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DatabaseList do
4
+ let(:backend){ double() }
5
+ let(:command){ DatabaseList.new(backend) }
6
+
7
+ describe 'result' do
8
+ it 'should retrieve all database identifiers' do
9
+ backend.stub(:info){ {db0: '', db1: '', example: ''} }
10
+
11
+ command.result.should include('0')
12
+ command.result.should include('1')
13
+ end
14
+ end
15
+ end
@@ -1,4 +1,4 @@
1
- require_relative '../spec_helper'
1
+ require_relative '../../spec_helper'
2
2
 
3
3
  describe PerformanceStats do
4
4
  let(:backend){ double(get: nil, set: nil, del: nil) }
@@ -42,7 +42,7 @@ describe PerformanceStats do
42
42
  end
43
43
  end
44
44
 
45
- describe 'results' do
45
+ describe 'result' do
46
46
  before :each do
47
47
  performance_stats.stub(:average_access)
48
48
  performance_stats.stub(:average_write)
@@ -50,9 +50,9 @@ describe PerformanceStats do
50
50
  end
51
51
 
52
52
  it 'should include performance stats' do
53
- performance_stats.results.should include(:average_access)
54
- performance_stats.results.should include(:average_write)
55
- performance_stats.results.should include(:average_create_and_delete)
53
+ performance_stats.result.should include(:average_access)
54
+ performance_stats.result.should include(:average_write)
55
+ performance_stats.result.should include(:average_create_and_delete)
56
56
  end
57
57
  end
58
58
  end
@@ -0,0 +1,21 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe RemoveKey do
4
+ let(:backend){ double() }
5
+ let(:key){ 'key' }
6
+ let(:command){ RemoveKey.new(backend, key) }
7
+
8
+ describe 'execute' do
9
+ it 'should not delete content if not allowed' do
10
+ Authorization.stub(:authorized_for?).with(:remove_content){ false }
11
+ backend.should_receive(:del).never
12
+ command.execute
13
+ end
14
+
15
+ it 'should remove content if allowed' do
16
+ Authorization.stub(:authorized_for?).with(:remove_content){ true }
17
+ backend.should_receive(:del)
18
+ command.execute
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe SearchKey do
4
+ let(:backend){ double() }
5
+ let(:key){ 'key' }
6
+ let(:command){ SearchKey.new(backend, key) }
7
+ let(:keys_found){ ['k1', 'k2', 'k3'] }
8
+
9
+ describe 'result' do
10
+ before :each do
11
+ backend.stub(:keys){ keys_found }
12
+ backend.stub(:get){ 'value' }
13
+ end
14
+
15
+ it 'should return an array of hashes' do
16
+ command.result.should be_kind_of(Array)
17
+ command.result[0].should be_kind_of(Hash)
18
+ end
19
+
20
+ it 'every entry should have key and value data' do
21
+ command.result[0][:key].should_not be_nil
22
+ command.result[0][:value].should_not be_nil
23
+ end
24
+ end
25
+ end
@@ -5,18 +5,18 @@ describe Authentication do
5
5
 
6
6
  describe 'config' do
7
7
  it 'should inject authentication in server class' do
8
- Authentication.config(credentials)
8
+ Authentication.setup(credentials)
9
9
  end
10
10
  end
11
11
 
12
12
  describe 'authentication_required??' do
13
13
  it 'should return true if it has some credentials' do
14
- Authentication.config(credentials)
14
+ Authentication.setup(credentials)
15
15
  Authentication.authentication_required?.should eq(true)
16
16
  end
17
17
 
18
18
  it 'should return false if no credentials were provided' do
19
- Authentication.config(nil)
19
+ Authentication.setup(nil)
20
20
  Authentication.authentication_required?.should eq(false)
21
21
  end
22
22
  end
@@ -41,7 +41,11 @@ RSpec.configure do |config|
41
41
  config.order = "random"
42
42
  end
43
43
 
44
- Backend.config(redis_host: 'localhost', redis_port: 6379)
45
- Authorization.config({})
46
- Authentication.config(nil)
44
+ BackendConnection.setup do |config|
45
+ config.host = 'localhost'
46
+ config.port = 6379
47
+ end
48
+
49
+ Authorization.setup({})
50
+ Authentication.setup(nil)
47
51
 
data/lib/redis_monitor.rb CHANGED
@@ -14,7 +14,6 @@ module RedisMonitor
14
14
  args = parse_arguments
15
15
  store_arguments(args)
16
16
 
17
- system('lib/engine/bin/rails', 's', '-p', args[:http_port].to_s)
18
- #system('lib/engine/bin/rails', 's', '-e', 'production')
17
+ system('lib/engine/bin/rails', 's', '-p', args[:http_port].to_s, '-e', 'production')
19
18
  end
20
19
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RedisMonitor
2
- VERSION = '0.2'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_monitor
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Jimenez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-11 00:00:00.000000000 Z
11
+ date: 2014-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -209,7 +209,12 @@ files:
209
209
  - lib/engine/app/helpers/database_helper.rb
210
210
  - lib/engine/app/helpers/pagination_helper.rb
211
211
  - lib/engine/app/lib/backend.rb
212
- - lib/engine/app/lib/performance_stats.rb
212
+ - lib/engine/app/lib/backend_connection.rb
213
+ - lib/engine/app/lib/commands/change_database.rb
214
+ - lib/engine/app/lib/commands/database_list.rb
215
+ - lib/engine/app/lib/commands/performance_stats.rb
216
+ - lib/engine/app/lib/commands/remove_key.rb
217
+ - lib/engine/app/lib/commands/search_key.rb
213
218
  - lib/engine/app/lib/security/authentication.rb
214
219
  - lib/engine/app/lib/security/authorization.rb
215
220
  - lib/engine/app/mailers/.keep
@@ -266,7 +271,11 @@ files:
266
271
  - lib/engine/spec/controllers/info_controller_spec.rb
267
272
  - lib/engine/spec/controllers/performance_controller_spec.rb
268
273
  - lib/engine/spec/lib/backend_spec.rb
269
- - lib/engine/spec/lib/performance_stats_spec.rb
274
+ - lib/engine/spec/lib/commands/change_database_spec.rb
275
+ - lib/engine/spec/lib/commands/database_list_spec.rb
276
+ - lib/engine/spec/lib/commands/performance_stats_spec.rb
277
+ - lib/engine/spec/lib/commands/remove_key_spec.rb
278
+ - lib/engine/spec/lib/commands/search_key_spec.rb
270
279
  - lib/engine/spec/lib/security/authentication_spec.rb
271
280
  - lib/engine/spec/lib/security/authorization_spec.rb
272
281
  - lib/engine/spec/spec_helper.rb