duck_record 0.0.11 → 0.0.12

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: 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