evented-memcache-client 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.
- data/CHANGELOG +113 -0
- data/COPYING +348 -0
- data/README +75 -0
- data/Rakefile +123 -0
- data/doc/classes/EventMachine.html +146 -0
- data/doc/classes/EventMachine/Protocols.html +135 -0
- data/doc/classes/EventMachine/Protocols/Memcache.html +153 -0
- data/doc/classes/EventMachine/Protocols/Memcache/Client.html +121 -0
- data/doc/classes/EventMachine/Protocols/Memcache/Connectable.html +615 -0
- data/doc/classes/EventMachine/Protocols/Memcache/Connection.html +192 -0
- data/doc/classes/EventMachine/Protocols/Memcache/Sender.html +389 -0
- data/doc/classes/EventMachine/Protocols/Memcache/Server.html +463 -0
- data/doc/classes/EventMachine/Protocols/Memcache/TenaciousMC.html +277 -0
- data/doc/classes/MyHandler.html +197 -0
- data/doc/created.rid +1 -0
- data/doc/files/COPYING.html +473 -0
- data/doc/files/README.html +187 -0
- data/doc/files/extras/consumer_rb.html +110 -0
- data/doc/files/extras/producer_rb.html +110 -0
- data/doc/files/extras/server_rb.html +110 -0
- data/doc/files/lib/evented-memcache-client_rb.html +125 -0
- data/doc/files/lib/evented_memcache_client/client_rb.html +120 -0
- data/doc/files/lib/evented_memcache_client/connectable_rb.html +120 -0
- data/doc/files/lib/evented_memcache_client/connection_rb.html +120 -0
- data/doc/files/lib/evented_memcache_client/sender_rb.html +112 -0
- data/doc/files/lib/evented_memcache_client/server_rb.html +120 -0
- data/doc/files/lib/evented_memcache_client/tenacious_rb.html +120 -0
- data/doc/fr_class_index.html +36 -0
- data/doc/fr_file_index.html +38 -0
- data/doc/fr_method_index.html +66 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/extras/consumer.rb +41 -0
- data/extras/producer.rb +22 -0
- data/extras/server.rb +33 -0
- data/lib/evented-memcache-client.rb +37 -0
- data/lib/evented_memcache_client/client.rb +36 -0
- data/lib/evented_memcache_client/connectable.rb +324 -0
- data/lib/evented_memcache_client/connection.rb +73 -0
- data/lib/evented_memcache_client/sender.rb +184 -0
- data/lib/evented_memcache_client/server.rb +118 -0
- data/lib/evented_memcache_client/tenacious.rb +106 -0
- metadata +115 -0
data/README
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
= INTRODUCTION
|
2
|
+
|
3
|
+
Evented Memcache Client is a memcache client written for Ruby's
|
4
|
+
EventMachine. It implements a full (though simple) memcache client.
|
5
|
+
|
6
|
+
= INSTALLATION
|
7
|
+
|
8
|
+
You'll need eventmachine:
|
9
|
+
|
10
|
+
sudo gem install eventmachine
|
11
|
+
|
12
|
+
Then:
|
13
|
+
|
14
|
+
sudo gem install evented-memcache-client
|
15
|
+
|
16
|
+
Naturally a running memcache or starling is needed too. I use
|
17
|
+
starling:
|
18
|
+
|
19
|
+
sudo gem install starling
|
20
|
+
sudo starling -p 12345
|
21
|
+
|
22
|
+
= USAGE
|
23
|
+
|
24
|
+
Here is a producer:
|
25
|
+
|
26
|
+
require 'rubygems'
|
27
|
+
require 'eventmachine'
|
28
|
+
require 'evented-memcache-client'
|
29
|
+
|
30
|
+
callbacks = {
|
31
|
+
:open => Proc.new { |conn|
|
32
|
+
conn.set(:key => 'x', :data => Time.now.to_s)
|
33
|
+
},
|
34
|
+
:stored => Proc.new { |conn, data, args|
|
35
|
+
puts "Stored a value"
|
36
|
+
EventMachine::stop
|
37
|
+
},
|
38
|
+
}
|
39
|
+
EventMachine::run {
|
40
|
+
EventMachine::connect('127.0.0.1',
|
41
|
+
12345,
|
42
|
+
EventMachine::Protocols::Memcache::Client,
|
43
|
+
callbacks)
|
44
|
+
}
|
45
|
+
|
46
|
+
And here is a consumer:
|
47
|
+
|
48
|
+
require 'rubygems'
|
49
|
+
require 'eventmachine'
|
50
|
+
require 'evented-memcache-client'
|
51
|
+
|
52
|
+
callbacks = {
|
53
|
+
:open => Proc.new { |conn|
|
54
|
+
puts 'Opened connection. Fetching...'
|
55
|
+
conn.get(:key => 'x')
|
56
|
+
},
|
57
|
+
:value => Proc.new { |conn, data, args|
|
58
|
+
key = args[0]
|
59
|
+
flags = args[1]
|
60
|
+
puts "Received message: '#{data}'"
|
61
|
+
puts 'Fetching more...'
|
62
|
+
conn.get(:key => 'x')
|
63
|
+
}
|
64
|
+
}
|
65
|
+
EventMachine::run {
|
66
|
+
EventMachine::connect('127.0.0.1',
|
67
|
+
12345,
|
68
|
+
EventMachine::Protocols::Memcache::Client,
|
69
|
+
callbacks)
|
70
|
+
}
|
71
|
+
|
72
|
+
= TODO
|
73
|
+
|
74
|
+
Needs a test suite.
|
75
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
#############################################################################
|
2
|
+
#
|
3
|
+
# $Id$
|
4
|
+
#
|
5
|
+
# Author:: Colin Steele (colin@colinsteele.org)
|
6
|
+
# Homepage::
|
7
|
+
#
|
8
|
+
#----------------------------------------------------------------------------
|
9
|
+
#
|
10
|
+
# Copyright (C) 2008 by Colin Steele. All Rights Reserved.
|
11
|
+
# colin@colinsteele.org
|
12
|
+
#
|
13
|
+
# This program is free software; you can redistribute it and/or modify
|
14
|
+
# it under the terms of either: 1) the GNU General Public License
|
15
|
+
# as published by the Free Software Foundation; either version 2 of the
|
16
|
+
# License, or (at your option) any later version; or 2) Ruby's License.
|
17
|
+
#
|
18
|
+
# See the file COPYING for complete licensing information.
|
19
|
+
#
|
20
|
+
#---------------------------------------------------------------------------
|
21
|
+
#
|
22
|
+
#
|
23
|
+
#############################################################################
|
24
|
+
|
25
|
+
$:.unshift(File.dirname(__FILE__) + "/lib")
|
26
|
+
|
27
|
+
require 'evented-memcache-client'
|
28
|
+
require 'rubygems'
|
29
|
+
require 'rake'
|
30
|
+
require 'rubyforge'
|
31
|
+
|
32
|
+
PKG_NAME = "evented-memcache-client"
|
33
|
+
PKG_VERSION = EventMachine::Protocols::Memcache::VERSION
|
34
|
+
RUBYFORGE_GROUP_ID = 'ev-memcache-cli'
|
35
|
+
RUBYFORGE_PKG_NAME = 'ev-memcache-cli'
|
36
|
+
|
37
|
+
Gem::manage_gems
|
38
|
+
require 'rake/testtask'
|
39
|
+
require 'rake/rdoctask'
|
40
|
+
require 'rake/gempackagetask'
|
41
|
+
|
42
|
+
task :default => [:test]
|
43
|
+
|
44
|
+
desc "Create a new gem and install it"
|
45
|
+
task(:setup => :package) do
|
46
|
+
puts %x[cd pkg;pwd;sudo -p "Password:" gem install evented-memcache-client-#{PKG_VERSION}.gem]
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Recreate the CHANGELOG"
|
50
|
+
task(:changelog) do
|
51
|
+
rm 'CHANGELOG', :force => true
|
52
|
+
File.open('CHANGELOG', 'w') { |f|
|
53
|
+
f.puts "#"
|
54
|
+
f.puts "# This file is automatically generated using 'rake changelog'"
|
55
|
+
f.puts "#"
|
56
|
+
}
|
57
|
+
puts %x[git log --pretty --name-only >> CHANGELOG]
|
58
|
+
end
|
59
|
+
|
60
|
+
Rake::TestTask.new do |t|
|
61
|
+
t.libs << "test"
|
62
|
+
t.test_files = FileList['test/**/*.rb']
|
63
|
+
end
|
64
|
+
|
65
|
+
Rake::RDocTask.new do |rd|
|
66
|
+
rd.main = "README"
|
67
|
+
rd.rdoc_files.include("README", 'COPYING', "lib/**/*.rb", "extras/**/*")
|
68
|
+
rd.rdoc_dir = 'doc'
|
69
|
+
rd.title = "Evented Memcache Client"
|
70
|
+
rd.options << '--line-numbers'
|
71
|
+
rd.options << '--inline-source'
|
72
|
+
rd.options << '--main' << 'README'
|
73
|
+
end
|
74
|
+
|
75
|
+
spec = Gem::Specification.new do |s|
|
76
|
+
s.platform = Gem::Platform::RUBY
|
77
|
+
s.name = PKG_NAME
|
78
|
+
s.version = PKG_VERSION
|
79
|
+
s.author = "Colin Steele"
|
80
|
+
s.email = "colin@colinsteele.org"
|
81
|
+
s.homepage = "http://www.colinsteele.org/emc"
|
82
|
+
s.summary = "Eventmachine-based Memcache client"
|
83
|
+
s.files = Rake::FileList["{extras,lib,doc}/**/*"].to_a
|
84
|
+
s.require_path = "lib"
|
85
|
+
s.test_files = Rake::FileList["{test}/**/*test.rb"].to_a
|
86
|
+
s.has_rdoc = true
|
87
|
+
s.extra_rdoc_files = ["README", "COPYING", "Rakefile", "CHANGELOG"]
|
88
|
+
s.add_dependency("eventmachine", ">= 0.12.0")
|
89
|
+
s.rubyforge_project = 'ev-memcache-cli'
|
90
|
+
s.description = <<EOF
|
91
|
+
A memcache client built on EventMachine.
|
92
|
+
EOF
|
93
|
+
end
|
94
|
+
|
95
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
96
|
+
pkg.need_zip = true
|
97
|
+
pkg.need_tar = true
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'Package and upload the release to rubyforge.'
|
101
|
+
task :release => [:clobber_package, :package] do |t|
|
102
|
+
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
|
103
|
+
abort "Versions don't match #{v} vs #{version}" if v != PKG_VERSION
|
104
|
+
pkg = "pkg/#{PKG_NAME}-#{v}"
|
105
|
+
|
106
|
+
if $DEBUG then
|
107
|
+
puts "release_id = rf.add_release #{rubyforge_name.inspect}, #{name.inspect}, #{version.inspect}, \"#{pkg}.tgz\""
|
108
|
+
puts "rf.add_file #{rubyforge_name.inspect}, #{name.inspect}, release_id, \"#{pkg}.gem\""
|
109
|
+
end
|
110
|
+
|
111
|
+
rf = RubyForge.new.configure
|
112
|
+
puts "Logging in"
|
113
|
+
rf.login
|
114
|
+
|
115
|
+
c = rf.userconfig
|
116
|
+
c["release_notes"] = spec.description if spec.description
|
117
|
+
# c["release_changes"] = spec.changes if spec.changes
|
118
|
+
c["preformatted"] = true
|
119
|
+
|
120
|
+
p files = ["#{pkg}.tgz", "#{pkg}.zip", "#{pkg}.gem"]
|
121
|
+
puts "Releasing #{PKG_NAME} v. #{v}"
|
122
|
+
rf.add_release RUBYFORGE_GROUP_ID, RUBYFORGE_PKG_NAME, v, *files
|
123
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Module: EventMachine</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Module</strong></td>
|
53
|
+
<td class="class-name-in-header">EventMachine</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../files/lib/evented-memcache-client_rb.html">
|
59
|
+
lib/evented-memcache-client.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
<a href="../files/lib/evented_memcache_client/client_rb.html">
|
63
|
+
lib/evented_memcache_client/client.rb
|
64
|
+
</a>
|
65
|
+
<br />
|
66
|
+
<a href="../files/lib/evented_memcache_client/connectable_rb.html">
|
67
|
+
lib/evented_memcache_client/connectable.rb
|
68
|
+
</a>
|
69
|
+
<br />
|
70
|
+
<a href="../files/lib/evented_memcache_client/connection_rb.html">
|
71
|
+
lib/evented_memcache_client/connection.rb
|
72
|
+
</a>
|
73
|
+
<br />
|
74
|
+
<a href="../files/lib/evented_memcache_client/sender_rb.html">
|
75
|
+
lib/evented_memcache_client/sender.rb
|
76
|
+
</a>
|
77
|
+
<br />
|
78
|
+
<a href="../files/lib/evented_memcache_client/server_rb.html">
|
79
|
+
lib/evented_memcache_client/server.rb
|
80
|
+
</a>
|
81
|
+
<br />
|
82
|
+
<a href="../files/lib/evented_memcache_client/tenacious_rb.html">
|
83
|
+
lib/evented_memcache_client/tenacious.rb
|
84
|
+
</a>
|
85
|
+
<br />
|
86
|
+
</td>
|
87
|
+
</tr>
|
88
|
+
|
89
|
+
</table>
|
90
|
+
</div>
|
91
|
+
<!-- banner header -->
|
92
|
+
|
93
|
+
<div id="bodyContent">
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
<div id="contextContent">
|
98
|
+
|
99
|
+
<div id="description">
|
100
|
+
<table>
|
101
|
+
<tr><td valign="top">Author:</td><td>Colin Steele (colin@colinsteele.org)
|
102
|
+
|
103
|
+
</td></tr>
|
104
|
+
</table>
|
105
|
+
<p>
|
106
|
+
Homepage::
|
107
|
+
</p>
|
108
|
+
|
109
|
+
</div>
|
110
|
+
|
111
|
+
|
112
|
+
</div>
|
113
|
+
|
114
|
+
|
115
|
+
</div>
|
116
|
+
|
117
|
+
|
118
|
+
<!-- if includes -->
|
119
|
+
|
120
|
+
<div id="section">
|
121
|
+
|
122
|
+
<div id="class-list">
|
123
|
+
<h3 class="section-bar">Classes and Modules</h3>
|
124
|
+
|
125
|
+
Module <a href="EventMachine/Protocols.html" class="link">EventMachine::Protocols</a><br />
|
126
|
+
|
127
|
+
</div>
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
<!-- if method_list -->
|
136
|
+
|
137
|
+
|
138
|
+
</div>
|
139
|
+
|
140
|
+
|
141
|
+
<div id="validator-badges">
|
142
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
143
|
+
</div>
|
144
|
+
|
145
|
+
</body>
|
146
|
+
</html>
|
@@ -0,0 +1,135 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Module: EventMachine::Protocols</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Module</strong></td>
|
53
|
+
<td class="class-name-in-header">EventMachine::Protocols</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../../files/lib/evented-memcache-client_rb.html">
|
59
|
+
lib/evented-memcache-client.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
<a href="../../files/lib/evented_memcache_client/client_rb.html">
|
63
|
+
lib/evented_memcache_client/client.rb
|
64
|
+
</a>
|
65
|
+
<br />
|
66
|
+
<a href="../../files/lib/evented_memcache_client/connectable_rb.html">
|
67
|
+
lib/evented_memcache_client/connectable.rb
|
68
|
+
</a>
|
69
|
+
<br />
|
70
|
+
<a href="../../files/lib/evented_memcache_client/connection_rb.html">
|
71
|
+
lib/evented_memcache_client/connection.rb
|
72
|
+
</a>
|
73
|
+
<br />
|
74
|
+
<a href="../../files/lib/evented_memcache_client/sender_rb.html">
|
75
|
+
lib/evented_memcache_client/sender.rb
|
76
|
+
</a>
|
77
|
+
<br />
|
78
|
+
<a href="../../files/lib/evented_memcache_client/server_rb.html">
|
79
|
+
lib/evented_memcache_client/server.rb
|
80
|
+
</a>
|
81
|
+
<br />
|
82
|
+
<a href="../../files/lib/evented_memcache_client/tenacious_rb.html">
|
83
|
+
lib/evented_memcache_client/tenacious.rb
|
84
|
+
</a>
|
85
|
+
<br />
|
86
|
+
</td>
|
87
|
+
</tr>
|
88
|
+
|
89
|
+
</table>
|
90
|
+
</div>
|
91
|
+
<!-- banner header -->
|
92
|
+
|
93
|
+
<div id="bodyContent">
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
<div id="contextContent">
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
</div>
|
102
|
+
|
103
|
+
|
104
|
+
</div>
|
105
|
+
|
106
|
+
|
107
|
+
<!-- if includes -->
|
108
|
+
|
109
|
+
<div id="section">
|
110
|
+
|
111
|
+
<div id="class-list">
|
112
|
+
<h3 class="section-bar">Classes and Modules</h3>
|
113
|
+
|
114
|
+
Module <a href="Protocols/Memcache.html" class="link">EventMachine::Protocols::Memcache</a><br />
|
115
|
+
|
116
|
+
</div>
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
<!-- if method_list -->
|
125
|
+
|
126
|
+
|
127
|
+
</div>
|
128
|
+
|
129
|
+
|
130
|
+
<div id="validator-badges">
|
131
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
132
|
+
</div>
|
133
|
+
|
134
|
+
</body>
|
135
|
+
</html>
|