seomoz-riak-client 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/Gemfile +27 -0
  2. data/Guardfile +14 -0
  3. data/Rakefile +76 -0
  4. data/erl_src/riak_kv_test_backend.beam +0 -0
  5. data/erl_src/riak_kv_test_backend.erl +174 -0
  6. data/erl_src/riak_search_test_backend.beam +0 -0
  7. data/erl_src/riak_search_test_backend.erl +175 -0
  8. data/lib/active_support/cache/riak_store.rb +2 -0
  9. data/lib/riak.rb +21 -0
  10. data/lib/riak/bucket.rb +215 -0
  11. data/lib/riak/cache_store.rb +84 -0
  12. data/lib/riak/client.rb +415 -0
  13. data/lib/riak/client/beefcake/messages.rb +147 -0
  14. data/lib/riak/client/beefcake/object_methods.rb +92 -0
  15. data/lib/riak/client/beefcake_protobuffs_backend.rb +176 -0
  16. data/lib/riak/client/excon_backend.rb +65 -0
  17. data/lib/riak/client/http_backend.rb +203 -0
  18. data/lib/riak/client/http_backend/configuration.rb +46 -0
  19. data/lib/riak/client/http_backend/key_streamer.rb +43 -0
  20. data/lib/riak/client/http_backend/object_methods.rb +94 -0
  21. data/lib/riak/client/http_backend/request_headers.rb +34 -0
  22. data/lib/riak/client/http_backend/transport_methods.rb +218 -0
  23. data/lib/riak/client/net_http_backend.rb +79 -0
  24. data/lib/riak/client/protobuffs_backend.rb +97 -0
  25. data/lib/riak/client/pump.rb +30 -0
  26. data/lib/riak/client/search.rb +94 -0
  27. data/lib/riak/core_ext.rb +6 -0
  28. data/lib/riak/core_ext/blank.rb +53 -0
  29. data/lib/riak/core_ext/extract_options.rb +7 -0
  30. data/lib/riak/core_ext/json.rb +15 -0
  31. data/lib/riak/core_ext/slice.rb +18 -0
  32. data/lib/riak/core_ext/stringify_keys.rb +10 -0
  33. data/lib/riak/core_ext/symbolize_keys.rb +10 -0
  34. data/lib/riak/core_ext/to_param.rb +31 -0
  35. data/lib/riak/encoding.rb +6 -0
  36. data/lib/riak/failed_request.rb +81 -0
  37. data/lib/riak/i18n.rb +3 -0
  38. data/lib/riak/json.rb +28 -0
  39. data/lib/riak/link.rb +85 -0
  40. data/lib/riak/locale/en.yml +48 -0
  41. data/lib/riak/map_reduce.rb +206 -0
  42. data/lib/riak/map_reduce/filter_builder.rb +94 -0
  43. data/lib/riak/map_reduce/phase.rb +98 -0
  44. data/lib/riak/map_reduce_error.rb +7 -0
  45. data/lib/riak/robject.rb +290 -0
  46. data/lib/riak/search.rb +3 -0
  47. data/lib/riak/serializers.rb +74 -0
  48. data/lib/riak/stamp.rb +77 -0
  49. data/lib/riak/test_server.rb +252 -0
  50. data/lib/riak/util/escape.rb +45 -0
  51. data/lib/riak/util/fiber1.8.rb +48 -0
  52. data/lib/riak/util/headers.rb +53 -0
  53. data/lib/riak/util/multipart.rb +52 -0
  54. data/lib/riak/util/multipart/stream_parser.rb +62 -0
  55. data/lib/riak/util/tcp_socket_extensions.rb +58 -0
  56. data/lib/riak/util/translation.rb +19 -0
  57. data/lib/riak/walk_spec.rb +105 -0
  58. data/riak-client.gemspec +55 -0
  59. data/seomoz-riak-client.gemspec +55 -0
  60. data/spec/fixtures/cat.jpg +0 -0
  61. data/spec/fixtures/multipart-blank.txt +7 -0
  62. data/spec/fixtures/multipart-mapreduce.txt +10 -0
  63. data/spec/fixtures/multipart-with-body.txt +16 -0
  64. data/spec/fixtures/server.cert.crt +15 -0
  65. data/spec/fixtures/server.cert.key +15 -0
  66. data/spec/fixtures/test.pem +1 -0
  67. data/spec/integration/riak/cache_store_spec.rb +154 -0
  68. data/spec/integration/riak/http_backends_spec.rb +58 -0
  69. data/spec/integration/riak/protobuffs_backends_spec.rb +32 -0
  70. data/spec/integration/riak/test_server_spec.rb +161 -0
  71. data/spec/riak/beefcake_protobuffs_backend_spec.rb +59 -0
  72. data/spec/riak/bucket_spec.rb +205 -0
  73. data/spec/riak/client_spec.rb +517 -0
  74. data/spec/riak/core_ext/to_param_spec.rb +15 -0
  75. data/spec/riak/escape_spec.rb +69 -0
  76. data/spec/riak/excon_backend_spec.rb +64 -0
  77. data/spec/riak/headers_spec.rb +38 -0
  78. data/spec/riak/http_backend/configuration_spec.rb +51 -0
  79. data/spec/riak/http_backend/object_methods_spec.rb +217 -0
  80. data/spec/riak/http_backend/transport_methods_spec.rb +117 -0
  81. data/spec/riak/http_backend_spec.rb +269 -0
  82. data/spec/riak/link_spec.rb +71 -0
  83. data/spec/riak/map_reduce/filter_builder_spec.rb +32 -0
  84. data/spec/riak/map_reduce/phase_spec.rb +136 -0
  85. data/spec/riak/map_reduce_spec.rb +310 -0
  86. data/spec/riak/multipart_spec.rb +23 -0
  87. data/spec/riak/net_http_backend_spec.rb +16 -0
  88. data/spec/riak/robject_spec.rb +427 -0
  89. data/spec/riak/search_spec.rb +178 -0
  90. data/spec/riak/serializers_spec.rb +93 -0
  91. data/spec/riak/stamp_spec.rb +54 -0
  92. data/spec/riak/stream_parser_spec.rb +53 -0
  93. data/spec/riak/walk_spec_spec.rb +195 -0
  94. data/spec/spec_helper.rb +39 -0
  95. data/spec/support/drb_mock_server.rb +39 -0
  96. data/spec/support/http_backend_implementation_examples.rb +266 -0
  97. data/spec/support/integration_setup.rb +10 -0
  98. data/spec/support/mock_server.rb +81 -0
  99. data/spec/support/mocks.rb +4 -0
  100. data/spec/support/test_server.yml.example +2 -0
  101. data/spec/support/unified_backend_examples.rb +255 -0
  102. 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
@@ -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