capsule_crm 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 395464813fddf0c08a191e17b395fed06e65c158
4
+ data.tar.gz: 391e2918c9f05a3ad4c9362e19bb8adc2b6a4481
5
+ SHA512:
6
+ metadata.gz: b5c63e469b2590cafc343352b6127e8251bcb11285f598dfeb0de7296ee279fc24200e34379ba63c9a832f3c68c6ff907da56f5f9e8ad20ffd5e3e135167e6f0
7
+ data.tar.gz: d0d215942a05b56c9c1d71181749be9ec3e77ec1b486485e197f35c18c3ba7b3e8915572742c8d648b6848a5a5937905560ac010e364a8ed8d7d8a9484537cb9
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capsule_crm.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,17 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ notification :tmux
5
+
6
+ guard 'rspec' do
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
+ watch('spec/spec_helper.rb') { "spec" }
10
+
11
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
12
+
13
+ # Turnip features and steps
14
+ watch(%r{^spec/acceptance/(.+)\.feature$})
15
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
16
+ end
17
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matt Beedle
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # CapsuleCrm
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'capsule_crm'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install capsule_crm
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capsule_crm/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "capsule_crm"
8
+ gem.version = CapsuleCrm::VERSION
9
+ gem.authors = ["Matt Beedle"]
10
+ gem.email = ["mattbeedle@googlemail.com"]
11
+ gem.description = %q{Gem to communicate with CapsuleCRM}
12
+ gem.summary = %q{Gem to communicate with CapsuleCRM}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency('activemodel')
21
+ gem.add_runtime_dependency('activesupport')
22
+ gem.add_runtime_dependency('faraday')
23
+ gem.add_runtime_dependency('virtus')
24
+
25
+ gem.add_development_dependency('cucumber')
26
+ gem.add_development_dependency('guard')
27
+ gem.add_development_dependency('guard-rspec')
28
+ gem.add_development_dependency('rb-fsevent')
29
+ gem.add_development_dependency('rspec')
30
+ gem.add_development_dependency('webmock')
31
+ end
@@ -0,0 +1,4 @@
1
+ Feature: Organizations
2
+ Organizations CRUD
3
+
4
+ Scenario: Getting all organizations
@@ -0,0 +1,26 @@
1
+ require 'active_model'
2
+ require 'faraday'
3
+ require 'virtus'
4
+ require 'capsule_crm/connection'
5
+ require 'capsule_crm/hash_helper'
6
+ require 'capsule_crm/results_proxy'
7
+ require 'capsule_crm/associations/belongs_to'
8
+ require 'capsule_crm/associations/has_many'
9
+ require 'capsule_crm/associations/has_many_proxy'
10
+ require 'capsule_crm/configuration'
11
+ require 'capsule_crm/organization'
12
+ require 'capsule_crm/person'
13
+ require 'capsule_crm/version'
14
+
15
+ module CapsuleCRM
16
+
17
+ class << self
18
+ attr_accessor :configuration
19
+ end
20
+
21
+ def self.configure
22
+ self.configuration = CapsuleCRM::Configuration.new
23
+ yield(self.configuration)
24
+ self.configuration
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ module CapsuleCRM
2
+ module Associations
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include CapsuleCRM::Associations::BelongsTo
7
+ include CapsuleCRM::Associations::HasMany
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module CapsuleCRM
2
+ module Associations
3
+ module BelongsTo
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def belongs_to(type, options = {})
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module CapsuleCRM
2
+ module Associations
3
+ module HasMany
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def has_many(type, options = {})
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ class CapsuleCRM::Associations::HasManyProxy < BasicObject
2
+
3
+ end
@@ -0,0 +1,8 @@
1
+ class CapsuleCRM::Configuration
2
+
3
+ attr_accessor :api_token, :logger, :subdomain
4
+
5
+ def logger
6
+ @logger || Logger.new(STDOUT)
7
+ end
8
+ end
@@ -0,0 +1,47 @@
1
+ module CapsuleCRM
2
+ class Connection
3
+
4
+ # Public: Send a GET request to CapsuleCRM API
5
+ #
6
+ # path - The String path where the request should go
7
+ # params - The Hash of URL parameters
8
+ #
9
+ # Returns a Hash from the JSON response
10
+ def self.get(path, params = {})
11
+ response = faraday.get(path, params) do |req|
12
+ req.headers.update default_request_headers
13
+ end
14
+ JSON.parse response.body
15
+ end
16
+
17
+ def self.post(path, params)
18
+ JSON.parse faraday.post(path, params).body
19
+ end
20
+
21
+ def self.put(path, params)
22
+ JSON.parse faraday.put(path, params).body
23
+ end
24
+
25
+ def self.delete(path, params)
26
+ JSON.parse faraday.delete(path, params).body
27
+ end
28
+
29
+ private
30
+
31
+ def self.default_request_headers
32
+ {
33
+ 'Accept' => 'application/json',
34
+ }
35
+ end
36
+
37
+ def self.faraday
38
+ Faraday.new("http://#{subdomain}.capsulecrm.com").tap do |connection|
39
+ connection.basic_auth(CapsuleCRM.configuration.api_token, '')
40
+ end
41
+ end
42
+
43
+ def self.subdomain
44
+ CapsuleCRM.configuration.subdomain
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,6 @@
1
+ class CapsuleCRM::Contact
2
+
3
+ def destroy
4
+ CapsuleCRM::Connection.delete "/api/party/#{party_id}/contact/#{id}"
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ require 'active_support/inflector'
2
+
3
+ module CapsuleCRM
4
+ class HashHelper
5
+ def self.underscore_keys!(hash)
6
+ hash.keys.each do |key|
7
+ hash[key.to_s.underscore] = hash.delete(key)
8
+ end
9
+ end
10
+
11
+ def self.camelize_keys!(hash)
12
+ hash.keys.each do |key|
13
+ hash[key.to_s.camelize] = hash.delete(key)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,84 @@
1
+ require 'active_support/core_ext'
2
+
3
+ class CapsuleCRM::Organization
4
+ include ::Virtus
5
+
6
+ include CapsuleCRM::Associations
7
+
8
+ extend ActiveModel::Naming
9
+ extend ActiveModel::Callbacks
10
+ extend ActiveModel::Conversion
11
+ include ActiveModel::Validations
12
+ include ActiveModel::Validations::Callbacks
13
+
14
+ attribute :name
15
+ attribute :about
16
+
17
+ # has_many :people
18
+
19
+ validates :name, presence: true
20
+
21
+ # Public: Get all organizations from Capsule. The list can be restricted
22
+ # and/or paginated with various query parameters sent through the options
23
+ # hash.
24
+ #
25
+ # options - The Hash of allowed query parameters for Capsule (default: {}):
26
+ # :q - The String search term that will be matched against name,
27
+ # telephone number and exact match on searchable custom fields
28
+ # :email - The String email address to search for
29
+ # :tag - The String tag to search for
30
+ # :start - The Integer first record to be returned in pagination.
31
+ # The results start with an index of 1
32
+ # :limit - The Integer maximum number of matching records to be
33
+ # returned
34
+ #
35
+ # Examples
36
+ #
37
+ # Organization.all
38
+ #
39
+ # Organization.all(q: "a search query", start: 10, limit: 20)
40
+ #
41
+ # Returns a ResultsProxy of organizations
42
+ def self.all(options = {})
43
+ options.delete_if { |key, value| !allowed_filtering_options.include?(key) }
44
+ delete_invalid_options(options)
45
+ CapsuleCRM::ResultsProxy.new(
46
+ CapsuleCRM::Connection.get('/api/party', options).map do |result|
47
+ new(result)
48
+ end
49
+ )
50
+ end
51
+
52
+ def self.find(id)
53
+ new CapsuleCRM::Connection.get("/api/party/#{id}")
54
+ end
55
+
56
+ def save
57
+ if new_record?
58
+ create(attributes)
59
+ else
60
+ update(attributes)
61
+ end
62
+ end
63
+
64
+ def create(attributes = {})
65
+ CapsuleCRM::Connection.post('/api/organization', attributes)
66
+ end
67
+
68
+ def update_attributes(attributes = {})
69
+ CapsuleCRM::Connection.put("/api/organization/#{id}", attributes)
70
+ end
71
+
72
+ private
73
+
74
+ def delete_invalid_all_options(options)
75
+ options.stringify_keys!
76
+ options.delete_if do |key, value|
77
+ !allowed_filtering_options.include?(key)
78
+ end
79
+ end
80
+
81
+ def allowed_filtering_options
82
+ %w(q email last_modified tag start limit)
83
+ end
84
+ end
@@ -0,0 +1,2 @@
1
+ class CapsuleCRM::Party
2
+ end
@@ -0,0 +1,190 @@
1
+ class CapsuleCRM::Person
2
+ include Virtus
3
+
4
+ include CapsuleCRM::Associations::HasMany
5
+
6
+ extend ActiveModel::Naming
7
+ extend ActiveModel::Callbacks
8
+ include ActiveModel::Conversion
9
+ include ActiveModel::Validations
10
+ include ActiveModel::Validations::Callbacks
11
+
12
+ attribute :id
13
+ attribute :title
14
+ attribute :first_name
15
+ attribute :last_name
16
+ attribute :job_title
17
+ attribute :about
18
+ attribute :organisation_name
19
+ attribute :organisation_id
20
+
21
+ validates :first_name, presence: { if: :first_name_required? }
22
+ validates :last_name, presence: { if: :last_name_required? }
23
+
24
+ has_many :addresses
25
+ has_many :emails
26
+ has_many :phones
27
+ has_many :websites
28
+
29
+ # Public: Set the attributes of a person
30
+ #
31
+ # attributes - The Hash of attributes (default: {}):
32
+ # :first_name - The String person first name
33
+ # :last_name - The String person last name
34
+ # :job_title - The String job title
35
+ # :about - The String information about the person
36
+ # :organisation_name - The String name of the organisation. If
37
+ # this organisation does not exist in capsule then a new one
38
+ # will be created on save
39
+ # :organisation_id - The Integer ID of the organisation in
40
+ # capsulecrm.
41
+ #
42
+ # Examples
43
+ #
44
+ # CapsuleCRM::Person.new
45
+ #
46
+ # Returns a CapsuleCRM::Person
47
+ def attributes=(attributes)
48
+ CapsuleCRM::HashHelper.underscore_keys!(attributes)
49
+ super(attributes)
50
+ self
51
+ end
52
+
53
+ # Public: Get all people from Capsule. The list can be restricted
54
+ # and/or paginated with various query parameters sent through the options
55
+ # hash.
56
+ #
57
+ # options - The Hash of allowed query parameters for Capsule (default: {}):
58
+ # :q - The String search term that will be matched against name,
59
+ # telephone number and exact match on searchable custom fields
60
+ # :email - The String email address to search for
61
+ # :tag - The String tag to search for
62
+ # :start - The Integer first record to be returned in pagination.
63
+ # The results start with an index of 1
64
+ # :limit - The Integer maximum number of matching records to be
65
+ # returned
66
+ #
67
+ # Examples
68
+ #
69
+ # CapsuleCRM::Person.all
70
+ #
71
+ # CapsuleCRM::Person.all(q: "a search query", start: 10, limit: 20)
72
+ #
73
+ # Returns a ResultsProxy of organisations
74
+ def self.all(options = {})
75
+ init_collection(
76
+ CapsuleCRM::Connection.get('/api/party', options)['parties']['person']
77
+ )
78
+ end
79
+
80
+ # Public: Get a person by ID
81
+ #
82
+ # id - The Integer person ID
83
+ #
84
+ # Examples
85
+ #
86
+ # CapsuleCRM::Person.find(1)
87
+ #
88
+ # Returns a CapsuleCRM::Person
89
+ def self.find(id)
90
+ new CapsuleCRM::Connection.get("/api/party/#{id}")['person']
91
+ end
92
+
93
+ # Public: Create a new person in capsulecrm
94
+ #
95
+ # attributes - The Hash of person attributes (default: {}):
96
+ # :first_name - The String first name
97
+ # :last_name - The String last name
98
+ # :job_title - The String job title
99
+ # :about - The String information about the person
100
+ # :organisation_name - The String organisation name. If now
101
+ # :organisation_id is supplied, then a new one will be created
102
+ # with this name
103
+ # :organisation_id - The Integer ID of the organisation this
104
+ # person belongs to
105
+ #
106
+ # Examples
107
+ #
108
+ # CapsuleCRM::Person.create(first_name: 'Matt', last_name: 'Beedle')
109
+ #
110
+ # Returns a CapsuleCRM::Person
111
+ def self.create(attributes = {})
112
+ new CapsuleCRM::Connection.post('/api/person', attributes)['person']
113
+ end
114
+
115
+ # Public: If the person already exists in capsule then update them,
116
+ # otherwise create a new person
117
+ #
118
+ # Examples
119
+ #
120
+ # person = CapsuleCRM::Person.new(first_name: 'Matt')
121
+ # person.save
122
+ #
123
+ # person = CapsuleCRM::Person.find(1)
124
+ # person.first_name = 'Matt'
125
+ # person.save
126
+ #
127
+ # Returns a CapsuleCRM::Person
128
+ def save
129
+ if new_record?
130
+ self.attributes = CapsuleCRM::Person.create(attributes).attributes
131
+ else
132
+ update_attributes attributes
133
+ end
134
+ end
135
+
136
+ # Public: Update the person in capsule
137
+ #
138
+ # attributes - The Hash of person attributes (default: {}):
139
+ # :first_name - The String first name
140
+ # :last_name - The String last name
141
+ # :job_title - The String job title
142
+ # :about - The String information about the person
143
+ # :organisation_name - The String organisation name
144
+ # :organisation_id - The String organisation id
145
+ #
146
+ # Examples
147
+ #
148
+ # person = CapsuleCRM::Person.find(1)
149
+ # person.update_attributes first_name: 'Matt', last_name: 'Beedle'
150
+ #
151
+ # Returns a CapsuleCRM::Person
152
+ def update_attributes(attributes = {})
153
+ self.attributes =
154
+ CapsuleCRM::Connection.put("/api/person/#{id}", attributes)['person']
155
+ end
156
+
157
+ # Public: Determine whether this CapsuleCRM::Person is a new record or not
158
+ #
159
+ # Returns a Boolean
160
+ def new_record?
161
+ !id
162
+ end
163
+
164
+ private
165
+
166
+ # Private: Build a ResultsProxy from a Array of CapsuleCRM::Person attributes
167
+ #
168
+ # collection - The Array of CapsuleCRM::Person attributes hashes
169
+ #
170
+ # Returns a CapsuleCRM::ResultsProxy
171
+ def self.init_collection(collection)
172
+ CapsuleCRM::ResultsProxy.new(collection.map { |item| new item })
173
+ end
174
+
175
+ # Private: Determines whether the person first name is required. Either the
176
+ # first or the last name is always required
177
+ #
178
+ # Returns a Boolean
179
+ def first_name_required?
180
+ last_name.blank?
181
+ end
182
+
183
+ # Private: Determines whether the person last name is required. Either the
184
+ # first or the last name is always required
185
+ #
186
+ # Return a Boolean
187
+ def last_name_required?
188
+ first_name.blank?
189
+ end
190
+ end
@@ -0,0 +1,18 @@
1
+ module CapsuleCRM
2
+ class ResultsProxy < BasicObject
3
+
4
+ def initialize(target)
5
+ @target = target
6
+ end
7
+
8
+ protected
9
+
10
+ def method_missing(name, *args, &block)
11
+ target.send(name, *args, &block)
12
+ end
13
+
14
+ def target
15
+ @target ||= []
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module CapsuleCrm
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,196 @@
1
+ require 'spec_helper'
2
+
3
+ describe CapsuleCRM::Person do
4
+
5
+ before { configure }
6
+
7
+ describe '.all' do
8
+ before do
9
+ stub_request(:get, /\/api\/party$/).
10
+ to_return(body: File.read('spec/support/all_parties.json'))
11
+ end
12
+
13
+ subject { CapsuleCRM::Person.all }
14
+
15
+ it { should be_a(Array) }
16
+
17
+ it { subject.length.should eql(2) }
18
+
19
+ it 'should only contain people' do
20
+ subject.all? { |item| item.is_a?(CapsuleCRM::Person) }.should be_true
21
+ end
22
+ end
23
+
24
+ describe '.find' do
25
+ before do
26
+ stub_request(:get, /.*/).
27
+ to_return(body: File.read('spec/support/person.json'))
28
+ end
29
+
30
+ subject { CapsuleCRM::Person.find(1) }
31
+
32
+ it { should be_a(CapsuleCRM::Person) }
33
+
34
+ it { subject.first_name.should eql('Eric') }
35
+
36
+ it { subject.last_name.should eql('Schmidt') }
37
+ end
38
+
39
+ describe '#attributes=' do
40
+ let(:person) { CapsuleCRM::Person.new }
41
+
42
+ before do
43
+ person.attributes= { firstName: 'Matt', lastName: 'Beedle' }
44
+ end
45
+
46
+ it { person.first_name.should eql('Matt') }
47
+
48
+ it { person.last_name.should eql('Beedle') }
49
+ end
50
+
51
+ describe '.create' do
52
+ context 'when the person saves successfully' do
53
+ before do
54
+ stub_request(:post, /.*/).
55
+ to_return(body: File.read('spec/support/create-person.json'))
56
+ end
57
+
58
+ subject { CapsuleCRM::Person.create }
59
+
60
+ it { should be_a(CapsuleCRM::Person) }
61
+
62
+ it { subject.about.should eql('A comment here') }
63
+
64
+ it { subject.first_name.should eql('Eric') }
65
+
66
+ it { subject.last_name.should eql('Schmidt') }
67
+
68
+ it { subject.organisation_name.should eql('Google Inc') }
69
+
70
+ it { subject.job_title.should eql('Chairman') }
71
+ end
72
+ end
73
+
74
+ describe '#update_attributes' do
75
+ context 'when the person saves successfully' do
76
+ before do
77
+ stub_request(:put, /.*/).
78
+ to_return(body: File.read('spec/support/update-person.json'))
79
+ end
80
+
81
+ let(:person) { CapsuleCRM::Person.new(id: 1) }
82
+
83
+ before { person.update_attributes first_name: 'James' }
84
+
85
+ it { person.first_name.should eql('James') }
86
+
87
+ it { person.id.should eql(1) }
88
+ end
89
+ end
90
+
91
+ describe '#save' do
92
+ context 'when the person is a new record' do
93
+ before do
94
+ stub_request(:post, /.*/).
95
+ to_return(body: File.read('spec/support/create-person.json'))
96
+ end
97
+
98
+ let(:person) { CapsuleCRM::Person.new }
99
+
100
+ before { person.save }
101
+
102
+ it { person.about.should eql('A comment here') }
103
+
104
+ it { person.first_name.should eql('Eric') }
105
+
106
+ it { person.last_name.should eql('Schmidt') }
107
+
108
+ it { person.organisation_name.should eql('Google Inc') }
109
+
110
+ it { person.job_title.should eql('Chairman') }
111
+ end
112
+
113
+ context 'when the person is not a new record' do
114
+ before do
115
+ stub_request(:put, /.*/).
116
+ to_return(body: File.read('spec/support/update-person.json'))
117
+ end
118
+
119
+ let(:person) { CapsuleCRM::Person.new(id: 1) }
120
+
121
+ before { person.save }
122
+
123
+ it { person.first_name.should eql('James') }
124
+
125
+ it { person.id.should eql(1) }
126
+ end
127
+ end
128
+
129
+ describe '#new_record?' do
130
+ context 'when the person is a new record' do
131
+ let(:person) { CapsuleCRM::Person.new }
132
+
133
+ subject { person.new_record? }
134
+
135
+ it { should be_true }
136
+ end
137
+
138
+ context 'when the person is not a new record' do
139
+ let(:person) { CapsuleCRM::Person.new(id: 1) }
140
+
141
+ subject { person.new_record? }
142
+
143
+ it { should be_false }
144
+ end
145
+ end
146
+
147
+ describe '.init_collection' do
148
+ subject do
149
+ CapsuleCRM::Person.init_collection(
150
+ JSON.parse(
151
+ File.read('spec/support/all_parties.json')
152
+ )['parties']['person']
153
+ )
154
+ end
155
+
156
+ it { should be_a(Array) }
157
+
158
+ it { subject.length.should eql(2) }
159
+
160
+ it do
161
+ subject.all? { |item| item.is_a?(CapsuleCRM::Person) }.should be_true
162
+ end
163
+ end
164
+
165
+ describe '#first_name_required?' do
166
+ let(:person) { CapsuleCRM::Person.new }
167
+
168
+ subject { person.send(:first_name_required?) }
169
+
170
+ context 'when there is no last name' do
171
+ it { should be_true }
172
+ end
173
+
174
+ context 'when there is a last name' do
175
+ before { person.last_name = 'Beedle' }
176
+
177
+ it { should be_false }
178
+ end
179
+ end
180
+
181
+ describe '#last_name_required?' do
182
+ let(:person) { CapsuleCRM::Person.new }
183
+
184
+ subject { person.send(:last_name_required?) }
185
+
186
+ context 'when there is no first name' do
187
+ it { should be_true }
188
+ end
189
+
190
+ context 'when there is a first name' do
191
+ before { person.first_name = 'Matt' }
192
+
193
+ it { should be_false }
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'webmock/rspec'
4
+ require 'support/helpers'
5
+ require 'capsule_crm'
6
+
7
+ # This file was generated by the `rspec --init` command. Conventionally, all
8
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
9
+ # Require this file using `require "spec_helper"` to ensure that it is only
10
+ # loaded once.
11
+ #
12
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
+ RSpec.configure do |config|
14
+ config.treat_symbols_as_metadata_keys_with_true_values = true
15
+ config.run_all_when_everything_filtered = true
16
+ config.filter_run :focus
17
+
18
+ # Run specs in random order to surface order dependencies. If you find an
19
+ # order dependency and want to debug it, you can fix the order by providing
20
+ # the seed, which is printed after each run.
21
+ # --seed 1234
22
+ config.order = 'random'
23
+
24
+ config.include Helpers
25
+ end
@@ -0,0 +1,26 @@
1
+ {
2
+ "parties": {
3
+ "organisation": {
4
+ "id": "50",
5
+ "createdOn": "2011-09-14T15:22:01Z",
6
+ "name": "Google Inc",
7
+ "updatedOn": "2011-12-14T10:45:46Z"
8
+ },
9
+ "person": [
10
+ {
11
+ "id": "100",
12
+ "lastName": "Schmidt",
13
+ "createdOn": "2011-09-14T15:22:01Z",
14
+ "firstName": "Eric",
15
+ "updatedOn": "2011-12-14T10:45:46Z"
16
+ },
17
+ {
18
+ "id": "101",
19
+ "lastName": "Page",
20
+ "createdOn": "2011-09-14T15:22:01Z",
21
+ "firstName": "Larry ",
22
+ "updatedOn": "2011-11-15T10:50:48Z"
23
+ }
24
+ ]
25
+ }
26
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "person": {
3
+ "jobTitle": "Chairman",
4
+ "about": "A comment here",
5
+ "lastName": "Schmidt",
6
+ "title": "Mr",
7
+ "organisationName": "Google Inc",
8
+ "firstName": "Eric",
9
+ "contacts": {
10
+ "email": {
11
+ "type": "Home",
12
+ "emailAddress": "e.schmidt@google.com"
13
+ },
14
+ "website": {
15
+ "type": "work",
16
+ "webAddress": "www.google.com",
17
+ "webService": "URL"
18
+ },
19
+ "address": {
20
+ "country": "United States",
21
+ "city": "Mountain View",
22
+ "state": "CA",
23
+ "type": "Office",
24
+ "zip": "94043",
25
+ "street": "1600 Amphitheatre Parkway"
26
+ },
27
+ "phone": {
28
+ "phoneNumber": "+1 888 555555",
29
+ "type": "Mobile"
30
+ }
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,8 @@
1
+ module Helpers
2
+ def configure
3
+ CapsuleCRM.configure do |c|
4
+ c.api_token = '1234'
5
+ c.subdomain = 'company'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ {
2
+ "person": {
3
+ "id": "100",
4
+ "lastName": "Schmidt",
5
+ "createdOn": "2011-09-14T15:22:01Z",
6
+ "firstName": "Eric",
7
+ "updatedOn": "2011-12-14T10:45:46Z"
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "person": {
3
+ "firstName": "James"
4
+ }
5
+ }
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capsule_crm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matt Beedle
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: virtus
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: cucumber
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rb-fsevent
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Gem to communicate with CapsuleCRM
154
+ email:
155
+ - mattbeedle@googlemail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - .gitignore
161
+ - .rspec
162
+ - Gemfile
163
+ - Guardfile
164
+ - LICENSE.txt
165
+ - README.md
166
+ - Rakefile
167
+ - capsule_crm.gemspec
168
+ - features/organizations.feature
169
+ - lib/capsule_crm.rb
170
+ - lib/capsule_crm/associations.rb
171
+ - lib/capsule_crm/associations/belongs_to.rb
172
+ - lib/capsule_crm/associations/has_many.rb
173
+ - lib/capsule_crm/associations/has_many_proxy.rb
174
+ - lib/capsule_crm/configuration.rb
175
+ - lib/capsule_crm/connection.rb
176
+ - lib/capsule_crm/contact.rb
177
+ - lib/capsule_crm/hash_helper.rb
178
+ - lib/capsule_crm/organization.rb
179
+ - lib/capsule_crm/party.rb
180
+ - lib/capsule_crm/person.rb
181
+ - lib/capsule_crm/results_proxy.rb
182
+ - lib/capsule_crm/version.rb
183
+ - spec/lib/capsule_crm/person_spec.rb
184
+ - spec/spec_helper.rb
185
+ - spec/support/all_parties.json
186
+ - spec/support/create-person.json
187
+ - spec/support/helpers.rb
188
+ - spec/support/person.json
189
+ - spec/support/update-person.json
190
+ homepage: ''
191
+ licenses: []
192
+ metadata: {}
193
+ post_install_message:
194
+ rdoc_options: []
195
+ require_paths:
196
+ - lib
197
+ required_ruby_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ required_rubygems_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ requirements: []
208
+ rubyforge_project:
209
+ rubygems_version: 2.0.3
210
+ signing_key:
211
+ specification_version: 4
212
+ summary: Gem to communicate with CapsuleCRM
213
+ test_files:
214
+ - features/organizations.feature
215
+ - spec/lib/capsule_crm/person_spec.rb
216
+ - spec/spec_helper.rb
217
+ - spec/support/all_parties.json
218
+ - spec/support/create-person.json
219
+ - spec/support/helpers.rb
220
+ - spec/support/person.json
221
+ - spec/support/update-person.json