capsule_crm 0.9.0 → 0.9.1

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: 9c9c330d4eeb07e7c78b092407c54bde1d851b7d
4
- data.tar.gz: 745c544f60e55e8d7ce5aa9e8e3abdb79c80c0e2
3
+ metadata.gz: 143725dc45cebfffee7104b902cda999f6e5d5a4
4
+ data.tar.gz: b15eee85686b5e11f0f2c5cea64701ed85d02a9c
5
5
  SHA512:
6
- metadata.gz: c8643c862014d2c0fa7980d6f9c6cdc82279a4fa9e513b556012e1bb902f325a1b61fbeb107d1f92dd5b781c0ce7ab4d5592f55921337c1dd85b90676d78d3f0
7
- data.tar.gz: ff1850b21048a9994f05b1678895b522089c24240329d436da85e852874986049b8d53217b7122612c14488a8c0105092d59e036c288e61b4f339fc1b6d17a79
6
+ metadata.gz: d3ca68c5b10e99a3b7cbe9b2fad98d4a84e1d4b3d79bc7fcfdbe327c038a1b122a5504cd8c02a74b67620cc9f7704571d6b8c06e5717ab2d4aa3e938a16a80fe
7
+ data.tar.gz: b20d34a05f2695e836e07bf2c1053dcf7806a96297d31dacdfbcf1797b55d9c0f7577a1a77a03109b3f579be816c2cd924ae9b6b81dfc25a197de073c10e2115
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.1
4
+
5
+ - Refactored code for finding parties/people/organizations to make sure that
6
+ contacts are always a CapsuleCRM::Contacts when finding a record
7
+ - Moved attributes= into a module
8
+
3
9
  ## 0.9.0
4
10
 
5
11
  ### New Features
data/Guardfile CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  notification :tmux
5
5
 
6
- guard 'rspec', all_on_start: true, all_after_pass: true do
6
+ guard 'rspec', all_on_start: true, all_after_pass: true, keep_failed: true do
7
7
  watch(%r{^spec/.+_spec\.rb$})
8
8
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
9
  watch('spec/spec_helper.rb') { "spec" }
data/lib/capsule_crm.rb CHANGED
@@ -2,6 +2,7 @@ require 'active_model'
2
2
  require 'faraday'
3
3
  require 'faraday_middleware'
4
4
  require 'virtus'
5
+ require 'capsule_crm/attributes'
5
6
  require 'capsule_crm/capsule_jsonable'
6
7
  require 'capsule_crm/taggable'
7
8
  require 'capsule_crm/collection'
@@ -0,0 +1,11 @@
1
+ module CapsuleCRM
2
+ module Attributes
3
+ extend ActiveSupport::Concern
4
+
5
+ def attributes=(attributes)
6
+ CapsuleCRM::HashHelper.underscore_keys!(attributes)
7
+ super(attributes)
8
+ self
9
+ end
10
+ end
11
+ end
@@ -14,6 +14,9 @@ module CapsuleCRM
14
14
  end
15
15
 
16
16
  def contacts=(contacts)
17
+ if contacts.is_a?(Hash)
18
+ contacts = CapsuleCRM::Contacts.new(contacts.symbolize_keys)
19
+ end
17
20
  @contacts = contacts
18
21
  end
19
22
 
@@ -15,10 +15,10 @@ module CapsuleCRM
15
15
  #
16
16
  # Returns a CapsuleCRM::Contact
17
17
  def initialize(attributes = {})
18
- self.addresses = Array(attributes[:addresses])
19
- self.emails = Array(attributes[:emails])
20
- self.phones = Array(attributes[:phones])
21
- self.websites = Array(attributes[:websites])
18
+ self.addresses = attributes[:addresses] || attributes[:address]
19
+ self.emails = attributes[:emails] || attributes[:email]
20
+ self.phones = attributes[:phones] || attributes[:phone]
21
+ self.websites = attributes[:websites] || attributes[:website]
22
22
  end
23
23
 
24
24
  # Public: Sets the addresses for this contacts container
@@ -34,7 +34,8 @@ module CapsuleCRM
34
34
  #
35
35
  # Returns an Array of CapsuleCRM::Address objects
36
36
  def addresses=(addresses)
37
- @addresses = addresses
37
+ addresses = CapsuleCRM::Address.new(addresses) if addresses.is_a?(Hash)
38
+ @addresses = Array(addresses)
38
39
  end
39
40
 
