better-ripple 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []