sugarcrm 0.6.2 → 0.7.2

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.
Files changed (59) hide show
  1. data/README.rdoc +13 -8
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/lib/sugarcrm.rb +7 -139
  5. data/lib/sugarcrm/association_methods.rb +45 -0
  6. data/lib/sugarcrm/attribute_methods.rb +65 -0
  7. data/lib/sugarcrm/base.rb +85 -0
  8. data/lib/sugarcrm/connection.rb +126 -103
  9. data/lib/sugarcrm/{api → connection/api}/get_available_modules.rb +6 -1
  10. data/lib/sugarcrm/{api → connection/api}/get_document_revision.rb +2 -1
  11. data/lib/sugarcrm/{api → connection/api}/get_entries.rb +5 -6
  12. data/lib/sugarcrm/{api → connection/api}/get_entries_count.rb +3 -5
  13. data/lib/sugarcrm/{api → connection/api}/get_entry.rb +6 -6
  14. data/lib/sugarcrm/{api → connection/api}/get_entry_list.rb +6 -6
  15. data/lib/sugarcrm/{api → connection/api}/get_module_fields.rb +2 -1
  16. data/lib/sugarcrm/{api → connection/api}/get_note_attachment.rb +1 -1
  17. data/lib/sugarcrm/connection/api/get_relationships.rb +34 -0
  18. data/lib/sugarcrm/{api → connection/api}/get_report_entries.rb +1 -1
  19. data/lib/sugarcrm/{api → connection/api}/get_server_info.rb +1 -1
  20. data/lib/sugarcrm/{api → connection/api}/get_user_id.rb +2 -2
  21. data/lib/sugarcrm/{api → connection/api}/get_user_team_id.rb +2 -2
  22. data/lib/sugarcrm/{api → connection/api}/login.rb +1 -1
  23. data/lib/sugarcrm/{api → connection/api}/logout.rb +1 -1
  24. data/lib/sugarcrm/{api → connection/api}/seamless_login.rb +1 -1
  25. data/lib/sugarcrm/{api → connection/api}/search_by_module.rb +1 -1
  26. data/lib/sugarcrm/{api → connection/api}/set_campaign_merge.rb +1 -1
  27. data/lib/sugarcrm/{api → connection/api}/set_document_revision.rb +1 -1
  28. data/lib/sugarcrm/{api → connection/api}/set_entries.rb +1 -1
  29. data/lib/sugarcrm/{api → connection/api}/set_entry.rb +1 -1
  30. data/lib/sugarcrm/{api → connection/api}/set_note_attachment.rb +0 -0
  31. data/lib/sugarcrm/{api → connection/api}/set_relationship.rb +1 -1
  32. data/lib/sugarcrm/{api → connection/api}/set_relationships.rb +1 -1
  33. data/lib/sugarcrm/connection/helper.rb +10 -0
  34. data/lib/sugarcrm/exceptions.rb +6 -0
  35. data/lib/sugarcrm/module.rb +105 -6
  36. data/lib/sugarcrm/module_methods.rb +18 -0
  37. data/lib/sugarcrm/request.rb +13 -3
  38. data/lib/sugarcrm/response.rb +75 -25
  39. data/test/connection/test_get_available_modules.rb +12 -0
  40. data/test/connection/test_get_entries.rb +21 -0
  41. data/test/connection/test_get_entry.rb +20 -0
  42. data/test/connection/test_get_entry_list.rb +28 -0
  43. data/test/connection/test_get_module_fields.rb +14 -0
  44. data/test/connection/test_get_relationships.rb +15 -0
  45. data/test/connection/test_get_server_info.rb +12 -0
  46. data/test/connection/test_get_user_id.rb +12 -0
  47. data/test/connection/test_get_user_team_id.rb +12 -0
  48. data/test/connection/test_login.rb +12 -0
  49. data/test/connection/test_logout.rb +12 -0
  50. data/test/helper.rb +4 -1
  51. data/test/test_connection.rb +12 -48
  52. data/test/test_module.rb +14 -0
  53. data/test/test_response.rb +5 -14
  54. data/test/test_sugarcrm.rb +16 -14
  55. metadata +60 -34
  56. data/lib/sugarcrm/api/get_relationship.rb +0 -25
  57. data/lib/sugarcrm/core_ext/attribute.rb +0 -67
  58. data/lib/sugarcrm/core_ext/remove_method.rb +0 -6
  59. data/lib/sugarcrm/core_ext/singleton_class.rb +0 -13
