riak-record 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb4640475e65d8b57d7dd89fb6bcea9dc8b98efc
4
- data.tar.gz: 07bc6462e699e51c3997c722bbaa03fa22f4ef6a
3
+ metadata.gz: f9cefbb009666dc6e1e326b9e0f27add25fde982
4
+ data.tar.gz: 16df6690a2751083ba1bfa157158dd648aeee2e8
5
5
  SHA512:
6
- metadata.gz: ed8334fa967f783728aacd07603cf3454d26e16398ffa30babc0a806933d216ef85feb0f06a3e86db297fcfff881ef2895fc4c35f4f990222254362fffe38ad6
7
- data.tar.gz: 22cb2b18af1bd6245986cbc371e03829b20a939699f78846407a238a18d5786d2a541e204e94e0d3f96132031bde38fecdd136dec3f6c818c80c5e70fa08c04e
6
+ metadata.gz: 9dda40575f7149e095a93ff445ac05870d906f4c364faf899fa0ab59fa27e79faf90367f8e8ec1e83989c3f01803ec928b052e791260d65ffa14d089560de061
7
+ data.tar.gz: 90d8f57ddc8e236431c472f68d9468ea5f8b91317f9751a9cf22dc5b53dad363606716addd548772e834f8b7a40b4fa131cbccba13b9e8a3777f5a74983b5a99
data/Gemfile CHANGED
@@ -8,4 +8,7 @@ group :development do
8
8
  gem "bundler", "~> 1.0"
9
9
  gem "jeweler", "~> 2.0.1"
10
10
  gem "simplecov", ">= 0"
11
+ gem 'guard-rspec', '~> 4.3.1'
12
+ gem 'guard-bundler'
13
+ gem 'terminal-notifier-guard'
11
14
  end
data/Gemfile.lock CHANGED
@@ -4,13 +4,18 @@ GEM
4
4
  addressable (2.3.6)
5
5
  beefcake (1.0.0)
6
6
  builder (3.2.2)
7
+ celluloid (0.15.2)
8
+ timers (~> 1.1.0)
7
9
  cert_validator (0.0.1)
10
+ coderay (1.1.0)
8
11
  descendants_tracker (0.0.4)
9
12
  thread_safe (~> 0.3, >= 0.3.1)
10
13
  diff-lcs (1.2.5)
11
14
  docile (1.1.5)
12
15
  faraday (0.9.0)
13
16
  multipart-post (>= 1.2, < 3)
17
+ ffi (1.9.3)
18
+ formatador (0.2.5)
14
19
  git (1.2.8)
15
20
  github_api (0.12.1)
16
21
  addressable (~> 2.3)
@@ -20,6 +25,18 @@ GEM
20
25
  multi_json (>= 1.7.5, < 2.0)
21
26
  nokogiri (~> 1.6.3)
22
27
  oauth2
28
+ guard (2.6.1)
29
+ formatador (>= 0.2.4)
30
+ listen (~> 2.7)
31
+ lumberjack (~> 1.0)
32
+ pry (>= 0.9.12)
33
+ thor (>= 0.18.1)
34
+ guard-bundler (2.0.0)
35
+ bundler (~> 1.0)
36
+ guard (~> 2.2)
37
+ guard-rspec (4.3.1)
38
+ guard (~> 2.1)
39
+ rspec (>= 2.14, < 4.0)
23
40
  hashie (3.3.1)
24
41
  highline (1.6.21)
25
42
  i18n (0.6.11)
@@ -35,6 +52,12 @@ GEM
35
52
  rdoc
36
53
  json (1.8.1)
37
54
  jwt (1.0.0)
55
+ listen (2.7.8)
56
+ celluloid (>= 0.15.2)
57
+ rb-fsevent (>= 0.9.3)
58
+ rb-inotify (>= 0.9)
59
+ lumberjack (1.0.6)
60
+ method_source (0.8.2)
38
61
  mini_portile (0.6.0)
39
62
  multi_json (1.10.1)
40
63
  multi_xml (0.5.5)
@@ -47,8 +70,15 @@ GEM
47
70
  multi_json (~> 1.3)
48
71
  multi_xml (~> 0.5)
49
72
  rack (~> 1.2)
73
+ pry (0.10.0)
74
+ coderay (~> 1.1.0)
75
+ method_source (~> 0.8.1)
76
+ slop (~> 3.4)
50
77
  rack (1.5.2)
51
78
  rake (10.3.2)
79
+ rb-fsevent (0.9.4)
80
+ rb-inotify (0.9.5)
81
+ ffi (>= 0.5.0)
52
82
  rdoc (3.12.2)
53
83
  json (~> 1.4)
54
84
  riak-client (2.0.0)
@@ -74,15 +104,22 @@ GEM
74
104
  multi_json
75
105
  simplecov-html (~> 0.8.0)
76
106
  simplecov-html (0.8.0)
107
+ slop (3.5.0)
108
+ terminal-notifier-guard (1.5.3)
109
+ thor (0.19.1)
77
110
  thread_safe (0.3.4)
111
+ timers (1.1.0)
78
112
 
79
113
  PLATFORMS
80
114
  ruby
81
115
 
82
116
  DEPENDENCIES
83
117
  bundler (~> 1.0)
118
+ guard-bundler
119
+ guard-rspec (~> 4.3.1)
84
120
  jeweler (~> 2.0.1)
85
121
  rdoc (~> 3.12)
86
122
  riak-client (~> 2.0.0)
87
123
  rspec (~> 3.1.0)
88
124
  simplecov
125
+ terminal-notifier-guard
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard :bundler do
2
+ watch('Gemfile')
3
+ # Uncomment next line if your Gemfile contains the `gemspec' command.
4
+ # watch(/^.+\.gemspec/)
5
+ end
6
+
7
+ guard :rspec, cmd: 'bundle exec rspec' do
8
+ watch(%r{^spec/.+_spec\.rb$})
9
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
10
+ watch('spec/spec_helper.rb') { "spec" }
11
+ end
data/README.md CHANGED
@@ -1,33 +1,89 @@
1
1
  # riak-record
2
2
 
3
3
  RiakRecord is a thin and immature wrapper around riak-ruby-client. It creates a bucket for
4
- each class, provides a simple finder, and creates attribute reader.
4
+ each class, provides a simple finder, and creates attribute reader. It adds a layer over
5
+ the Riak::Client to make interacting with Riak more ActiveRecord-like while
6
+ still giving you all the access to Riak's underlying client's capabilities.
5
7
 
6
8
  ## Usage
7
9
 
8
10
  ```ruby
9
11
  require 'riak-record'
10
12
 
11
- RiakRecord.client = Riak::Client.new
12
- RiakRecord.namespace = 'staging' # optional. Namespaces buckets
13
+ RiakRecord::Base.client = Riak::Client.new
14
+ RiakRecord::Base.namespace = 'staging' # optional. Namespaces buckets
13
15
 
14
- class ExampleRecord < RiakRecord
15
- bucket_name 'example_a'
16
- record_attributes :attribute1, :attribute2
16
+ class Post < RiakRecord::Base
17
+ bucket_name :posts
18
+ data_attributes :title, :body, :category
19
+ belongs_to :author
20
+ has_many :comments
21
+
22
+ index_int_attributes :author_id # author_id_int
23
+ index_bin_attributes :category # catgory_bin
24
+ end
25
+
26
+ class Author < RiakRecord::Base
27
+ bucket_name :authors
28
+ data_attributes :name
29
+ has_many :posts
17
30
  end
18
31
 
19
- ExampleRecord.find("a-key") #> Instance of ExampleRecord
20
- ExampleRecord.find(["a-key","b-key"]) #> Array of ExampleRecords returned
32
+ class Comment < RiakRecord::Base
33
+ bucket_name :comments
34
+ data_attribute :comment
35
+ belongs_to :post
36
+
37
+ index_int_attributes :post_id
38
+ end
39
+
40
+ Author.client #> instance of Riak::Client
41
+ Author.bucket #> instance of Riak::Bucket
42
+
43
+ author = Author.new(99) # create a new record with id/key 99
44
+ author.name = 'Robert' # set an attribute
45
+ author.save # store in riak
46
+
47
+ Post.find(["my-first-post","a-farewell-to-blogging"]) #> Array of ExampleRecords returned
48
+
49
+ post = Post.find("my-first-post") #> Instance of ExampleRecord
50
+ post.riak_object #> directly access Riak::RObject
51
+ post.data #> same as record.riak_object.data
21
52
 
22
- record = ExampleRecord.find("a-key")
23
- record.riak_object #> directly access Riak::RObject
24
- record.data #> same as record.riak_object.data
25
- record.attribute1 #> record.riak_object.data[:attribute1]
26
- record.attribute1 = 'name'
27
- record.save #> record.riak_object.store
53
+ post.title = 'My First Post' #> record.riak_object.data['title']=
54
+ post.title #> record.riak_object.data['title']
55
+
56
+ post.author = 99 #> record.riak_object.indexes["author_id_int"] = [99]
57
+ post.category = 'ruby' #> record.riak_object.indexes["category_bin"] = ["ruby"]
58
+ post.save #> record.riak_object.store
59
+ post.reload #> reload the underlying riak_object from the db discarding changes
60
+
61
+ Author.find(99).posts #> [post]
62
+
63
+ finder = Post.where(:category => 'ruby') #> Instance of RiakRecord::Finder
64
+ finder.count #> 1
65
+ finder.any? #> true
66
+ finder.any?{|o| o.category == 'php'} #> false
67
+ finder.none? #> false
68
+ finder.each{|e| ... } #> supports all enumerable methods
69
+ finder.count_by(:author_id) #> {"1" => 1}
28
70
  ```
