better-ripple 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.
Files changed (77) hide show
  1. data/LICENSE +17 -0
  2. data/README.md +182 -0
  3. data/RELEASE_NOTES.md +284 -0
  4. data/better-ripple.gemspec +55 -0
  5. data/lib/rails/generators/ripple/configuration/configuration_generator.rb +13 -0
  6. data/lib/rails/generators/ripple/configuration/templates/ripple.yml +25 -0
  7. data/lib/rails/generators/ripple/js/js_generator.rb +13 -0
  8. data/lib/rails/generators/ripple/js/templates/js/contrib.js +63 -0
  9. data/lib/rails/generators/ripple/js/templates/js/iso8601.js +76 -0
  10. data/lib/rails/generators/ripple/js/templates/js/ripple.js +132 -0
  11. data/lib/rails/generators/ripple/model/model_generator.rb +20 -0
  12. data/lib/rails/generators/ripple/model/templates/model.rb.erb +10 -0
  13. data/lib/rails/generators/ripple/observer/observer_generator.rb +16 -0
  14. data/lib/rails/generators/ripple/observer/templates/observer.rb.erb +2 -0
  15. data/lib/rails/generators/ripple/test/templates/cucumber.rb.erb +7 -0
  16. data/lib/rails/generators/ripple/test/test_generator.rb +44 -0
  17. data/lib/rails/generators/ripple_generator.rb +79 -0
  18. data/lib/ripple.rb +86 -0
  19. data/lib/ripple/associations.rb +380 -0
  20. data/lib/ripple/associations/embedded.rb +35 -0
  21. data/lib/ripple/associations/instantiators.rb +26 -0
  22. data/lib/ripple/associations/linked.rb +65 -0
  23. data/lib/ripple/associations/many.rb +38 -0
  24. data/lib/ripple/associations/many_embedded_proxy.rb +39 -0
  25. data/lib/ripple/associations/many_linked_proxy.rb +66 -0
  26. data/lib/ripple/associations/many_reference_proxy.rb +95 -0
  27. data/lib/ripple/associations/many_stored_key_proxy.rb +76 -0
  28. data/lib/ripple/associations/one.rb +20 -0
  29. data/lib/ripple/associations/one_embedded_proxy.rb +35 -0
  30. data/lib/ripple/associations/one_key_proxy.rb +58 -0
  31. data/lib/ripple/associations/one_linked_proxy.rb +26 -0
  32. data/lib/ripple/associations/one_stored_key_proxy.rb +43 -0
  33. data/lib/ripple/associations/proxy.rb +118 -0
  34. data/lib/ripple/attribute_methods.rb +132 -0
  35. data/lib/ripple/attribute_methods/dirty.rb +59 -0
  36. data/lib/ripple/attribute_methods/query.rb +34 -0
  37. data/lib/ripple/attribute_methods/read.rb +28 -0
  38. data/lib/ripple/attribute_methods/write.rb +25 -0
  39. data/lib/ripple/callbacks.rb +71 -0
  40. data/lib/ripple/conflict/basic_resolver.rb +86 -0
  41. data/lib/ripple/conflict/document_hooks.rb +46 -0
  42. data/lib/ripple/conflict/resolver.rb +79 -0
  43. data/lib/ripple/conflict/test_helper.rb +34 -0
  44. data/lib/ripple/conversion.rb +29 -0
  45. data/lib/ripple/core_ext.rb +3 -0
  46. data/lib/ripple/core_ext/casting.rb +151 -0
  47. data/lib/ripple/core_ext/indexes.rb +89 -0
  48. data/lib/ripple/core_ext/object.rb +8 -0
  49. data/lib/ripple/document.rb +105 -0
  50. data/lib/ripple/document/bucket_access.rb +25 -0
  51. data/lib/ripple/document/finders.rb +131 -0
  52. data/lib/ripple/document/key.rb +35 -0
  53. data/lib/ripple/document/link.rb +30 -0
  54. data/lib/ripple/document/persistence.rb +130 -0
  55. data/lib/ripple/embedded_document.rb +63 -0
  56. data/lib/ripple/embedded_document/around_callbacks.rb +18 -0
  57. data/lib/ripple/embedded_document/finders.rb +26 -0
  58. data/lib/ripple/embedded_document/persistence.rb +75 -0
  59. data/lib/ripple/i18n.rb +5 -0
  60. data/lib/ripple/indexes.rb +151 -0
  61. data/lib/ripple/inspection.rb +32 -0
  62. data/lib/ripple/locale/en.yml +26 -0
  63. data/lib/ripple/locale/fr.yml +24 -0
  64. data/lib/ripple/nested_attributes.rb +275 -0
  65. data/lib/ripple/observable.rb +28 -0
  66. data/lib/ripple/properties.rb +74 -0
  67. data/lib/ripple/property_type_mismatch.rb +12 -0
  68. data/lib/ripple/railtie.rb +26 -0
  69. data/lib/ripple/railties/ripple.rake +103 -0
  70. data/lib/ripple/serialization.rb +82 -0
  71. data/lib/ripple/test_server.rb +35 -0
  72. data/lib/ripple/timestamps.rb +25 -0
  73. data/lib/ripple/translation.rb +18 -0
  74. data/lib/ripple/validations.rb +65 -0
  75. data/lib/ripple/validations/associated_validator.rb +43 -0
  76. data/lib/ripple/version.rb +3 -0
  77. metadata +310 -0
