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.
- data/LICENSE +17 -0
- data/README.md +182 -0
- data/RELEASE_NOTES.md +284 -0
- data/better-ripple.gemspec +55 -0
- data/lib/rails/generators/ripple/configuration/configuration_generator.rb +13 -0
- data/lib/rails/generators/ripple/configuration/templates/ripple.yml +25 -0
- data/lib/rails/generators/ripple/js/js_generator.rb +13 -0
- data/lib/rails/generators/ripple/js/templates/js/contrib.js +63 -0
- data/lib/rails/generators/ripple/js/templates/js/iso8601.js +76 -0
- data/lib/rails/generators/ripple/js/templates/js/ripple.js +132 -0
- data/lib/rails/generators/ripple/model/model_generator.rb +20 -0
- data/lib/rails/generators/ripple/model/templates/model.rb.erb +10 -0
- data/lib/rails/generators/ripple/observer/observer_generator.rb +16 -0
- data/lib/rails/generators/ripple/observer/templates/observer.rb.erb +2 -0
- data/lib/rails/generators/ripple/test/templates/cucumber.rb.erb +7 -0
- data/lib/rails/generators/ripple/test/test_generator.rb +44 -0
- data/lib/rails/generators/ripple_generator.rb +79 -0
- data/lib/ripple.rb +86 -0
- data/lib/ripple/associations.rb +380 -0
- data/lib/ripple/associations/embedded.rb +35 -0
- data/lib/ripple/associations/instantiators.rb +26 -0
- data/lib/ripple/associations/linked.rb +65 -0
- data/lib/ripple/associations/many.rb +38 -0
- data/lib/ripple/associations/many_embedded_proxy.rb +39 -0
- data/lib/ripple/associations/many_linked_proxy.rb +66 -0
- data/lib/ripple/associations/many_reference_proxy.rb +95 -0
- data/lib/ripple/associations/many_stored_key_proxy.rb +76 -0
- data/lib/ripple/associations/one.rb +20 -0
- data/lib/ripple/associations/one_embedded_proxy.rb +35 -0
- data/lib/ripple/associations/one_key_proxy.rb +58 -0
- data/lib/ripple/associations/one_linked_proxy.rb +26 -0
- data/lib/ripple/associations/one_stored_key_proxy.rb +43 -0
- data/lib/ripple/associations/proxy.rb +118 -0
- data/lib/ripple/attribute_methods.rb +132 -0
- data/lib/ripple/attribute_methods/dirty.rb +59 -0
- data/lib/ripple/attribute_methods/query.rb +34 -0
- data/lib/ripple/attribute_methods/read.rb +28 -0
- data/lib/ripple/attribute_methods/write.rb +25 -0
- data/lib/ripple/callbacks.rb +71 -0
- data/lib/ripple/conflict/basic_resolver.rb +86 -0
- data/lib/ripple/conflict/document_hooks.rb +46 -0
- data/lib/ripple/conflict/resolver.rb +79 -0
- data/lib/ripple/conflict/test_helper.rb +34 -0
- data/lib/ripple/conversion.rb +29 -0
- data/lib/ripple/core_ext.rb +3 -0
- data/lib/ripple/core_ext/casting.rb +151 -0
- data/lib/ripple/core_ext/indexes.rb +89 -0
- data/lib/ripple/core_ext/object.rb +8 -0
- data/lib/ripple/document.rb +105 -0
- data/lib/ripple/document/bucket_access.rb +25 -0
- data/lib/ripple/document/finders.rb +131 -0
- data/lib/ripple/document/key.rb +35 -0
- data/lib/ripple/document/link.rb +30 -0
- data/lib/ripple/document/persistence.rb +130 -0
- data/lib/ripple/embedded_document.rb +63 -0
- data/lib/ripple/embedded_document/around_callbacks.rb +18 -0
- data/lib/ripple/embedded_document/finders.rb +26 -0
- data/lib/ripple/embedded_document/persistence.rb +75 -0
- data/lib/ripple/i18n.rb +5 -0
- data/lib/ripple/indexes.rb +151 -0
- data/lib/ripple/inspection.rb +32 -0
- data/lib/ripple/locale/en.yml +26 -0
- data/lib/ripple/locale/fr.yml +24 -0
- data/lib/ripple/nested_attributes.rb +275 -0
- data/lib/ripple/observable.rb +28 -0
- data/lib/ripple/properties.rb +74 -0
- data/lib/ripple/property_type_mismatch.rb +12 -0
- data/lib/ripple/railtie.rb +26 -0
- data/lib/ripple/railties/ripple.rake +103 -0
- data/lib/ripple/serialization.rb +82 -0
- data/lib/ripple/test_server.rb +35 -0
- data/lib/ripple/timestamps.rb +25 -0
- data/lib/ripple/translation.rb +18 -0
- data/lib/ripple/validations.rb +65 -0
- data/lib/ripple/validations/associated_validator.rb +43 -0
- data/lib/ripple/version.rb +3 -0
- 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
|
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: []
|