memcached-manager 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +13 -5
  2. data/.travis.yml +1 -1
  3. data/CONTRIBUTING.md +4 -4
  4. data/Dockerfile +7 -0
  5. data/Gemfile +0 -1
  6. data/Gemfile.lock +23 -19
  7. data/README.rdoc +8 -5
  8. data/Rakefile +6 -6
  9. data/VERSION +1 -1
  10. data/features/api/run_command.feature +6 -0
  11. data/features/api/search_memcached_keys.feature +6 -0
  12. data/features/step_definitions/api/create_memcached_key.rb +1 -1
  13. data/features/step_definitions/api/list_memcached_keys.rb +1 -0
  14. data/features/step_definitions/api/run_command.rb +12 -0
  15. data/features/step_definitions/api/search_memcached_keys.rb +6 -0
  16. data/features/step_definitions/webapp/create_memcached_key.rb +13 -7
  17. data/features/step_definitions/webapp/delete_memcached_key.rb +7 -13
  18. data/features/step_definitions/webapp/edit_configs.rb +7 -0
  19. data/features/support/env.rb +3 -2
  20. data/features/webapp/edit_configs.feature +9 -0
  21. data/features/webapp/edit_memcached_key.feature +1 -1
  22. data/fig.yml +13 -0
  23. data/githubpage_idea +23 -0
  24. data/lib/api.rb +25 -7
  25. data/lib/extensions.rb +6 -0
  26. data/lib/extensions/memcached_command.rb +14 -0
  27. data/lib/extensions/memcached_connection.rb +9 -0
  28. data/lib/extensions/memcached_inspector.rb +12 -5
  29. data/lib/extensions/memcached_settings.rb +2 -2
  30. data/lib/public/images/favicon.png +0 -0
  31. data/lib/public/images/glyphicons-halflings.png +0 -0
  32. data/lib/public/images/logo.png +0 -0
  33. data/lib/public/images/org-logo.png +0 -0
  34. data/lib/public/images/search.png +0 -0
  35. data/lib/public/javascripts/angular/controllers.js +48 -3
  36. data/lib/public/javascripts/angular/filters.js +85 -0
  37. data/lib/public/javascripts/angular/routes.js +26 -0
  38. data/lib/public/javascripts/angular/services/notification.js +41 -6
  39. data/lib/public/javascripts/angular/services/query_params_singleton.js +10 -0
  40. data/lib/public/javascripts/angular/services/resources.js +13 -0
  41. data/lib/public/javascripts/application.js +38 -1
  42. data/lib/public/javascripts/humanize.js +473 -0
  43. data/lib/public/javascripts/humanize_duration.js +329 -0
  44. data/lib/public/javascripts/jquery-terminal.js +4335 -0
  45. data/lib/public/javascripts/underscore.js +5 -0
  46. data/lib/public/stylesheets/app.css +196 -10
  47. data/lib/public/stylesheets/buttons.css +107 -0
  48. data/lib/public/stylesheets/inputs.css +119 -0
  49. data/lib/public/stylesheets/jquery-terminal.css +184 -0
  50. data/lib/public/stylesheets/media_queries.css +162 -0
  51. data/lib/public/templates/config.html.erb +8 -0
  52. data/lib/public/templates/edit.html.erb +5 -3
  53. data/lib/public/templates/keys.html.erb +42 -31
  54. data/lib/public/templates/new.html.erb +6 -4
  55. data/lib/public/templates/show.html.erb +1 -1
  56. data/lib/public/templates/stats.html.erb +1 -2
  57. data/lib/routes.rb +3 -0
  58. data/lib/views/index.erb +24 -3
  59. data/lib/views/layout.erb +14 -1
  60. data/memcached-manager.gemspec +31 -5
  61. data/spec/lib/extensions/api_response_spec.rb +9 -7
  62. data/spec/lib/extensions/memcached_command_spec.rb +13 -0
  63. data/spec/lib/extensions/memcached_connection_spec.rb +9 -4
  64. data/spec/lib/extensions/memcached_inspector_spec.rb +38 -17
  65. data/spec/lib/extensions/memcached_settings_spec.rb +16 -16
  66. data/spec/spec_helper.rb +2 -4
  67. metadata +48 -21
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ebef29d899eb8b67b814c15f970236443f74939b
4
- data.tar.gz: 0c7a0a39d8e4abf3c9fc0dcc10fec139e029a642
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWI1Y2M2Zjg0YTAyNGVkMGVkOTRjODUyNTEyYzQ1ZDVjY2M2ZjVkOA==
5
+ data.tar.gz: !binary |-
6
+ ODQ0ODUxMWE3ODYxODg1ZTM4MmQ2MjVmZDE4MzUxNmEwNmQ2NGIzYQ==
5
7
  SHA512:
