rrod 1.0.0.alpha.3.1 → 1.0.0.alpha.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4101da6fbe1ed4d4fcf254abdb4acca0728b46d1
4
- data.tar.gz: 76b4c7882a859a31c3e79c981b8455a42c03f4a0
3
+ metadata.gz: 73a47a1b2feaa5f8ca345afab9b483e5755d710b
4
+ data.tar.gz: 000a4429b93fe6a68df919e3a1295abc27a71a0b
5
5
  SHA512:
6
- metadata.gz: 8990dc1552f05775cf3e61af09eed0515fdafb5ea19a2eb0c4294fc4090f487e148cb4cdac07778ceccc417a98233f753d1b91362dd5ff565dc66cef683a2e28
7
- data.tar.gz: 92366b857caa0a345965b9befaf882f5d57d0896315cdf15e0ec6b54727994dc2c45d31a34dafe48812557c4ce6f3a7f83402f0cc3c88569164809ab87f2daf3
6
+ metadata.gz: 4267a72e45678a7f60eb7fbd756d7fd88bdfb552a38eb596dcf768d59aa99dece04a297151e31d6dfb70f59c5d231b1d635e2dec80278724d2c930b8ea6ba4d7
7
+ data.tar.gz: 74ef9e7c3c8d511e080fbc143c62ff6dc9813902cbe427bb6de738672d213ab0eb58f305fa6202f9ba6f33a815ddc9162917d387403e99d6474d084368ce40de
@@ -2,12 +2,12 @@ module Rrod
2
2
  class Caster
3
3
  module NestedModel
4
4
 
5
- def rrod_cast(values)
5
+ def rrod_cast(values, model)
6
6
  return if values.nil?
7
- Rrod::Model::Collection.new(model, values)
7
+ Rrod::Model::Collection.new(model, model_class, values)
8
8
  end
9
9
 
10
- def model
10
+ def model_class
11
11
  first
12
12
  end
13
13
 
data/lib/rrod/caster.rb CHANGED
@@ -5,14 +5,14 @@ module Rrod
5
5
  @casting = casting
6
6
  end
7
7
 
8
- def rrod_cast(value)
8
+ def rrod_cast(value, instance=nil)
9
9
  return if value.nil?
10
10
  @casting.(value)
11
11
  end
12
12
 
13
13
  module Boolean
14
14
  extend self
15
- def rrod_cast(value)
15
+ def rrod_cast(value, instance=nil)
16
16
  [nil, false, 'false', 0, '0'].include?(value) ? false : true
17
17
  end
18
18
  end
@@ -9,6 +9,10 @@ module Rrod
9
9
  def self.writer_definition(name)
10
10
  ->(value) { write_attribute name, value }
11
11
  end
12
+
13
+ def self.presence_definition(name)
14
+ -> { self[name].present? }
15
+ end
12
16
 
13
17
  attr_accessor :model, :name, :type, :options, :default, :index
14
18
 
@@ -20,7 +24,7 @@ module Rrod
20
24
  self.model = model
21
25
  self.name = name.to_sym
22
26
  self.type = type
23
- self.default = options.delete(:default)
27
+ self.default = options.delete(:default) || nested_default
24
28
  self.options = options
25
29
  set_index if options.delete(:index)
26
30
  end
@@ -33,13 +37,14 @@ module Rrod
33
37
  def define
34
38
  define_reader
35
39
  define_writer
40
+ define_presence
36
41
  apply_validators
37
42
  self
38
43
  end
39
44
 
40
- def cast(value)
45
+ def cast(value, instance)
41
46
  caster = type.respond_to?(:rrod_cast) ? type : rrod_caster
42
- caster ? caster.rrod_cast(value) : value
47
+ caster ? caster.rrod_cast(value, instance) : value
43
48
  end
44
49
 
45
50
  private
@@ -57,6 +62,12 @@ module Rrod
57
62
  type.is_a?(Array) and type.first.ancestors.include?(Rrod::Model)
58
63
  end
59
64
 
65
+ def nested_default
66
+ return unless nested_model?
67
+ model_class = type.model_class
68
+ -> { Rrod::Model::Collection.new(self, model_class) }
69
+ end
70
+
60
71
  def define_reader
61
72
  model.send :define_method, name, self.class.reader_definition(name)
62
73
  end
@@ -64,6 +75,10 @@ module Rrod
64
75
  def define_writer
65
76
  model.send :define_method, "#{name}=", self.class.writer_definition(name)
66
77
  end
