capsule_crm 1.8.0 → 1.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 40b178add184629b0011c050d6c021eecb3061ed
4
- data.tar.gz: 07a406a438880798916012ef6af98fe59786db58
3
+ metadata.gz: 6cfdc83bc1370520aadef70ff71c92d7ce027a9b
4
+ data.tar.gz: 06ff75f4e1278b8c3f1b15a7a1c90a72ed2c860f
5
5
  SHA512:
6
- metadata.gz: d5e6e13677f95912036882050ad7e5babb5a662b813007ffe94ed293a10d5b0b54858aaa9459206d9065cce3fd2583263876bc48f30b26e221b1f149f7013bd8
7
- data.tar.gz: 4966758a6dfc65e830d68e133341dd104861e7afce472ea43907ed27fd7c65c3c23e15ed73138cdbd9a8154ee6201966e51f4b1247a13da56fa02ef316f0a3ea
6
+ metadata.gz: 69ff92ce9719c2756affb46c7de48027d72cd3a7378b0bc5f9798460f6ba097a39ec6007b06d5c8c83c09f8c8c239580092336977d42719526ac98479e3d03f0
7
+ data.tar.gz: 56acc7915da8a8a42344c5f1bfebf97e9b52f536b4f5200d962864e2a0a955e8a3c7e2a46c6d4a70051dd2583f0e7edcbccb09f8d1ead15e1e829ffca15bc435
data/.hound.yml CHANGED
@@ -285,7 +285,7 @@ MethodDefParentheses:
285
285
 
286
286
  MethodLength:
287
287
  Description: 'Avoid methods longer than 10 lines of code.'
288
- Enabled: false
288
+ Enabled: true
289
289
 
290
290
  MethodName:
291
291
  # Valid values are: snake_case, camelCase