6
- metadata.gz: dcc15350c6bb6eedc677ab71e208eac2c8216e9263f617ede987916ebc475c7cb00ce480d28f6e83612a87ea0e3191734bdb32d0a93dd68415dc97bca9d3f023
7
- data.tar.gz: 1321de423964cb1d1e53828017793233afdbd07d774181d23e2cd92f2502ef7c68bc95f79857e6714204229ebccefa861b4e4825ef52f19bdb9f9616c137d500
8
+ metadata.gz: !binary |-
9
+ MmI4MDk5N2JlNGY3M2E5Y2JjOTI5ODViNGY3NjA3YzcyMWZhOTQzMTgyZTYx
10
+ MGU1MjZhYTMzZjIxOTA1NWFkYzI1NjUxZDc2MmEyMWFhOGEyNzgwMjMxZmU4
11
+ ZmU2ODIyM2I2ZGUzNmU3YWYxMmExZDJjMWU0M2Q2YjJhMjY0NWM=
12
+ data.tar.gz: !binary |-
13
+ ODk2NjMxZDNiNzBhNTViNjkxOTE5OWU0MjQwOTM5MjA3MDQxMTk1M2UyZmRk
14
+ OWU1NWM4ODU3NzE3M2RlYTMwNTE2ZGI1Nzg3ODRmMjhhMWE0YTNkNTdjYTE0
15
+ NTkyMGIyMmYzM2Q3YWE5ZTVmMjg3ZTVlMmM0MmVhMTE1NDk5YzQ=
@@ -6,7 +6,7 @@ before_install:
6
6
  - gem install bundler
7
7
 
8
8
  script:
9
- rake
9
+ bundle exec rake
10
10
 
11
11
  rvm:
12
12
  - 1.9.3
@@ -11,11 +11,11 @@ Have `memcached` run on `localhost:11211` then run:
11
11
 
12
12
  bundle exec rake
13
13
 
14
- == Roadmap(stuff you can do)
14
+ == What does the project needs help with?
15
15
 
16
- * Develop frontend & artwork (in progress)
17
- * Favicon
18
- * Update API/frontend in order to use http statuses for errors, creation and so on.
16
+ * Add some formatting to forms
17
+ * Do the notification system correctly using angular.js
18
+ * Develop a better looking frontend
19
19
 
20
20
  == Making a pull request?
21
21
 
@@ -0,0 +1,7 @@
1
+ FROM ruby:1.9.3
2
+ RUN mkdir /memcached-manager
3
+ WORKDIR /memcached-manager
4
+ ADD . /memcached-manager
5
+ RUN bundle install
6
+ RUN export DISPLAY=:99
7
+ RUN /etc/init.d/xvfb start
data/Gemfile CHANGED
@@ -15,7 +15,6 @@ group :test do
15
15
  gem "rack-test", :require => "rack/test"
16
16
  gem "rspec"
17
17
  gem "mocha"
18
- gem "cucumber"
19
18
  gem "capybara", :require => false
20
19
  gem "faraday"
21
20
  end
@@ -2,7 +2,7 @@ GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
4
  addressable (2.3.5)
5
- backports (3.3.4)
5
+ backports (3.6.4)
6
6
  builder (3.2.2)
7
7
  capybara (2.1.0)
8
8
  mime-types (>= 1.16)
@@ -10,7 +10,7 @@ GEM
10
10
  rack (>= 1.0.0)
11
11
  rack-test (>= 0.5.4)
12
12
  xpath (~> 2.0)
13
- childprocess (0.3.9)
13
+ childprocess (0.5.5)
14
14
  ffi (~> 1.0, >= 1.0.11)
15
15
  cliver (0.2.2)
16
16
  cucumber (1.3.8)