29
71
 
72
+ ## Using RiakRecord::Associations in other classes
30
73
 
74
+ If you're using another data store with Riak, it might be helpful to include Riak's associations in the other class.
75
+
76
+ ```ruby
77
+ class User < ActiveRecord::Base
78
+ include RiakRecord::Assocations
79
+
80
+ has_many_riak :posts, :class_name => "Post", :foreign_key => :user_id
81
+ belongs_to_riak :author, :class_name => "Author", :foreign_key => :author_id
82
+ end
83
+
84
+ User.find(1).posts #> create RiakRecord::Finder(Post, :user_id => 1)
85
+ User.find(1).author #> Author.find(self.author_id)
86
+ ```
31
87
 
32
88
  ## Contributing to riak-record
33
89
 
data/TODO.md ADDED
@@ -0,0 +1,8 @@
1
+ # TODO
2
+
3
+ * RiakRecord::Base
4
+ * links_to should create a walkable link
5
+ * Document methods in classes
6
+ * Validations support
7
+ * Validate key is unique (bucket.get_or_new)
8
+ * Autogen id/key (snowflake?)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.1.0
@@ -0,0 +1,49 @@
1
+ module RiakRecord
2
+ module Associations
3
+
4
+ module ClassMethods
5
+ def belongs_to_riak(association_name, options = {})
6
+ class_name = options[:class_name] ||= association_name.to_s.split("_").collect(&:capitalize).join
7
+ foreign_key = options[:foreign_key] || "#{association_name}_id"
8
+ method_def = <<-END_OF_RUBY
9
+
10
+ def #{association_name}
11
+ @belongs_to_riak_#{association_name} = nil if @belongs_to_riak_#{association_name} && @belongs_to_riak_#{association_name}.id.to_s != Array(#{foreign_key}).first.to_s
12
+ @belongs_to_riak_#{association_name} ||= #{class_name}.find(#{foreign_key})
13
+ end
14
+
15
+ def #{association_name}=(obj)
16
+ raise ArgumentError, "not an instance of RiakRecord" unless obj.kind_of?(RiakRecord::Base)
17
+ @belongs_to_riak_#{association_name} = obj
18
+ self.#{foreign_key} = obj.id
19
+ end
20
+
21
+ END_OF_RUBY
22
+
23
+ class_eval method_def
24
+ end
25
+
26
+ def has_many_riak(association_name, options = {})
27
+ class_name = options[:class_name]
28
+ foreign_key = options[:foreign_key]
29
+ class_name && foreign_key or raise ArgumentError, "has_many_riak requires class_name and foreign_key options"
30
+
31
+ method_def = <<-END_OF_RUBY
32
+
33
+ def #{association_name}
34
+ @has_many_riak_#{association_name} ||= #{class_name}.where(:#{foreign_key} => self.id.to_s)
35
+ end
36
+
37
+ END_OF_RUBY
38
+
39
+ class_eval method_def
40
+ end
41
+
42
+ end
43
+
44
+ def self.included(base)
45
+ base.extend(ClassMethods)
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,146 @@
1
+ require 'riak'
2
+
3
+ module RiakRecord
4
+ class Base
5
+ attr_reader :riak_object
6
+ include Associations
7
+ class << self
8
+ alias :has_many :has_many_riak
9
+ alias :belongs_to :belongs_to_riak
10
+ end
11
+
12
+ def initialize(r = nil)
13
+ unless r.is_a? Riak::RObject
14
+ r = self.class.bucket.new(r.to_s)
15
+ r.data = {}
16
+ end
17
+ @riak_object = r
18
+ end
19
+
20
+ def data
21
+ riak_object.data
22
+ end
23
+
24
+ def indexes
25
+ riak_object.indexes
26
+ end
27
+
28
+ def save
29
+ riak_object.store(:returnbody => false)
30
+ self
31
+ end
32
+
33
+ def id
34
+ riak_object.key
35
+ end
36
+
37
+ def reload
38
+ @riak_object = self.class.bucket.get(id)
39
+ @riak_object.data = {} if @riak_object.data.nil?
40
+ self
41
+ end
42
+
43
+ def self.bucket_name(name = :not_a_name)
44
+ @bucket_name = name.to_s unless name == :not_a_name
45
+ namespace.present? ? namespace_prefixed+@bucket_name : @bucket_name
46
+ end
47
+
48
+ def self.bucket
49
+ @bucket ||= client.bucket(bucket_name)
50
+ end
51
+
52
+ def self.data_attributes(*attributes)
53
+ attributes.map(&:to_sym).each do |method_name|
54
+ define_method(method_name) do
55
+ data[method_name.to_s]
56
+ end
57
+
58
+ define_method("#{method_name}=".to_sym) do |value|
59
+ data[method_name.to_s] = value
60
+ end
61
+ end
62
+ end
63
+
64
+ def self.index_int_attributes(*attributes)
65
+ attributes.map(&:to_sym).each do |method_name|
66
+ index_names[method_name.to_sym] = "#{method_name}_int"
67
+
68
+ define_method(method_name) do
69
+ indexes["#{method_name}_int"]
70
+ end
71
+
72
+ define_method("#{method_name}=".to_sym) do |value|
73
+ indexes["#{method_name}_int"] = Array(value).map(&:to_i)
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.index_bin_attributes(*attributes)
79
+ attributes.map(&:to_sym).each do |method_name|
80
+ index_names[method_name.to_sym] = "#{method_name}_bin"
81
+
82
+ define_method(method_name) do
83
+ indexes["#{method_name}_bin"]
84
+ end
85
+
86
+ define_method("#{method_name}=".to_sym) do |value|
87
+ indexes["#{method_name}_bin"] = Array(value).map(&:to_s)
88
+ end
89
+ end
90
+ end
91
+
92
+ def self.index_names
93
+ @index_names ||= {}
94
+ end
95
+
96
+ def self.where(options)
97
+ RiakRecord::Finder.new(self, options)
98
+ end
99
+
100
+ def self.find(key_or_keys)
101
+ return find_many(key_or_keys) if key_or_keys.is_a?(Array)
102
+
103
+ begin
104
+ self.new(bucket.get(key_or_keys.to_s))
105
+ rescue Riak::FailedRequest => e
106
+ if e.not_found?
107
+ nil
108
+ else
109
+ raise e
110
+ end
111
+ end
112
+ end
113
+
114
+ def self.find_many(keys)
115
+ hash = bucket.get_many(keys.map(&:to_s))
116
+ keys.map{ |k| hash[k] }
117
+ end
118
+
119
+ @@namespace = nil
120
+ def self.namespace=(namespace)
121
+ @@namespace = namespace
122
+ end
123
+
124
+ def self.namespace
125
+ @@namespace
126
+ end
127
+
128
+ def self.namespace_prefixed
129
+ self.namespace + ":-:"
130
+ end
131
+
132
+ def self.all_buckets_in_namespace
133
+ raise "namespace not set" unless self.namespace
134
+ client.list_buckets.select{|b| b.name.match(/^#{ Regexp.escape(self.namespace_prefixed) }/) }
135
+ end
136
+
137
+ def self.client=(client)
138
+ @@client = client
139
+ end
140
+
141
+ def self.client
142
+ @@client
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,125 @@
1
+ module RiakRecord
2
+ class Finder
3
+ include Enumerable
4
+
5
+ def initialize(finder_class, conditions)
6
+ unless finder_class <= RiakRecord::Base
7
+ raise ArgumentError, "RiakRecord::Finder requires a RiakRecord::Base class"
8
+ end
9
+ unless conditions.is_a?(Hash) && conditions.size == 1
10
+ raise ArgumentError, "RiakRecord::Finder requires exactly one condition specified as a hash"
11
+ end
12
+ @finder_class = finder_class
13
+ @bucket = finder_class.bucket
14
+ @index = finder_class.index_names[conditions.keys.first.to_sym]
15
+ @value = conditions.values.first
16
+ @load_complete = false
17
+ @page_size = 100
18
+ @loaded_objects = []
19
+ end
20
+
21
+ def all
22
+ until @load_complete do
23
+ load_next_page
24
+ end
25
+ @loaded_objects
26
+ end
27
+ alias :to_a :all
28
+
29
+ def each
30
+ @loaded_objects.each{|o| yield o}
31
+ end
32
+
33
+ def count
34
+ @load_complete ? @loaded_objects.count : count_map_reduce
35
+ end
36
+
37
+ def first(n=nil)
38
+ if n
39
+ until @load_complete || n <= @loaded_objects.count
40
+ load_next_page
41
+ end
42
+ @loaded_objects.first(n)
43
+ else
44
+ load_next_page unless load_started?
45
+ @loaded_objects.first
46
+ end
47
+ end
48
+
49
+ def find(ifnone = nil, &block)
50
+ found = @loaded_objects.find(&block)
51
+ until found || @load_complete
52
+ found = load_next_page.find(&block)
53
+ end
54
+ return found if found
55
+ return ifnone.call if ifnone
56
+ nil
57
+ end
58
+ alias :detect :find
59
+
60
+ def empty?(&block)
61
+ if block_given?
62
+ !any?(&block)
63
+ else
64
+ load_next_page unless load_started?
65
+ @loaded_objects.count.zero?
66
+ end
67
+ end
68
+ alias :none? :empty?
69
+
70
+ def any?(&block)
71
+ if block_given?
72
+ return true if @loaded_objects.any? &block
73
+ until @load_complete
74
+ load_next_page.any? &block
75
+ end
76
+ false
77
+ else
78
+ !empty?
79
+ end
80
+ end
81
+
82
+ def count_by(attribute)
83
+ return count_by_map_reduce(attribute) unless @load_complete
84
+ results = {}
85
+ @loaded_objects.each{|o| k = o.send(attribute).to_s; results[k] ||= 0; results[k] += 1 }
86
+ results
87
+ end
88
+
89
+ private
90
+
91
+ def load_started?
92
+ @load_complete || @loaded_objects.count > 0
93
+ end
94
+
95
+ def count_by_map_reduce(attribute)
96
+ count_by_index = @finder_class.index_names[attribute.to_sym].present?
97
+ parsed_attribute = count_by_index ? "v.values[0].metadata.index.#{@finder_class.index_names[attribute.to_sym]}" : "JSON.parse(v.values[0].data).#{attribute}"
98
+ Riak::MapReduce.new(@finder_class.client).
99
+ index(@bucket, @index, @value).
100
+ map("function(v){ var h = {}; h[#{parsed_attribute}] = 1; return [h] }", :keep => false).
101
+ reduce("function(values) { var result = {}; for (var value in values) { for (var key in values[value]) { if (key in result) { result[key] += values[value][key]; } else { result[key] = values[value][key]; }}} return [result]; }", :keep => true).run.first
102
+ end
103
+
104
+ def count_map_reduce
105
+ Riak::MapReduce.new(@finder_class.client).
106
+ index(@bucket, @index, @value).
107
+ map("function(v){ return [1] }", :keep => false).
108
+ reduce("Riak.reduceSum", :keep => true).run.first
109
+ end
110
+
111
+ def load_next_page
112
+ return if @load_complete
113
+ if @querier
114
+ @querier = @querier.next_page
115
+ else
116
+ @querier = Riak::SecondaryIndex.new(@bucket, @index, @value, :max_results => @page_size)
117
+ end
118
+ @load_complete = !@querier.has_next_page?
119
+ new_objects = @querier.values.map{ |robject| @finder_class.new(robject) }
120
+ @loaded_objects.concat(new_objects)
121
+ new_objects
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,6 @@
1
+ require 'riak_record/associations'
2
+ require 'riak_record/finder'
3
+ require 'riak_record/base'
4
+
5
+ module RiakRecord
6
+ end
data/riak-record.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: riak-record 0.0.4 ruby lib
5
+ # stub: riak-record 0.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "riak-record"
9
- s.version = "0.0.4"
9
+ s.version = "0.1.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Robert Graff"]
14
- s.date = "2014-09-18"
14
+ s.date = "2014-09-23"
15
15
  s.description = "RiakRecord is a thin and immature wrapper around riak-ruby-client. It creates a bucket for\n each class, provides a simple finder, and creates attribute reader."
16
16
  s.email = "robert_graff@yahoo.com"
17
17
  s.extra_rdoc_files = [
@@ -23,13 +23,21 @@ Gem::Specification.new do |s|
23
23
  ".rspec",
24
24
  "Gemfile",
25
25
  "Gemfile.lock",
26
+ "Guardfile",
26
27
  "LICENSE.txt",
27
28
  "README.md",
28
29
  "Rakefile",
30
+ "TODO.md",
29
31
  "VERSION",
30
- "lib/riak-record.rb",
32
+ "lib/riak_record.rb",
33
+ "lib/riak_record/associations.rb",
34
+ "lib/riak_record/base.rb",
35
+ "lib/riak_record/finder.rb",
31
36
  "riak-record.gemspec",
32
- "spec/riak-record_spec.rb",
37
+ "spec/riak_record/associations_spec.rb",
38
+ "spec/riak_record/base_spec.rb",
39
+ "spec/riak_record/finder_spec.rb",
40
+ "spec/riak_record_spec.rb",
33
41
  "spec/spec_helper.rb"
34
42
  ]
35
43
  s.homepage = "http://github.com/rgraff/riak-record"
@@ -47,6 +55,9 @@ Gem::Specification.new do |s|
47
55
  s.add_development_dependency(%q<bundler>, ["~> 1.0"])
48
56
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
49
57
  s.add_development_dependency(%q<simplecov>, [">= 0"])
58
+ s.add_development_dependency(%q<guard-rspec>, ["~> 4.3.1"])
59
+ s.add_development_dependency(%q<guard-bundler>, [">= 0"])
60
+ s.add_development_dependency(%q<terminal-notifier-guard>, [">= 0"])
50
61
  else
51
62
  s.add_dependency(%q<riak-client>, ["~> 2.0.0"])
52
63
  s.add_dependency(%q<rspec>, ["~> 3.1.0"])
@@ -54,6 +65,9 @@ Gem::Specification.new do |s|
54
65
  s.add_dependency(%q<bundler>, ["~> 1.0"])
55
66
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
56
67
  s.add_dependency(%q<simplecov>, [">= 0"])
68
+ s.add_dependency(%q<guard-rspec>, ["~> 4.3.1"])
69
+ s.add_dependency(%q<guard-bundler>, [">= 0"])
70
+ s.add_dependency(%q<terminal-notifier-guard>, [">= 0"])
57
71
  end
58
72
  else
59
73
  s.add_dependency(%q<riak-client>, ["~> 2.0.0"])
@@ -62,6 +76,9 @@ Gem::Specification.new do |s|
62
76
  s.add_dependency(%q<bundler>, ["~> 1.0"])
63
77
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
64
78
  s.add_dependency(%q<simplecov>, [">= 0"])
79
+ s.add_dependency(%q<guard-rspec>, ["~> 4.3.1"])
80
+ s.add_dependency(%q<guard-bundler>, [">= 0"])
81
+ s.add_dependency(%q<terminal-notifier-guard>, [">= 0"])
65
82
  end
66
83
  end
67
84