40
41
  # Public: Gets the addresses for this contacts container
@@ -45,7 +46,7 @@ module CapsuleCRM
45
46
  #
46
47
  # Returns an Array of CapsuleCRM::Address objects
47
48
  def addresses
48
- @addresses || []
49
+ Array(@addresses)
49
50
  end
50
51
 
51
52
  # Public: Sets the emails for this contacts container
@@ -61,7 +62,8 @@ module CapsuleCRM
61
62
  #
62
63
  # Returns an Array of CapsuleCRM::Email objects
63
64
  def emails=(emails)
64
- @emails = emails
65
+ emails = CapsuleCRM::Email.new(emails) if emails.is_a?(Hash)
66
+ @emails = Array(emails)
65
67
  end
66
68
 
67
69
  # Public: Gets the emails for this contacts container
@@ -87,7 +89,8 @@ module CapsuleCRM
87
89
  #
88
90
  # Returns an Array of CapsuleCRM::Phone objects
89
91
  def phones=(phones)
90
- @phones = phones
92
+ phones = CapsuleCRM::Phone.new(phones) if phones.is_a?(Hash)
93
+ @phones = Array(phones)
91
94
  end
92
95
 
93
96
  # Public: Gets the phones for this contacts container
@@ -115,7 +118,8 @@ module CapsuleCRM
115
118
  #
116
119
  # Returns an Array of CapsuleCRM::Website objects
117
120
  def websites=(websites)
118
- @websites = websites
121
+ websites = CapsuleCRM::Website.new(websites) if websites.is_a?(Hash)
122
+ @websites = Array(websites)
119
123
  end
120
124
 
121
125
  # Public: Gets the websites for this contacts container
@@ -7,6 +7,7 @@ module CapsuleCRM
7
7
  include ActiveModel::Validations
8
8
 
9
9
  include CapsuleCRM::Associations
10
+ include CapsuleCRM::Attributes
10
11
  include CapsuleCRM::Collection
11
12
 
12
13
  attribute :id, Integer
@@ -33,12 +34,6 @@ module CapsuleCRM
33
34
  alias :_for_person :_for_party
34
35
  end
35
36
 
36
- def attributes=(attributes)
37
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
38
- super(attributes)
39
- self
40
- end
41
-
42
37
  def self.create(attributes = {})
43
38
  new(attributes).tap(&:save)
44
39
  end
@@ -69,16 +64,10 @@ module CapsuleCRM
69
64
  def to_capsule_json
70
65
  {
71
66
  customFields: {
72
- customField: [CapsuleCRM::HashHelper.camelize_keys(
73
- {
74
- id: id,
75
- label: label,
76
- date: date,
77
- tag: tag,
78
- boolean: boolean,
79
- text: text,
80
- }.delete_if { |key, value| value.blank? }
81
- )]
67
+ customField: [
68
+ CapsuleCRM::HashHelper.camelize_keys(attributes).
69
+ delete_if { |key, value| value.blank? }
70
+ ]
82
71
  }
83
72
  }
84
73
  end
@@ -9,5 +9,10 @@ module CapsuleCRM
9
9
 
10
10
  attribute :type
11
11
  attribute :email_address
12
+
13
+ def initialize(attributes = {})
14
+ CapsuleCRM::HashHelper.underscore_keys!(attributes)
15
+ super(attributes)
16
+ end
12
17
  end
13
18
  end
@@ -7,6 +7,7 @@ module CapsuleCRM
7
7
  include ActiveModel::Validations
8
8
 
9
9
  include CapsuleCRM::Associations
10
+ include CapsuleCRM::Attributes
10
11
  include CapsuleCRM::Collection
11
12
 
12
13
  attribute :id, Integer
@@ -56,48 +57,6 @@ module CapsuleCRM
56
57
  )
57
58
  end
58
59
 
