seomoz-riak-client 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +27 -0
- data/Guardfile +14 -0
- data/Rakefile +76 -0
- data/erl_src/riak_kv_test_backend.beam +0 -0
- data/erl_src/riak_kv_test_backend.erl +174 -0
- data/erl_src/riak_search_test_backend.beam +0 -0
- data/erl_src/riak_search_test_backend.erl +175 -0
- data/lib/active_support/cache/riak_store.rb +2 -0
- data/lib/riak.rb +21 -0
- data/lib/riak/bucket.rb +215 -0
- data/lib/riak/cache_store.rb +84 -0
- data/lib/riak/client.rb +415 -0
- data/lib/riak/client/beefcake/messages.rb +147 -0
- data/lib/riak/client/beefcake/object_methods.rb +92 -0
- data/lib/riak/client/beefcake_protobuffs_backend.rb +176 -0
- data/lib/riak/client/excon_backend.rb +65 -0
- data/lib/riak/client/http_backend.rb +203 -0
- data/lib/riak/client/http_backend/configuration.rb +46 -0
- data/lib/riak/client/http_backend/key_streamer.rb +43 -0
- data/lib/riak/client/http_backend/object_methods.rb +94 -0
- data/lib/riak/client/http_backend/request_headers.rb +34 -0
- data/lib/riak/client/http_backend/transport_methods.rb +218 -0
- data/lib/riak/client/net_http_backend.rb +79 -0
- data/lib/riak/client/protobuffs_backend.rb +97 -0
- data/lib/riak/client/pump.rb +30 -0
- data/lib/riak/client/search.rb +94 -0
- data/lib/riak/core_ext.rb +6 -0
- data/lib/riak/core_ext/blank.rb +53 -0
- data/lib/riak/core_ext/extract_options.rb +7 -0
- data/lib/riak/core_ext/json.rb +15 -0
- data/lib/riak/core_ext/slice.rb +18 -0
- data/lib/riak/core_ext/stringify_keys.rb +10 -0
- data/lib/riak/core_ext/symbolize_keys.rb +10 -0
- data/lib/riak/core_ext/to_param.rb +31 -0
- data/lib/riak/encoding.rb +6 -0
- data/lib/riak/failed_request.rb +81 -0
- data/lib/riak/i18n.rb +3 -0
- data/lib/riak/json.rb +28 -0
- data/lib/riak/link.rb +85 -0
- data/lib/riak/locale/en.yml +48 -0
- data/lib/riak/map_reduce.rb +206 -0
- data/lib/riak/map_reduce/filter_builder.rb +94 -0
- data/lib/riak/map_reduce/phase.rb +98 -0
- data/lib/riak/map_reduce_error.rb +7 -0
- data/lib/riak/robject.rb +290 -0
- data/lib/riak/search.rb +3 -0
- data/lib/riak/serializers.rb +74 -0
- data/lib/riak/stamp.rb +77 -0
- data/lib/riak/test_server.rb +252 -0
- data/lib/riak/util/escape.rb +45 -0
- data/lib/riak/util/fiber1.8.rb +48 -0
- data/lib/riak/util/headers.rb +53 -0
- data/lib/riak/util/multipart.rb +52 -0
- data/lib/riak/util/multipart/stream_parser.rb +62 -0
- data/lib/riak/util/tcp_socket_extensions.rb +58 -0
- data/lib/riak/util/translation.rb +19 -0
- data/lib/riak/walk_spec.rb +105 -0
- data/riak-client.gemspec +55 -0
- data/seomoz-riak-client.gemspec +55 -0
- data/spec/fixtures/cat.jpg +0 -0
- data/spec/fixtures/multipart-blank.txt +7 -0
- data/spec/fixtures/multipart-mapreduce.txt +10 -0
- data/spec/fixtures/multipart-with-body.txt +16 -0
- data/spec/fixtures/server.cert.crt +15 -0
- data/spec/fixtures/server.cert.key +15 -0
- data/spec/fixtures/test.pem +1 -0
- data/spec/integration/riak/cache_store_spec.rb +154 -0
- data/spec/integration/riak/http_backends_spec.rb +58 -0
- data/spec/integration/riak/protobuffs_backends_spec.rb +32 -0
- data/spec/integration/riak/test_server_spec.rb +161 -0
- data/spec/riak/beefcake_protobuffs_backend_spec.rb +59 -0
- data/spec/riak/bucket_spec.rb +205 -0
- data/spec/riak/client_spec.rb +517 -0
- data/spec/riak/core_ext/to_param_spec.rb +15 -0
- data/spec/riak/escape_spec.rb +69 -0
- data/spec/riak/excon_backend_spec.rb +64 -0
- data/spec/riak/headers_spec.rb +38 -0
- data/spec/riak/http_backend/configuration_spec.rb +51 -0
- data/spec/riak/http_backend/object_methods_spec.rb +217 -0
- data/spec/riak/http_backend/transport_methods_spec.rb +117 -0
- data/spec/riak/http_backend_spec.rb +269 -0
- data/spec/riak/link_spec.rb +71 -0
- data/spec/riak/map_reduce/filter_builder_spec.rb +32 -0
- data/spec/riak/map_reduce/phase_spec.rb +136 -0
- data/spec/riak/map_reduce_spec.rb +310 -0
- data/spec/riak/multipart_spec.rb +23 -0
- data/spec/riak/net_http_backend_spec.rb +16 -0
- data/spec/riak/robject_spec.rb +427 -0
- data/spec/riak/search_spec.rb +178 -0
- data/spec/riak/serializers_spec.rb +93 -0
- data/spec/riak/stamp_spec.rb +54 -0
- data/spec/riak/stream_parser_spec.rb +53 -0
- data/spec/riak/walk_spec_spec.rb +195 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/drb_mock_server.rb +39 -0
- data/spec/support/http_backend_implementation_examples.rb +266 -0
- data/spec/support/integration_setup.rb +10 -0
- data/spec/support/mock_server.rb +81 -0
- data/spec/support/mocks.rb +4 -0
- data/spec/support/test_server.yml.example +2 -0
- data/spec/support/unified_backend_examples.rb +255 -0
- metadata +271 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
|
2
|
+
# (c) 2008 Aman Gupta (tmm1)
|
3
|
+
|
4
|
+
unless defined? Fiber
|
5
|
+
require 'thread'
|
6
|
+
|
7
|
+
class FiberError < StandardError; end
|
8
|
+
|
9
|
+
class Fiber
|
10
|
+
def initialize
|
11
|
+
raise ArgumentError, 'new Fiber requires a block' unless block_given?
|
12
|
+
|
13
|
+
@yield = Queue.new
|
14
|
+
@resume = Queue.new
|
15
|
+
|
16
|
+
@thread = Thread.new{ @yield.push [ *yield(*@resume.pop) ] }
|
17
|
+
@thread.abort_on_exception = true
|
18
|
+
@thread[:fiber] = self
|
19
|
+
end
|
20
|
+
attr_reader :thread
|
21
|
+
|
22
|
+
def resume *args
|
23
|
+
raise FiberError, 'dead fiber called' unless @thread.alive?
|
24
|
+
@resume.push(args)
|
25
|
+
result = @yield.pop
|
26
|
+
result.size > 1 ? result : result.first
|
27
|
+
end
|
28
|
+
|
29
|
+
def yield *args
|
30
|
+
@yield.push(args)
|
31
|
+
result = @resume.pop
|
32
|
+
result.size > 1 ? result : result.first
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.yield *args
|
36
|
+
raise FiberError, "can't yield from root fiber" unless fiber = Thread.current[:fiber]
|
37
|
+
fiber.yield(*args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.current
|
41
|
+
Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
|
42
|
+
end
|
43
|
+
|
44
|
+
def inspect
|
45
|
+
"#<#{self.class}:0x#{self.object_id.to_s(16)}>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
# Splits headers into < 8KB chunks
|
4
|
+
# @private
|
5
|
+
module Net::HTTPHeader
|
6
|
+
def each_capitalized
|
7
|
+
# 1.9 check
|
8
|
+
respond_to?(:enum_for) and (block_given? or return enum_for(__method__))
|
9
|
+
@header.each do |k,v|
|
10
|
+
base_length = "#{k}: \r\n".length
|
11
|
+
values = v.map {|i| i.to_s.split(", ") }.flatten
|
12
|
+
while !values.empty?
|
13
|
+
current_line = ""
|
14
|
+
while values.first && current_line.length + base_length + values.first.length + 2 < 8192
|
15
|
+
val = values.shift.strip
|
16
|
+
current_line += current_line.empty? ? val : ", #{val}"
|
17
|
+
end
|
18
|
+
yield capitalize(k), current_line
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module Riak
|
25
|
+
module Util
|
26
|
+
# Represents headers from an HTTP request or response.
|
27
|
+
# Used internally by HTTP backends for processing headers.
|
28
|
+
class Headers
|
29
|
+
include Net::HTTPHeader
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
initialize_http_header({})
|
33
|
+
end
|
34
|
+
|
35
|
+
# Parse a single header line into its key and value
|
36
|
+
# @param [String] chunk a single header line
|
37
|
+
def self.parse(chunk)
|
38
|
+
line = chunk.strip
|
39
|
+
# thanks Net::HTTPResponse
|
40
|
+
return [nil,nil] if chunk =~ /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)\s*(.*)\z/in
|
41
|
+
m = /\A([^:]+):\s*/.match(line)
|
42
|
+
[m[1], m.post_match] rescue [nil, nil]
|
43
|
+
end
|
44
|
+
|
45
|
+
# Parses a header line and adds it to the header collection
|
46
|
+
# @param [String] chunk a single header line
|
47
|
+
def parse(chunk)
|
48
|
+
key, value = self.class.parse(chunk)
|
49
|
+
add_field(key, value) if key && value
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'riak/util/headers'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
module Util
|
5
|
+
# Utility methods for handling multipart/mixed responses
|
6
|
+
module Multipart
|
7
|
+
extend self
|
8
|
+
# Parses a multipart/mixed body into its constituent parts, including nested multipart/mixed sections
|
9
|
+
# @param [String] data the multipart body data
|
10
|
+
# @param [String] boundary the boundary string given in the Content-Type header
|
11
|
+
def parse(data, boundary)
|
12
|
+
contents = data.match(end_boundary_regex(boundary)).pre_match rescue ""
|
13
|
+
contents.split(inner_boundary_regex(boundary)).reject(&:blank?).map do |part|
|
14
|
+
parse_multipart_section(part)
|
15
|
+
end.compact
|
16
|
+
end
|
17
|
+
|
18
|
+
# Extracts the boundary string from a Content-Type header that is a multipart type
|
19
|
+
# @param [String] header_string the Content-Type header
|
20
|
+
# @return [String] the boundary string separating each part
|
21
|
+
def extract_boundary(header_string)
|
22
|
+
$1 if header_string =~ /boundary=([A-Za-z0-9\'()+_,-.\/:=?]+)/
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def end_boundary_regex(boundary)
|
27
|
+
/\r?\n--#{Regexp.escape(boundary)}--\r?\n/
|
28
|
+
end
|
29
|
+
|
30
|
+
def inner_boundary_regex(boundary)
|
31
|
+
/\r?\n--#{Regexp.escape(boundary)}\r?\n/
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_multipart_section(part)
|
35
|
+
headers = Headers.new
|
36
|
+
if md = part.match(/\r?\n\r?\n/)
|
37
|
+
body = md.post_match
|
38
|
+
md.pre_match.split(/\r?\n/).each do |line|
|
39
|
+
headers.parse(line)
|
40
|
+
end
|
41
|
+
|
42
|
+
if headers["content-type"] =~ /multipart\/mixed/
|
43
|
+
boundary = extract_boundary(headers.to_hash["content-type"].first)
|
44
|
+
parse(body, boundary)
|
45
|
+
else
|
46
|
+
{:headers => headers.to_hash, :body => body}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'riak/util/translation'
|
2
|
+
require 'riak/util/multipart'
|
3
|
+
|
4
|
+
module Riak
|
5
|
+
module Util
|
6
|
+
module Multipart
|
7
|
+
# This class is parses chunked/streamed multipart HTTP
|
8
|
+
# streams. It is used by streaming MapReduce queries, and in the
|
9
|
+
# future streaming key-lists (once implemented on the Riak side).
|
10
|
+
class StreamParser
|
11
|
+
include Multipart
|
12
|
+
include Translation
|
13
|
+
# Creates a new StreamParser.
|
14
|
+
#
|
15
|
+
# Example usage:
|
16
|
+
# http.get(200, "/riak", "foo", {}, &StreamParser.new {|part| ... })
|
17
|
+
#
|
18
|
+
# @yield [Hash] parts of the multipart/mixed stream,
|
19
|
+
# containing :headers and :body keys
|
20
|
+
def initialize(&block)
|
21
|
+
raise ArgumentError, t('missing_block') unless block_given?
|
22
|
+
@buffer = ""
|
23
|
+
@block = block
|
24
|
+
@state = :get_boundary
|
25
|
+
end
|
26
|
+
|
27
|
+
# Accepts a chunk of the HTTP response stream, and yields to
|
28
|
+
# the block when appropriate.
|
29
|
+
def accept(chunk)
|
30
|
+
@buffer << chunk
|
31
|
+
@state = send(@state)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a Proc that can be passed to an HTTP request method.
|
35
|
+
def to_proc
|
36
|
+
method(:accept).to_proc
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
CAPTURE_BOUNDARY = /^--([A-Za-z0-9\'()+_,-.\/:=?]+)\r?\n/
|
41
|
+
|
42
|
+
def get_boundary
|
43
|
+
if @buffer =~ CAPTURE_BOUNDARY
|
44
|
+
@re = /\r?\n--#{Regexp.escape($1)}(?:--)?\r?\n/
|
45
|
+
@buffer = $~.post_match
|
46
|
+
buffering
|
47
|
+
else
|
48
|
+
:get_boundary
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def buffering
|
53
|
+
while @buffer =~ @re
|
54
|
+
@block.call parse_multipart_section($~.pre_match)
|
55
|
+
@buffer = $~.post_match
|
56
|
+
end
|
57
|
+
:buffering
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'timeout'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
# Borrowed from Webrat and Selenium client, watches for TCP port
|
6
|
+
# liveness of the spawned server.
|
7
|
+
# @private
|
8
|
+
class TCPSocket
|
9
|
+
def self.wait_for_service(options)
|
10
|
+
verbose_wait until listening_service?(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.wait_for_service_termination(options)
|
14
|
+
verbose_wait while listening_service?(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.listening_service?(options)
|
18
|
+
Timeout::timeout(options[:timeout] || 20) do
|
19
|
+
begin
|
20
|
+
socket = TCPSocket.new(options[:host], options[:port])
|
21
|
+
socket.close unless socket.nil?
|
22
|
+
true
|
23
|
+
rescue Errno::ECONNREFUSED,
|
24
|
+
Errno::EBADF # Windows
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.verbose_wait
|
31
|
+
# Removed the puts call so as not to clutter up test output.
|
32
|
+
sleep 2
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.wait_for_service_with_timeout(options)
|
36
|
+
start_time = Time.now
|
37
|
+
|
38
|
+
until listening_service?(options)
|
39
|
+
verbose_wait
|
40
|
+
|
41
|
+
if options[:timeout] && (Time.now > start_time + options[:timeout])
|
42
|
+
raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.wait_for_service_termination_with_timeout(options)
|
48
|
+
start_time = Time.now
|
49
|
+
|
50
|
+
while listening_service?(options)
|
51
|
+
verbose_wait
|
52
|
+
|
53
|
+
if options[:timeout] && (Time.now > start_time + options[:timeout])
|
54
|
+
raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'riak/i18n'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
module Util
|
5
|
+
# Methods for doing i18n string lookup
|
6
|
+
module Translation
|
7
|
+
# The scope of i18n messages
|
8
|
+
def i18n_scope
|
9
|
+
:riak
|
10
|
+
end
|
11
|
+
|
12
|
+
# Provides the translation for a given internationalized message
|
13
|
+
def t(message, options={})
|
14
|
+
I18n.t("#{i18n_scope}.#{message}", options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'riak/util/translation'
|
2
|
+
require 'riak/util/escape'
|
3
|
+
require 'riak/link'
|
4
|
+
|
5
|
+
module Riak
|
6
|
+
# The specification of how to follow links from one object to another in Riak,
|
7
|
+
# when using the link-walker resource.
|
8
|
+
# Example link-walking operation:
|
9
|
+
# GET /riak/artists/REM/albums,_,_/tracks,_,1
|
10
|
+
# This operation would have two WalkSpecs:
|
11
|
+
# Riak::WalkSpec.new({:bucket => 'albums'})
|
12
|
+
# Riak::WalkSpec.new({:bucket => 'tracks', :result => true})
|
13
|
+
class WalkSpec
|
14
|
+
include Util::Translation
|
15
|
+
include Util::Escape
|
16
|
+
|
17
|
+
# @return [String] The bucket followed links should be restricted to. "_" represents all buckets.
|
18
|
+
attr_accessor :bucket
|
19
|
+
|
20
|
+
# @return [String] The "riaktag" or "rel" that followed links should be restricted to. "_" represents all tags.
|
21
|
+
attr_accessor :tag
|
22
|
+
|
23
|
+
# @return [Boolean] Whether objects should be returned from this phase of link walking. Default is false.
|
24
|
+
attr_accessor :keep
|
25
|
+
|
26
|
+
# Normalize a list of walk specs into WalkSpec objects.
|
27
|
+
def self.normalize(*params)
|
28
|
+
params.flatten!
|
29
|
+
specs = []
|
30
|
+
while params.length > 0
|
31
|
+
param = params.shift
|
32
|
+
case param
|
33
|
+
when Hash
|
34
|
+
specs << new(param)
|
35
|
+
when WalkSpec
|
36
|
+
specs << param
|
37
|
+
else
|
38
|
+
if params.length >= 2
|
39
|
+
specs << new(param, params.shift, params.shift)
|
40
|
+
else
|
41
|
+
raise ArgumentError, t("too_few_arguments", :params => params.inspect)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
specs
|
46
|
+
end
|
47
|
+
|
48
|
+
# Creates a walk-spec for use in finding other objects in Riak.
|
49
|
+
# @overload initialize(hash)
|
50
|
+
# Creates a walk-spec from a hash.
|
51
|
+
# @param [Hash] hash options for the walk-spec
|
52
|
+
# @option hash [String] :bucket ("_") the bucket the links should point to (default '_' is all)
|
53
|
+
# @option hash [String] :tag ("_") the tag to filter links by (default '_' is all)
|
54
|
+
# @option hash [Boolean] :keep (false) whether to return results from following this link specification
|
55
|
+
# @overload initialize(bucket, tag, keep)
|
56
|
+
# Creates a walk-spec from a bucket-tag-result triple.
|
57
|
+
# @param [String] bucket the bucket the links should point to (default '_' is all)
|
58
|
+
# @param [String] tag the tag to filter links by (default '_' is all)
|
59
|
+
# @param [Boolean] keep whether to return results from following this link specification
|
60
|
+
# @see {Riak::RObject#walk}
|
61
|
+
def initialize(*args)
|
62
|
+
args.flatten!
|
63
|
+
case args.size
|
64
|
+
when 1
|
65
|
+
hash = args.first
|
66
|
+
raise ArgumentError, t("hash_type", :hash => hash.inspect) unless Hash === hash
|
67
|
+
assign(hash[:bucket], hash[:tag], hash[:keep])
|
68
|
+
when 3
|
69
|
+
assign(*args)
|
70
|
+
else
|
71
|
+
raise ArgumentError, t("wrong_argument_count_walk_spec")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Converts the walk-spec into the form required by the link-walker resource URL
|
76
|
+
def to_s
|
77
|
+
b = @bucket && escape(@bucket) || '_'
|
78
|
+
t = @tag && escape(@tag) || '_'
|
79
|
+
"#{b},#{t},#{@keep ? '1' : '_'}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def ==(other)
|
83
|
+
other.is_a?(WalkSpec) && other.bucket == bucket && other.tag == tag && other.keep == keep
|
84
|
+
end
|
85
|
+
|
86
|
+
def ===(other)
|
87
|
+
self == other || case other
|
88
|
+
when WalkSpec
|
89
|
+
other.keep == keep &&
|
90
|
+
(bucket == "_" || bucket == other.bucket) &&
|
91
|
+
(tag == "_" || tag == other.tag)
|
92
|
+
when Link
|
93
|
+
(bucket == "_" || bucket == other.url.split("/")[2]) &&
|
94
|
+
(tag == "_" || tag == other.rel)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def assign(bucket, tag, result)
|
100
|
+
@bucket = bucket || "_"
|
101
|
+
@tag = tag || "_"
|
102
|
+
@keep = result || false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/riak-client.gemspec
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{riak-client}
|
5
|
+
s.version = "1.0.0.pre"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Sean Cribbs"]
|
9
|
+
s.date = %q{2011-11-18}
|
10
|
+
s.description = %q{riak-client is a rich client for Riak, the distributed database by Basho. It supports the full HTTP interface including storage operations, bucket configuration, link-walking and map-reduce.}
|
11
|
+
s.email = %q{sean@basho.com}
|
12
|
+
s.files = ["erl_src/riak_kv_test_backend.beam", "erl_src/riak_kv_test_backend.erl", "erl_src/riak_search_test_backend.beam", "erl_src/riak_search_test_backend.erl", "Gemfile", "Guardfile", "lib/active_support/cache/riak_store.rb", "lib/riak/bucket.rb", "lib/riak/cache_store.rb", "lib/riak/client/beefcake/messages.rb", "lib/riak/client/beefcake/object_methods.rb", "lib/riak/client/beefcake_protobuffs_backend.rb", "lib/riak/client/excon_backend.rb", "lib/riak/client/http_backend/configuration.rb", "lib/riak/client/http_backend/key_streamer.rb", "lib/riak/client/http_backend/object_methods.rb", "lib/riak/client/http_backend/request_headers.rb", "lib/riak/client/http_backend/transport_methods.rb", "lib/riak/client/http_backend.rb", "lib/riak/client/net_http_backend.rb", "lib/riak/client/protobuffs_backend.rb", "lib/riak/client/pump.rb", "lib/riak/client/search.rb", "lib/riak/client.rb", "lib/riak/core_ext/blank.rb", "lib/riak/core_ext/extract_options.rb", "lib/riak/core_ext/json.rb", "lib/riak/core_ext/slice.rb", "lib/riak/core_ext/stringify_keys.rb", "lib/riak/core_ext/symbolize_keys.rb", "lib/riak/core_ext/to_param.rb", "lib/riak/core_ext.rb", "lib/riak/encoding.rb", "lib/riak/failed_request.rb", "lib/riak/i18n.rb", "lib/riak/json.rb", "lib/riak/link.rb", "lib/riak/locale/en.yml", "lib/riak/map_reduce/filter_builder.rb", "lib/riak/map_reduce/phase.rb", "lib/riak/map_reduce.rb", "lib/riak/map_reduce_error.rb", "lib/riak/robject.rb", "lib/riak/search.rb", "lib/riak/serializers.rb", "lib/riak/stamp.rb", "lib/riak/test_server.rb", "lib/riak/util/escape.rb", "lib/riak/util/fiber1.8.rb", "lib/riak/util/headers.rb", "lib/riak/util/multipart/stream_parser.rb", "lib/riak/util/multipart.rb", "lib/riak/util/tcp_socket_extensions.rb", "lib/riak/util/translation.rb", "lib/riak/walk_spec.rb", "lib/riak.rb", "Rakefile", "riak-client.gemspec", "spec/fixtures/cat.jpg", "spec/fixtures/multipart-blank.txt", "spec/fixtures/multipart-mapreduce.txt", "spec/fixtures/multipart-with-body.txt", "spec/fixtures/server.cert.crt", "spec/fixtures/server.cert.key", "spec/fixtures/test.pem", "spec/integration/riak/cache_store_spec.rb", "spec/integration/riak/http_backends_spec.rb", "spec/integration/riak/protobuffs_backends_spec.rb", "spec/integration/riak/test_server_spec.rb", "spec/riak/beefcake_protobuffs_backend_spec.rb", "spec/riak/bucket_spec.rb", "spec/riak/client_spec.rb", "spec/riak/core_ext/to_param_spec.rb", "spec/riak/escape_spec.rb", "spec/riak/excon_backend_spec.rb", "spec/riak/headers_spec.rb", "spec/riak/http_backend/configuration_spec.rb", "spec/riak/http_backend/object_methods_spec.rb", "spec/riak/http_backend/transport_methods_spec.rb", "spec/riak/http_backend_spec.rb", "spec/riak/link_spec.rb", "spec/riak/map_reduce/filter_builder_spec.rb", "spec/riak/map_reduce/phase_spec.rb", "spec/riak/map_reduce_spec.rb", "spec/riak/multipart_spec.rb", "spec/riak/net_http_backend_spec.rb", "spec/riak/robject_spec.rb", "spec/riak/search_spec.rb", "spec/riak/serializers_spec.rb", "spec/riak/stamp_spec.rb", "spec/riak/stream_parser_spec.rb", "spec/riak/walk_spec_spec.rb", "spec/spec_helper.rb", "spec/support/drb_mock_server.rb", "spec/support/http_backend_implementation_examples.rb", "spec/support/integration_setup.rb", "spec/support/mock_server.rb", "spec/support/mocks.rb", "spec/support/test_server.yml.example", "spec/support/unified_backend_examples.rb"]
|
13
|
+
s.homepage = %q{http://seancribbs.github.com/ripple}
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
s.rubygems_version = %q{1.3.5}
|
16
|
+
s.summary = %q{riak-client is a rich client for Riak, the distributed database by Basho.}
|
17
|
+
s.test_files = ["lib/riak/walk_spec.rb", "spec/integration/riak/cache_store_spec.rb", "spec/integration/riak/http_backends_spec.rb", "spec/integration/riak/protobuffs_backends_spec.rb", "spec/integration/riak/test_server_spec.rb", "spec/riak/beefcake_protobuffs_backend_spec.rb", "spec/riak/bucket_spec.rb", "spec/riak/client_spec.rb", "spec/riak/core_ext/to_param_spec.rb", "spec/riak/escape_spec.rb", "spec/riak/excon_backend_spec.rb", "spec/riak/headers_spec.rb", "spec/riak/http_backend/configuration_spec.rb", "spec/riak/http_backend/object_methods_spec.rb", "spec/riak/http_backend/transport_methods_spec.rb", "spec/riak/http_backend_spec.rb", "spec/riak/link_spec.rb", "spec/riak/map_reduce/filter_builder_spec.rb", "spec/riak/map_reduce/phase_spec.rb", "spec/riak/map_reduce_spec.rb", "spec/riak/multipart_spec.rb", "spec/riak/net_http_backend_spec.rb", "spec/riak/robject_spec.rb", "spec/riak/search_spec.rb", "spec/riak/serializers_spec.rb", "spec/riak/stamp_spec.rb", "spec/riak/stream_parser_spec.rb", "spec/riak/walk_spec_spec.rb"]
|
18
|
+
|
19
|
+
if s.respond_to? :specification_version then
|
20
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
21
|
+
s.specification_version = 3
|
22
|
+
|
23
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
24
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
|
25
|
+
s.add_development_dependency(%q<fakeweb>, [">= 1.2"])
|
26
|
+
s.add_development_dependency(%q<rack>, [">= 1.0"])
|
27
|
+
s.add_development_dependency(%q<excon>, ["~> 0.6.1"])
|
28
|
+
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
29
|
+
s.add_runtime_dependency(%q<i18n>, [">= 0.4.0"])
|
30
|
+
s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
|
31
|
+
s.add_runtime_dependency(%q<beefcake>, ["= 0.3.2"])
|
32
|
+
s.add_runtime_dependency(%q<multi_json>, ["~> 1.0.0"])
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
35
|
+
s.add_dependency(%q<fakeweb>, [">= 1.2"])
|
36
|
+
s.add_dependency(%q<rack>, [">= 1.0"])
|
37
|
+
s.add_dependency(%q<excon>, ["~> 0.6.1"])
|
38
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
39
|
+
s.add_dependency(%q<i18n>, [">= 0.4.0"])
|
40
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
41
|
+
s.add_dependency(%q<beefcake>, ["= 0.3.2"])
|
42
|
+
s.add_dependency(%q<multi_json>, ["~> 1.0.0"])
|
43
|
+
end
|
44
|
+
else
|
45
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
46
|
+
s.add_dependency(%q<fakeweb>, [">= 1.2"])
|
47
|
+
s.add_dependency(%q<rack>, [">= 1.0"])
|
48
|
+
s.add_dependency(%q<excon>, ["~> 0.6.1"])
|
49
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
50
|
+
s.add_dependency(%q<i18n>, [">= 0.4.0"])
|
51
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
52
|
+
s.add_dependency(%q<beefcake>, ["= 0.3.2"])
|
53
|
+
s.add_dependency(%q<multi_json>, ["~> 1.0.0"])
|
54
|
+
end
|
55
|
+
end
|