@@ -11,8 +11,8 @@ RubyGem for interacting with SugarCRM via REST.
11
11
  == Description:
12
12
 
13
13
  I've implemented all of the basic API calls that SugarCRM supports, and am actively building an abstraction layer
14
- on top of the basic API methods. The end result will be to provide ActiveRecord style finders and first class
15
- objects. Some of this functionality is included today.
14
+ on top of the basic API methods. The end result will be ActiveRecord style finders and first class objects. Some
15
+ of this functionality is included today.
16
16
 
17
17
  == FEATURES/PROBLEMS:
18
18
 
@@ -23,20 +23,25 @@ objects. Some of this functionality is included today.
23
23
 
24
24
  require 'sugarcrm'
25
25
  # Establish a connection
26
- sugarcrm = SugarCRM::Base.establish_connection("http://localhost/sugarcrm", 'user', 'password', {:debug => false})
26
+ SugarCRM::Base.establish_connection("http://localhost/sugarcrm", 'user', 'password', {:debug => false})
27
27
 
28
28
  # Retrieve a user by ID, using the SugarCRM::User Proxy object
29
29
  SugarCRM::User.find(id)
30
30
 
31
31
  # Show a list of available modules
32
- sugarcrm.connection.modules
32
+ SugarCRM.modules
33
+
34
+ # Use the HTTP for direct API calls
35
+ SugarCRM.connection.get_entry(1)
33
36
 
34
37
  # Lookup a user by name. Find any associated accounts