@@ -21,11 +21,11 @@ GEM
21
21
  multi_test (>= 0.0.2)
22
22
  daemons (1.1.9)
23
23
  dalli (2.6.4)
24
- diff-lcs (1.2.4)
24
+ diff-lcs (1.2.5)
25
25
  eventmachine (1.0.3)
26
26
  faraday (0.8.8)
27
27
  multipart-post (~> 1.2.0)
28
- ffi (1.9.0)
28
+ ffi (1.9.6)
29
29
  gherkin (2.12.1)
30
30
  multi_json (~> 1.3)
31
31
  git (1.2.6)
@@ -61,7 +61,7 @@ GEM
61
61
  mime-types (1.25)
62
62
  mocha (0.14.0)
63
63
  metaclass (~> 0.0.1)
64
- multi_json (1.8.0)
64
+ multi_json (1.10.1)
65
65
  multi_test (0.0.2)
66
66
  multi_xml (0.5.5)
67
67
  multipart-post (1.2.0)
@@ -86,20 +86,24 @@ GEM
86
86
  rake (10.1.0)
87
87
  rdoc (4.0.1)
88
88
  json (~> 1.4)
89
- rspec (2.14.1)
90
- rspec-core (~> 2.14.0)
91
- rspec-expectations (~> 2.14.0)
92
- rspec-mocks (~> 2.14.0)
93
- rspec-core (2.14.5)
94
- rspec-expectations (2.14.2)
95
- diff-lcs (>= 1.1.3, < 2.0)
96
- rspec-mocks (2.14.3)
97
- rubyzip (0.9.9)
98
- selenium-webdriver (2.35.1)
99
- childprocess (>= 0.2.5)
89
+ rspec (3.1.0)
90
+ rspec-core (~> 3.1.0)
91
+ rspec-expectations (~> 3.1.0)
92
+ rspec-mocks (~> 3.1.0)
93
+ rspec-core (3.1.7)
94
+ rspec-support (~> 3.1.0)
95
+ rspec-expectations (3.1.2)
96
+ diff-lcs (>= 1.2.0, < 2.0)
97
+ rspec-support (~> 3.1.0)
98
+ rspec-mocks (3.1.3)
99
+ rspec-support (~> 3.1.0)
100
+ rspec-support (3.1.2)
101
+ rubyzip (1.1.6)
102
+ selenium-webdriver (2.44.0)
103
+ childprocess (~> 0.5)
100
104
  multi_json (~> 1.0)
101
- rubyzip (< 1.0.0)
102
- websocket (~> 1.0.4)
105
+ rubyzip (~> 1.0)
106
+ websocket (~> 1.0)
103
107
  sinatra (1.4.3)
104
108
  rack (~> 1.4)
105
109
  rack-protection (~> 1.4)
@@ -118,7 +122,7 @@ GEM
118
122
  tilt (1.4.1)
119
123
  vegas (0.1.11)
120
124
  rack (>= 1.0.0)
121
- websocket (1.0.7)
125
+ websocket (1.2.1)
122
126
  websocket-driver (0.3.0)
123
127
  xpath (2.0.0)
124
128
  nokogiri (~> 1.3)