data/CHANGELOG.md CHANGED
@@ -1,27 +1,40 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.0
4
+
5
+ - Raise a CapsuleCRM::Errors::AssociationTypeMismatch when an object of the
6
+ wrong type is set on a belongs to association.
7
+ [#79](https://github.com/mattbeedle/capsule_crm/pull/79)
8
+ - CapsuleCRM::Errors::RecordInvalid#to_s and #inspect methods are now more
9
+ descriptive [#78](https://github.com/mattbeedle/capsule_crm/pull/78)
10
+
3
11
  ## 1.8.0
4
12
 
5
13
  - Custom fields may now be deleted.
14
+ [#77](https://github.com/mattbeedle/capsule_crm/pull/77)
6
15
 
7
16
  ## 1.7.0
8
17
 
9
18
  - Inspecting items only displays their attributes now. Much cleaner for working
10
19
  on the console
20
+ [https://github.com/mattbeedle/capsule_crm/commit/cde082c1934ff97b6fa2dc9c56a01ca771d73b26](https://github.com/mattbeedle/capsule_crm/commit/cde082c1934ff97b6fa2dc9c56a01ca771d73b26)
11
21
 
12
22
  ## 1.6.2
13
23
 
14
- - Fix bug where responses errors always had a blank body
24
+ - Fix bug where responses errors always had a blank body.
25
+ [#76](https://github.com/mattbeedle/capsule_crm/pull/76)
15
26
 
16
27
  ## 1.6.1
17
28
 
18
29
  - Fix issue where if capsulecrm.com returned a blank error response the
19
- ResponseError would raise an undefined method exception
30
+ ResponseError would raise an undefined method exception.
31
+ [#74](https://github.com/mattbeedle/capsule_crm/pull/74)
20
32
 
21
33
  ## 1.6.0
22
34
 
23
35
  - ResponseError#to_s now return the response message from the server so errors
24
36
  are a little easier to debug.
37
+ [#69](https://github.com/mattbeedle/capsule_crm/pull/69)
25
38
 
26
39
  ## 1.5.3
27
40
 
@@ -2,12 +2,12 @@ require_relative 'belongs_to_association'
2
2
  require_relative 'belongs_to_finder'
3
3
 
4
4
  module CapsuleCRM
5
- module Associations
6
- module BelongsTo
5
+ module Associations # nodoc
6
+ module BelongsTo # nodoc
7
7
  extend ActiveSupport::Concern
8
8
 
9
+ # nodoc
9
10
  module ClassMethods
10
-
11
11
  # Public: Add getter and setter methods for belongs to associations
12
12
  #
13
13
  # association_name - The String name of the association
@@ -32,9 +32,9 @@ module CapsuleCRM
32
32
  # person.organisation
33
33
  # => organisation
34
34
  def belongs_to(association_name, options = {})
35
- association = CapsuleCRM::Associations::BelongsToAssociation.
36
- new(association_name, self, options)
37
- self.associations[association_name] = association
35
+ association = CapsuleCRM::Associations::BelongsToAssociation
36
+ .new(association_name, self, options)
37
+ associations[association_name] = association
38
38
 
39
39
  class_eval do
40
40
  attribute association.foreign_key, Integer
@@ -42,24 +42,25 @@ module CapsuleCRM
42
42
 
43
43
  (class << self; self; end).instance_eval do
44
44
  define_method "_for_#{association_name}" do |id|
45
- CapsuleCRM::Associations::BelongsToFinder.new(association).
46
- call(id)
45
+ CapsuleCRM::Associations::BelongsToFinder.new(association)
46
+ .call(id)
47
47
  end
48
48
  end
49
49
 
50
50
  define_method association_name do
51
51
  instance_variable_get(:"@#{association_name}") ||
52
- if self.send(association.foreign_key)
52
+ if send(association.foreign_key)
53
53
  association.parent(self).tap do |object|
54
- self.send("#{association_name}=", object)
54
+ send("#{association_name}=", object)
55
55
  end
56
56
  end
57
57
  end
58
58
 
59
59
  define_method "#{association_name}=" do |associated_object|
60
60
  associated_object.tap do |object|
61
- instance_variable_set(:"@#{association_name}", associated_object)
62
- self.send "#{association.foreign_key}=", associated_object.try(:id)
61
+ association.check_object! object if object
62
+ instance_variable_set(:"@#{association_name}", object)
63
+ send "#{association.foreign_key}=", object.try(:id)
63
64
  end
64
65
  end
65
66
  end
@@ -75,11 +75,28 @@ module CapsuleCRM
75
75
  end
76
76
 
77
77
  def serialize
78
- @serialize ||= options[:serialize]
78
+ @serialize ||= options[:serialize] == false ? false : true
79
+ end
80
+
81
+ def check_object!(object)
82
+ association_mismatch!(object) if object_invalid?(object)
79
83
  end
80
84
 
81
85
  private
82
86
 
87
+ def enforce_type?
88
+ true unless options[:enforce_type] == false
89
+ end
90
+
91
+ def object_invalid?(object)
92
+ enforce_type? && !object.is_a?(target_klass)
93
+ end
94
+
95
+ def association_mismatch!(object)
96
+ fail CapsuleCRM::Errors::AssociationTypeMismatch,
97
+ [object.class, target_klass], caller
98
+ end
99
+
83
100
  def infer_foreign_key
84
101
  "#{association_name}_id"
85
102
  end
@@ -0,0 +1,10 @@
1
+ module CapsuleCRM
2
+ module Errors
3
+ class AssociationTypeMismatch < StandardError
4
+ def initialize(args)
5
+ received, expected = *args
6
+ super "#{expected} expected, received #{received}"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,6 +1,12 @@
1
1
  module CapsuleCRM
2
2
  module Errors
3
3
  class RecordInvalid < StandardError
4
+ attr_reader :record
5
+
6
+ def initialize(record)
7
+ @record = record
8
+ super(record.errors.full_messages.join(', '))
9
+ end
4
10
  end
5
11
  end
6
12
  end
@@ -40,6 +40,7 @@ module CapsuleCRM
40
40
  attribute :expected_close_date, DateTime
41
41
  attribute :actual_close_date, DateTime
42
42
  attribute :probability, Float
43
+ attribute :owner, String
43
44
 
44
45
  attr_accessor :milestone, :owner
45
46
 
@@ -28,7 +28,7 @@ module CapsuleCRM
28
28
  belongs_to :case
29
29
  belongs_to :owner, class_name: 'CapsuleCRM::User', serializable_key: :owner
30
30
  belongs_to :category, class_name: 'CapsuleCRM::TaskCategory',
31
- serializable_key: :category
31
+ serializable_key: :category, enforce_type: false
32
32
 
33
33
  validates :id, numericality: { allow_blank: true }
34
34
  validates :description, presence: true
@@ -26,7 +26,7 @@ module CapsuleCRM
26
26
 
27
27
  validates :name, presence: true
28
28
 
29
- has_many :tasks
29
+ has_many :tasks, source: :category
30
30
 
31
31
  def id; name; end
32
32
  end
@@ -1,3 +1,3 @@
1
1
  module CapsuleCrm
2
- VERSION = '1.8.0'
2
+ VERSION = '1.9.0'
3
3
  end
data/lib/capsule_crm.rb CHANGED
@@ -30,6 +30,7 @@ require 'capsule_crm/website'
30
30
  require 'capsule_crm/hash_helper'
31
31
  require 'capsule_crm/results_proxy'
32
32
  require 'capsule_crm/errors'
33
+ require 'capsule_crm/errors/association_type_mismatch'
33
34
  require 'capsule_crm/errors/record_invalid'
34
35
  require 'capsule_crm/errors/record_not_saved'
35
36
  require 'capsule_crm/errors/response_error'
@@ -21,6 +21,38 @@ describe CapsuleCRM::Associations::BelongsToAssociation do
21
21
  new(association_name, defined_on, options)
22
22
  end
23
23
 
24
+ describe '#check_object!' do
25
+ context 'when the object is valid' do
26
+ let(:object) { CapsuleCRM::BelongsToAssociationTest.new }
27
+
28
+ it 'should not raise' do
29
+ expect { association.check_object!(object) }.not_to raise_error
30
+ end
31
+ end
32
+
33
+ context 'when the object is not valid' do
34
+ context 'when type checking is turned off' do
35
+ let(:options) do
36
+ {
37
+ class_name: 'CapsuleCRM::BelongsToAssociationTest',
38
+ enforce_type: false
39
+ }
40
+ end
41
+
42
+ it 'should not raise' do
43
+ expect { association.check_object!(double) }.not_to raise_error
44
+ end
45
+ end
46
+
47
+ context 'when type checking is turned on' do
48
+ it 'should raise an AssociationMismatch' do
49
+ expect { association.check_object!(double) }
50
+ .to raise_error(CapsuleCRM::Errors::AssociationTypeMismatch)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
24
56
  describe '#macro' do
25
57
  subject { association.macro }
26
58
 
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe CapsuleCRM::Errors::RecordInvalid do
4
+ let(:errors) { double('errors', full_messages: full_messages) }
5
+ let(:full_messages) do
6
+ ["Record can't be squishy", "Record can't be pink"]
7
+ end
8
+ let(:record) { double('Record', errors: errors) }
9
+
10
+ subject { described_class.new(record) }
11
+
12
+ describe '#to_s' do
13
+ it 'should return the full messages joined by ,' do
14
+ expect(subject.to_s).to eql(full_messages.join(', '))
15
+ end
16
+ end
17
+
18
+ describe '#record' do
19
+ it 'should be accessible' do
20
+ expect(subject.record).to eql(record)
21
+ end
22
+ end
23
+ end
@@ -28,7 +28,7 @@ describe CapsuleCRM::History do
28
28
 
29
29
  context 'when it belongs to a case' do
30
30
  before do
31
- subject.case = double('CapsuleCRM::Case', id: Random.rand(1..10))
31
+ subject.case = CapsuleCRM::Case.new(id: Random.rand(1..10))
32
32
  end
33
33
 
34
34
  it { should_not validate_presence_of(:party) }
@@ -37,7 +37,7 @@ describe CapsuleCRM::History do
37
37
 
38
38
  context 'when it belongs to a party' do
39
39
  before do
40
- subject.party = double('CapsuleCRM::Party', id: Random.rand(1..10))
40
+ subject.party = CapsuleCRM::Party.new(id: Random.rand(1..10))
41
41
  end
42
42
 
43
43
  it { should_not validate_presence_of(:case) }
@@ -47,7 +47,7 @@ describe CapsuleCRM::History do
47
47
  context 'when it belongs to an opportunity' do
48
48
  before do
49
49
  subject.opportunity =
50
- double('CapsuleCRM::Opportunity', id: Random.rand(1..10))
50
+ CapsuleCRM::Opportunity.new(id: Random.rand(1..10))
51
51
  end
52
52
 
53
53
  it { should_not validate_presence_of(:party) }
@@ -92,7 +92,7 @@ describe CapsuleCRM::Serializer do
92
92
  context 'when there are belongs to associations' do
93
93
  before do
94
94
  SerializableTest.send(
95
- :belongs_to, :person, class_name: 'SerializableTest'
95
+ :belongs_to, :person, class_name: 'CapsuleCRM::Person'
96
96
  )
97
97
  SerializableTest.send(
98
98
  :has_many, :things, class_name: 'SerializableTest',
@@ -100,7 +100,7 @@ describe CapsuleCRM::Serializer do
100
100
  )
101
101
  object.person = person
102
102
  end
103
- let(:person) { double('CapsuleCRM::Person', id: Random.rand(1..10)) }
103
+ let(:person) { CapsuleCRM::Person.new(id: Random.rand(1..10)) }
104
104
 
105
105
  context 'without a serializable key' do
106
106
  it 'should include the person id' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capsule_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Beedle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-09 00:00:00.000000000 Z
11
+ date: 2014-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -274,6 +274,7 @@ files:
274
274
  - lib/capsule_crm/custom_field_definition.rb
275
275
  - lib/capsule_crm/email.rb
276
276
  - lib/capsule_crm/errors.rb
277
+ - lib/capsule_crm/errors/association_type_mismatch.rb
277
278
  - lib/capsule_crm/errors/record_invalid.rb
278
279
  - lib/capsule_crm/errors/record_not_saved.rb
279
280
  - lib/capsule_crm/errors/response_error.rb
@@ -334,6 +335,7 @@ files:
334
335
  - spec/lib/capsule_crm/custom_field_definition_spec.rb
335
336
  - spec/lib/capsule_crm/custom_field_spec.rb
336
337
  - spec/lib/capsule_crm/email_spec.rb
338
+ - spec/lib/capsule_crm/errors/record_invalid_spec.rb
337
339
  - spec/lib/capsule_crm/errors/response_error_spec.rb
338
340
  - spec/lib/capsule_crm/errors_spec.rb
339
341
  - spec/lib/capsule_crm/faraday/middleware/raise_error_spec.rb
@@ -446,6 +448,7 @@ test_files:
446
448
  - spec/lib/capsule_crm/custom_field_definition_spec.rb
447
449
  - spec/lib/capsule_crm/custom_field_spec.rb
448
450
  - spec/lib/capsule_crm/email_spec.rb
451
+ - spec/lib/capsule_crm/errors/record_invalid_spec.rb
449
452
  - spec/lib/capsule_crm/errors/response_error_spec.rb
450
453
  - spec/lib/capsule_crm/errors_spec.rb
451
454
  - spec/lib/capsule_crm/faraday/middleware/raise_error_spec.rb