78
+
79
+ def define_presence
80
+ model.send :define_method, "#{name}?", self.class.presence_definition(name)
81
+ end
67
82
 
68
83
  def set_index
69
84
  @index = Index.new(self)
@@ -48,9 +48,7 @@ module Rrod
48
48
  # @param [Symbol, String] the key of the attribute to write
49
49
  # @param the value to write to attributes
50
50
  def write_attribute(key, value)
51
- @attributes[key.to_s] = self.class.cast_attribute(key, value).tap { |attr|
52
- attr._parent = self if attr.respond_to?(:_parent=)
53
- }
51
+ @attributes[key.to_s] = self.class.cast_attribute(key, value, self)
54
52
  end
55
53
  alias :[]= :write_attribute
56
54
 
@@ -2,14 +2,15 @@ module Rrod
2
2
  module Model
3
3
  class Collection
4
4
  include Enumerable
5
- attr_accessor :model
5
+ attr_accessor :parent, :model
6
6
 
7
7
  # explicitly declare the public interface to the underlying collection
8
- COLLECTION_INTERFACE = %w[clear count each length size [] first last]
8
+ COLLECTION_INTERFACE = %w[clear count each length size [] first last empty?]
9
9
 
10
10
  delegate(*COLLECTION_INTERFACE, to: :collection)
11
11
 
12
- def initialize(model, collection=[])
12
+ def initialize(parent, model, collection=[])
13
+ self.parent = parent
13
14
  self.model = model
14
15
  self.collection = collection
15
16
  end
@@ -34,7 +35,7 @@ module Rrod
34
35
  end
35
36
 
36
37
  def push(value)
37
- instance = model.rrod_cast(value)
38
+ instance = model.rrod_cast(value, parent)
38
39
  raise InvalidMemberTypeError.new unless model === instance
39
40
  collection.push(instance)
40
41
  end
@@ -17,6 +17,12 @@ module Rrod
17
17
  def save
18
18
  persist
19
19
  end
20
+
21
+ def update(attributes)
22
+ self.attributes = attributes
23
+ save
24
+ end
25
+ alias :update_attributes :update
20
26
 
21
27
  def persist
22
28
  bucket.enable_index!
@@ -10,9 +10,9 @@ module Rrod
10
10
  attributes[name.to_sym] = Attribute.new(self, name, type, options).define
11
11
  end
12
12
 
13
- def cast_attribute(key, value)
13
+ def cast_attribute(key, value, instance)
14
14
  attribute = attributes[key.to_sym]
15
- attribute ? attribute.cast(value) : value
15
+ attribute ? attribute.cast(value, instance) : value
16
16
  end
17
17
 
18
18
  def nested_in(parent)
@@ -23,11 +23,19 @@ module Rrod
23
23
  attributes.any?
24
24
  end
25
25
 
26
- def rrod_cast(value)
27
- return if value.nil?
28
- return value if value.is_a?(Rrod::Model)
29
- raise UncastableObjectError.new("#{value.inspect} cannot be rrod_cast") unless Hash === value
30
- instantiate(nil, value)
26
+ def rrod_cast(value, parent=nil)
27
+ return if value.nil?
28
+
29
+ cast_model = case value
30
+ when Rrod::Model
31
+ value
32
+ when Hash
33
+ instantiate(nil, value)
34
+ else
35
+ raise UncastableObjectError.new("#{value.inspect} cannot be rrod_cast") unless Hash === value
36
+ end
37
+
38
+ cast_model.tap { |m| m._parent = parent }
31
39
  end
32
40
 
33
41
  end
@@ -13,12 +13,12 @@ module Rrod
13
13
  end
14
14
 
15
15
  ::RSpec.configure do |config|
16
- config.before(:each, :integration => true) do
16
+ config.before(:each, :integration => true) do |example|
17
17
  if Rrod::TestServer.fatal
18
18
  fail "Test server not working: #{Rrod::TestServer.fatal}"
19
19
  end
20
20
 
21
- if ::RSpec.current_example.metadata[:test_server] == false
21
+ if example.metadata[:test_server] == false
22
22
  Rrod::TestServer.stop
23
23
  else
24
24
  Rrod::TestServer.create unless Rrod::TestServer.exist?
@@ -30,12 +30,12 @@ module Rrod
30
30
  end
31
31
  end
32
32
 
33
- config.after(:each, :integration => true) do
33
+ config.after(:each, :integration => true) do |example|
34
34
  # i really don't understand this...
35
35
  # well the 'example' needs to be accessed another way, Rspec.current_example.
36
36
  if !Rrod::TestServer.fatal &&