59
- # Public: Underscore all of the attributes keys and set the attributes of
60
- # this history item
61
- #
62
- # attributes - The Hash of history attributes (default: {}):
63
- # :id - The Integer ID of this history item
64
- # :creator - The String username of the creator
65
- # (CapsuleCRM::User) OR a CapsuleCRM::User object
66
- # :type - The String type (Note, Email or Task)
67
- # :note - The String note
68
- # :subject - The String email subject if this history
69
- # item is from an email
70
- # :entry_date - The date when this history item was
71
- # created
72
- # :attachments - An Array of CapsuleCRM::Attachment
73
- # objects OR an Array of CapsuleCRM::Attachment attributes
74
- # hashes
75
- # :participants - An Array of CapsuleCRM::Participant
76
- # objects OR an Array of CapsuleCRM::Participant attributes
77
- # hashes
78
- # :party_id - The Integer ID of the party that this
79
- # history item belongs to
80
- # :case_id - The Integer ID of the case that this
81
- # history item belongs to
82
- # :opportunity_id - The Integer ID of the opportunity that
83
- # this item belongs to
84
- #
85
- # Examples
86
- #
87
- # history = CapsuleCRM::History.new
88
- # history.attributes = { entry_date: Time.now }
89
- #
90
- # or
91
- #
92
- # history.attributes = { entryDate: Time.now }
93
- #
94
- # Returns a CapsuleCRM::History object
95
- def attributes=(attributes)
96
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
97
- super(attributes)
98
- self
99
- end
100
-
101
60
  # Public: find a CapsuleCRM::History by ID
102
61
  #
103
62
  # id - The Integer CapsuleCRM::History ID
@@ -7,6 +7,7 @@ module CapsuleCRM
7
7
  include ActiveModel::Validations
8
8
 
9
9
  include CapsuleCRM::Associations
10
+ include CapsuleCRM::Attributes
10
11
  include CapsuleCRM::Collection
11
12
 
12
13
  attribute :id, Integer
@@ -41,36 +42,6 @@ module CapsuleCRM
41
42
  self
42
43
  end
43
44
 
44
- # Public: Set the attributes of a opportunity
45
- #
46
- # attributes - The Hash of attributes (default: {}):
47
- # :name - The String opportunity name
48
- # :description - The String opportunity description
49
- # :currency - The String currency code
50
- # :value - The Float opportunity (financial) value
51
- # :duration_basis - The String duration basis
52
- # :duration - The Integer duration (for opportunities
53
- # with a repeating (not FIXED) duratin basis
54
- # :party_id - The Integer party id
55
- # :milestone_id - The Integer milestone id
56
- # :expected_close_date - The DateTime when the opportunity
57
- # is expected to be closed
58
- # :actual_close_date - The DateTime when the opportunity
59
- # was actually closed
60
- # :probability - The Float probability that this
61
- # opportunity will be won
62
- #
63
- # Examples
64
- #
65
- # CapsuleCRM::Opportunity.new
66
- #
67
- # Returns a CapsuleCRM::Opportunity
68
- def attributes=(attributes)
69
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
70
- super(attributes)
71
- self
72
- end
73
-
74
45
  # Public: Get all opportunities from Capsule. The list can be restricted
75
46
  # and/or paginated with various query parameters sent through the options
76
47
  # hash.
@@ -2,8 +2,6 @@ require 'active_support/core_ext'
2
2
 
3
3
  module CapsuleCRM
4
4
  class Organization < CapsuleCRM::Party
5
- include Virtus
6
-
7
5
  extend ActiveModel::Naming
8
6
  extend ActiveModel::Callbacks
9
7
  extend ActiveModel::Conversion
@@ -24,23 +22,6 @@ module CapsuleCRM
24
22
  has_many :people, class_name: 'CapsuleCRM::Person', source: :organization
25
23
  has_many :custom_fields, class_name: 'CapsuleCRM::CustomField', source: :organization
26
24
 
27
- # Public: Set the attributes of an organization
28
- #
29
- # attributes - The Hash of attributes (default: {}):
30
- # :name - The String organization name
31
- # :about - The String information about the organization
32
- #
33
- # Examples
34
- #
35
- # CapsuleCRM::Organization.new
36
- #
37
- # Returns a CapsuleCRM::Organization
38
- def attributes=(attributes)
39
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
40
- super(attributes)
41
- self
42
- end
43
-
44
25
  # Public: Get all people from Capsule. The list can be restricted
45
26
  # and/or paginated with various query parameters sent through the options
46
27
  # hash.
@@ -229,9 +210,8 @@ module CapsuleCRM
229
210
  #
230
211
  # Returns a Hash
231
212
  def to_capsule_json
232
- self.contacts = nil if self.contacts.blank?
233
213
  {
234
- organisation: attributes.merge(self.contacts ? {contacts: (self.contacts.is_a?(Hash) ? self.contacts : self.contacts.to_capsule_json)} : {}).
214
+ organisation: attributes.merge(contacts: contacts.to_capsule_json).
235
215
  stringify_keys
236
216
  }.stringify_keys
