ruby-pardot 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/.rspec ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :gemcutter
2
+
3
+ # Specify your gem's dependencies in ruby-pardot.gemspec
4
+ gemspec
@@ -0,0 +1,32 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ruby-pardot (1.0)
5
+ crack
6
+ httparty
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ crack (0.1.8)
12
+ diff-lcs (1.1.2)
13
+ fakeweb (1.3.0)
14
+ httparty (0.7.4)
15
+ crack (= 0.1.8)
16
+ rspec (2.5.0)
17
+ rspec-core (~> 2.5.0)
18
+ rspec-expectations (~> 2.5.0)
19
+ rspec-mocks (~> 2.5.0)
20
+ rspec-core (2.5.1)
21
+ rspec-expectations (2.5.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.5.0)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ bundler (>= 1.0.0)
30
+ fakeweb
31
+ rspec
32
+ ruby-pardot!
@@ -0,0 +1,82 @@
1
+ == Install
2
+
3
+ Add the following to your Gemfile
4
+
5
+ gem "ruby-pardot"
6
+
7
+ == Usage
8
+
9
+ === Authentication
10
+
11
+ The client will authenticate before performing other API calls, but you can manually authenticate as well
12
+
13
+ client = Pardot::Client.new email, password, user_key
14
+
15
+ # will raise a Pardot::ResponseError if login fails
16
+ # will raise a Pardot::NetError if the http call fails
17
+ client.authenticate
18
+
19
+ === Object Types
20
+
21
+ The available objects are:
22
+
23
+ * lists
24
+ * opportunities
25
+ * prospects
26
+ * users
27
+ * visitor_activities
28
+ * visitors
29
+ * visits
30
+
31
+ === Querying Objects
32
+
33
+ http://developer.pardot.com/kb/api-version-3/querying-prospects
34
+
35
+ Most objects accept limit, offset, sort_by, and sord_order parameters
36
+
37
+ prospects = client.prospects.query(:assigned => false, :sort_by => "last_activity_at", :limit => 20)
38
+
39
+ prospects["total_results"] # number of prospects found
40
+
41
+ prospects["prospect"].each do |prospect|
42
+ puts prospect["first_name"]
43
+ end
44
+
45
+ === Creating, editing, and reading objects
46
+
47
+ See each individual object's API reference page for available methods
48
+
49
+ http://developer.pardot.com/kb/api-version-3/using-prospects
50
+
51
+ prospect = client.prospects.create("user@test.com", :first_name => "John", :last_name => "Doe")
52
+
53
+ prospect.each do |key, value|
54
+ puts "#{key} is #{value}"
55
+ end
56
+
57
+ === Output formats
58
+
59
+ client.format = "simple" # default
60
+ client.format = "mobile"
61
+ client.format = "full"
62
+
63
+ === Error handling
64
+
65
+ Pardot will respond with an error message when you provide invalid parameters
66
+
67
+ begin
68
+ prospect = client.prospects.create("user@test.com")
69
+ rescue Pardot::ResponseError => e
70
+ # the request went through, but Pardot responded with an error, possibly because this email is already in use
71
+ end
72
+
73
+ Performing API calls across the internet is inherently unsafe, so be sure to catch the exceptions
74
+
75
+ begin
76
+ visitor = client.visitors.query(:id_greater_than => 200)
77
+ rescue Pardot::NetError => e
78
+ # the API request failed
79
+ # - socket broke before the request was completed
80
+ # - pi.pardot.com is under heavy load
81
+ # - many number of other reasons
82
+ end
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+
5
+ require 'rspec/core'
6
+ require 'rspec/core/rake_task'
7
+
8
+ desc "Run all specs"
9
+ RSpec::Core::RakeTask.new(:spec) do |t|
10
+ t.pattern = "./spec/**/*_spec.rb"
11
+ end
@@ -0,0 +1,19 @@
1
+ module Pardot
2
+ module Authentication
3
+
4
+ def authenticate
5
+ resp = post "login", nil, :email => @email, :password => @password, :user_key => @user_key
6
+ @api_key = resp["api_key"]
7
+ end
8
+
9
+ def authenticated?
10
+ @api_key != nil
11
+ end
12
+
13
+ def reauthenticate
14
+ @api_key = nil
15
+ authenticate
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module Pardot
2
+
3
+ class Client
4
+
5
+ include HTTParty
6
+ base_uri 'https://pi.pardot.com'
7
+ format :xml
8
+
9
+ include Authentication
10
+ include Http
11
+
12
+ include Objects::Lists
13
+ include Objects::Opportunities
14
+ include Objects::Prospects
15
+ include Objects::Users
16
+ include Objects::Visitors
17
+ include Objects::Visits
18
+ include Objects::VisitorActivities
19
+
20
+ attr_accessor :email, :password, :user_key, :api_key, :format
21
+
22
+ def initialize email, password, user_key
23
+ @email = email
24
+ @password = password
25
+ @user_key = user_key
26
+
27
+ @format = "simple"
28
+ end
29
+
30
+
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ module Pardot
2
+
3
+ class Error < StandardError; end
4
+ class NetError < Error; end
5
+ class ResponseError < Error; end
6
+ class ExpiredApiKeyError < Error; end
7
+
8
+ end
@@ -0,0 +1,69 @@
1
+ module Pardot
2
+ module Http
3
+
4
+ def get object, path, params = {}, num_retries = 0
5
+ smooth_params object, params
6
+ full_path = fullpath object, path
7
+ check_response self.class.get(full_path, :query => params)
8
+
9
+ rescue Pardot::ExpiredApiKeyError => e
10
+ handle_expired_api_key :get, object, path, params, num_retries, e
11
+
12
+ rescue SocketError, Interrupt, EOFError, SystemCallError => e
13
+ raise Pardot::NetError.new(e)
14
+ end
15
+
16
+ def post object, path, params = {}, num_retries = 0
17
+ smooth_params object, params
18
+ full_path = fullpath object, path
19
+ check_response self.class.post(full_path, :query => params)
20
+
21
+ rescue Pardot::ExpiredApiKeyError => e
22
+ handle_expired_api_key :post, object, path, params, num_retries, e
23
+
24
+ rescue SocketError, Interrupt, EOFError, SystemCallError => e
25
+ raise Pardot::NetError.new(e)
26
+ end
27
+
28
+ protected
29
+
30
+ def handle_expired_api_key method, object, path, params, num_retries, e
31
+ raise e unless num_retries == 0
32
+
33
+ reauthenticate
34
+
35
+ send(method, object, path, params, 1)
36
+ end
37
+
38
+ def smooth_params object, params
39
+ return if object == "login"
40
+
41
+ authenticate unless authenticated?
42
+ params.merge! :user_key => @user_key, :api_key => @api_key, :format => @format
43
+ end
44
+
45
+ def check_response http_response
46
+ rsp = http_response["rsp"]
47
+
48
+ error = rsp["err"] if rsp
49
+ error ||= "Unknown Failure: #{rsp.inspect}" if rsp && rsp["stat"] == "fail"
50
+
51
+ if error == "Invalid API key or user key" && @api_key
52
+ raise ExpiredApiKeyError.new @api_key
53
+ end
54
+
55
+ raise ResponseError.new error if error
56
+
57
+ rsp
58
+ end
59
+
60
+ def fullpath object, path, version = 3
61
+ full = File.join("/api", object, "version", version.to_s)
62
+ unless path.nil?
63
+ full = File.join(full, path)
64
+ end
65
+ full
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,50 @@
1
+ module Pardot
2
+ module Objects
3
+
4
+ module Lists
5
+
6
+ def lists
7
+ @lists ||= Lists.new self
8
+ end
9
+
10
+ class Lists
11
+
12
+ def initialize client
13
+ @client = client
14
+ end
15
+
16
+ def create id, params = {}
17
+ post "/do/create", params
18
+ end
19
+
20
+ def query params
21
+ result = get "/do/query", params, "result"
22
+ result["total_results"] = result["total_results"].to_i if result["total_results"]
23
+ result
24
+ end
25
+
26
+ def read_by_id id, params = {}
27
+ get "/do/read/id/#{id}", params
28
+ end
29
+
30
+ def update id, params = {}
31
+ post "/do/update/#{id}"
32
+ end
33
+
34
+ protected
35
+
36
+ def get path, params = {}, result = "list"
37
+ response = @client.get "list", path, params
38
+ result ? response[result] : response
39
+ end
40
+
41
+ def post path, params = {}, result = "list"
42
+ response = @client.post "list", path, params
43
+ result ? response[result] : response
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,54 @@
1
+ module Pardot
2
+ module Objects
3
+
4
+ module Opportunities
5
+
6
+ def opportunities
7
+ @opportunities ||= Opportunities.new self
8
+ end
9
+
10
+ class Opportunities
11
+
12
+ def initialize client
13
+ @client = client
14
+ end
15
+
16
+ def query params
17
+ result = get "/do/query", params, "result"
18
+ result["total_results"] = result["total_results"].to_i if result["total_results"]
19
+ result
20
+ end
21
+
22
+ def create_by_email email, params = {}
23
+ post "/do/create/prospect_email/#{email}", params
24
+ end
25
+
26
+ def create_by_id prospect_id, params = {}
27
+ post "/do/create/prospect_id/#{prospect_id}", params
28
+ end
29
+
30
+ def read_by_id id, params = {}
31
+ post "/do/read/id/#{id}", params
32
+ end
33
+
34
+ def update_by_id id, params = {}
35
+ post "/do/update/id/#{id}", params
36
+ end
37
+
38
+ protected
39
+
40
+ def get path, params = {}, result = "opportunity"
41
+ response = @client.get "opportunity", path, params
42
+ result ? response[result] : response
43
+ end
44
+
45
+ def post path, params = {}, result = "opportunity"
46
+ response = @client.post "opportunity", path, params
47
+ result ? response[result] : response
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,73 @@
1
+ module Pardot
2
+ module Objects
3
+ module Prospects
4
+
5
+ def prospects
6
+ @prospects ||= Prospects.new self
7
+ end
8
+
9
+ class Prospects
10
+
11
+ def initialize client
12
+ @client = client
13
+ end
14
+
15
+ def query search_criteria
16
+ result = get "/do/query", search_criteria, "result"
17
+ result["total_results"] = result["total_results"].to_i if result["total_results"]
18
+ result
19
+ end
20
+
21
+ def assign_by_email email, params
22
+ post "/do/assign/email/#{email}", params
23
+ end
24
+
25
+ def assign_by_id id, params
26
+ post "/do/assign/id/#{id}", params
27
+ end
28
+
29
+ def create email, params = {}
30
+ post "/do/create/email/#{email}", params
31
+ end
32
+
33
+ def read_by_email email, params = {}
34
+ post "/do/read/email/#{email}", params
35
+ end
36
+
37
+ def read_by_id id, params = {}
38
+ post "/do/read/id/#{id}", params
39
+ end
40
+
41
+ def update_by_email email, params = {}
42
+ post "/do/update/email/#{email}", params
43
+ end
44
+
45
+ def update_by_id id, params = {}
46
+ post "/do/update/id/#{id}", params
47
+ end
48
+
49
+ def upsert_by_email email, params = {}
50
+ post "/do/upsert/email/#{email}", params
51
+ end
52
+
53
+ def upsert_by_id id, params = {}
54
+ post "/do/upsert/id/#{id}", params
55
+ end
56
+
57
+ protected
58
+
59
+ def get path, params = {}, result = "prospect"
60
+ response = @client.get "prospect", path, params
61
+ result ? response[result] : response
62
+ end
63
+
64
+ def post path, params = {}, result = "prospect"
65
+ response = @client.post "prospect", path, params
66
+ result ? response[result] : response
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
73
+ end