37
37
  Rrod::TestServer.started? &&
38
- ::RSpec.current_example.metadata[:test_server] != false
38
+ example.metadata[:test_server] != false
39
39
  Rrod::TestServer.drop
40
40
  end
41
41
  end
data/lib/rrod/version.rb CHANGED
@@ -1,2 +1,2 @@
1
1
  Rrod = Module.new unless defined? Rrod
2
- Rrod::VERSION = '1.0.0.alpha.3.1'
2
+ Rrod::VERSION = '1.0.0.alpha.4'
data/rrod.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency "pry", "~> 0.9"
29
29
 
30
30
  spec.add_development_dependency "bundler", "~> 1.3"
31
- spec.add_development_dependency "rspec", "~> 2.14"
31
+ spec.add_development_dependency "rspec", "~> 3.1.0"
32
32
 
33
33
  spec.add_development_dependency "rake"
34
34
  end
@@ -73,12 +73,18 @@ describe Rrod::Model::Attribute do
73
73
  expect(instance).to respond_to("#{name}=")
74
74
  end
75
75
  end
76
+
77
+ describe "presence" do
78
+ it "checks for presence" do
79
+ expect(instance).to respond_to("#{name}?")
80
+ end
81
+ end
76
82
  end
77
83
 
78
84
  describe "casting" do
79
85
  it "will use the types rrod_cast method if available" do
80
86
  type = Class.new {
81
- def self.rrod_cast(value)
87
+ def self.rrod_cast(value, instance)
82
88
  value.to_s.upcase
83
89
  end
84
90
  }
@@ -2,8 +2,12 @@ require 'spec_helper'
2
2
  require 'support/models/person'
3
3
 
4
4
  describe Rrod::Model::Collection do
5
+ let(:owner) { Person.new }
5
6
  let(:array) { [Pet.new] }
6
- let(:collection) { described_class.new(Pet, array) }
7
+ let(:collection) {
8
+ owner.pets = array
9
+ owner.pets
10
+ }
7
11
 
8
12
  describe "initialization" do
9
13
  it "takes a collection" do
@@ -11,7 +15,7 @@ describe Rrod::Model::Collection do
11
15
  end
12
16
 
13
17
  it "defaults to an empty collection" do
14
- expect(described_class.new(Pet).collection).to be_an Array
18
+ expect(described_class.new(owner, Pet).collection).to be_an Array
15
19
  end
16
20
 
17
21
  describe "#build" do
@@ -25,6 +29,11 @@ describe Rrod::Model::Collection do
25
29
  object = collection.build(name: 'Molle')
26
30
  expect(object).to be_a(Pet)
27
31
  end
32
+
33
+ it "assigns the _parent to the built object" do
34
+ pet = collection.build(name: 'Molle')
35
+ expect(pet.owner).to eq(owner)
36
+ end
28
37
  end
29
38
 
30
39
 
@@ -43,7 +52,7 @@ describe Rrod::Model::Collection do
43
52
  end
44
53
 
45
54
  it "clears the collection" do
46
- collection = described_class.new(Pet)
55
+ collection = described_class.new(owner, Pet)
47
56
  begin; collection.collection = array; rescue; end
48
57
  expect(collection.collection).to be_empty
49
58
  end
@@ -39,5 +39,18 @@ describe Rrod::Model::Persistence, integration: true do
39
39
  expect(instance.id).not_to be_nil
40
40
  end
41
41
  end
42
+
43
+ describe "update models" do
44
+ before :each do
45
+ instance.save
46
+ end
47
+
48
+ it "updates attributes" do
49
+ instance.update wheels: 6
50
+ expect(instance.wheels).to eq 6
51
+ end
52
+
53
+
54
+ end
42
55
  end
43
56
  end
@@ -64,6 +64,14 @@ describe Rrod::Model::Schema do
64
64
  expect(instance.pets.first.owner).to eq(instance)
65
65
  end
66
66
 
67
+ it "returns an empty collection when referencing an empty association" do
68
+ expect(instance.pets).to be_empty
69
+ end
70
+
71
+ it "allows building a nested model on an empty collection" do
72
+ expect { instance.pets.build(name: 'Molle') }.not_to raise_error
73
+ end
74
+
67
75
  end
68
76
 
69
77
  it "raises an UncastableObjectError if object is not castable" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rrod
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.3.1
4
+ version: 1.0.0.alpha.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Hunter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-14 00:00:00.000000000 Z
11
+ date: 2015-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: riak-client
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '2.14'
117
+ version: 3.1.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '2.14'
124
+ version: 3.1.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement