memcached-manager 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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