dallish 1.4.1

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.
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .DS_Store
6
+ .idea
7
+ bin/
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'dalli'
4
+ gem 'rspec'
5
+
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2012 Kazuhiro Sera <seratch__at__gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
@@ -0,0 +1,53 @@
1
+ <<<<<<< HEAD
2
+ dallish
3
+ =======
4
+
5
+ An extended Dalli for memcached 1.4.x
6
+ =======
7
+ # Dallish
8
+
9
+ Dallish is an extended [Dalli](https://github.com/mperham/dalli) for memcached 1.4.x.
10
+
11
+ ## Note
12
+
13
+ Dallish is slower than Dalli, so just use as a tool for debugging or management.
14
+
15
+ Unfortunately, the methods by Dallish won't work with memcached 1.6 or higher.
16
+
17
+ ## How to use?
18
+
19
+ First, get Dallish.
20
+
21
+ ```
22
+ gem install dallish
23
+ ```
24
+
25
+ And then, try it as follows.
26
+
27
+ ```ruby
28
+ require 'dallish'
29
+
30
+ dallish = Dallish.new('localhost:11211')
31
+
32
+ # methods by Dalli
33
+ dallish.set('foo', 123)
34
+ dallish.set('fooo', 234)
35
+ dallish.set('bar', 345)
36
+ dallish.set('baz', 456)
37
+
38
+ dallish.get('foo') # => 123
39
+
40
+ # mehods by Dallish
41
+ dallish.all_keys # => [foo,fooo,bar,baz]
42
+
43
+ dallish.find_keys_by(/foo.+/) # => [foo,fooo]
44
+
45
+ dallish.find_all_by(/foo.+/) # =>
46
+
47
+ dallish.delete_all_by(/foo.+/)
48
+ ```
49
+
50
+ ## License
51
+
52
+ The MIT License
53
+ >>>>>>> 37ae587... Initial version
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "dallish/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "dallish"
8
+ s.version = Dallish::VERSION
9
+ s.authors = ["Kazuhiro Sera"]
10
+ s.email = ["seratch@gmail.com"]
11
+ s.homepage = "https://github.com/seratch/dallish"
12
+ s.summary = %q{An extended Dalli for memcached 1.4.x}
13
+ s.description = %q{An extended Dalli for memcached 1.4.x}
14
+
15
+ s.rubyforge_project = "dallish"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.required_ruby_version = '>= 1.9.0'
23
+ s.add_dependency('dalli')
24
+
25
+ end
26
+
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'dalli'
4
+ require 'dallish/client'
5
+
6
+ module Dallish
7
+
8
+ def self.new(params_or_dalli_servers = {}, dalli_options = {})
9
+ if is_the_arg_dalli_servers(params_or_dalli_servers)
10
+ params = {:servers => params_or_dalli_servers, :dalli_options => dalli_options}
11
+ else
12
+ params = params_or_dalli_servers
13
+ end
14
+ Dallish::Client.new(params)
15
+ end
16
+
17
+ private
18
+
19
+ def self.is_the_arg_dalli_servers(params_or_dalli_servers)
20
+ params_or_dalli_servers and
21
+ (params_or_dalli_servers.is_a?(String) or params_or_dalli_servers.is_a?(Array))
22
+ end
23
+
24
+ end
@@ -0,0 +1,101 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'logger'
4
+ require 'dalli'
5
+ require 'net/telnet'
6
+
7
+ module Dallish
8
+ class Client
9
+
10
+ attr_accessor :servers, :log, :dalli
11
+
12
+ def initialize(params)
13
+ raise ArgumentError.new('`params` should be a Hash value.') unless params.is_a? Hash
14
+
15
+ # log settings
16
+ @log = Logger.new(params[:log_output] || STDOUT)
17
+ @log.level = params[:log_level] || Logger::INFO
18
+
19
+ # memcached server settings
20
+ if params[:servers] and params[:servers].is_a?(String)
21
+ @servers = [params[:servers]]
22
+ else
23
+ @servers = params[:servers] || ['127.0.0.1:11211']
24
+ end
25
+ @dalli_options = params[:options] || {}
26
+ @dalli = Dalli::Client.new(@servers, @dalli_options)
27
+
28
+ # cannot support memcached 1.6 or higher
29
+ self.servers.each { |server|
30
+ version = telnet(server, :prompt => /\n/).cmd('version')
31
+ self.log.debug "version: #{version}"
32
+
33
+ /VERSION (?<major_version>\d+\.\d+).*/ =~ version
34
+ if major_version and major_version.to_f >= 1.6
35
+ raise ArgumentError.new("Sorry, Dallish doesn't support memcached 1.6 or higher version.")
36
+ end
37
+ }
38
+ end
39
+
40
+ def telnet(server, options = {})
41
+ (host, port) = server.split(':')
42
+ self.log.debug "target memcahced server: #{host}:#{port}"
43
+ telnet = Net::Telnet::new(
44
+ 'Host' => host,
45
+ 'Port' => port,
46
+ 'Prompt' => options[:prompt] || /(^END$)/,
47
+ 'Timeout' => options[:timeout] || 3
48
+ )
49
+ end
50
+
51
+ def all_keys()
52
+ self.servers.flat_map { |server|
53
+ telnet = telnet(server)
54
+ begin
55
+ slab_ids = telnet.cmd("stats slabs").split("\n").map { |line|
56
+ /STAT (?<slab_id>\d+):.+/ =~ line
57
+ slab_id
58
+ }.reject { |e| e.nil? }.uniq
59
+
60
+ slab_ids.flat_map { |slab_id|
61
+ telnet.cmd("stats cachedump #{slab_id} 1000000").split("\n").map { |line|
62
+ /ITEM (?<key>.+) \[\d+ b; \d+ s\]/ =~ line
63
+ key
64
+ }
65
+ }
66
+ rescue Exception => e
67
+ self.log.info "Failed to get keys because #{e.to_s}"
68
+ []
69
+ ensure
70
+ telnet.close()
71
+ end
72
+ }.reject { |e| e.nil? }.uniq
73
+ end
74
+
75
+ def find_keys_by(regexp)
76
+ all_keys.select { |key|
77
+ if key.is_a?(Array) then
78
+ puts "#{key},#{key.class}"
79
+ end
80
+ regexp.match(key) }
81
+ end
82
+
83
+ def delete_all_by(regexp)
84
+ find_keys_by(regexp).each do |key|
85
+ self.dalli.delete(key)
86
+ end
87
+ end
88
+
89
+ def find_all_by(regexp)
90
+ find_keys_by(regexp).inject({}) { |result, key|
91
+ result[key] = self.dalli.get(key)
92
+ result
93
+ }
94
+ end
95
+
96
+ def method_missing(name, *args, &block)
97
+ self.dalli.send(name, *args, &block)
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,6 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Dallish
4
+ VERSION = "1.4.1"
5
+ end
6
+
@@ -0,0 +1,71 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'dallish'
4
+ require 'logger'
5
+
6
+ describe Dallish do
7
+
8
+ before do
9
+ @dallish = Dallish.new(
10
+ :servers => ["localhost:11211", 'memcached:11211'],
11
+ :log_level => Logger::INFO
12
+ )
13
+ end
14
+
15
+ it "should be also created with Dalli style args" do
16
+ dallish = Dallish.new('localhost:11211')
17
+ dallish.should_not be(nil)
18
+ keys = dallish.all_keys
19
+ keys.should_not be(nil)
20
+ keys.size.should > 0
21
+ end
22
+
23
+ it "should be created" do
24
+ dallish = Dallish.new(:servers => "localhost:11211")
25
+ dallish.should_not be(nil)
26
+ keys = dallish.all_keys
27
+ keys.should_not be(nil)
28
+ keys.size.should > 0
29
+ end
30
+
31
+ it "should get all keys" do
32
+ keys = @dallish.all_keys
33
+ keys.should_not be(nil)
34
+ keys.size.should > 0
35
+ end
36
+
37
+ it "should find_keys_by regexp" do
38
+ (1..100).each { |i| @dallish.set("foo_#{i}", 123) }
39
+ keys = @dallish.find_keys_by(/foo_\d+$/)
40
+ keys.size.should >= 100
41
+ end
42
+
43
+ it "should delete_all_by regexp" do
44
+ (1..100).each { |i| @dallish.set("to_delete_#{i}", 123) }
45
+ keys = @dallish.find_keys_by(/to_delete_\d+$/)
46
+ keys.size.should >= 100
47
+
48
+ @dallish.delete_all_by(/to_delete_\d+$/)
49
+
50
+ keys = @dallish.find_keys_by(/to_delete_\d+$/)
51
+ keys.size.should == 0
52
+ end
53
+
54
+ it "should find_all_by regexp" do
55
+ (1..100).each { |i| @dallish.set("to_get_#{i}", 123) }
56
+ keys = @dallish.find_keys_by(/to_get_\d+$/)
57
+ keys.size.should >= 100
58
+
59
+ results = @dallish.find_all_by(/to_get_\d+$/)
60
+ results.keys.size.should >= 100
61
+ end
62
+
63
+ it "should have dalli's methods" do
64
+ @dallish.set("foo", 123)
65
+ @dallish.set("bar", 234)
66
+ @dallish.get("foo").should == 123
67
+ @dallish.get_multi("foo", "bar").size.should == 2
68
+ @dallish.fetch("foo").should == 123
69
+ end
70
+
71
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dallish
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.4.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kazuhiro Sera
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dalli
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: An extended Dalli for memcached 1.4.x
31
+ email:
32
+ - seratch@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - LICENSE
40
+ - README.md
41
+ - dallish.gemspec
42
+ - lib/dallish.rb
43
+ - lib/dallish/client.rb
44
+ - lib/dallish/version.rb
45
+ - spec/dallish_spec.rb
46
+ homepage: https://github.com/seratch/dallish
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: 1.9.0
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project: dallish
66
+ rubygems_version: 1.8.24
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: An extended Dalli for memcached 1.4.x
70
+ test_files:
71
+ - spec/dallish_spec.rb