237
217
  end
@@ -1,6 +1,8 @@
1
1
  class CapsuleCRM::Party
2
- include CapsuleCRM::Taggable
2
+ include Virtus
3
3
 
4
+ include CapsuleCRM::Attributes
5
+ include CapsuleCRM::Taggable
4
6
  include CapsuleCRM::Associations::HasMany
5
7
 
6
8
  has_many :histories, class_name: 'CapsuleCRM::History', source: :party
@@ -1,7 +1,5 @@
1
1
  module CapsuleCRM
2
2
  class Person < CapsuleCRM::Party
3
- include Virtus
4
-
5
3
  include CapsuleCRM::Collection
6
4
  include CapsuleCRM::Contactable
7
5
  include CapsuleCRM::Associations::BelongsTo
@@ -62,30 +60,6 @@ module CapsuleCRM
62
60
  )
63
61
  end
64
62
 
65
- # Public: Set the attributes of a person
66
- #
67
- # attributes - The Hash of attributes (default: {}):
68
- # :first_name - The String person first name
69
- # :last_name - The String person last name
70
- # :job_title - The String job title
71
- # :about - The String information about the person
72
- # :organisation_name - The String name of the organisation. If
73
- # this organisation does not exist in capsule then a new one
74
- # will be created on save
75
- # :organisation_id - The Integer ID of the organisation in
76
- # capsulecrm.
77
- #
78
- # Examples
79
- #
80
- # CapsuleCRM::Person.new
81
- #
82
- # Returns a CapsuleCRM::Person
83
- def attributes=(attributes)
84
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
85
- super(attributes)
86
- self
87
- end
88
-
89
63
  # Public: Create a new person in capsulecrm
90
64
  #
91
65
  # attributes - The Hash of person attributes (default: {}):
@@ -246,11 +220,10 @@ module CapsuleCRM
246
220
  #
247
221
  # Returns a Hash
248
222
  def to_capsule_json
249
- self.contacts = nil if self.contacts.blank?
250
223
  {
251
224
  person: CapsuleCRM::HashHelper.camelize_keys(
252
225
  attributes.dup.delete_if { |key, value| value.blank? }.
253
- merge(self.contacts ? {contacts: (self.contacts.is_a?(Hash) ? self.contacts : self.contacts.to_capsule_json)} : {})
226
+ merge(contacts: contacts.to_capsule_json)
254
227
  )
255
228
  }.stringify_keys
256
229
  end
@@ -9,5 +9,10 @@ module CapsuleCRM
9
9
 
10
10
  attribute :type
11
11
  attribute :phone_number
12
+
13
+ def initialize(attributes = {})
14
+ CapsuleCRM::HashHelper.underscore_keys!(attributes)
15
+ super(attributes)
16
+ end
12
17
  end
13
18
  end
@@ -7,6 +7,7 @@ module CapsuleCRM
7
7
  include ActiveModel::Validations
8
8
 
9
9
  include CapsuleCRM::Associations::BelongsTo
10
+ include CapsuleCRM::Attributes
10
11
  include CapsuleCRM::Collection
11
12
 
12
13
  attribute :id, Integer
@@ -49,11 +50,6 @@ module CapsuleCRM
49
50
  )
50
51
  end
51
52
 
52
- def attributes=(attributes)
53
- CapsuleCRM::HashHelper.underscore_keys!(attributes)
54
- super(attributes)
55
- end
56
-
57
53
  def owner=(user)
58
54
  user = CapsuleCRM::User.find_by_username(user) if user.is_a?(String)
59
55
  @owner = user
@@ -1,3 +1,3 @@
1
1
  module CapsuleCrm
2
- VERSION = '0.9.0'
2
+ VERSION = '0.9.1'
3
3
  end
@@ -13,5 +13,10 @@ module CapsuleCRM
13
13
  attribute :web_address
14
14
 
15
15
  validates :web_service, :web_address, presence: true
16
+
17
+ def initialize(attributes = {})
18
+ CapsuleCRM::HashHelper.underscore_keys!(attributes)
19
+ super(attributes)
20
+ end
16
21
  end
17
22
  end
@@ -4,7 +4,63 @@ describe CapsuleCRM::Party do
4
4
  before { configure }
5
5
 
6
6
  describe '.find' do
7
- pending
7
+ context 'when finding an organization' do
8
+ before do
9
+ stub_request(:get, /\/api\/party\/#{id}$/).
10
+ to_return(body: File.read('spec/support/organisation.json'))
11
+ end
12
+
13
+ subject { CapsuleCRM::Party.find(id) }
14
+
15
+ let(:id) { rand(10) }
16
+
17
+ it { expect(subject).to be_a(CapsuleCRM::Organization) }
18
+
19
+ it { expect(subject.contacts).to be_a(CapsuleCRM::Contacts) }
20
+
21
+ it 'should get the contact address street' do
22
+ expect(subject.addresses.first.street).
23
+ to eql('1600 Amphitheatre Parkway')
24
+ end
25
+
26
+ it 'should get the contact address city' do
27
+ expect(subject.addresses.first.city).
28
+ to eql('Mountain View')
29
+ end
30
+
31
+ it { expect(subject.addresses.first.state).to eql('CA') }
32
+
33
+ it { expect(subject.addresses.first.zip).to eql('94043') }
34
+
35
+ it 'should get the contact address country' do
36
+ expect(subject.addresses.first.country).
37
+ to eql('United States')
38
+ end
39
+ end
40
+
41
+ context 'when finding a person' do
42
+ before do
43
+ stub_request(:get, /\/api\/party\/#{id}$/).
44
+ to_return(body: File.read('spec/support/person.json'))
45
+ end
46
+
47
+ subject { CapsuleCRM::Party.find(id) }
48
+
49
+ let(:id) { rand(10) }
50
+
51
+ it 'should get the email address' do
52
+ expect(subject.emails.first.email_address).
53
+ to eql('e.schmidt@google.com')
54
+ end
55
+
56
+ it 'should get the phone number' do
57
+ expect(subject.phones.first.phone_number).to eql('+1 888 555555')
58
+ end
59
+
60
+ it 'should get the website' do
61
+ expect(subject.websites.first.web_address).to eql('www.google.com')
62
+ end
63
+ end
8
64
  end
9
65
 
10
66
  describe '.all' do
@@ -1,8 +1,17 @@
1
1
  {
2
2
  "organisation": {
3
- "id": "50",
4
- "createdOn": "2011-09-14T15:22:01Z",
3
+ "contacts": {
4
+ "address": {
5
+ "type": "Office",
6
+ "street": "1600 Amphitheatre Parkway",
7
+ "city": "Mountain View",
8
+ "state": "CA",
9
+ "zip": "94043",
10
+ "country": "United States"
11
+ }
12
+ },
13
+ "id": "1",
5
14
  "name": "Google Inc",
6
- "updatedOn": "2011-12-14T10:45:46Z"
15
+ "about": "A comment here"
7
16
  }
8
17
  }
@@ -1,9 +1,34 @@
1
1
  {
2
2
  "person": {
3
+ "contacts": {
4
+ "address": {
5
+ "type": "Office",
6
+ "street": "1600 Amphitheatre Parkway",
7
+ "city": "Mountain View",
8
+ "state": "CA",
9
+ "zip": "94043",
10
+ "country": "United States"
11
+ },
12
+ "email": {
13
+ "type": "Home",
14
+ "emailAddress": "e.schmidt@google.com"
15
+ },
16
+ "phone": {
17
+ "type": "Mobile",
18
+ "phoneNumber": "+1 888 555555"
19
+ },
20
+ "website": {
21
+ "type": "work",
22
+ "webService": "URL",
23
+ "webAddress": "www.google.com"
24
+ }
25
+ },
3
26
  "id": "100",
4
- "lastName": "Schmidt",
5
- "createdOn": "2011-09-14T15:22:01Z",
27
+ "title": "Mr",
6
28
  "firstName": "Eric",
7
- "updatedOn": "2011-12-14T10:45:46Z"
29
+ "lastName": "Schmidt",
30
+ "jobTitle": "Chairman",
31
+ "organisationName": "Google Inc",
32
+ "about": "A comment here"
8
33
  }
9
34
  }
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: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Beedle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-23 00:00:00.000000000 Z
11
+ date: 2013-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -259,6 +259,7 @@ files:
259
259
  - lib/capsule_crm/associations/has_many.rb
260
260
  - lib/capsule_crm/associations/has_many_proxy.rb
261
261
  - lib/capsule_crm/attachment.rb
262
+ - lib/capsule_crm/attributes.rb
262
263
  - lib/capsule_crm/capsule_jsonable.rb
263
264
  - lib/capsule_crm/case.rb
264
265
  - lib/capsule_crm/collection.rb