duck_record 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1fffce17ba17b6f56bb65f12a64cd4a62a297e0b
4
- data.tar.gz: fc5f292b1eb03dfa856b4776df57b0535052b80f
3
+ metadata.gz: 94d686747e67e2fd89839e277156b05e45bae20a
4
+ data.tar.gz: aedff996d41cc23adf9686041eb0817e2db29f65
5
5
  SHA512:
6
- metadata.gz: bfa5e099a22e92992d90381854708f43a2890c6dd7730bc9be4ee43c112b11b7d7554fe5b3a4420c32b2bf9446b67eb60d809873076021fb1a65cbbb1fe5f7e9
7
- data.tar.gz: bff27304fdbf8e7bad4ebaac002e9210ac79a0a41157e58d754d5a11eaa5a0f1b3a53c6d547c02957269e60d194e38196b93a756101c74c1963fda3eb3af0882
6
+ metadata.gz: 59898083c6f86b92da56fb15b990c1df664647319def15335f56b414a1fe41133f2fde382eec4738f2eaa29e32cfd4f2f5cf6207559dc1f9be14e14a25abbf31
7
+ data.tar.gz: b1dd8db43eb6f791bc4c0671202ec0e36a9b59b3a28e5db43b45a1b75a5a53c45a7dcba324aa6697dcfc3160f7e4bcf2ae3985b3fa04c65cd5ecbd3a61a5edb1
@@ -77,7 +77,7 @@ module DuckRecord
77
77
  unless fresh_class && record.is_a?(fresh_class)
78
78
  message = "#{reflection.class_name}(##{reflection.klass.object_id}) expected, "\
79
79
  "got #{record.inspect} which is an instance of #{record.class}(##{record.class.object_id})"
80
- raise ActiveRecord::AssociationTypeMismatch, message
80
+ raise DuckRecord::AssociationTypeMismatch, message
81
81
  end
82
82
  end
83
83
  end
@@ -85,7 +85,8 @@ module DuckRecord::Associations::Builder # :nodoc:
85
85
 
86
86
  def self.define_writers(mixin, name)
87
87
  mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
88
- def #{name}=(value)
88
+ def #{name}=(value, force_write_readonly: false)
89
+ return if !force_write_readonly && self.class.readonly_attributes.include?("#{name}")
89
90
  association(:#{name}).writer(value)
90
91
  end
91
92
  CODE
@@ -40,7 +40,11 @@ module DuckRecord
40
40
  end
41
41
 
42
42
  def build(attributes = {}, &block)
43
- if attributes.is_a?(Array)
43
+ if attributes.is_a?(klass)
44
+ add_to_target(attributes) do |record|
45
+ yield(record) if block_given?
46
+ end
47
+ elsif attributes.is_a?(Array)
44
48
  attributes.collect { |attr| build(attr, &block) }
45
49
  else
46
50
  add_to_target(build_record(attributes)) do |record|
@@ -53,8 +57,13 @@ module DuckRecord
53
57
  # be chained. Since << flattens its argument list and inserts each record,
54
58
  # +push+ and +concat+ behave identically.
55
59
  def concat(*records)
56
- records = records.flatten
57
- @target.concat records
60
+ records.flatten.each do |r|
61
+ begin
62
+ build(r)
63
+ rescue
64
+ raise_on_type_mismatch!(r)
65
+ end
66
+ end
58
67
  end
59
68
 
60
69
  # Removes all records from the association without calling callbacks
@@ -130,7 +139,14 @@ module DuckRecord
130
139
  # Replace this collection with +other_array+. This will perform a diff
131
140
  # and delete/add only records that have changed.
132
141
  def replace(other_array)
133
- @target = other_array
142
+ delete_all
143
+ other_array.each do |item|
144
+ begin
145
+ build(item)
146
+ rescue
147
+ raise_on_type_mismatch!(r)
148
+ end
149
+ end
134
150
  end
135
151
 
136
152
  def include?(record)
@@ -3,9 +3,14 @@ module DuckRecord
3
3
  module Associations
4
4
  class HasOneAssociation < SingularAssociation #:nodoc:
5
5
  def replace(record)
6
- raise_on_type_mismatch!(record) if record
7
-
8
- self.target = record
6
+ self.target =
7
+ if record.is_a? klass
8
+ record
9
+ elsif record.respond_to?(:to_h)
10
+ build_record(record.to_h)
11
+ end
12
+ rescue
13
+ raise_on_type_mismatch!(record)
9
14
  end
10
15
  end
11
16
  end
@@ -22,6 +22,21 @@ module DuckRecord
22
22
  class ConfigurationError < DuckRecordError
23
23
  end
24
24
 
25
+ # Raised when an object assigned to an association has an incorrect type.
26
+ #
27
+ # class Ticket < ActiveRecord::Base
28
+ # has_many :patches
29
+ # end
30
+ #
31
+ # class Patch < ActiveRecord::Base
32
+ # belongs_to :ticket
33
+ # end
34
+ #
35
+ # # Comments are not patches, this assignment raises AssociationTypeMismatch.
36
+ # @ticket.patches << Comment.new(content: "Please attach tests to your patch.")
37
+ class AssociationTypeMismatch < DuckRecordError
38
+ end
39
+
25
40
  # Raised when unknown attributes are supplied via mass assignment.
26
41
  UnknownAttributeError = ActiveModel::UnknownAttributeError
27
42
 
@@ -149,14 +149,14 @@ module DuckRecord
149
149
  # <tt>has_many :clients</tt> returns <tt>{}</tt>
150
150
  attr_reader :options
151
151
 
152
- attr_reader :active_record
152
+ attr_reader :duck_record
153
153
 
154
154
  attr_reader :plural_name # :nodoc:
155
155
 
156
- def initialize(name, options, active_record)
156
+ def initialize(name, options, duck_record)
157
157
  @name = name
158
158
  @options = options
159
- @active_record = active_record
159
+ @duck_record = duck_record
160
160
  @klass = options[:anonymous_class]
161
161
  @plural_name = name.to_s.pluralize
162
162
  end
@@ -200,12 +200,12 @@ module DuckRecord
200
200
  end
201
201
 
202
202
  def compute_class(name)
203
- active_record.send(:compute_type, name)
203
+ duck_record.send(:compute_type, name)
204
204
  end
205
205
 
206
206
  attr_accessor :parent_reflection # Reflection
207
207
 
208
- def initialize(name, options, active_record)
208
+ def initialize(name, options, duck_record)
209
209
  super
210
210
  @constructable = calculate_constructable(macro, options)
211
211
 
@@ -1,3 +1,3 @@
1
1
  module DuckRecord
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duck_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - jasl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-13 00:00:00.000000000 Z
11
+ date: 2017-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -156,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  version: '0'
157
157
  requirements: []
158
158
  rubyforge_project:
159
- rubygems_version: 2.6.11
159
+ rubygems_version: 2.6.12
160
160
  signing_key:
161
161
  specification_version: 4
162
162
  summary: Used for creating virtual models like ActiveType or ModelAttribute does