@@ -0,0 +1,12 @@
1
+ require 'ripple/translation'
2
+
3
+ module Ripple
4
+ # Exception raised when the value assigned to a document property
5
+ # cannot be coerced into the property's defined type.
6
+ class PropertyTypeMismatch < StandardError
7
+ include Translation
8
+ def initialize(klass, value)
9
+ super t("property_type_mismatch", :class => klass, :value => value.inspect)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ require 'rails/railtie'
2
+
3
+ module Ripple
4
+ # Railtie for automatic initialization of the Ripple framework
5
+ # during Rails initialization.
6
+ class Railtie < Rails::Railtie
7
+ rake_tasks do
8
+ load "ripple/railties/ripple.rake"
9
+ end
10
+
11
+ initializer "ripple.configure_rails_initialization" do
12
+ if File.exist?(Rails.root + "config/ripple.yml")
13
+ Ripple.load_configuration Rails.root.join('config', 'ripple.yml'), [Rails.env]
14
+ end
15
+ end
16
+
17
+ initializer "ripple.configure_test_server_root", :after => "ripple.configure_rails_initialization" do
18
+ unless Rails.env.development? || Rails.env.production?
19
+ # Make sure the TestServer lives in the default location, if
20
+ # not set in the config file.
21
+ Ripple.config[:root] ||= (Rails.root + 'tmp/riak_test_server').to_s
22
+ Ripple.config[:js_source_dir] ||= (Rails.root + "app/mapreduce").to_s
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,103 @@
1
+ require 'ripple/translation'
2
+ require 'riak/cluster'
3
+ require 'pp'
4
+
5
+ namespace :riak do
6
+ task :cluster_created => :rails_env do
7
+ fail Ripple::Translator.t('cluster_not_created') unless cluster.exist?
8
+ end
9
+
10
+ desc "Starts the Riak cluster for the current environment"
11
+ task :start => :cluster_created do
12
+ cluster.start
13
+ end
14
+
15
+ desc "Stops the Riak cluster for the current environment"
16
+ task :stop => :cluster_created do
17
+ cluster.stop
18
+ end
19
+
20
+ desc "Creates a Riak cluster for the current environment in db/, e.g. db/development"
21
+ task :create => :rails_env do
22
+ cluster.create
23
+ end
24
+
25
+ desc "Destroys the generated Riak cluster for the current environment."
26
+ task :destroy => ['rails_env', 'riak:stop'] do
27
+ cluster.destroy
28
+ end
29
+
30
+ desc "Drops data only from the Riak cluster for the current environment."
31
+ task :drop => :cluster_created do
32
+ cluster.drop
33
+ end
34
+
35
+ namespace :create do
36
+ desc "Creates Riak clusters for all environments defined in config/ripple.yml"
37
+ task :all do
38
+ load_config.each do |env, config|
39
+ cluster(env.to_s, config).create
40
+ end
41
+ end
42
+ end
43
+
44
+ namespace :drop do
45
+ desc "Drops data Riak clusters for all environments defined in config/ripple.yml"
46
+ task :all do
47
+ load_config.each do |env, config|
48
+ c = cluster(env.to_s, config)
49
+ warn Ripple::Translator.t('cluster_not_created') unless c.exist?
50
+ c.drop
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ namespace :db do
57
+ desc "Creates the database(s) for the current environment"
58
+ task :create => "riak:create"
59
+
60
+ namespace(:create) do
61
+ desc "Creates the database(s) for all environments"
62
+ task :all => "riak:create:all"
63
+ end
64
+
65
+ desc "Drops the database(s) for the current environment"
66
+ task :drop => ['db:stop', 'riak:drop']
67
+
68
+ namespace(:drop) do
69
+ desc "Drops the database(s) for all environments"
70
+ task :all => "riak:drop:all"
71
+ end
72
+
73
+ desc "Starts the database(s) for the current environment"
74
+ task :start => 'riak:start'
75
+
76
+ desc "Stops the database(s) for the current environment"
77
+ task :stop => 'riak:stop'
78
+
79
+ desc "Creates the database(s) and loads the seed data."
80
+ task :setup => ['db:create', 'db:start', 'db:seed']
81
+
82
+ desc "Drops and recreates the database(s) for the current environment."
83
+ task :reset => ['db:drop', 'db:setup']
84
+
85
+ desc "Loads the seed data in to the current environment"
86
+ task :seed => :environment do
87
+ Rails.application.load_seed
88
+ end
89
+ end
90
+
91
+ def load_config
92
+ file = Rails.root + "config/ripple.yml"
93
+ raise Ripple::MissingConfiguration, file.to_s unless file.exist?
94
+ YAML.load(ERB.new(file.read).result).with_indifferent_access
95
+ end
96
+
97
+ def cluster(environment=nil, config=nil)
98
+ environment ||= Rails.env
99
+ config ||= load_config[environment].with_indifferent_access
100
+ root = Rails.root + "db" + environment.to_s
101
+ # TODO: We need to deal with multiple hosts and client ports
102
+ Riak::Cluster.new({ :root => root.to_s }.merge(config).with_indifferent_access)
103
+ end
@@ -0,0 +1,82 @@
1
+ # Copyright 2010-2011 Sean Cribbs and Basho Technologies, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'active_support/concern'
16
+ require 'active_model/serialization'
17
+ require 'active_model/serializers/json'
18
+
19
+ module Ripple
20
+ # Provides methods for serializing Ripple documents to external
21
+ # formats (e.g. JSON). By default, embedded documents will be
22
+ # included in the resulting format.
23
+ module Serialization
24
+ extend ActiveSupport::Concern
25
+ include ::ActiveModel::Serializers::JSON
26
+
27
+ # Creates a Hash suitable for conversion to an external format.
28
+ # @param [Hash] options (nil) serialization options
29
+ # @option options [Array<Symbol>] :only emit only the specified attributes
30
+ # @option options [Array<Symbol>] :except omit the specified attributes
31
+ # @option options [Array<Symbol>, Hash] :include include the
32
+ # specified associations (with or without extra
33
+ # options). This defaults to all embedded associations.
34
+ # @return [Hash] a hash of attributes and embedded documents
35
+ def serializable_hash(options=nil)
36
+ options = options.try(:clone) || {}
37
+
38
+ unless options.has_key?(:include)
39
+ options[:include] = self.class.embedded_associations.map(&:name)
40
+ end
41
+
42
+ hash = super(options)
43
+
44
+ hash['key'] = key if respond_to?(:key) && key.present? && (!options[:except] || !options[:except].map(&:to_s).include?("key"))
45
+
46
+ serializable_add_includes(options) do |association, records, opts|
47
+ hash[association.to_s] = records.is_a?(Enumerable) ? records.map {|r| r.serializable_hash(opts) } : records.serializable_hash(opts)
48
+ end
49
+ hash
50
+ end
51
+
52
+ private
53
+ def serializable_add_includes(options={})
54
+ return unless include_associations = options.delete(:include)
55
+
56
+ base_only_or_except = {
57
+ :except => options[:except],
58
+ :only => options[:only]
59
+ }
60
+
61
+ include_has_options = include_associations.is_a?(Hash)
62
+ associations = include_has_options ? include_associations.keys : Array.wrap(include_associations)
63
+
64
+ for association in associations
65
+ records = case self.class.associations[association.to_sym].type
66
+ when :many
67
+ send(association).to_a
68
+ when :one
69
+ send(association)
70
+ end
71
+
72
+ unless records.nil?
73
+ association_options = include_has_options ? include_associations[association] : base_only_or_except
74
+ opts = options.merge(association_options)
75
+ yield(association, records, opts)
76
+ end
77
+ end
78
+
79
+ options[:include] = include_associations
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,35 @@
1
+ require 'riak/test_server'
2
+ require 'singleton'
3
+
4
+ module Ripple
5
+ # Extends the {Riak::TestServer} to be aware of the Ripple
6
+ # configuration and adjust settings appropriately. Also simplifies
7
+ # its usage in the generation of test helpers.
8
+ class TestServer < Riak::TestServer
9
+ include Singleton
10
+
11
+ # Creates and starts the test server
12
+ def self.setup
13
+ instance.create
14
+ instance.start
15
+ end
16
+
17
+ # Clears data from the test server
18
+ def self.clear
19
+ instance.drop
20
+ end
21
+
22
+ # @private
23
+ def initialize(options=Ripple.config.dup)
24
+ options[:env] ||= {}
25
+ options[:env][:riak_kv] ||= {}
26
+ options[:env][:riak_kv][:js_source_dir] ||= Ripple.config.delete(:js_source_dir)
27
+ options[:env][:riak_kv][:map_cache_size] ||= 0
28
+ options[:env][:riak_core] ||= {}
29
+ options[:env][:riak_core][:http] ||= [ Tuple[Ripple.config[:host], Ripple.config[:http_port]] ]
30
+ options[:env][:riak_kv][:pb_port] ||= Ripple.config[:pb_port]
31
+ options[:env][:riak_kv][:pb_ip] ||= Ripple.config[:host]
32
+ super(options)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ require 'active_support/time'
2
+ require 'active_support/concern'
3
+
4
+ module Ripple
5
+ # Adds automatic creation and update timestamps to a
6
+ # {Ripple::Document} model.
7
+ module Timestamps
8
+ extend ActiveSupport::Concern
9
+
10
+ module ClassMethods
11
+ # Adds the :created_at and :updated_at timestamp properties to
12
+ # the document.
13
+ def timestamps!(options={})
14
+ property :created_at, Time, options.merge(:default => proc { Time.now })
15
+ property :updated_at, Time, options.dup
16
+ before_save :touch
17
+ end
18
+ end
19
+
20
+ # Sets the :updated_at attribute before saving the document.
21
+ def touch
22
+ self.updated_at = Time.now
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ require 'ripple/i18n'
2
+ require 'riak/util/translation'
3
+
4
+ module Ripple
5
+ # Adds i18n translation/string-lookup capabilities.
6
+ module Translation
7
+ include Riak::Util::Translation
8
+
9
+ # The scope of i18n keys to search (:ripple).
10
+ def i18n_scope
11
+ :ripple
12
+ end
13
+ end
14
+
15
+ # A dummy object so translations can be accessed without module
16
+ # inclusion.
17
+ Translator = Object.new.tap {|o| o.extend Translation }
18
+ end
@@ -0,0 +1,65 @@
1
+ require 'active_support/concern'
2
+ require 'active_model/validations'
3
+ require 'ripple/translation'
4
+ require 'ripple/validations/associated_validator'
5
+
6
+ module Ripple
7
+ # Raised by <tt>save!</tt> when the document is invalid. Use the
8
+ # +document+ method to retrieve the document which did not validate.
9
+ # begin
10
+ # invalid_document.save!
11
+ # rescue Ripple::DocumentInvalid => invalid
12
+ # puts invalid.document.errors
13
+ # end
14
+ class DocumentInvalid < StandardError
15
+ include Translation
16
+ attr_reader :document
17
+ def initialize(document)
18
+ @document = document
19
+ errors = @document.errors.full_messages.join(", ")
20
+ super(t("document_invalid", :errors => errors))
21
+ end
22
+ end
23
+
24
+ # Adds validations to {Ripple::Document} models. Validations are
25
+ # executed before saving the document.
26
+ module Validations
27
+ extend ActiveSupport::Concern
28
+ include ActiveModel::Validations
29
+
30
+ module ClassMethods
31
+ # @private
32
+ def property(key, type, options={})
33
+ prop = super
34
+ validates key, prop.validation_options unless prop.validation_options.blank?
35
+ end
36
+
37
+ # Instantiates a new document, applies attributes from a block, and saves it
38
+ # Raises Ripple::DocumentInvalid if the record did not save
39
+ def create!(*args, &block)
40
+ obj = create(*args, &block)
41
+ (raise Ripple::DocumentInvalid.new(obj) if obj.new?) || obj
42
+ end
43
+ end
44
+
45
+ # @private
46
+ def save(options={:validate => true})
47
+ return false if options[:validate] && !valid?
48
+ super()
49
+ end
50
+
51
+ # Saves the document and raises {DocumentInvalid} exception if
52
+ # validations fail.
53
+ def save!
54
+ (raise Ripple::DocumentInvalid.new(self) unless save) || true
55
+ end
56
+
57
+ # Sets the passed attributes and saves the document, raising a
58
+ # {DocumentInvalid} exception if the validations fail.
59
+ def update_attributes!(attrs)
60
+ self.attributes = attrs
61
+ save!
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,43 @@
1
+ require 'active_model/validator'
2
+
3
+ module Ripple
4
+ module Validations
5
+ class AssociatedValidator < ActiveModel::EachValidator
6
+ include Translation
7
+ def validate_each(record, attribute, value)
8
+ return if (value.is_a?(Array) ? value : [value]).collect{ |r| r.nil? || r.valid? }.all?
9
+ record.errors.add(attribute, error_message_for(attribute, value))
10
+ end
11
+
12
+ private
13
+
14
+ def error_message_for(attribute, associated_records)
15
+ if associated_records.respond_to?(:each_with_index)
16
+ record_errors = associated_records.enum_for(:each_with_index).collect do |record, index|
17
+ next unless record.errors.any?
18
+
19
+ t("associated_document_error_summary",
20
+ :doc_type => attribute.to_s.singularize,
21
+ :doc_id => index + 1,
22
+ :errors => record.errors.full_messages.to_sentence
23
+ )
24
+ end
25
+ record_errors.compact!
26
+ record_errors.flatten!
27
+
28
+ t("many_association_validation_error",
29
+ :association_errors => record_errors.join('; '))
30
+ else
31
+ t("one_association_validation_error",
32
+ :association_errors => associated_records.errors.full_messages.to_sentence)
33
+ end
34
+ end
35
+ end
36
+
37
+ module ClassMethods
38
+ def validates_associated(*attr_names)
39
+ validates_with AssociatedValidator, _merge_attributes(attr_names)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,3 @@
1
+ module Ripple
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,310 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: better-ripple
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jon Frisby
9
+ - Sean Cribbs
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-10-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: !binary |-
17
+ YmV0dGVyLXJpYWstY2xpZW50
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - !binary |-
22
+ fj4=
23
+ - !ruby/object:Gem::Version
24
+ version: !binary |-
25
+ MS4wLjA=
26
+ type: :runtime
27
+ prerelease: false
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - !binary |-
32
+ fj4=
33
+ - !ruby/object:Gem::Version
34
+ version: !binary |-
35
+ MS4wLjA=
36
+ - !ruby/object:Gem::Dependency
37
+ name: !binary |-
38
+ YWN0aXZlc3VwcG9ydA==
39
+ requirement: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - !binary |-
43
+ Pj0=
44
+ - !ruby/object:Gem::Version
45
+ version: !binary |-
46
+ My4wLjA=
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - !binary |-
53
+ Pj0=
54
+ - !ruby/object:Gem::Version
55
+ version: !binary |-
56
+ My4wLjA=
57
+ - !ruby/object:Gem::Dependency
58
+ name: !binary |-
59
+ YWN0aXZlc3VwcG9ydA==
60
+ requirement: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - !binary |-
64
+ Pj0=
65
+ - !ruby/object:Gem::Version
66
+ version: !binary |-
67
+ My4wLjA=
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - !binary |-
74
+ Pj0=
75
+ - !ruby/object:Gem::Version
76
+ version: !binary |-
77
+ My4wLjA=
78
+ - !ruby/object:Gem::Dependency
79
+ name: !binary |-
80
+ YWN0aXZlbW9kZWw=
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - !binary |-
85
+ Pj0=
86
+ - !ruby/object:Gem::Version
87
+ version: !binary |-
88
+ My4wLjA=
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - !binary |-
95
+ Pj0=
96
+ - !ruby/object:Gem::Version
97
+ version: !binary |-
98
+ My4wLjA=
99
+ - !ruby/object:Gem::Dependency
100
+ name: !binary |-
101
+ YWN0aXZlbW9kZWw=
102
+ requirement: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - !binary |-
106
+ Pj0=
107
+ - !ruby/object:Gem::Version
108
+ version: !binary |-
109
+ My4wLjA=
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - !binary |-
116
+ Pj0=
117
+ - !ruby/object:Gem::Version
118
+ version: !binary |-
119
+ My4wLjA=
120
+ - !ruby/object:Gem::Dependency
121
+ name: !binary |-
122
+ dHppbmZv
123
+ requirement: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ type: :runtime
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: !binary |-
139
+ cnNwZWM=
140
+ requirement: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - !binary |-
144
+ fj4=
145
+ - !ruby/object:Gem::Version
146
+ version: !binary |-
147
+ Mi44LjA=
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - !binary |-
154
+ fj4=
155
+ - !ruby/object:Gem::Version
156
+ version: !binary |-
157
+ Mi44LjA=
158
+ - !ruby/object:Gem::Dependency
159
+ name: !binary |-
160
+ cmFrZQ==
161
+ requirement: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: !binary |-
177
+ YW1tZXRlcg==
178
+ requirement: !ruby/object:Gem::Requirement
179
+ none: false
180
+ requirements:
181
+ - - !binary |-
182
+ fj4=
183
+ - !ruby/object:Gem::Version
184
+ version: !binary |-
185
+ MC4yLjI=
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - !binary |-
192
+ fj4=
193
+ - !ruby/object:Gem::Version
194
+ version: !binary |-
195
+ MC4yLjI=
196
+ description: better-ripple is an improved version of ripple, an object-mapper library
197
+ for Riak. It uses ActiveModel to provide an experience that integrates well with
198
+ Rails 3 applications.
199
+ email:
200
+ - jon@cloudability.com
201
+ - sean@basho.com
202
+ executables: []
203
+ extensions: []
204
+ extra_rdoc_files: []
205
+ files:
206
+ - LICENSE
207
+ - README.md
208
+ - RELEASE_NOTES.md
209
+ - better-ripple.gemspec
210
+ - lib/rails/generators/ripple/configuration/configuration_generator.rb
211
+ - lib/rails/generators/ripple/configuration/templates/ripple.yml
212
+ - lib/rails/generators/ripple/js/js_generator.rb
213
+ - lib/rails/generators/ripple/js/templates/js/contrib.js
214
+ - lib/rails/generators/ripple/js/templates/js/iso8601.js
215
+ - lib/rails/generators/ripple/js/templates/js/ripple.js
216
+ - lib/rails/generators/ripple/model/model_generator.rb
217
+ - lib/rails/generators/ripple/model/templates/model.rb.erb
218
+ - lib/rails/generators/ripple/observer/observer_generator.rb
219
+ - lib/rails/generators/ripple/observer/templates/observer.rb.erb
220
+ - lib/rails/generators/ripple/test/templates/cucumber.rb.erb
221
+ - lib/rails/generators/ripple/test/test_generator.rb
222
+ - lib/rails/generators/ripple_generator.rb
223
+ - lib/ripple.rb
224
+ - lib/ripple/associations.rb
225
+ - lib/ripple/associations/embedded.rb
226
+ - lib/ripple/associations/instantiators.rb
227
+ - lib/ripple/associations/linked.rb
228
+ - lib/ripple/associations/many.rb
229
+ - lib/ripple/associations/many_embedded_proxy.rb
230
+ - lib/ripple/associations/many_linked_proxy.rb
231
+ - lib/ripple/associations/many_reference_proxy.rb
232
+ - lib/ripple/associations/many_stored_key_proxy.rb
233
+ - lib/ripple/associations/one.rb
234
+ - lib/ripple/associations/one_embedded_proxy.rb
235
+ - lib/ripple/associations/one_key_proxy.rb
236
+ - lib/ripple/associations/one_linked_proxy.rb
237
+ - lib/ripple/associations/one_stored_key_proxy.rb
238
+ - lib/ripple/associations/proxy.rb
239
+ - lib/ripple/attribute_methods.rb
240
+ - lib/ripple/attribute_methods/dirty.rb
241
+ - lib/ripple/attribute_methods/query.rb
242
+ - lib/ripple/attribute_methods/read.rb
243
+ - lib/ripple/attribute_methods/write.rb
244
+ - lib/ripple/callbacks.rb
245
+ - lib/ripple/conflict/basic_resolver.rb
246
+ - lib/ripple/conflict/document_hooks.rb
247
+ - lib/ripple/conflict/resolver.rb
248
+ - lib/ripple/conflict/test_helper.rb
249
+ - lib/ripple/conversion.rb
250
+ - lib/ripple/core_ext.rb
251
+ - lib/ripple/core_ext/casting.rb
252
+ - lib/ripple/core_ext/indexes.rb
253
+ - lib/ripple/core_ext/object.rb
254
+ - lib/ripple/document.rb
255
+ - lib/ripple/document/bucket_access.rb
256
+ - lib/ripple/document/finders.rb
257
+ - lib/ripple/document/key.rb
258
+ - lib/ripple/document/link.rb
259
+ - lib/ripple/document/persistence.rb
260
+ - lib/ripple/embedded_document.rb
261
+ - lib/ripple/embedded_document/around_callbacks.rb
262
+ - lib/ripple/embedded_document/finders.rb
263
+ - lib/ripple/embedded_document/persistence.rb
264
+ - lib/ripple/i18n.rb
265
+ - lib/ripple/indexes.rb
266
+ - lib/ripple/inspection.rb
267
+ - lib/ripple/locale/en.yml
268
+ - lib/ripple/locale/fr.yml
269
+ - lib/ripple/nested_attributes.rb
270
+ - lib/ripple/observable.rb
271
+ - lib/ripple/properties.rb
272
+ - lib/ripple/property_type_mismatch.rb
273
+ - lib/ripple/railtie.rb
274
+ - lib/ripple/railties/ripple.rake
275
+ - lib/ripple/serialization.rb
276
+ - lib/ripple/test_server.rb
277
+ - lib/ripple/timestamps.rb
278
+ - lib/ripple/translation.rb
279
+ - lib/ripple/validations.rb
280
+ - lib/ripple/validations/associated_validator.rb
281
+ - lib/ripple/version.rb
282
+ homepage: http://github.com/cloudability/better-ripple
283
+ licenses: []
284
+ post_install_message:
285
+ rdoc_options: []
286
+ require_paths:
287
+ - lib
288
+ required_ruby_version: !ruby/object:Gem::Requirement
289
+ none: false
290
+ requirements:
291
+ - - ! '>='
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ segments:
295
+ - 0
296
+ hash: 2064328604662960294
297
+ required_rubygems_version: !ruby/object:Gem::Requirement
298
+ none: false
299
+ requirements:
300
+ - - ! '>='
301
+ - !ruby/object:Gem::Version
302
+ version: '0'
303
+ requirements: []
304
+ rubyforge_project:
305
+ rubygems_version: 1.8.24
306
+ signing_key:
307
+ specification_version: 3
308
+ summary: better-ripple is an improved version of ripple, an object-mapper library
309
+ for Riak.
310
+ test_files: []