35
- sugarcrm.connection.get_entry_list(
38
+ SugarCRM::User.find_by_username('sarah').accounts
39
+
40
+ # Same operation, but using the direct API calls
41
+ SugarCRM.connection.get_entry_list(
36
42
  "Users",
37
- "users.user_name = \'#{USER}\'",
43
+ "users.user_name = \'sarah\'",
38
44
  {
39
- :fields => ["first_name", "last_name"],
40
45
  :link_fields => [
41
46
  {
42
47
  "name" => "accounts",
@@ -48,7 +53,7 @@ objects. Some of this functionality is included today.
48
53
 
49
54
  == REQUIREMENTS:
50
55
 
51
- * activesupport gem
56
+ * >= activesupport 3.0.0 gem
52
57
  * json gem
53
58
 
54
59
  == INSTALL:
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ begin
14
14
  gem.authors = ["Carl Hicks"]
15
15
  gem.add_development_dependency "shoulda", ">= 0"
16
16
  gem.add_dependency "json", ">= 0"
17
- gem.add_dependency "activesupport", ">= 2.3"
17
+ gem.add_dependency "activesupport", ">= 3.0"
18
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
19
  end
20
20
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.7.2
@@ -1,143 +1,11 @@
1
- #! /usr/bin/env ruby
2
-
3
- module SugarCRM
4
-
5
- Dir["#{File.dirname(__FILE__)}/sugarcrm/**/*.rb"].each { |f| load(f) }
6
-
7
1
  require 'pp'
8
- require 'uri'
9
- require 'net/https'
10
- require 'digest/md5'
11
-
12
2
  require 'rubygems'
13
3
  require 'active_support/core_ext'
14
- require 'json'
15
-
16
- class Base
17
- # Unset all of the instance methods we don't need.
18
- instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$|^define_method$|^class$|^instance_of.$)/ }
19
-
20
- # This holds our connection
21
- cattr_accessor :connection, :instance_writer => false
22
-
23
- # Contains the name of the module in SugarCRM
24
- class_attribute :module_name
25
- self.module_name = self.name.split(/::/)[-1]
26
-
27
- # Contains the fields found on the current module
28
- class_attribute :module_fields
29
- self.module_fields = {}
30
-
31
- # Tracks if we have extended our class with attribute methods yet.
32
- class_attribute :attribute_methods_generated
33
- self.attribute_methods_generated = false
34
-
35
- # Contains a list of attributes
36
- attr :attributes, true
37
- attr :debug, true
38
-
39
- def self.establish_connection(url, user, pass, opts={})
40
- options = {
41
- :debug => false,
42
- }.merge(opts)
43
- @debug = options[:debug]
44
- @@connection = SugarCRM::Connection.new(url, user, pass, @debug)
45
- end
46
-
47
- # Registers the module fields on the class
48
- def self.register_module_fields
49
- self.module_fields = connection.get_fields(self.module_name)["module_fields"] if self.module_fields.length == 0
50
- end
51
-
52
- def initialize(attributes={})
53
- @attributes = attributes_from_module_fields.merge(attributes)
54
- define_attribute_methods
55
- end
56
-
57
- def inspect
58
- self
59
- end
60
-
61
- def to_s
62
- attrs = []
63
- @attributes.each_key do |k|
64
- attrs << "#{k}: #{attribute_for_inspect(k)}"
65
- end
66
- "#<#{self.class} #{attrs.join(", ")}>"
67
- end
68
-
69
- # Returns an <tt>#inspect</tt>-like string for the value of the
70
- # attribute +attr_name+. String attributes are elided after 50
71
- # characters, and Date and Time attributes are returned in the
72
- # <tt>:db</tt> format. Other attributes return the value of
73
- # <tt>#inspect</tt> without modification.
74
- #
75
- # person = Person.create!(:name => "David Heinemeier Hansson " * 3)
76
- #
77
- # person.attribute_for_inspect(:name)
78
- # # => '"David Heinemeier Hansson David Heinemeier Hansson D..."'
79
- #
80
- # person.attribute_for_inspect(:created_at)
81
- # # => '"2009-01-12 04:48:57"'
82
- def attribute_for_inspect(attr_name)
83
- value = read_attribute(attr_name)
84
-
85
- if value.is_a?(String) && value.length > 50
86
- "#{value[0..50]}...".inspect
87
- elsif value.is_a?(Date) || value.is_a?(Time)
88
- %("#{value.to_s(:db)}")
89
- else
90
- value.inspect
91
- end
92
- end
93
-
94
- protected
95
-
96
- # Generates get/set methods for keys in the attributes hash
97
- def define_attribute_methods
98
- return if attribute_methods_generated?
99
- @attributes.each_pair do |k,v|
100
- self.class.module_eval %Q?
101
- def #{k}
102
- read_attribute :#{k}
103
- end
104
- def #{k}=(value)
105
- write_attribute :#{k},value
106
- end
107
- ?
108
- end
109
- self.class.attribute_methods_generated = true
110
- end
111
-
112
- # Wrapper around class attribute
113
- def attribute_methods_generated?
114
- self.class.attribute_methods_generated
115
- end
116
-
117
- def module_fields_registered?
118
- self.class.module_fields.length > 0
119
- end
120
-
121
- # Returns a hash of the module fields from the
122
- def attributes_from_module_fields
123
- self.class.register_module_fields unless module_fields_registered?
124
- fields = {}
125
- self.class.module_fields.keys.sort.each do |k|
126
- fields[k.to_s] = nil
127
- end
128
- fields
129
- end
130
-
131
- # Wrapper around attributes hash
132
- def read_attribute(key)
133
- @attributes[key]
134
- end
135
-
136
- # Wrapper around attributes hash
137
- def write_attribute(key, value)
138
- @attributes[key] = value
139
- end
140
-
141
- end
142
4
 
143
- end
5
+ require 'sugarcrm/module_methods'
6
+ require 'sugarcrm/base'
7
+ require 'sugarcrm/connection'
8
+ require 'sugarcrm/exceptions'
9
+ require 'sugarcrm/module'
10
+ require 'sugarcrm/request'
11
+ require 'sugarcrm/response'
@@ -0,0 +1,45 @@
1
+ module SugarCRM; module AssociationMethods
2
+
3
+ # Returns an array of the module link fields
4
+ def associations_from_module_link_fields
5
+ self.class._module.link_fields.keys
6
+ end
7
+
8
+ # Generates the association proxy methods for related modules
9
+ def define_association_methods
10
+ return if association_methods_generated?
11
+ @associations.each do |k|
12
+ self.class.module_eval %Q?
13
+ def #{k}
14
+ query_association :#{k}
15
+ end
16
+ def #{k}=(value)
17
+ update_association :#{k},value
18
+ end
19
+ ?
20
+ end
21
+ self.class.association_methods_generated = true
22
+ end
23
+
24
+ #
25
+ # {"email_addresses"=>
26
+ # {"name"=>"email_addresses",
27
+ # "module"=>"EmailAddress",
28
+ # "bean_name"=>"EmailAddress",
29
+ # "relationship"=>"users_email_addresses",
30
+ # "type"=>"link"},
31
+ #
32
+ def query_association(association)
33
+ klass = self.class._module.link_fields[association.to_s]["module"]
34
+ objects = SugarCRM.connection.get_relationships(
35
+ self.class._module.name,
36
+ self.id,
37
+ association.to_s
38
+ )
39
+ end
40
+
41
+ def update_association(association, value)
42
+ false
43
+ end
44
+
45
+ end; end
@@ -0,0 +1,65 @@
1
+ module SugarCRM; module AttributeMethods
2
+
3
+ # Returns a hash of the module fields from the
4
+ def attributes_from_module_fields
5
+ fields = {}
6
+ self.class._module.fields.keys.sort.each do |k|
7
+ fields[k.to_s] = nil
8
+ end
9
+ fields
10
+ end
11
+
12
+ # Generates get/set methods for keys in the attributes hash
13
+ def define_attribute_methods
14
+ return if attribute_methods_generated?
15
+ @attributes.each_pair do |k,v|
16
+ self.class.module_eval %Q?
17
+ def #{k}
18
+ read_attribute :#{k}
19
+ end
20
+ def #{k}=(value)
21
+ write_attribute :#{k},value
22
+ end
23
+ ?
24
+ end
25
+ self.class.attribute_methods_generated = true
26
+ end
27
+
28
+ # Returns an <tt>#inspect</tt>-like string for the value of the
29
+ # attribute +attr_name+. String attributes are elided after 50
30
+ # characters, and Date and Time attributes are returned in the
31
+ # <tt>:db</tt> format. Other attributes return the value of
32
+ # <tt>#inspect</tt> without modification.
33
+ #
34
+ # person = Person.create!(:name => "David Heinemeier Hansson " * 3)
35
+ #
36
+ # person.attribute_for_inspect(:name)
37
+ # # => '"David Heinemeier Hansson David Heinemeier Hansson D..."'
38
+ #
39
+ # person.attribute_for_inspect(:created_at)
40
+ # # => '"2009-01-12 04:48:57"'
41
+ def attribute_for_inspect(attr_name)
42
+ value = read_attribute(attr_name)
43
+ if value.is_a?(String) && value.length > 50
44
+ "#{value[0..50]}...".inspect
45
+ elsif value.is_a?(Date) || value.is_a?(Time)
46
+ %("#{value.to_s(:db)}")
47
+ else
48
+ value.inspect
49
+ end
50
+ end
51
+
52
+ protected
53
+
54
+ # Wrapper around attributes hash
55
+ def read_attribute(key)
56
+ @attributes[key]
57
+ end
58
+
59
+ # Wrapper around attributes hash
60
+ def write_attribute(key, value)
61
+ @attributes[key] = value
62
+ end
63
+
64
+ end; end
65
+
@@ -0,0 +1,85 @@
1
+ require 'sugarcrm/attribute_methods'
2
+ require 'sugarcrm/association_methods'
3
+
4
+ module SugarCRM; class Base
5
+
6
+ # Unset all of the instance methods we don't need.
7
+ instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$|^define_method$|^class$|^instance_of.$)/ }
8
+
9
+ # This holds our connection
10
+ cattr_accessor :connection, :instance_writer => false
11
+
12
+ # Tracks if we have extended our class with attribute methods yet.
13
+ class_attribute :attribute_methods_generated
14
+ self.attribute_methods_generated = false
15
+
16
+ class_attribute :association_methods_generated
17
+ self.association_methods_generated = false
18
+
19
+ class_attribute :_module
20
+ self._module = nil
21
+
22
+ # Contains a list of attributes
23
+ attr :attributes, true
24
+ attr :id, true
25
+ attr :debug, true
26
+
27
+ class << self # Class methods
28
+ def establish_connection(url, user, pass, opts={})
29
+ options = {
30
+ :debug => false,
31
+ }.merge(opts)
32
+ @debug = options[:debug]
33
+ @@connection = SugarCRM::Connection.new(url, user, pass, @debug)
34
+ end
35
+
36
+ # Runs a find against the remote service
37
+ def find(id)
38
+ response = SugarCRM.connection.get_entry(self._module.name, id, {:fields => self._module.fields.keys})
39
+ end
40
+ end
41
+
42
+ # Creates an instance of a Module Class, i.e. Account, User, Contact, etc.
43
+ # This call depends upon SugarCRM.modules having actual data in it. If you
44
+ # are using Base.establish_connection, you should be fine. But if you are
45
+ # using the Connection class by itself, you may need to prime the pump with
46
+ # a call to Module.register_all
47
+ def initialize(id=nil, attributes={})
48
+ @id = id
49
+ @attributes = attributes_from_module_fields.merge(attributes)
50
+ @associations = associations_from_module_link_fields
51
+ define_attribute_methods
52
+ define_association_methods
53
+ end
54
+
55
+ def inspect
56
+ self
57
+ end
58
+
59
+ def to_s
60
+ attrs = []
61
+ @attributes.each_key do |k|
62
+ attrs << "#{k}: #{attribute_for_inspect(k)}"
63
+ end
64
+ "#<#{self.class} #{attrs.join(", ")}>"
65
+ end
66
+
67
+ def save
68
+ response = SugarCRM.connection.set_entry(self._module.name, @attributes)
69
+ end
70
+
71
+ # Wrapper around class attribute
72
+ def attribute_methods_generated?
73
+ self.class.attribute_methods_generated
74
+ end
75
+
76
+ def association_methods_generated?
77
+ self.class.association_methods_generated
78
+ end
79
+
80
+ Base.class_eval do
81
+ include AttributeMethods
82
+ include AssociationMethods
83
+ end
84
+
85
+ end; end
@@ -1,112 +1,135 @@
1
- module SugarCRM
2
- class Connection
3
-
4
- URL = "/service/v2/rest.php"
5
-
6
- attr :url, true
7
- attr :user, false
8
- attr :pass, false
9
- attr :ssl, false
10
- attr :session, true
11
- attr :connection, true
12
- attr :modules, false
13
- attr :debug, true
14
-
15
- # This is the singleton connection class.
16
- def initialize(url, user, pass, debug=false)
17
- @url = URI.parse(url)
18
- @user = user
19
- @pass = pass
20
- @debug = debug
21
- # Handles http/https in url string
22
- @ssl = false
23
- @ssl = true if @url.scheme == "https"
24
- # Appends the rest.php path onto the end of the URL if it's not included
25
- if @url.path !~ /rest.php$/
26
- @url.path += URL
27
- end
28
- login!
29
- raise SugarCRM::LoginError, "Invalid Login" unless logged_in?
30
- @modules = get_modules
31
- @modules.each do |m|
32
- begin
33
- register_module(m)
34
- rescue SugarCRM::InvalidRequest
35
- next
36
- end
37
- end
38
- end
39
-
40
- # Check to see if we are logged in
41
- def logged_in?
42
- @session ? true : false
43
- end
1
+
2
+ require 'uri'
3
+ require 'net/https'
4
+
5
+ require 'rubygems'
6
+ require 'json'
7
+
8
+ require 'sugarcrm/connection/helper'
9
+ Dir["#{File.dirname(__FILE__)}/connection/api/*.rb"].each { |f| load(f) }
10
+
11
+ module SugarCRM; class Connection
12
+
13
+ URL = "/service/v2/rest.php"
14
+ DONT_SHOW_DEBUG_FOR = [:get_available_modules]
15
+ RESPONSE_IS_NOT_JSON = [:get_user_id, :get_user_team_id]
16
+
17
+ attr :url, true
18
+ attr :user, false
19
+ attr :pass, false
20
+ attr :session, true
21
+ attr :connection, true
22
+ attr :options, true
23
+ attr :request, true
24
+ attr :response, true
25
+
26
+ # This is the singleton connection class.
27
+ def initialize(url, user, pass, options={})
28
+ @options = {
29
+ :debug => false,
30
+ :register_modules => true
31
+ }.merge(options)
44
32
 
45
- # Login
46
- def login!
47
- response = login
48
- @session = response["id"]
49
- end
33
+ @url = URI.parse(url)
34
+ @user = user
35
+ @pass = pass
36
+ @request = ""
37
+ @response = ""
38
+
39
+ resolve_url
40
+ login!
41
+ self
42
+ end
43
+
44
+ # Check to see if we are logged in
45
+ def logged_in?
46
+ @session ? true : false
47
+ end
48
+
49
+ # Login
50
+ def login!
51
+ @session = login["id"]
52
+ raise SugarCRM::LoginError, "Invalid Login" unless logged_in?
53
+ SugarCRM.connection = self
54
+ SugarCRM::Base.connection = self
55
+ Module.register_all if @options[:register_modules]
56
+ end
50
57
 
51
- # Check to see if we are connected
52
- def connected?
53
- return false unless @connection
54
- return false unless @connection.started?
55
- true
58
+ # Check to see if we are connected
59
+ def connected?
60
+ return false unless @connection
61
+ return false unless @connection.started?
62
+ true
63
+ end
64
+
65
+ # Connect
66
+ def connect!
67
+ @connection = Net::HTTP.new(@url.host, @url.port)
68
+ if @url.scheme == "https"
69
+ @connection.use_ssl = true
70
+ @connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
56
71
  end
57
-
58
- # Connect
59
- def connect!
60
- @connection = Net::HTTP.new(@url.host, @url.port)
61
- if @ssl
62
- @connection.use_ssl = true
63
- @connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
72
+ @connection.start
73
+ end
74
+
75
+ # Send a GET request to the Sugar Instance
76
+ def send!(method, json)
77
+ @request = SugarCRM::Request.new(@url, method, json, @options[:debug])
78
+ if @request.length > 3900
79
+ @response = @connection.post(@url.path, @request)
80
+ else
81
+ @response = @connection.get(@url.path.dup + "?" + @request.to_s)
82
+ end
83
+ handle_response
84
+ end
85
+
86
+ def debug=(debug)
87
+ options[:debug] = debug
88
+ end
89
+
90
+ private
91
+
92
+ def handle_response
93
+ case @response
94
+ when Net::HTTPOK
95
+ return process_response
96
+ when Net::HTTPNotFound
97
+ raise SugarCRM::InvalidSugarCRMUrl, "#{@url} is invalid"
98
+ when Net::HTTPInternalServerError
99
+ raise SugarCRM::InvalidRequest, "#{@request} is invalid"
100
+ else
101
+ if @options[:debug]
102
+ puts "#{@request.method}: Raw Response:"
103
+ puts @response.body
104
+ puts "\n"
64
105
  end
65
- @connection.start
106
+ raise SugarCRM::UnhandledResponse, "Can't handle response #{@response}"
66
107
  end
108
+ end
67
109
 
68
- # Send a GET request to the Sugar Instance
69
- def get(method, json)
70
- request = SugarCRM::Request.new(@url, method, json, @debug)
71
- response = connection.get(request.to_s)
72
-
73
- case response
74
- when Net::HTTPOK
75
- raise SugarCRM::EmptyResponse unless response.body
76
- response_json = JSON.parse response.body
77
- return false if response_json["result_count"] == 0
78
- if @debug
79
- puts "#{method}: JSON Response:"
80
- pp response_json
81
- puts "\n"
82
- end
83
- return response_json
84
- when Net::HTTPNotFound
85
- raise SugarCRM::InvalidSugarCRMUrl, "#{@url} is invalid"
86
- when Net::HTTPInternalServerError
87
- raise SugarCRM::InvalidRequest, "#{request} is invalid"
88
- else
89
- if @debug
90
- puts "#{method}: Raw Response:"
91
- puts response.body
92
- puts "\n"
93
- end
94
- raise SugarCRM::UnhandledResponse, "Can't handle response #{response}"
95
- end
110
+ def process_response
111
+ # Complain if our body is empty.
112
+ raise SugarCRM::EmptyResponse unless @response.body
113
+ # Some methods are dumb and don't return a JSON Response
114
+ return @response.body if RESPONSE_IS_NOT_JSON.include? @request.method
115
+ # Push it through the old meat grinder.
116
+ response_json = JSON.parse @response.body
117
+ # Empty result. Is this wise?
118
+ return false if response_json["result_count"] == 0
119
+ # Filter debugging on REALLY BIG responses
120
+ if @options[:debug] && !(DONT_SHOW_DEBUG_FOR.include? @request.method)
121
+ puts "#{@request.method}: JSON Response:"
122
+ pp response_json
123
+ puts "\n"
96
124
  end
97
-
98
- # Dynamically register objects based on Module name
99
- # I.e. a SugarCRM Module named Users will generate
100
- # a SugarCRM::User class.
101
- def register_module(module_name, mod=SugarCRM)
102
- klass_name = module_name.singularize
103
- return if mod.const_defined? klass_name
104
- klass = Class.new(SugarCRM::Base) do
105
- self.module_name = module_name
106
- end
107
- mod.const_set klass_name, klass
108
- klass
125
+ return response_json
126
+ end
127
+
128
+ def resolve_url
129
+ # Appends the rest.php path onto the end of the URL if it's not included
130
+ if @url.path !~ /rest.php$/
131
+ @url.path += URL
109
132
  end
110
-
111
133
  end
112
- end
134
+
135
+ end; end