highrise 2.0.1 → 3.0.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.
- data/Gemfile +3 -0
- data/Gemfile.lock +38 -0
- data/MIT-LICENSE +1 -1
- data/README.mkdn +21 -29
- data/Rakefile +6 -31
- data/autotest/discover.rb +1 -3
- data/examples/config_initializers_highrise.rb +1 -9
- data/examples/sample.rb +0 -1
- data/highrise.gemspec +24 -117
- data/lib/highrise.rb +6 -5
- data/lib/highrise/account.rb +0 -1
- data/lib/highrise/base.rb +15 -3
- data/lib/highrise/comment.rb +1 -2
- data/lib/highrise/company.rb +3 -2
- data/lib/highrise/deal.rb +4 -1
- data/lib/highrise/deal_category.rb +3 -0
- data/lib/highrise/group.rb +1 -2
- data/lib/highrise/kase.rb +13 -2
- data/lib/highrise/membership.rb +1 -2
- data/lib/highrise/pagination.rb +8 -1
- data/lib/highrise/party.rb +11 -0
- data/lib/highrise/person.rb +1 -4
- data/lib/highrise/recording.rb +5 -0
- data/lib/highrise/searchable.rb +22 -0
- data/lib/highrise/subject.rb +6 -0
- data/lib/highrise/tag.rb +0 -5
- data/lib/highrise/taggable.rb +4 -1
- data/lib/highrise/task_category.rb +3 -0
- data/lib/highrise/version.rb +3 -0
- data/spec/highrise/account_spec.rb +5 -11
- data/spec/highrise/base_spec.rb +45 -10
- data/spec/highrise/comment_spec.rb +2 -11
- data/spec/highrise/company_spec.rb +10 -72
- data/spec/highrise/deal_category_spec.rb +13 -0
- data/spec/highrise/deal_spec.rb +16 -13
- data/spec/highrise/email_spec.rb +7 -19
- data/spec/highrise/group_spec.rb +2 -11
- data/spec/highrise/kase_spec.rb +10 -18
- data/spec/highrise/membership_spec.rb +2 -11
- data/spec/highrise/note_spec.rb +8 -17
- data/spec/highrise/pagination_behavior.rb +20 -0
- data/spec/highrise/pagination_spec.rb +4 -6
- data/spec/highrise/party_spec.rb +16 -0
- data/spec/highrise/person_spec.rb +23 -80
- data/spec/highrise/recording_spec.rb +13 -0
- data/spec/highrise/searchable_behavior.rb +13 -0
- data/spec/highrise/searchable_spec.rb +8 -0
- data/spec/highrise/subject_spec.rb +20 -35
- data/spec/highrise/tag_spec.rb +8 -13
- data/spec/highrise/taggable_behavior.rb +27 -0
- data/spec/highrise/taggable_spec.rb +9 -0
- data/spec/highrise/task_category_spec.rb +13 -0
- data/spec/highrise/task_spec.rb +6 -18
- data/spec/highrise/user_spec.rb +11 -28
- data/spec/spec_helper.rb +9 -18
- metadata +55 -42
- data/CHANGELOG +0 -131
- data/VERSION.yml +0 -5
- data/install.rb +0 -1
- data/lib/cachable.rb +0 -83
- data/spec/cachable_spec.rb +0 -84
- data/spec/spec.opts +0 -7
- data/uninstall.rb +0 -1
data/lib/highrise/deal.rb
CHANGED
data/lib/highrise/group.rb
CHANGED
data/lib/highrise/kase.rb
CHANGED
@@ -1,8 +1,19 @@
|
|
1
1
|
module Highrise
|
2
2
|
class Kase < Subject
|
3
|
+
def open!
|
4
|
+
update_attribute(:closed_at, nil)
|
5
|
+
end
|
6
|
+
|
3
7
|
def close!
|
4
|
-
|
5
|
-
|
8
|
+
update_attribute(:closed_at, Time.now.utc)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.open
|
12
|
+
Kase.find(:all, :from => "/kases/open.xml")
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.closed
|
16
|
+
Kase.find(:all, :from => "/kases/closed.xml")
|
6
17
|
end
|
7
18
|
end
|
8
19
|
end
|
data/lib/highrise/membership.rb
CHANGED
data/lib/highrise/pagination.rb
CHANGED
@@ -11,12 +11,19 @@ module Highrise
|
|
11
11
|
records
|
12
12
|
end
|
13
13
|
|
14
|
+
# This only is usefull for company, person & recordings, but should be safely ignored by other classes
|
15
|
+
def find_all_across_pages_since(time)
|
16
|
+
find_all_across_pages(:params => { :since => time.utc.strftime("%Y%m%d%H%M%S") })
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
14
21
|
def each(options = {})
|
15
22
|
options[:params] ||= {}
|
16
23
|
options[:params][:n] = 0
|
17
24
|
|
18
25
|
loop do
|
19
|
-
if (records = self.find(:all, options)).any?
|
26
|
+
if (records = self.find(:all, options)).try(:any?)
|
20
27
|
records.each { |record| yield record }
|
21
28
|
options[:params][:n] += records.size
|
22
29
|
else
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Highrise
|
2
|
+
class Party < Base
|
3
|
+
def self.recently_viewed
|
4
|
+
find(:all, :from => "/parties/recently_viewed.xml")
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.deletions_since(time)
|
8
|
+
find(:all, :from => "/parties/deletions.xml", :params => { :since => time.utc.strftime("%Y%m%d%H%M%S") })
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/highrise/person.rb
CHANGED
@@ -2,11 +2,8 @@ module Highrise
|
|
2
2
|
class Person < Subject
|
3
3
|
include Pagination
|
4
4
|
include Taggable
|
5
|
+
include Searchable
|
5
6
|
|
6
|
-
def self.find_all_across_pages_since(time)
|
7
|
-
find_all_across_pages(:params => { :since => time.utc.to_s(:db).gsub(/[^\d]/, '') })
|
8
|
-
end
|
9
|
-
|
10
7
|
def company
|
11
8
|
Company.find(company_id) if company_id
|
12
9
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Highrise
|
2
|
+
module Searchable
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
# List By Search Criteria
|
9
|
+
# Ex: Highrise::Person.search(:email => "john.doe@example.com", :country => "CA")
|
10
|
+
# Available criteria are: city, state, country, zip, phone, email
|
11
|
+
def search(options = {})
|
12
|
+
search_params = options.inject({}) { |h, (k, v)| h["criteria[#{k}]"] = v; h }
|
13
|
+
# This might have to be changed in the future if other non-pagable resources become searchable
|
14
|
+
if self.respond_to?(:find_all_across_pages)
|
15
|
+
self.find_all_across_pages(:from => "/#{self.collection_name}/search.xml", :params => search_params)
|
16
|
+
else
|
17
|
+
self.find(:all, {:from => "/#{self.collection_name}/search.xml", :params => search_params})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/highrise/subject.rb
CHANGED
@@ -9,6 +9,12 @@ module Highrise
|
|
9
9
|
attrs[:subject_type] = self.label
|
10
10
|
Note.create attrs
|
11
11
|
end
|
12
|
+
|
13
|
+
def add_task(attrs={})
|
14
|
+
attrs[:subject_id] = self.id
|
15
|
+
attrs[:subject_type] = self.label
|
16
|
+
Task.create attrs
|
17
|
+
end
|
12
18
|
|
13
19
|
def emails
|
14
20
|
Email.find_all_across_pages(:from => "/#{self.class.collection_name}/#{id}/emails.xml")
|
data/lib/highrise/tag.rb
CHANGED
@@ -3,10 +3,5 @@ module Highrise
|
|
3
3
|
def ==(object)
|
4
4
|
(object.instance_of?(self.class) && object.id == self.id && object.name == self.name)
|
5
5
|
end
|
6
|
-
|
7
|
-
# You can't find :one because that finds all *objects* with that tag
|
8
|
-
def self.find_by_name(arg)
|
9
|
-
tags = self.find(:all).detect{|tag| tag.name == arg}
|
10
|
-
end
|
11
6
|
end
|
12
7
|
end
|
data/lib/highrise/taggable.rb
CHANGED
@@ -3,13 +3,16 @@ module Highrise
|
|
3
3
|
def tags
|
4
4
|
self.get(:tags)
|
5
5
|
end
|
6
|
+
|
6
7
|
def tag!(tag_name)
|
7
8
|
self.post(:tags, :name => tag_name) unless tag_name.blank?
|
8
9
|
end
|
10
|
+
|
9
11
|
def untag!(tag_name)
|
10
12
|
to_delete = self.tags.find{|tag| tag['name'] == tag_name} unless tag_name.blank?
|
11
13
|
self.untag_id!(to_delete['id']) unless to_delete.nil?
|
12
|
-
end
|
14
|
+
end
|
15
|
+
protected
|
13
16
|
def untag_id!(tag_id)
|
14
17
|
self.delete("tags/#{tag_id}")
|
15
18
|
end
|
@@ -1,16 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Account do
|
4
|
-
|
5
|
-
@account = Highrise::Account.new
|
6
|
-
end
|
7
|
-
|
8
|
-
it "should be instance of Highrise::Base" do
|
9
|
-
@account.kind_of?(Highrise::Base).should be_true
|
10
|
-
end
|
4
|
+
it { should be_a_kind_of Highrise::Base }
|
11
5
|
|
12
|
-
it "
|
13
|
-
Highrise::Account.should_receive(:find).with(:one, {:from => "/account.xml"}).and_return(
|
14
|
-
Highrise::Account.me.should ==
|
6
|
+
it ".me" do
|
7
|
+
Highrise::Account.should_receive(:find).with(:one, {:from => "/account.xml"}).and_return(subject)
|
8
|
+
Highrise::Account.me.should == subject
|
15
9
|
end
|
16
10
|
end
|
data/spec/highrise/base_spec.rb
CHANGED
@@ -1,13 +1,48 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Base do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
it { subject.should be_a_kind_of ActiveResource::Base }
|
5
|
+
|
6
|
+
describe "dynamic finder methods" do
|
7
|
+
context "without pagination" do
|
8
|
+
before do
|
9
|
+
@deal_one = Highrise::Base.new(:id => 1, :name => "A deal")
|
10
|
+
@deal_two = Highrise::Base.new(:id => 2, :name => "A deal")
|
11
|
+
@deal_three = Highrise::Base.new(:id => 3, :name => "Another deal")
|
12
|
+
Highrise::Base.should_receive(:find).with(:all).and_return([@deal_one, @deal_two, @deal_three])
|
13
|
+
end
|
14
|
+
it ".find_by_(attribute) finds one" do
|
15
|
+
Highrise::Base.find_by_name("A deal").should == @deal_one
|
16
|
+
end
|
17
|
+
|
18
|
+
it ".find_all_by_(attribute) finds all" do
|
19
|
+
Highrise::Base.find_all_by_name("A deal").should == [@deal_one, @deal_two]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with pagination" do
|
24
|
+
before do
|
25
|
+
class PaginatedBaseClass < Highrise::Base; include Highrise::Pagination; end
|
26
|
+
@john_doe = PaginatedBaseClass.new(:id => 1, :first_name => "John")
|
27
|
+
@john_baker = PaginatedBaseClass.new(:id => 2, :first_name => "John")
|
28
|
+
@joe_smith = PaginatedBaseClass.new(:id => 3, :first_name => "Joe")
|
29
|
+
PaginatedBaseClass.should_receive(:find_all_across_pages).and_return([@john_doe, @john_baker, @joe_smith])
|
30
|
+
end
|
31
|
+
it ".find_by_(attribute) finds one" do
|
32
|
+
PaginatedBaseClass.find_by_first_name("John").should == @john_doe
|
33
|
+
end
|
34
|
+
|
35
|
+
it ".find_all_by_(attribute) finds all" do
|
36
|
+
PaginatedBaseClass.find_all_by_first_name("John").should == [@john_doe, @john_baker]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "expects arguments to the finder" do
|
41
|
+
expect { Highrise::Base.find_all_by_first_name }.to raise_error(ArgumentError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "falls back to regular method missing" do
|
45
|
+
expect { Highrise::Base.any_other_method }.to raise_error(NoMethodError)
|
46
|
+
end
|
11
47
|
end
|
12
|
-
|
13
|
-
end
|
48
|
+
end
|
@@ -1,14 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Comment do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@comment = Highrise::Comment.new
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should be instance of Highrise::Base" do
|
10
|
-
@comment.kind_of?(Highrise::Base).should be_true
|
11
|
-
end
|
12
|
-
|
13
|
-
|
4
|
+
it { should be_a_kind_of Highrise::Base }
|
14
5
|
end
|
@@ -1,79 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Company do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
Highrise::Base.site = 'http://example.com.i:3000'
|
7
|
-
@company = Highrise::Company.new(:id => 1)
|
8
|
-
returning @tags = [] do
|
9
|
-
@tags << {'id' => "414578", 'name' => "cliente"}
|
10
|
-
@tags << {'id' => "414580", 'name' => "ged"}
|
11
|
-
@tags << {'id' => "414579", 'name' => "iepc"}
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should be instance of Highrise::Base" do
|
16
|
-
@company.kind_of?(Highrise::Base).should be_true
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".find_all_across_pages_since" do
|
20
|
-
|
21
|
-
it "should delegate to find_all_across_pages with correct params" do
|
22
|
-
time = Time.parse("Wed Jan 14 15:43:11 -0200 2009")
|
23
|
-
Highrise::Company.should_receive(:find_all_across_pages).with({:params=>{:since=>"20090114174311"}}).and_return("result")
|
24
|
-
Highrise::Company.find_all_across_pages_since(time).should == "result"
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
4
|
+
subject { Highrise::Company.new(:id => 1) }
|
28
5
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@company.people.should == "people"
|
34
|
-
end
|
6
|
+
it { should be_a_kind_of Highrise::Base }
|
7
|
+
it_should_behave_like "a paginated class"
|
8
|
+
it_should_behave_like "a taggable class"
|
9
|
+
it_should_behave_like "a searchable class"
|
35
10
|
|
11
|
+
it "#people" do
|
12
|
+
Highrise::Person.should_receive(:find_all_across_pages).with(:from=>"/companies/1/people.xml").and_return("people")
|
13
|
+
subject.people.should == "people"
|
36
14
|
end
|
37
15
|
|
38
|
-
|
39
|
-
|
40
|
-
it "should return an array of all tags for that company." do
|
41
|
-
@company.should_receive(:get).with(:tags).and_return(@tags)
|
42
|
-
@company.tags.should == @tags
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "tag!(tag_name)" do
|
48
|
-
|
49
|
-
it "should create a tag for this company." do
|
50
|
-
@company.should_receive(:post).with(:tags, :name => "client" ).and_return(true)
|
51
|
-
@company.tag!("client").should be_true
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "untag!(tag_name)" do
|
57
|
-
|
58
|
-
it "should delete a tag for this company." do
|
59
|
-
@company.should_receive(:get).with(:tags).and_return(@tags)
|
60
|
-
@company.should_receive(:delete).with("tags/414578").and_return(true)
|
61
|
-
@company.untag!("cliente").should be_true
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
describe ".label" do
|
67
|
-
it "should return 'Party' for label" do
|
68
|
-
@company.label.should == 'Party'
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe ".add_note" do
|
73
|
-
it "should delegate to Highrise::Note.create with correct params" do
|
74
|
-
Highrise::Note.should_receive(:create).with({:body=>"body", :subject_id=>1, :subject_type=>'Party'}).and_return(mock('note'))
|
75
|
-
@company.add_note :body=>'body'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
16
|
+
it { subject.label.should == 'Party' }
|
79
17
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Highrise::DealCategory do
|
4
|
+
subject { Highrise::DealCategory.new(:id => 1, :name => "Deal Category") }
|
5
|
+
|
6
|
+
it { should be_a_kind_of Highrise::Base }
|
7
|
+
|
8
|
+
it ".find_by_name" do
|
9
|
+
deal_category = Highrise::DealCategory.new(:id => 2, :name => "Another Deal Category")
|
10
|
+
Highrise::DealCategory.should_receive(:find).with(:all).and_return([deal_category, subject])
|
11
|
+
Highrise::DealCategory.find_by_name("Deal Category").should == subject
|
12
|
+
end
|
13
|
+
end
|
data/spec/highrise/deal_spec.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Deal do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
4
|
+
subject { Highrise::Deal.new(:id => 1) }
|
5
|
+
|
6
|
+
it { should be_a_kind_of Highrise::Subject }
|
8
7
|
|
9
|
-
it "
|
10
|
-
|
8
|
+
it ".add_note" do
|
9
|
+
Highrise::Note.should_receive(:create).with({:body=>"body", :subject_id=>1, :subject_type=>'Deal'}).and_return(mock('note'))
|
10
|
+
subject.add_note :body=>'body'
|
11
11
|
end
|
12
12
|
|
13
|
-
describe ".
|
14
|
-
it
|
15
|
-
|
16
|
-
|
13
|
+
describe ".update_status" do
|
14
|
+
it { expect { subject.update_status("invalid") }.to raise_error(ArgumentError) }
|
15
|
+
|
16
|
+
%w[pending won lost].each do |status|
|
17
|
+
it "updates status to #{status}" do
|
18
|
+
subject.should_receive(:put).with(:status, :status => {:name => status})
|
19
|
+
subject.update_status(status)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
|
-
|
20
|
-
end
|
23
|
+
end
|
data/spec/highrise/email_spec.rb
CHANGED
@@ -1,25 +1,13 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Highrise::Email do
|
4
|
+
it { should be_a_kind_of Highrise::Base }
|
4
5
|
|
5
|
-
|
6
|
-
@mail = Highrise::Email.new
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should be instance of Highrise::Base" do
|
10
|
-
@mail.kind_of?(Highrise::Base).should be_true
|
11
|
-
end
|
6
|
+
it_should_behave_like "a paginated class"
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Highrise::Comment.should_receive(:find).with(:all, {:from=>"/emails/1/comments.xml"}).and_return("comments")
|
18
|
-
@mail.comments.should == "comments"
|
19
|
-
end
|
20
|
-
|
8
|
+
it "#comments" do
|
9
|
+
subject.should_receive(:email_id).and_return(1)
|
10
|
+
Highrise::Comment.should_receive(:find).with(:all, {:from=>"/emails/1/comments.xml"}).and_return("comments")
|
11
|
+
subject.comments.should == "comments"
|
21
12
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
13
|
end
|