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.
- data/README.rdoc +13 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/sugarcrm.rb +7 -139
- data/lib/sugarcrm/association_methods.rb +45 -0
- data/lib/sugarcrm/attribute_methods.rb +65 -0
- data/lib/sugarcrm/base.rb +85 -0
- data/lib/sugarcrm/connection.rb +126 -103
- data/lib/sugarcrm/{api → connection/api}/get_available_modules.rb +6 -1
- data/lib/sugarcrm/{api → connection/api}/get_document_revision.rb +2 -1
- data/lib/sugarcrm/{api → connection/api}/get_entries.rb +5 -6
- data/lib/sugarcrm/{api → connection/api}/get_entries_count.rb +3 -5
- data/lib/sugarcrm/{api → connection/api}/get_entry.rb +6 -6
- data/lib/sugarcrm/{api → connection/api}/get_entry_list.rb +6 -6
- data/lib/sugarcrm/{api → connection/api}/get_module_fields.rb +2 -1
- data/lib/sugarcrm/{api → connection/api}/get_note_attachment.rb +1 -1
- data/lib/sugarcrm/connection/api/get_relationships.rb +34 -0
- data/lib/sugarcrm/{api → connection/api}/get_report_entries.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/get_server_info.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/get_user_id.rb +2 -2
- data/lib/sugarcrm/{api → connection/api}/get_user_team_id.rb +2 -2
- data/lib/sugarcrm/{api → connection/api}/login.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/logout.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/seamless_login.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/search_by_module.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_campaign_merge.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_document_revision.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_entries.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_entry.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_note_attachment.rb +0 -0
- data/lib/sugarcrm/{api → connection/api}/set_relationship.rb +1 -1
- data/lib/sugarcrm/{api → connection/api}/set_relationships.rb +1 -1
- data/lib/sugarcrm/connection/helper.rb +10 -0
- data/lib/sugarcrm/exceptions.rb +6 -0
- data/lib/sugarcrm/module.rb +105 -6
- data/lib/sugarcrm/module_methods.rb +18 -0
- data/lib/sugarcrm/request.rb +13 -3
- data/lib/sugarcrm/response.rb +75 -25
- data/test/connection/test_get_available_modules.rb +12 -0
- data/test/connection/test_get_entries.rb +21 -0
- data/test/connection/test_get_entry.rb +20 -0
- data/test/connection/test_get_entry_list.rb +28 -0
- data/test/connection/test_get_module_fields.rb +14 -0
- data/test/connection/test_get_relationships.rb +15 -0
- data/test/connection/test_get_server_info.rb +12 -0
- data/test/connection/test_get_user_id.rb +12 -0
- data/test/connection/test_get_user_team_id.rb +12 -0
- data/test/connection/test_login.rb +12 -0
- data/test/connection/test_logout.rb +12 -0
- data/test/helper.rb +4 -1
- data/test/test_connection.rb +12 -48
- data/test/test_module.rb +14 -0
- data/test/test_response.rb +5 -14
- data/test/test_sugarcrm.rb +16 -14
- metadata +60 -34
- data/lib/sugarcrm/api/get_relationship.rb +0 -25
- data/lib/sugarcrm/core_ext/attribute.rb +0 -67
- data/lib/sugarcrm/core_ext/remove_method.rb +0 -6
- data/lib/sugarcrm/core_ext/singleton_class.rb +0 -13
@@ -0,0 +1,18 @@
|
|
1
|
+
module SugarCRM
|
2
|
+
|
3
|
+
@@connection = nil
|
4
|
+
def self.connection
|
5
|
+
@@connection
|
6
|
+
end
|
7
|
+
def self.connection=(connection)
|
8
|
+
@@connection = connection
|
9
|
+
end
|
10
|
+
|
11
|
+
@@modules = []
|
12
|
+
def self.modules
|
13
|
+
@@modules
|
14
|
+
end
|
15
|
+
def self.modules=(modules)
|
16
|
+
@@modules = modules
|
17
|
+
end
|
18
|
+
end
|
data/lib/sugarcrm/request.rb
CHANGED
@@ -6,18 +6,28 @@ class Request
|
|
6
6
|
attr :url, true
|
7
7
|
attr :method, true
|
8
8
|
attr :json, true
|
9
|
+
attr :http_method
|
9
10
|
|
10
11
|
def initialize(url, method, json, debug=false)
|
11
|
-
@
|
12
|
-
@
|
12
|
+
@url = url
|
13
|
+
@method = method
|
14
|
+
@json = json
|
15
|
+
|
16
|
+
@request = 'method=' << @method.to_s
|
13
17
|
@request << '&input_type=JSON'
|
14
18
|
@request << '&response_type=JSON'
|
15
|
-
@request << '&rest_data=' << json
|
19
|
+
@request << '&rest_data=' << @json
|
16
20
|
|
17
21
|
if debug
|
18
22
|
puts "#{method}: Request:"
|
19
23
|
pp @request
|
24
|
+
puts "\n"
|
20
25
|
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def length
|
30
|
+
self.to_s.length
|
21
31
|
end
|
22
32
|
|
23
33
|
def to_s
|
data/lib/sugarcrm/response.rb
CHANGED
@@ -1,29 +1,79 @@
|
|
1
|
-
module SugarCRM
|
2
|
-
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@attributes = flatten(@response["entry_list"][0]["name_value_list"])
|
15
|
-
@object = SugarCRM.const_get(@module).new(@attributes) if SugarCRM.const_get(@module)
|
1
|
+
module SugarCRM; class Response
|
2
|
+
|
3
|
+
class << self
|
4
|
+
# This class handles the response from the server.
|
5
|
+
# It tries to convert the response into an object such as User
|
6
|
+
# or an object collection. If it fails, it just returns the response hash
|
7
|
+
def handle(json)
|
8
|
+
r = new(json)
|
9
|
+
begin
|
10
|
+
return r.to_obj
|
11
|
+
rescue
|
12
|
+
return json
|
13
|
+
end
|
16
14
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
15
|
+
end
|
16
|
+
|
17
|
+
attr :response, false
|
18
|
+
|
19
|
+
def initialize(json)
|
20
|
+
@response = json
|
21
|
+
end
|
22
|
+
|
23
|
+
# Tries to instantiate and return an object with the values
|
24
|
+
# populated from the response
|
25
|
+
def to_obj
|
26
|
+
objects = []
|
27
|
+
@response["entry_list"].each do |object|
|
28
|
+
attributes = []
|
29
|
+
_module = resolve_module(object)
|
30
|
+
id = object["id"]
|
31
|
+
begin
|
32
|
+
attributes = flatten_name_value_list(object)
|
33
|
+
rescue ArgumentError => e
|
25
34
|
end
|
26
|
-
|
35
|
+
if SugarCRM.const_get(_module)
|
36
|
+
if attributes.length == 0
|
37
|
+
pp object
|
38
|
+
raise AttributeParsingError, "response contains objects without attributes!"
|
39
|
+
end
|
40
|
+
objects << SugarCRM.const_get(_module).new(id, attributes)
|
41
|
+
else
|
42
|
+
raise InvalidModule, "#{_module} does not exist, or is not accessible"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
# If we only have one result, just return the object
|
46
|
+
if objects.length == 1
|
47
|
+
return objects[0]
|
48
|
+
else
|
49
|
+
return objects
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_json
|
54
|
+
@response.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
def resolve_module(list)
|
58
|
+
list["module_name"].classify
|
59
|
+
end
|
60
|
+
|
61
|
+
def flatten_name_value_list(list)
|
62
|
+
if list["name_value_list"]
|
63
|
+
return flatten(list["name_value_list"])
|
64
|
+
else
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Takes a hash like { "first_name" => {"name" => "first_name", "value" => "John"}}
|
70
|
+
# And flattens it into {"first_name" => "John"}
|
71
|
+
def flatten(list)
|
72
|
+
raise ArgumentError, 'method parameter must respond to #each_pair' unless list.respond_to? :each_pair
|
73
|
+
flat_list = {}
|
74
|
+
list.each_pair do |k,v|
|
75
|
+
flat_list[k.to_sym] = v["value"]
|
27
76
|
end
|
77
|
+
flat_list
|
28
78
|
end
|
29
|
-
end
|
79
|
+
end; end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetAvailableModules < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS)
|
7
|
+
end
|
8
|
+
should "return an array of modules when #get_modules" do
|
9
|
+
assert_instance_of SugarCRM::Module, SugarCRM.connection.get_modules[0]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetEntries < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => true, :debug => false})
|
7
|
+
@response = SugarCRM.connection.get_entries(
|
8
|
+
"Users",
|
9
|
+
[1,"seed_sally_id"],
|
10
|
+
{:fields => ["first_name", "last_name"]}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
# should "return a list of entries when sent #get_entries." do
|
14
|
+
# assert @response.response.key? "entry_list"
|
15
|
+
# end
|
16
|
+
should "return an object when #get_entries" do
|
17
|
+
assert_instance_of Array, @response
|
18
|
+
assert_instance_of SugarCRM::User, @response[0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetEntry < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:debug => false })
|
7
|
+
@response = SugarCRM.connection.get_entry(
|
8
|
+
"Users",
|
9
|
+
1,
|
10
|
+
{:fields => ["first_name", "last_name"]}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
# should "return a single entry when sent #get_entry." do
|
14
|
+
# assert @response.response. "entry_list"
|
15
|
+
# end
|
16
|
+
should "return an object when #get_entry" do
|
17
|
+
assert_instance_of SugarCRM::User, @response
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetEntryList < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => true, :debug => false})
|
7
|
+
@response = SugarCRM.connection.get_entry_list(
|
8
|
+
"Users",
|
9
|
+
"users.deleted = 0",
|
10
|
+
{:fields => ["first_name", "last_name"]}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
# should "return a list of entries when sent #get_entry_list." do
|
14
|
+
# assert @response.response.key? "entry_list"
|
15
|
+
# end
|
16
|
+
should "return a list of entries when sent #get_entry_list and no fields." do
|
17
|
+
users = SugarCRM.connection.get_entry_list(
|
18
|
+
"Users",
|
19
|
+
"users.deleted = 0"
|
20
|
+
)
|
21
|
+
assert_equal "Administrator", users.first.last_name
|
22
|
+
end
|
23
|
+
should "return an object when #get_entry_list" do
|
24
|
+
assert_instance_of Array, @response
|
25
|
+
assert_instance_of SugarCRM::User, @response[0]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestModuleFields < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:debug => false, :register_modules => false})
|
7
|
+
end
|
8
|
+
should "return a hash of module fields when #get_module_fields" do
|
9
|
+
fields = SugarCRM.connection.get_module_fields("Users")
|
10
|
+
assert_instance_of Hash, fields
|
11
|
+
assert "address_city", fields.keys[0]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetRelationships < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false, :debug => false})
|
7
|
+
end
|
8
|
+
should "return a list of email_addresses when sent #get_relationship and a user_id" do
|
9
|
+
email_address = SugarCRM.connection.get_relationships(
|
10
|
+
"Users",1,"email_addresses"
|
11
|
+
)
|
12
|
+
assert_instance_of SugarCRM::EmailAddress, email_address
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetServerInfo < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false})
|
7
|
+
end
|
8
|
+
should "get server info" do
|
9
|
+
assert true, SugarCRM.connection.get_server_info
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetUserID < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false})
|
7
|
+
end
|
8
|
+
should "get the ID of the logged in user" do
|
9
|
+
assert true, SugarCRM.connection.get_user_id
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGetUserTeamID < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false})
|
7
|
+
end
|
8
|
+
should "get the team ID of the logged in user" do
|
9
|
+
assert true, SugarCRM.connection.get_user_team_id
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestLogin < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false})
|
7
|
+
end
|
8
|
+
should "login and set session id" do
|
9
|
+
assert_not_nil SugarCRM.connection.session
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestLogin < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
setup do
|
6
|
+
SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => false})
|
7
|
+
end
|
8
|
+
should "logout and not be able to login with the old session id" do
|
9
|
+
assert true, SugarCRM.connection.logout
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/test/helper.rb
CHANGED
@@ -11,5 +11,8 @@ class Test::Unit::TestCase
|
|
11
11
|
URL = "http://valet/sugarcrm6"
|
12
12
|
USER = "admin"
|
13
13
|
PASS = 'letmein'
|
14
|
-
|
14
|
+
|
15
|
+
def setup_connection
|
16
|
+
SugarCRM::Base.establish_connection(URL, USER, PASS, {:debug => false})
|
17
|
+
end
|
15
18
|
end
|
data/test/test_connection.rb
CHANGED
@@ -1,60 +1,24 @@
|
|
1
1
|
require 'helper'
|
2
|
-
require "test/unit"
|
3
|
-
require "pp"
|
4
2
|
|
5
|
-
|
3
|
+
#require 'connection/test_login'
|
4
|
+
#require 'connection/test_get_available_modules'
|
5
|
+
#require 'connection/test_get_module_fields'
|
6
|
+
#require 'connection/test_get_entry'
|
7
|
+
#require 'connection/test_get_entries'
|
8
|
+
#require 'connection/test_get_entry_list'
|
9
|
+
|
10
|
+
class TestConnection < Test::Unit::TestCase
|
6
11
|
context "A SugarCRM::Connection instance" do
|
7
|
-
|
8
12
|
setup do
|
9
|
-
@connection = SugarCRM::Connection.new(URL, USER, PASS
|
10
|
-
end
|
11
|
-
|
12
|
-
should "login and set session id" do
|
13
|
-
assert_not_nil @connection.session
|
13
|
+
@connection = SugarCRM::Connection.new(URL, USER, PASS)
|
14
14
|
end
|
15
|
-
|
16
15
|
should "retrieve the list of available modules" do
|
17
|
-
assert_instance_of Array,
|
16
|
+
assert_instance_of Array, SugarCRM.modules
|
17
|
+
assert_instance_of SugarCRM::Module, SugarCRM.modules[0]
|
18
18
|
end
|
19
|
-
|
20
19
|
should "create sub-classes by module name" do
|
20
|
+
@connection = SugarCRM::Connection.new(URL, USER, PASS, {:register_modules => true})
|
21
21
|
assert SugarCRM.const_defined? "User"
|
22
22
|
end
|
23
|
-
|
24
|
-
should "return a single entry when sent #get_entry." do
|
25
|
-
response = @connection.get_entry(
|
26
|
-
"Users",
|
27
|
-
1,
|
28
|
-
{:fields => ["first_name", "last_name"]}
|
29
|
-
)
|
30
|
-
assert response.response.key? "entry_list"
|
31
|
-
end
|
32
|
-
|
33
|
-
should "return a list of entries when sent #get_entries." do
|
34
|
-
response = @connection.get_entries(
|
35
|
-
"Users",
|
36
|
-
[1],
|
37
|
-
{:fields => ["first_name", "last_name"]}
|
38
|
-
)
|
39
|
-
assert response.key? "entry_list"
|
40
|
-
end
|
41
|
-
|
42
|
-
should "return a list of entries when sent #get_entry_list." do
|
43
|
-
response = @connection.get_entry_list(
|
44
|
-
"Users",
|
45
|
-
"users.user_name = \'#{USER}\'",
|
46
|
-
{
|
47
|
-
:fields => ["first_name", "last_name"],
|
48
|
-
:link_fields => [
|
49
|
-
{
|
50
|
-
"name" => "accounts",
|
51
|
-
"value" => ["id", "name"]
|
52
|
-
}
|
53
|
-
]
|
54
|
-
}
|
55
|
-
)
|
56
|
-
assert response.key? "entry_list"
|
57
|
-
end
|
58
|
-
|
59
23
|
end
|
60
24
|
end
|
data/test/test_module.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestModule < Test::Unit::TestCase
|
4
|
+
context "A SugarCRM::Module instance" do
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@connection = SugarCRM::Connection.new(URL, USER, PASS)
|
8
|
+
end
|
9
|
+
|
10
|
+
should "respond to #fields" do
|
11
|
+
assert_respond_to SugarCRM.modules[0], :fields
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/test/test_response.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'helper'
|
2
|
-
require "test/unit"
|
3
|
-
require "pp"
|
4
2
|
|
5
|
-
class
|
3
|
+
class TestResponse < Test::Unit::TestCase
|
6
4
|
context "A SugarCRM::Response instance" do
|
7
5
|
setup do
|
6
|
+
@connection = SugarCRM::Connection.new(URL, USER, PASS)
|
8
7
|
@json = {"entry_list"=> [{
|
9
8
|
"name_value_list"=> {
|
10
9
|
"address_city" => {"name"=>"address_city", "value"=>""},
|
@@ -17,19 +16,11 @@ class TestSugarcrm < Test::Unit::TestCase
|
|
17
16
|
}],
|
18
17
|
"relationship_list"=>[]}
|
19
18
|
|
20
|
-
@response = SugarCRM::Response.
|
21
|
-
end
|
22
|
-
|
23
|
-
should "set the module name" do
|
24
|
-
assert_equal "User", @response.module
|
25
|
-
end
|
26
|
-
|
27
|
-
should "flatten the name_value_list into an attributes hash" do
|
28
|
-
assert_equal "never", @response.attributes[:pwd_last_changed]
|
19
|
+
@response = SugarCRM::Response.handle(@json)
|
29
20
|
end
|
30
21
|
|
31
|
-
should "return an instance of a SugarCRM Module
|
32
|
-
assert_instance_of SugarCRM::User, @response
|
22
|
+
should "return an instance of a SugarCRM Module" do
|
23
|
+
assert_instance_of SugarCRM::User, @response
|
33
24
|
end
|
34
25
|
|
35
26
|
end
|