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.
- checksums.yaml +13 -5
- data/.travis.yml +1 -1
- data/CONTRIBUTING.md +4 -4
- data/Dockerfile +7 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +23 -19
- data/README.rdoc +8 -5
- data/Rakefile +6 -6
- data/VERSION +1 -1
- data/features/api/run_command.feature +6 -0
- data/features/api/search_memcached_keys.feature +6 -0
- data/features/step_definitions/api/create_memcached_key.rb +1 -1
- data/features/step_definitions/api/list_memcached_keys.rb +1 -0
- data/features/step_definitions/api/run_command.rb +12 -0
- data/features/step_definitions/api/search_memcached_keys.rb +6 -0
- data/features/step_definitions/webapp/create_memcached_key.rb +13 -7
- data/features/step_definitions/webapp/delete_memcached_key.rb +7 -13
- data/features/step_definitions/webapp/edit_configs.rb +7 -0
- data/features/support/env.rb +3 -2
- data/features/webapp/edit_configs.feature +9 -0
- data/features/webapp/edit_memcached_key.feature +1 -1
- data/fig.yml +13 -0
- data/githubpage_idea +23 -0
- data/lib/api.rb +25 -7
- data/lib/extensions.rb +6 -0
- data/lib/extensions/memcached_command.rb +14 -0
- data/lib/extensions/memcached_connection.rb +9 -0
- data/lib/extensions/memcached_inspector.rb +12 -5
- data/lib/extensions/memcached_settings.rb +2 -2
- data/lib/public/images/favicon.png +0 -0
- data/lib/public/images/glyphicons-halflings.png +0 -0
- data/lib/public/images/logo.png +0 -0
- data/lib/public/images/org-logo.png +0 -0
- data/lib/public/images/search.png +0 -0
- data/lib/public/javascripts/angular/controllers.js +48 -3
- data/lib/public/javascripts/angular/filters.js +85 -0
- data/lib/public/javascripts/angular/routes.js +26 -0
- data/lib/public/javascripts/angular/services/notification.js +41 -6
- data/lib/public/javascripts/angular/services/query_params_singleton.js +10 -0
- data/lib/public/javascripts/angular/services/resources.js +13 -0
- data/lib/public/javascripts/application.js +38 -1
- data/lib/public/javascripts/humanize.js +473 -0
- data/lib/public/javascripts/humanize_duration.js +329 -0
- data/lib/public/javascripts/jquery-terminal.js +4335 -0
- data/lib/public/javascripts/underscore.js +5 -0
- data/lib/public/stylesheets/app.css +196 -10
- data/lib/public/stylesheets/buttons.css +107 -0
- data/lib/public/stylesheets/inputs.css +119 -0
- data/lib/public/stylesheets/jquery-terminal.css +184 -0
- data/lib/public/stylesheets/media_queries.css +162 -0
- data/lib/public/templates/config.html.erb +8 -0
- data/lib/public/templates/edit.html.erb +5 -3
- data/lib/public/templates/keys.html.erb +42 -31
- data/lib/public/templates/new.html.erb +6 -4
- data/lib/public/templates/show.html.erb +1 -1
- data/lib/public/templates/stats.html.erb +1 -2
- data/lib/routes.rb +3 -0
- data/lib/views/index.erb +24 -3
- data/lib/views/layout.erb +14 -1
- data/memcached-manager.gemspec +31 -5
- data/spec/lib/extensions/api_response_spec.rb +9 -7
- data/spec/lib/extensions/memcached_command_spec.rb +13 -0
- data/spec/lib/extensions/memcached_connection_spec.rb +9 -4
- data/spec/lib/extensions/memcached_inspector_spec.rb +38 -17
- data/spec/lib/extensions/memcached_settings_spec.rb +16 -16
- data/spec/spec_helper.rb +2 -4
- metadata +48 -21
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWI1Y2M2Zjg0YTAyNGVkMGVkOTRjODUyNTEyYzQ1ZDVjY2M2ZjVkOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ODQ0ODUxMWE3ODYxODg1ZTM4MmQ2MjVmZDE4MzUxNmEwNmQ2NGIzYQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MmI4MDk5N2JlNGY3M2E5Y2JjOTI5ODViNGY3NjA3YzcyMWZhOTQzMTgyZTYx
|
10
|
+
MGU1MjZhYTMzZjIxOTA1NWFkYzI1NjUxZDc2MmEyMWFhOGEyNzgwMjMxZmU4
|
11
|
+
ZmU2ODIyM2I2ZGUzNmU3YWYxMmExZDJjMWU0M2Q2YjJhMjY0NWM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODk2NjMxZDNiNzBhNTViNjkxOTE5OWU0MjQwOTM5MjA3MDQxMTk1M2UyZmRk
|
14
|
+
OWU1NWM4ODU3NzE3M2RlYTMwNTE2ZGI1Nzg3ODRmMjhhMWE0YTNkNTdjYTE0
|
15
|
+
NTkyMGIyMmYzM2Q3YWE5ZTVmMjg3ZTVlMmM0MmVhMTE1NDk5YzQ=
|
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -11,11 +11,11 @@ Have `memcached` run on `localhost:11211` then run:
|
|
11
11
|
|
12
12
|
bundle exec rake
|
13
13
|
|
14
|
-
==
|
14
|
+
== What does the project needs help with?
|
15
15
|
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
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
|
|
data/Dockerfile
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,7 +2,7 @@ GEM
|
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
addressable (2.3.5)
|
5
|
-
backports (3.
|
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.
|
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.
|
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.
|
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.
|
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 (
|
90
|
-
rspec-core (~>
|
91
|
-
rspec-expectations (~>
|
92
|
-
rspec-mocks (~>
|
93
|
-
rspec-core (
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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 (
|
102
|
-
websocket (~> 1.0
|
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.
|
125
|
+
websocket (1.2.1)
|
122
126
|
websocket-driver (0.3.0)
|
123
127
|
xpath (2.0.0)
|
124
128
|
nokogiri (~> 1.3)
|
data/README.rdoc
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
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/
|
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.
|
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 => [:
|
60
|
+
task :default => [:features, :spec]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
@@ -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 '
|
15
|
+
response_json.keys.should include 'expires_in'
|
16
16
|
end
|
17
17
|
|
18
18
|
Then /^it should be saved in memcached$/ do
|
@@ -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
|
@@ -1,10 +1,16 @@
|
|
1
|
-
When /^
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
-
|
9
|
-
|
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 /^
|
2
|
-
|
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
|
-
|
6
|
-
|
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
|
data/features/support/env.rb
CHANGED
@@ -13,7 +13,7 @@ World(RSpec::Matchers)
|
|
13
13
|
|
14
14
|
# Files
|
15
15
|
Dir.glob("lib/**/*.rb").each do |file|
|
16
|
-
|
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
|
+
|
data/fig.yml
ADDED
data/githubpage_idea
ADDED
@@ -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(
|
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(
|
46
|
+
api_response { { host: memcached_host(cookies), port: memcached_port(cookies) } }
|
40
47
|
end
|
41
48
|
|
42
49
|
post '/config.json' do
|
43
|
-
|
44
|
-
|
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
|
-
|
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(
|
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
|
-
|
77
|
+
pairs
|
60
78
|
end
|
61
79
|
end
|
62
80
|
|