gibson 1.0.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.
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
data/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ Software License Agreement (BSD License)
2
+
3
+ Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice,
10
+ this list of conditions and the following disclaimer.
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the distribution.
14
+ * Neither the name of Gibson nor the names of its contributors may be used
15
+ to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
+ POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,105 @@
1
+ Ruby Gibson client
2
+ ========================
3
+
4
+ A pure Ruby Gibson client library.
5
+
6
+ <http://gibson-db.in/>
7
+
8
+ Supported Ruby versions and implementations
9
+ ------------------------------------------------
10
+
11
+ This module should work identically on:
12
+
13
+ * JRuby 1.6+
14
+ * Ruby 1.9.2+
15
+ * Ruby 1.8.7+
16
+ * Rubinius 2.0
17
+
18
+ If you have problems, please enter an issue.
19
+
20
+ Installation and Usage
21
+ ------------------------
22
+
23
+ You can verify your installation using this piece of code:
24
+
25
+ gem install gibson
26
+
27
+ And
28
+
29
+ require 'gibson'
30
+ g = Gibson::Client.new
31
+ g.set 0, 'foo', 'bar'
32
+ p g.get 'foo'
33
+
34
+ Connection
35
+ ----------
36
+
37
+ Create a Client object to start working.
38
+
39
+ require 'gibson'
40
+
41
+ gibson = Gibson::Client.new
42
+
43
+ The following options can be used in the constructor:
44
+
45
+ * **socket**: String, the path of the unix socket to connect to, default to /var/run/gibson.sock.
46
+ * **address**: String, the tcp address to connect to, setting this option will exclude the :socket option, default to nil.
47
+ * **port**: Integer, the tcp port of Gibson instance, default to 10128.
48
+ * **timeout**: Integer, timeout in milliseconds for socket I/O, default to 100.
49
+ * **keepalive**: Boolean, true to set SO_KEEPALIVE option on the tcp socket, default true.
50
+
51
+ Tcp connection example:
52
+
53
+ gibson = Gibson::Client.new :address => 'localhost'
54
+
55
+ Custom unix socket connection example with 50ms timeout:
56
+
57
+ gibson = Gibson::Client.new :socket => '/tmp/socket', :timeout => 50
58
+
59
+ Runtime Errors
60
+ --------------
61
+
62
+ Every Gibson protocol error is mapped to a RuntimeError derived class.
63
+
64
+ * **GenericError** Generic protocol error.
65
+ * **NotFoundError** Key or prefix not found.
66
+ * **NaNError** The object is not a number.
67
+ * **OutOfMemoryError** Server is out of memory.
68
+ * **LockedError** Object is locked.
69
+
70
+ Methods
71
+ -------
72
+
73
+ After connecting, you can start to make requests.
74
+
75
+ # will retrieve the 'key' value
76
+ gibson.get 'key'
77
+
78
+ # create ( or replace ) a value with a TTL of 3600 seconds.
79
+ # set the TTL to zero and the value will never expire.
80
+ gibson.set 3600, 'key', 'value'
81
+
82
+ # delete a key from cache.
83
+ gibson.del 'key'
84
+
85
+ # will print server stats
86
+ gibson.stats.each do |name,value|
87
+ puts "#{name}: #{value}"
88
+ end
89
+
90
+ Every available command is automatically mapped to a client method, so follow the
91
+ [official reference](http://gibson-db.in/commands.php) of Gibson commands.
92
+
93
+ Once you're done, close the connection.
94
+
95
+ gibson.close
96
+
97
+ License
98
+ ---
99
+
100
+ Released under the BSD license.
101
+ Copyright &copy; 2013, Simone Margaritelli
102
+ <evilsocket@gmail.com>
103
+
104
+ <http://www.evilsocket.net/>
105
+ All rights reserved.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require 'rake/clean'
2
+ CLEAN.include "**/*.rbc"
3
+ CLEAN.include "**/.DS_Store"
data/gibson.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ require './lib/gibson/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{gibson}
5
+ s.version = Gibson::VERSION
6
+ s.license = "BSD"
7
+
8
+ s.authors = ["Simone Margaritelli"]
9
+ s.description = %q{High performance Gibson client for Ruby}
10
+ s.email = %q{evilsocket@gmail.com}
11
+ s.files = Dir.glob("lib/**/*") + [
12
+ "LICENSE",
13
+ "README.md",
14
+ "Rakefile",
15
+ "Gemfile",
16
+ "gibson.gemspec"
17
+ ]
18
+ s.homepage = %q{http://gibson-db.in/}
19
+ s.rdoc_options = ["--charset=UTF-8"]
20
+ s.require_paths = ["lib"]
21
+ s.summary = %q{High performance Gibson client for Ruby}
22
+ end
23
+
@@ -0,0 +1,83 @@
1
+ # Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of Gibson nor the names of its contributors may be used
13
+ # to endorse or promote products derived from this software without
14
+ # specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+ module Gibson
28
+ require 'socket'
29
+
30
+ class Connection
31
+ DEFAULTS = {
32
+ :socket => '/var/run/gibson.sock',
33
+ :address => nil,
34
+ :port => 10128,
35
+ :timeout => 100,
36
+ :keepalive => false
37
+ }
38
+
39
+ def initialize(opts = {})
40
+ @sock = nil
41
+ @connected = false
42
+ @options = DEFAULTS.merge(opts)
43
+ end
44
+
45
+ def connected?
46
+ @connected
47
+ end
48
+
49
+ def connect
50
+ if @options[:address] != nil
51
+ @sock = TCPSocket.new( @options[:address], @options[:port] )
52
+ @sock.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true )
53
+ @sock.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true ) if @options[:keepalive]
54
+ else
55
+ @sock = UNIXSocket.open( @options[:socket] )
56
+ end
57
+
58
+ @connected = true
59
+ end
60
+
61
+ def close
62
+ @sock.close
63
+ end
64
+
65
+ def wait_writable
66
+ IO.select(nil, [@sock], nil, @options[:timeout] ) || raise(Timeout::Error, "IO timeout")
67
+ end
68
+
69
+ def wait_readable
70
+ IO.select( [@sock], nil, nil, @options[:timeout] ) || raise(Timeout::Error, "IO timeout")
71
+ end
72
+
73
+ def write(data)
74
+ wait_writable
75
+ @sock.write data
76
+ end
77
+
78
+ def read(n)
79
+ wait_readable
80
+ @sock.recv n
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,121 @@
1
+ # Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of Gibson nor the names of its contributors may be used
13
+ # to endorse or promote products derived from this software without
14
+ # specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+ require 'gibson/protocol'
28
+ require 'gibson/connection'
29
+
30
+ module Gibson
31
+ class Client
32
+ def initialize(opts = {})
33
+ @connection = nil
34
+ @options = opts
35
+ end
36
+
37
+ def connect
38
+ @connection = Connection.new( @options )
39
+ @connection.connect
40
+ end
41
+
42
+ def decode_val( encoding, size, data )
43
+ # plain string
44
+ if encoding == Protocol::ENCODINGS[:plain]
45
+ data.unpack( 'Z' + size.to_s )[0]
46
+ # number
47
+ elsif encoding == Protocol::ENCODINGS[:number]
48
+ # 32 bit integer ?
49
+ if size == 4:
50
+ data.unpack( 'l<' )[0]
51
+ else
52
+ data.unpack( 'q<' )[0]
53
+ end
54
+ else
55
+ raise 'Unknown data encoding.'
56
+ end
57
+ end
58
+
59
+ def decode_kval( data, size )
60
+ left = size - 4
61
+ count, data = data.unpack( 'L<a' + left.to_s )
62
+ obj = {}
63
+
64
+ count.times { |i|
65
+ left -= 4
66
+ klen, data = data.unpack( 'L<a' + left.to_s )
67
+
68
+ left -= klen
69
+ key, data = data.unpack( 'a' + klen.to_s + 'a' + left.to_s )
70
+
71
+ left -= 1
72
+ enc, data = data.unpack( 'ca' + left.to_s )
73
+
74
+ left -= 4
75
+ vsize, data = data.unpack( 'L<a' + left.to_s )
76
+
77
+ left -= vsize
78
+ value, data = data.unpack( 'a' + vsize.to_s + 'a' + left.to_s )
79
+
80
+ obj[key] = decode Protocol::REPLIES[:val], enc, vsize, value
81
+ }
82
+
83
+ obj
84
+ end
85
+
86
+ def decode( code, encoding, size, data )
87
+ if code == Protocol::REPLIES[:val]
88
+ decode_val encoding, size, data
89
+ elsif code == Protocol::REPLIES[:kval]
90
+ decode_kval data, size
91
+ elsif code == Protocol::REPLIES[:ok]
92
+ true
93
+ elsif Protocol.error? code
94
+ raise Protocol::ERRORS[code]
95
+
96
+ else
97
+ data
98
+ end
99
+ end
100
+
101
+ def query( opcode, payload = '' )
102
+ connect if @connection == nil or not @connection.connected?
103
+
104
+ psize = payload.length
105
+ packet = [ 2 + psize, opcode, payload ].pack( 'L<S<Z' + psize.to_s )
106
+
107
+ @connection.write packet
108
+
109
+ code, encoding, size = @connection.read(7).unpack('S<cL<' )
110
+ data = @connection.read size
111
+
112
+ decode code, encoding, size, data
113
+ end
114
+
115
+ def method_missing(name, *arguments)
116
+ if Protocol::COMMANDS.has_key? name
117
+ query Protocol::COMMANDS[name], arguments.join(' ')
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,89 @@
1
+ # Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of Gibson nor the names of its contributors may be used
13
+ # to endorse or promote products derived from this software without
14
+ # specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+ module Gibson
28
+ class GenericError < RuntimeError; end
29
+ class NotFoundError < RuntimeError; end
30
+ class NaNError < RuntimeError; end
31
+ class OutOfMemoryError < RuntimeError; end
32
+ class LockedError < RuntimeError; end
33
+
34
+ class Protocol
35
+ COMMANDS = {
36
+ :set => 1,
37
+ :ttl => 2,
38
+ :get => 3,
39
+ :del => 4,
40
+ :inc => 5,
41
+ :dec => 6,
42
+ :lock => 7,
43
+ :unlock => 8,
44
+ :mset => 9,
45
+ :mttl => 10,
46
+ :mget => 11,
47
+ :mdel => 12,
48
+ :minc => 13,
49
+ :mdec => 14,
50
+ :mlock => 15,
51
+ :munlock => 16,
52
+ :count => 17,
53
+ :stats => 18,
54
+ :ping => 19,
55
+ :meta => 20,
56
+ :keys => 21,
57
+ :end => 0xff
58
+ }
59
+
60
+ REPLIES = {
61
+ :error => 0, # Generic error
62
+ :not_found => 1, # Key/Prefix not found
63
+ :nan => 2, # Not a number
64
+ :mem => 3, # Out of memory
65
+ :locked => 4, # Object is locked
66
+ :ok => 5, # Ok, no data follows
67
+ :val => 6, # Ok, scalar value follows
68
+ :kval => 7 # Ok, [ key => value, ... ] follows
69
+ }
70
+
71
+ ERRORS = {
72
+ 0 => GenericError,
73
+ 1 => NotFoundError,
74
+ 2 => NaNError,
75
+ 3 => OutOfMemoryError,
76
+ 4 => LockedError
77
+ }
78
+
79
+ ENCODINGS = {
80
+ :plain => 0x00, # the item is in plain encoding and data points to its buffer
81
+ :lzf => 0x01, # PLAIN but compressed data with lzf
82
+ :number => 0x02 # the item contains a number and data pointer is actually that number
83
+ }
84
+
85
+ def self.error? (code)
86
+ code >= REPLIES[:error] && code <= REPLIES[:locked]
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of Gibson nor the names of its contributors may be used
13
+ # to endorse or promote products derived from this software without
14
+ # specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+ module Gibson
28
+ VERSION = '1.0.1'
29
+ end
30
+
data/lib/gibson.rb ADDED
@@ -0,0 +1,27 @@
1
+ # Copyright (c) 2013, Simone Margaritelli <evilsocket at gmail dot com>
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of Gibson nor the names of its contributors may be used
13
+ # to endorse or promote products derived from this software without
14
+ # specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+ require 'gibson/gibson'
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gibson
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 1
9
+ version: 1.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Simone Margaritelli
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-08-07 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: High performance Gibson client for Ruby
22
+ email: evilsocket@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/gibson/connection.rb
31
+ - lib/gibson/gibson.rb
32
+ - lib/gibson/protocol.rb
33
+ - lib/gibson/version.rb
34
+ - lib/gibson.rb
35
+ - LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - Gemfile
39
+ - gibson.gemspec
40
+ has_rdoc: true
41
+ homepage: http://gibson-db.in/
42
+ licenses:
43
+ - BSD
44
+ post_install_message:
45
+ rdoc_options:
46
+ - --charset=UTF-8
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ requirements: []
64
+
65
+ rubyforge_project:
66
+ rubygems_version: 1.3.6
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: High performance Gibson client for Ruby
70
+ test_files: []
71
+