@@ -1,8 +1,8 @@
1
- == Memcached Manager
1
+ {<img src="https://github.com/memcached-manager/memcached-manager/blob/master/lib/public/images/logo.png" />}[https://www.github.com/memcached-manager/memcached-manager]
2
2
 
3
3
  A single-page sinatra memcached manager/admin that allows you to read stats, view, edit and create keys from memcached. Also easily pluggable to a Rails/Rack app.
4
4
 
5
- {<img src="https://travis-ci.org/thiagofm/memcached-manager.png" />}[https://travis-ci.org/thiagofm/memcached-manager] {<img src="https://codeclimate.com/github/thiagofm/memcached-manager.png" />}[https://codeclimate.com/github/thiagofm/memcached-manager]
5
+ {<img src="https://travis-ci.org/memcached-manager/memcached-manager.png" />}[https://travis-ci.org/memcached-manager/memcached-manager] {<img src="https://codeclimate.com/github/thiagofm/memcached-manager.png" />}[https://codeclimate.com/github/thiagofm/memcached-manager]
6
6
 
7
7
  == Installing & running
8
8
 
@@ -38,19 +38,22 @@ If you want to specify a different config than the defaults(localhost:11211) add
38
38
 
39
39
  == Requirements
40
40
 
41
- Ruby >= 1.9
41
+ Ruby >= 1.93
42
42
  Memcached (of course)
43
43
 
44
44
  == Contributing to Memcached Manager
45
45
 
46
46
  See +CONTRIBUTING.md+
47
47
 
48
+ == Contributors
49
+
50
+ * Ami[mailto:ami_sama@hotmail.com] (made the logo)
51
+
48
52
  == Maintainers
49
53
 
50
54
  * thiagofm[http://github.com/thiagofm]
51
55
 
52
56
  == Copyright
53
57
 
54
- Copyright (c) 2013 Thiago Fernandes Massa. See +LICENSE.txt+ for
58
+ Copyright (c) 2013-2015 Thiago Fernandes Massa. See +LICENSE.txt+ for
55
59
  further details.
56
-
data/Rakefile CHANGED
@@ -23,7 +23,7 @@ Jeweler::Tasks.new do |gem|
23
23
  gem.authors = ["Thiago Fernandes Massa"]
24
24
  gem.test_files = Dir.glob('spec/**/*')
25
25
  gem.executables = %w(memcached-manager)
26
-
26
+
27
27
  # dependencies defined in Gemfile
28
28
  end
29
29
  Jeweler::RubygemsDotOrgTasks.new
@@ -52,9 +52,9 @@ RSpec::Core::RakeTask.new do |t|
52
52
  t.pattern = "./spec/**/*_spec.rb"
53
53
  end
54
54
 
55
- task :jasmineci do
56
- system("export DISPLAY=:99.0 && bundle exec rake jasmine:ci")
57
- raise "#{cmd} failed!" unless $?.exitstatus == 0
58
- end
55
+ #task :jasmineci do
56
+ #cmd = system("export DISPLAY=:99.0 && bundle exec rake jasmine:ci")
57
+ #raise "#{cmd} failed!" unless $?.exitstatus == 0
58
+ #end
59
59
 
60
- task :default => [:jasmineci, :features, :spec]
60
+ task :default => [:features, :spec]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 1.0.0
@@ -0,0 +1,6 @@
1
+ @api
2
+ Feature: Run command
3
+ Scenario: Success
4
+ Given there's some memcached keys avaiable
5
+ When I post the command "get ineed" to "/run.json" in the API
6
+ Then it should be run on memcached and give a response
@@ -0,0 +1,6 @@
1
+ @api
2
+ Feature: Search memcached keys
3
+ Scenario: Success
4
+ Given there's some memcached keys avaiable
5
+ When I visit "/keys.json?query=foo" in the API
6
+ Then I should receive a json response with the "foo" and "foo1" keys
@@ -12,7 +12,7 @@ Then /^I should receive a json response that it was saved successfully$/ do
12
12
  response_json.class.should eql Hash
13
13
  response_json.keys.should_not include 'errors'
14
14
  response_json.values.should include 'all.i.want.to.do'
15
- response_json.keys.should include 'expired'
15
+ response_json.keys.should include 'expires_in'
16
16
  end
17
17
 
18
18
  Then /^it should be saved in memcached$/ do
@@ -2,6 +2,7 @@
2
2
 
3
3
  Given /^there's some memcached keys avaiable$/ do
4
4
  Memcached.set('foo', 'bar')
5
+ Memcached.set('foo1', 'bar')
5
6
  Memcached.set('ineed', 'togetalife')
6
7
  end
7
8
 
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ When(/^I post the command "(.*?)" to "(.*?)" in the API$/) do |command, route|
4
+ @response = API.post do |req|
5
+ req.url "api/#{route}"
6
+ req.params = {command: command}
7
+ end
8
+ end
9
+
10
+ Then(/^it should be run on memcached and give a response$/) do
11
+ expect(JSON.parse(@response.body)['response']).to match(/ineed/)
12
+ end
@@ -0,0 +1,6 @@
1
+ Then(/^I should receive a json response with the "(.*?)" and "(.*?)" keys$/) do |key1, key2|
2
+ keys = @response.map{|p| p['key']}
3
+ expect(keys.size).to be 2
4
+ expect(keys).to include key1
5
+ expect(keys).to include key2
6
+ end
@@ -1,10 +1,16 @@
1
- When /^click on the X inside a div$/ do
2
- within(".key-actions") do
3
- find('.icon-remove').click
4
- end
5
- sleep 5
1
+ When /^I visit "(.*?)"$/ do |route|
2
+ visit route
3
+ end
4
+
5
+ When /^fill in "(.*?)" with "(.*?)"$/ do |field, value|
6
+ fill_in(field, :with => value)
6
7
  end
7
8
 
8
- Then /^"(.*?)" key shouldn't exist in memcached$/ do |key|
9
- Memcached.get(key).should be nil
9
+ When /^click "(.*?)"$/ do |button|
10
+ click_button button
11
+ end
12
+
13
+ Then /^"(.*?)" key should have the "(.*?)" value in memcached$/ do |key, value|
14
+ sleep 5
15
+ Memcached.get(key).should == value
10
16
  end
@@ -1,16 +1,10 @@
1
- When /^I visit "(.*?)"$/ do |route|
2
- visit route
1
+ When /^click on the X inside a div$/ do
2
+ within(".keys-actions") do
3
+ find('.icon-remove').click
4
+ end
5
+ sleep 5
3
6
  end
4
7
 
5
- When /^fill in "(.*?)" with "(.*?)"$/ do |field, value|
6
- fill_in(field, :with => value)
7
- end
8
-
9
- When /^click "(.*?)"$/ do |button|
10
- click_button button
11
- end
12
-
13
- Then /^"(.*?)" key should have the "(.*?)" value in memcached$/ do |key, value|
14
- sleep 1
15
- Memcached.get(key).should == value
8
+ Then /^"(.*?)" key shouldn't exist in memcached$/ do |key|
9
+ Memcached.get(key).should be nil
16
10
  end
@@ -0,0 +1,7 @@
1
+ Then(/^I should see those configs in "(.*?)"$/) do |route|
2
+ response = API.get(route)
3
+ response = JSON.parse(response.body)
4
+
5
+ expect(response['host']).to eq 'localhost'
6
+ expect(response['port']).to eq '11211'
7
+ end
@@ -13,7 +13,7 @@ World(RSpec::Matchers)
13
13
 
14
14
  # Files
15
15
  Dir.glob("lib/**/*.rb").each do |file|
16
- require_relative "../../#{file}"
16
+ require "./#{file}"
17
17
  end
18
18
 
19
19
  Capybara.app = Rack::Builder.parse_file(File.expand_path('../../../config.ru', __FILE__)).first
@@ -24,5 +24,6 @@ API = Faraday.new do |conn| conn.adapter :rack, Rack::URLMap.new({
24
24
  })
25
25
  end
26
26
 
27
- MemcachedConfigs = { host: 'localhost', port: '11211' }
27
+ MemcachedConfigs = { host: ENV['MEMCACHED_1_PORT_11211_TCP_ADDR'] || 'localhost', port: '11211' }
28
28
  Memcached = Dalli::Client.new("#{MemcachedConfigs[:host]}:#{MemcachedConfigs[:port]}")
29
+
@@ -0,0 +1,9 @@
1
+ @webapp
2
+ @javascript
3
+ Feature: Edit configs of memcached
4
+ Scenario: Success
5
+ When I visit "#/config"
6
+ And fill in "Host" with "127.0.0.1"
7
+ And fill in "Port" with "11211"
8
+ And click "Update settings"
9
+ Then I should see those configs in "/api/config.json"
@@ -5,5 +5,5 @@ Feature: Edit memcached pair
5
5
  Given a key named "foo" with the content "bar" exists
6
6
  When I visit "#/edit/foo"
7
7
  And fill in "Value" with "baz"
8
- And click "Edit"
8
+ And click "Update key"
9
9
  Then "foo" key should have the "baz" value in memcached
data/fig.yml ADDED
@@ -0,0 +1,13 @@
1
+ memcached :
2
+ image: sameersbn/memcached
3
+ ports:
4
+ - "11211"
5
+ web:
6
+ build: .
7
+ command: bundle exec /memcached-manager/bin/memcached-manager
8
+ volumes:
9
+ - .:/memcached-manager
10
+ ports:
11
+ - "3000:5678"
12
+ links:
13
+ - memcached
@@ -0,0 +1,23 @@
1
+ Did you ever try to read all keys that are in memcached and found out that memcached have no command that allows it?
2
+
3
+ Do you miss being able to actually know what is inside your memcached server effortlessly?
4
+
5
+ I did want that, so I've built it. Check it out:
6
+
7
+ (image of menu)
8
+ - Check how much time is left for any key to expire or how much size it occupies.
9
+
10
+ (image of search)
11
+ - Find any key you want. (made in angular.js)
12
+
13
+ (terminal mode image)
14
+ - Type anything on a terminal connection directly with the memcached server, no need to telnet anymore.
15
+
16
+ (image with crud stuff)
17
+ - A CRUD for your memcached server: Create, Read, Update or Delete any key without using an archaic direct telnet connection.
18
+
19
+ All that packaged in a slick web interface, just install it and use it! It's also pluggable to any rack/rails application with -one line-.
20
+
21
+ (installing instructions, gem install memcached-manager blablabla)
22
+
23
+ footer: made with <3 in Brazil
data/lib/api.rb CHANGED
@@ -14,11 +14,14 @@ module MemcachedManager
14
14
  class API < Sinatra::Base
15
15
  enable :inline_templates
16
16
  enable :sessions
17
+ enable :cookies
17
18
 
18
19
  set :public_folder, 'public'
19
20
 
21
+ helpers Sinatra::Cookies
20
22
  helpers Sinatra::MemcachedSettings
21
23
  helpers Sinatra::MemcachedConnection
24
+ helpers Sinatra::MemcachedCommand
22
25
  helpers Sinatra::MemcachedInspector
23
26
  helpers Sinatra::Errors
24
27
  helpers Sinatra::APIResponse
@@ -28,35 +31,50 @@ module MemcachedManager
28
31
 
29
32
  setup_errors
30
33
 
31
- try { setup_memcached(memcached_host(session), memcached_port(session)) }
34
+ try { setup_memcached(memcached_host(cookies), memcached_port(cookies)) }
32
35
  end
33
36
 
34
37
  after do
35
38
  close_memcached
36
39
  end
37
40
 
41
+ get '/status.json' do
42
+ api_response { { connected: memcached_connected?(memcached_host(cookies), memcached_port(cookies)) } }
43
+ end
44
+
38
45
  get '/config.json' do
39
- api_response { { host: memcached_host(session), port: memcached_port(session) } }
46
+ api_response { { host: memcached_host(cookies), port: memcached_port(cookies) } }
40
47
  end
41
48
 
42
49
  post '/config.json' do
43
- session['host'] = params['host']
44
- session['port'] = params['port']
50
+ response.set_cookie(:host, :value => params['host'], :path => '/')
51
+ response.set_cookie(:port, :value => params['port'], :path => '/')
52
+
53
+ api_response { { host: memcached_host(cookies), port: memcached_port(cookies) } }
54
+ end
45
55
 
46
- api_response { { host: memcached_host(session), port: memcached_port(session) } }
56
+ post '/run.json' do
57
+ api_response do
58
+ memcached_command(host: memcached_host(cookies), port: memcached_port(cookies), command: params[:command])
59
+ end
47
60
  end
48
61
 
49
62
  [:post, :put].each do |method|
50
63
  send(method, '/keys.json') do
51
64
  try { memcached_connection.set(params[:key], params[:value]) }
52
65
 
53
- api_response { memcached_inspect(host: memcached_host(session), port: memcached_port(session), key: params[:key]) }
66
+ api_response { memcached_inspect(host: memcached_host(cookies), port: memcached_port(cookies), key: params[:key]) }
54
67
  end
55
68
  end
56
69
 
57
70
  get '/keys.json' do
71
+ pairs = memcached_inspect(host: memcached_host(cookies), port: memcached_port(cookies), query: params[:query])
72
+
73
+ # Removing all expired keys
74
+ pairs.select! {|pair| !memcached_connection.get(pair[:key]).nil? }
75
+
58
76
  api_response do
59
- memcached_inspect(host: memcached_host(session), port: memcached_port(session))
77
+ pairs
60
78
  end
61
79
  end
62
80