sugarcrm_emp 0.10.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.
Files changed (94) hide show
  1. data/.document +5 -0
  2. data/.gitignore +29 -0
  3. data/Gemfile +14 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +275 -0
  6. data/Rakefile +44 -0
  7. data/VERSION +1 -0
  8. data/WATCHLIST.rdoc +7 -0
  9. data/bin/sugarcrm +26 -0
  10. data/lib/rails/generators/sugarcrm/config/config_generator.rb +22 -0
  11. data/lib/rails/generators/sugarcrm/config/templates/initializer.rb +4 -0
  12. data/lib/rails/generators/sugarcrm/config/templates/sugarcrm.yml +19 -0
  13. data/lib/sugarcrm/associations/association.rb +170 -0
  14. data/lib/sugarcrm/associations/association_cache.rb +36 -0
  15. data/lib/sugarcrm/associations/association_collection.rb +141 -0
  16. data/lib/sugarcrm/associations/association_methods.rb +91 -0
  17. data/lib/sugarcrm/associations/associations.rb +61 -0
  18. data/lib/sugarcrm/associations.rb +5 -0
  19. data/lib/sugarcrm/attributes/attribute_methods.rb +203 -0
  20. data/lib/sugarcrm/attributes/attribute_serializers.rb +55 -0
  21. data/lib/sugarcrm/attributes/attribute_typecast.rb +44 -0
  22. data/lib/sugarcrm/attributes/attribute_validations.rb +62 -0
  23. data/lib/sugarcrm/attributes.rb +4 -0
  24. data/lib/sugarcrm/base.rb +355 -0
  25. data/lib/sugarcrm/config/sugarcrm.yaml +10 -0
  26. data/lib/sugarcrm/connection/api/get_available_modules.rb +22 -0
  27. data/lib/sugarcrm/connection/api/get_document_revision.rb +14 -0
  28. data/lib/sugarcrm/connection/api/get_entries.rb +23 -0
  29. data/lib/sugarcrm/connection/api/get_entries_count.rb +20 -0
  30. data/lib/sugarcrm/connection/api/get_entry.rb +23 -0
  31. data/lib/sugarcrm/connection/api/get_entry_list.rb +31 -0
  32. data/lib/sugarcrm/connection/api/get_module_fields.rb +15 -0
  33. data/lib/sugarcrm/connection/api/get_note_attachment.rb +14 -0
  34. data/lib/sugarcrm/connection/api/get_relationships.rb +30 -0
  35. data/lib/sugarcrm/connection/api/get_report_entries.rb +17 -0
  36. data/lib/sugarcrm/connection/api/get_server_info.rb +7 -0
  37. data/lib/sugarcrm/connection/api/get_user_id.rb +13 -0
  38. data/lib/sugarcrm/connection/api/get_user_team_id.rb +14 -0
  39. data/lib/sugarcrm/connection/api/login.rb +18 -0
  40. data/lib/sugarcrm/connection/api/logout.rb +15 -0
  41. data/lib/sugarcrm/connection/api/seamless_login.rb +13 -0
  42. data/lib/sugarcrm/connection/api/search_by_module.rb +25 -0
  43. data/lib/sugarcrm/connection/api/set_campaign_merge.rb +15 -0
  44. data/lib/sugarcrm/connection/api/set_document_revision.rb +35 -0
  45. data/lib/sugarcrm/connection/api/set_entries.rb +15 -0
  46. data/lib/sugarcrm/connection/api/set_entry.rb +15 -0
  47. data/lib/sugarcrm/connection/api/set_note_attachment.rb +25 -0
  48. data/lib/sugarcrm/connection/api/set_relationship.rb +27 -0
  49. data/lib/sugarcrm/connection/api/set_relationships.rb +22 -0
  50. data/lib/sugarcrm/connection/connection.rb +201 -0
  51. data/lib/sugarcrm/connection/helper.rb +50 -0
  52. data/lib/sugarcrm/connection/request.rb +61 -0
  53. data/lib/sugarcrm/connection/response.rb +91 -0
  54. data/lib/sugarcrm/connection.rb +5 -0
  55. data/lib/sugarcrm/connection_pool.rb +163 -0
  56. data/lib/sugarcrm/exceptions.rb +23 -0
  57. data/lib/sugarcrm/extensions/README.txt +23 -0
  58. data/lib/sugarcrm/finders/dynamic_finder_match.rb +41 -0
  59. data/lib/sugarcrm/finders/finder_methods.rb +243 -0
  60. data/lib/sugarcrm/finders.rb +2 -0
  61. data/lib/sugarcrm/module.rb +174 -0
  62. data/lib/sugarcrm/module_methods.rb +91 -0
  63. data/lib/sugarcrm/session.rb +218 -0
  64. data/lib/sugarcrm.rb +22 -0
  65. data/sugarcrm.gemspec +178 -0
  66. data/test/config_test.yaml +15 -0
  67. data/test/connection/test_get_available_modules.rb +9 -0
  68. data/test/connection/test_get_entries.rb +15 -0
  69. data/test/connection/test_get_entry.rb +22 -0
  70. data/test/connection/test_get_entry_list.rb +23 -0
  71. data/test/connection/test_get_module_fields.rb +11 -0
  72. data/test/connection/test_get_relationships.rb +12 -0
  73. data/test/connection/test_get_server_info.rb +9 -0
  74. data/test/connection/test_get_user_id.rb +9 -0
  75. data/test/connection/test_get_user_team_id.rb +9 -0
  76. data/test/connection/test_login.rb +9 -0
  77. data/test/connection/test_logout.rb +9 -0
  78. data/test/connection/test_set_document_revision.rb +28 -0
  79. data/test/connection/test_set_entry.rb +15 -0
  80. data/test/connection/test_set_note_attachment.rb +16 -0
  81. data/test/connection/test_set_relationship.rb +18 -0
  82. data/test/extensions_test/patch.rb +9 -0
  83. data/test/helper.rb +17 -0
  84. data/test/test_association_collection.rb +11 -0
  85. data/test/test_associations.rb +156 -0
  86. data/test/test_connection.rb +13 -0
  87. data/test/test_connection_pool.rb +40 -0
  88. data/test/test_finders.rb +201 -0
  89. data/test/test_module.rb +51 -0
  90. data/test/test_request.rb +35 -0
  91. data/test/test_response.rb +26 -0
  92. data/test/test_session.rb +136 -0
  93. data/test/test_sugarcrm.rb +213 -0
  94. metadata +266 -0
@@ -0,0 +1,91 @@
1
+ module SugarCRM
2
+ # store the namespaces that have been used to prevent namespace collision
3
+ @@used_namespaces = []
4
+ def self.used_namespaces
5
+ @@used_namespaces
6
+ end
7
+
8
+ # return the namespaces linked to active sessions
9
+ def self.namespaces
10
+ result = []
11
+ @@used_namespaces.each{|n|
12
+ result << n if SugarCRM.const_defined? n
13
+ }
14
+ result
15
+ end
16
+
17
+ # store the various connected sessions
18
+ # key = session.object_id, value = session instance
19
+ @@sessions = {}
20
+ def self.sessions
21
+ @@sessions
22
+ end
23
+
24
+ def self.add_session(session)
25
+ @@used_namespaces << session.namespace unless @@used_namespaces.include? session.namespace
26
+ @@sessions[session.object_id] = session
27
+ end
28
+
29
+ def self.remove_session(session)
30
+ @@sessions.delete(session.object_id)
31
+ end
32
+
33
+ def self.session
34
+ return nil if @@sessions.size < 1
35
+ (raise SugarCRM::MultipleSessions, "There are multiple active sessions: use the session namespace instead of SugarCRM") if @@sessions.size > 1
36
+ @@sessions.values.first
37
+ end
38
+
39
+ def self.connection
40
+ return nil unless self.session
41
+ self.session.connection
42
+ end
43
+
44
+ def self.connect(url, user, pass, options={})
45
+ session = SugarCRM::Session.new(url, user, pass, options)
46
+ # return the namespace module
47
+ session.namespace_const
48
+ end
49
+
50
+ class << self
51
+ alias :connect! :connect
52
+ end
53
+
54
+ def respond_to?(sym)
55
+ return true if @@sessions.size == 1 && SugarCRM.session.namespace_const.respond_to?(sym)
56
+ super
57
+ end
58
+
59
+ def self.method_missing(sym, *args, &block)
60
+ (raise SugarCRM::NoActiveSession, "No session is active. Create a new session with 'SugarCRM.connect(...)'") if @@sessions.size < 1
61
+ (raise SugarCRM::MultipleSessions, "There are multiple active sessions: call methods on the session namespace instead of SugarCRM") if @@sessions.size > 1
62
+ if SugarCRM.session.namespace_const.respond_to? sym
63
+ SugarCRM.session.namespace_const.send(sym, *args, &block)
64
+ else
65
+ super
66
+ end
67
+ end
68
+
69
+ # If a user tries to access a SugarCRM class before they're logged in,
70
+ # try to log in using credentials from config file.
71
+ # This will trigger module loading,
72
+ # and we can then attempt to return the requested class automagically
73
+ def self.const_missing(sym)
74
+ (raise SugarCRM::MultipleSessions, "There are multiple active sessions: use the session namespace instead of SugarCRM") if @@sessions.size > 1
75
+ # make sure we have an active session
76
+ begin
77
+ Session.new unless SugarCRM.connection && SugarCRM.connection.logged_in?
78
+ rescue SugarCRM::MissingCredentials => e
79
+ # unable to load necessary login credentials from config file => pass exception on
80
+ super
81
+ end
82
+
83
+ # if user calls (e.g.) SugarCRM::Account, delegate to SugarCRM::Namespace0::Account
84
+ namespace_const = SugarCRM.session.namespace_const
85
+ if namespace_const.const_defined? sym
86
+ namespace_const.const_get(sym)
87
+ else
88
+ super
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,218 @@
1
+ # This class hold an individual connection to a SugarCRM server.
2
+ # There can be several such simultaneous connections
3
+ module SugarCRM; class Session
4
+ attr_reader :config, :connection_pool, :extensions_path, :namespace, :namespace_const
5
+ attr_accessor :modules
6
+ def initialize(url, user, pass, opts={})
7
+ options = {
8
+ :debug => false,
9
+ :register_modules => true
10
+ }.merge(opts)
11
+
12
+ @modules = []
13
+ @namespace = "Namespace#{SugarCRM.used_namespaces.size}"
14
+ @config = {:base_url => url,:username => user,:password => pass,:options => options}
15
+ @extensions_path = File.join(File.dirname(__FILE__), 'extensions')
16
+
17
+ setup_connection
18
+ register_namespace
19
+ connect(@config[:base_url], @config[:username], @config[:password], @config[:options])
20
+ end
21
+
22
+ # Creates a new session from the credentials present in a file
23
+ def self.from_file(path, opts={})
24
+ config_values = self.parse_config_file(path)
25
+ self.from_hash(config_values[:config], opts)
26
+ end
27
+
28
+ # Creates a new session from the credentials in the hash
29
+ def self.from_hash(hash, opts={})
30
+ pool_options = parse_connection_pool_options(hash)
31
+ options = opts
32
+ (options = {:connection_pool => pool_options}.merge(opts)) if pool_options.size > 0
33
+
34
+ begin
35
+ session = self.new(hash[:base_url], hash[:username], hash[:password], options)
36
+ rescue MissingCredentials => e
37
+ return false
38
+ end
39
+ session.namespace_const
40
+ end
41
+
42
+ # Returns a hash with the content in the YAML argument file
43
+ def self.parse_config_file(path)
44
+ self.validate_path path
45
+ contents = YAML.load_file(path)
46
+ return {} unless contents
47
+ self.symbolize_keys(contents)
48
+ end
49
+
50
+ def setup_connection
51
+ load_config_files unless connection_info_loaded?
52
+ raise MissingCredentials, "Missing login credentials. Make sure you provide the SugarCRM URL, username, and password" unless connection_info_loaded?
53
+ end
54
+
55
+ def connect(url=nil, user=nil, pass=nil, opts={})
56
+ options = {
57
+ :debug => @config[:options][:debug],
58
+ :register_modules => true
59
+ }.merge(opts)
60
+
61
+ # store the params used to connect
62
+ {:base_url => url, :username => user, :password => pass}.each{|k,v|
63
+ @config[k] = v unless v.nil?
64
+ }
65
+
66
+ SugarCRM::Module.deregister_all(self)
67
+ @connection_pool = SugarCRM::ConnectionPool.new(self)
68
+ SugarCRM::Module.register_all(self)
69
+ SugarCRM.add_session(self)
70
+ load_extensions
71
+ true
72
+ end
73
+ alias :connect! :connect
74
+
75
+ # Re-uses this session and namespace if the user wants to connect with different credentials
76
+ def reconnect(url=nil, user=nil, pass=nil, opts={})
77
+ @connection_pool.disconnect!
78
+ connect(url, user, pass, opts)
79
+ end
80
+ alias :reconnect! :reconnect
81
+ alias :reload! :reconnect
82
+
83
+ # log out from SugarCRM and cleanup (deregister modules, remove session, etc.)
84
+ def disconnect
85
+ @connection_pool.disconnect!
86
+ SugarCRM::Module.deregister_all(self)
87
+ namespace = @namespace
88
+ SugarCRM.instance_eval{ remove_const namespace } # remove NamespaceX from SugarCRM
89
+ SugarCRM.remove_session(self)
90
+ end
91
+ alias :disconnect! :disconnect
92
+
93
+ # Returns a connection from the connection pool, if available
94
+ def connection
95
+ @connection_pool.connection
96
+ end
97
+
98
+ def extensions_folder=(folder, dirstring=nil)
99
+ path = File.expand_path(folder, dirstring)
100
+ @extensions_path = path
101
+ load_extensions
102
+ end
103
+
104
+ # load credentials from file, and (re)connect to SugarCRM
105
+ def load_config(path, opts = {})
106
+ opts.reverse_merge! :reconnect => true
107
+ new_config = self.class.parse_config_file(path)
108
+ update_config(new_config[:config]) if new_config and new_config[:config]
109
+ reconnect(@config[:base_url], @config[:username], @config[:password]) if opts[:reconnect] and connection_info_loaded?
110
+ @config
111
+ end
112
+
113
+ def update_config(params)
114
+ params.each{ |k,v| @config[k.to_sym] = v }
115
+ @config
116
+ end
117
+
118
+ # lazy load the SugarCRM version we're connecting to
119
+ def sugar_version
120
+ @version ||= connection.get_server_info["version"]
121
+ end
122
+
123
+ private
124
+ # Converts all hash keys to symbols (if a hash value is itself a hash, call the method recursively)
125
+ # Session.symbolize_keys({"one" => 1, "two" => {"foo" => "bar"}}) # => {:one => 1, :two => {:foo => "bar"}}
126
+ def self.symbolize_keys(hash)
127
+ hash.inject({}){|memo,(k,v)|
128
+ unless v.class == Hash
129
+ memo[k.to_sym] = v
130
+ else
131
+ memo[k.to_sym] = self.symbolize_keys(v)
132
+ end
133
+ memo
134
+ }
135
+ end
136
+
137
+ def self.validate_path(path)
138
+ raise "Invalid path: #{path}" unless File.exists? path
139
+ end
140
+
141
+ def config_file_paths
142
+ # see README for reasoning behind the priorization
143
+ paths = ['/etc/sugarcrm.yaml', File.expand_path('~/.sugarcrm.yaml'), File.join(File.dirname(__FILE__), 'config', 'sugarcrm.yaml')]
144
+ paths.insert(1, File.join(ENV['USERPROFILE'], 'sugarcrm.yaml')) if ENV['USERPROFILE']
145
+ paths
146
+ end
147
+
148
+ def connection_info_loaded?
149
+ return false unless @config
150
+ @config[:base_url] && @config[:username] && @config[:password]
151
+ end
152
+
153
+ def generate_namespace_module
154
+ # Create a new module to have a separate namespace in which to register the SugarCRM modules.
155
+ # This will prevent issues with modules from separate SugarCRM instances colliding within the same namespace
156
+ # (e.g. 2 SugarCRM instances where only one has custom fields on the Account module)
157
+ namespace_module = Object::Module.new do
158
+ @session = nil
159
+ def self.session
160
+ @session
161
+ end
162
+ def self.session=(sess)
163
+ @session = sess
164
+ end
165
+ def self.current_user
166
+ (@session.namespace_const)::User.find_by_user_name(@session.config[:username])
167
+ end
168
+ def self.respond_to?(sym)
169
+ return true if @session.respond_to? sym
170
+ super
171
+ end
172
+ def self.method_missing(sym, *args, &block)
173
+ raise unless @session.respond_to? sym
174
+ @session.send(sym, *args, &block)
175
+ end
176
+
177
+ if RUBY_VERSION > '1.9'
178
+ # In Ruby 1.9 and above, constants are no longer lexically scoped;
179
+ # By default, const_defined? will check up the ancestor chain, which
180
+ # is *not* desirable in our case.
181
+ def self.const_defined?(sym, inherit=false)
182
+ super
183
+ end
184
+ end
185
+ end
186
+ # set the session: will be needed in SugarCRM::Base to call the API methods on the correct session
187
+ namespace_module.session = self
188
+ namespace_module
189
+ end
190
+
191
+ def load_config_files
192
+ # see README for reasoning behind the priorization
193
+ config_file_paths.each{|path|
194
+ load_config path if File.exists? path
195
+ }
196
+ end
197
+
198
+ def register_namespace
199
+ SugarCRM.const_set(@namespace, generate_namespace_module)
200
+ @namespace_const = SugarCRM.const_get(@namespace)
201
+ end
202
+
203
+ # load all the monkey patch extension files in the provided folder
204
+ def load_extensions
205
+ self.class.validate_path @extensions_path
206
+ Dir[File.join(@extensions_path, '**', '*.rb').to_s].each { |f| load(f) }
207
+ end
208
+
209
+ # Returns hash containing only keys/values relating to connection pool options. These are removed from parameter hash.
210
+ def self.parse_connection_pool_options(config_values)
211
+ result = {}
212
+ pool_size = config_values.delete(:pool)
213
+ result[:size] = pool_size if pool_size
214
+ wait_timeout = config_values.delete(:wait_timeout)
215
+ result[:wait_timeout] = wait_timeout if wait_timeout
216
+ result
217
+ end
218
+ end; end
data/lib/sugarcrm.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'net/https'
2
+ require 'pp'
3
+ require 'set'
4
+ require 'cgi'
5
+ require 'uri'
6
+ require 'base64'
7
+ require 'rubygems'
8
+ require 'active_support/core_ext'
9
+ require 'json'
10
+ require 'httpclient'
11
+
12
+ require 'sugarcrm/session'
13
+ require 'sugarcrm/module_methods'
14
+ require 'sugarcrm/connection_pool'
15
+ require 'sugarcrm/connection'
16
+ require 'sugarcrm/exceptions'
17
+ require 'sugarcrm/finders'
18
+ require 'sugarcrm/attributes'
19
+ require 'sugarcrm/associations'
20
+ require 'sugarcrm/module'
21
+ require 'sugarcrm/base'
22
+
data/sugarcrm.gemspec ADDED
@@ -0,0 +1,178 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "sugarcrm_emp"
8
+ s.version = "0.10.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Carl Hicks", "David Sulc", "Dimitar Kostov"]
12
+ s.date = "2011-12-13"
13
+ s.email = "dimitar@emerchantpay.com"
14
+ s.executables = ["sugarcrm"]
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "Gemfile",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "WATCHLIST.rdoc",
28
+ "bin/sugarcrm",
29
+ "lib/rails/generators/sugarcrm/config/config_generator.rb",
30
+ "lib/rails/generators/sugarcrm/config/templates/initializer.rb",
31
+ "lib/rails/generators/sugarcrm/config/templates/sugarcrm.yml",
32
+ "lib/sugarcrm.rb",
33
+ "lib/sugarcrm/associations.rb",
34
+ "lib/sugarcrm/associations/association.rb",
35
+ "lib/sugarcrm/associations/association_cache.rb",
36
+ "lib/sugarcrm/associations/association_collection.rb",
37
+ "lib/sugarcrm/associations/association_methods.rb",
38
+ "lib/sugarcrm/associations/associations.rb",
39
+ "lib/sugarcrm/attributes.rb",
40
+ "lib/sugarcrm/attributes/attribute_methods.rb",
41
+ "lib/sugarcrm/attributes/attribute_serializers.rb",
42
+ "lib/sugarcrm/attributes/attribute_typecast.rb",
43
+ "lib/sugarcrm/attributes/attribute_validations.rb",
44
+ "lib/sugarcrm/base.rb",
45
+ "lib/sugarcrm/config/sugarcrm.yaml",
46
+ "lib/sugarcrm/connection.rb",
47
+ "lib/sugarcrm/connection/api/get_available_modules.rb",
48
+ "lib/sugarcrm/connection/api/get_document_revision.rb",
49
+ "lib/sugarcrm/connection/api/get_entries.rb",
50
+ "lib/sugarcrm/connection/api/get_entries_count.rb",
51
+ "lib/sugarcrm/connection/api/get_entry.rb",
52
+ "lib/sugarcrm/connection/api/get_entry_list.rb",
53
+ "lib/sugarcrm/connection/api/get_module_fields.rb",
54
+ "lib/sugarcrm/connection/api/get_note_attachment.rb",
55
+ "lib/sugarcrm/connection/api/get_relationships.rb",
56
+ "lib/sugarcrm/connection/api/get_report_entries.rb",
57
+ "lib/sugarcrm/connection/api/get_server_info.rb",
58
+ "lib/sugarcrm/connection/api/get_user_id.rb",
59
+ "lib/sugarcrm/connection/api/get_user_team_id.rb",
60
+ "lib/sugarcrm/connection/api/login.rb",
61
+ "lib/sugarcrm/connection/api/logout.rb",
62
+ "lib/sugarcrm/connection/api/seamless_login.rb",
63
+ "lib/sugarcrm/connection/api/search_by_module.rb",
64
+ "lib/sugarcrm/connection/api/set_campaign_merge.rb",
65
+ "lib/sugarcrm/connection/api/set_document_revision.rb",
66
+ "lib/sugarcrm/connection/api/set_entries.rb",
67
+ "lib/sugarcrm/connection/api/set_entry.rb",
68
+ "lib/sugarcrm/connection/api/set_note_attachment.rb",
69
+ "lib/sugarcrm/connection/api/set_relationship.rb",
70
+ "lib/sugarcrm/connection/api/set_relationships.rb",
71
+ "lib/sugarcrm/connection/connection.rb",
72
+ "lib/sugarcrm/connection/helper.rb",
73
+ "lib/sugarcrm/connection/request.rb",
74
+ "lib/sugarcrm/connection/response.rb",
75
+ "lib/sugarcrm/connection_pool.rb",
76
+ "lib/sugarcrm/exceptions.rb",
77
+ "lib/sugarcrm/extensions/README.txt",
78
+ "lib/sugarcrm/finders.rb",
79
+ "lib/sugarcrm/finders/dynamic_finder_match.rb",
80
+ "lib/sugarcrm/finders/finder_methods.rb",
81
+ "lib/sugarcrm/module.rb",
82
+ "lib/sugarcrm/module_methods.rb",
83
+ "lib/sugarcrm/session.rb",
84
+ "sugarcrm.gemspec",
85
+ "test/config_test.yaml",
86
+ "test/connection/test_get_available_modules.rb",
87
+ "test/connection/test_get_entries.rb",
88
+ "test/connection/test_get_entry.rb",
89
+ "test/connection/test_get_entry_list.rb",
90
+ "test/connection/test_get_module_fields.rb",
91
+ "test/connection/test_get_relationships.rb",
92
+ "test/connection/test_get_server_info.rb",
93
+ "test/connection/test_get_user_id.rb",
94
+ "test/connection/test_get_user_team_id.rb",
95
+ "test/connection/test_login.rb",
96
+ "test/connection/test_logout.rb",
97
+ "test/connection/test_set_document_revision.rb",
98
+ "test/connection/test_set_entry.rb",
99
+ "test/connection/test_set_note_attachment.rb",
100
+ "test/connection/test_set_relationship.rb",
101
+ "test/extensions_test/patch.rb",
102
+ "test/helper.rb",
103
+ "test/test_association_collection.rb",
104
+ "test/test_associations.rb",
105
+ "test/test_connection.rb",
106
+ "test/test_connection_pool.rb",
107
+ "test/test_finders.rb",
108
+ "test/test_module.rb",
109
+ "test/test_request.rb",
110
+ "test/test_response.rb",
111
+ "test/test_session.rb",
112
+ "test/test_sugarcrm.rb"
113
+ ]
114
+ s.homepage = "http://github.com/eMerchantPay/sugarcrm"
115
+ s.require_paths = ["lib"]
116
+ s.rubygems_version = "1.8.11"
117
+ s.summary = "A less clunky way to interact with SugarCRM via REST."
118
+ s.test_files = [
119
+ "test/config_test.yaml",
120
+ "test/connection/test_get_available_modules.rb",
121
+ "test/connection/test_get_entries.rb",
122
+ "test/connection/test_get_entry.rb",
123
+ "test/connection/test_get_entry_list.rb",
124
+ "test/connection/test_get_module_fields.rb",
125
+ "test/connection/test_get_relationships.rb",
126
+ "test/connection/test_get_server_info.rb",
127
+ "test/connection/test_get_user_id.rb",
128
+ "test/connection/test_get_user_team_id.rb",
129
+ "test/connection/test_login.rb",
130
+ "test/connection/test_logout.rb",
131
+ "test/connection/test_set_document_revision.rb",
132
+ "test/connection/test_set_entry.rb",
133
+ "test/connection/test_set_note_attachment.rb",
134
+ "test/connection/test_set_relationship.rb",
135
+ "test/extensions_test/patch.rb",
136
+ "test/helper.rb",
137
+ "test/test_association_collection.rb",
138
+ "test/test_associations.rb",
139
+ "test/test_connection.rb",
140
+ "test/test_connection_pool.rb",
141
+ "test/test_finders.rb",
142
+ "test/test_module.rb",
143
+ "test/test_request.rb",
144
+ "test/test_response.rb",
145
+ "test/test_session.rb",
146
+ "test/test_sugarcrm.rb"
147
+ ]
148
+
149
+ if s.respond_to? :specification_version then
150
+ s.specification_version = 3
151
+
152
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
153
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.3.10"])
154
+ s.add_runtime_dependency(%q<i18n>, [">= 0"])
155
+ s.add_runtime_dependency(%q<json>, [">= 0"])
156
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
157
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
158
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
159
+ else
160
+ s.add_dependency(%q<activesupport>, [">= 2.3.10"])
161
+ s.add_dependency(%q<i18n>, [">= 0"])
162
+ s.add_dependency(%q<json>, [">= 0"])
163
+ s.add_dependency(%q<shoulda>, [">= 0"])
164
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
165
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
166
+ s.add_dependency(%q<httpclient>, [">= 2.2.5"])
167
+ end
168
+ else
169
+ s.add_dependency(%q<activesupport>, [">= 2.3.10"])
170
+ s.add_dependency(%q<i18n>, [">= 0"])
171
+ s.add_dependency(%q<json>, [">= 0"])
172
+ s.add_dependency(%q<shoulda>, [">= 0"])
173
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
174
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
175
+ s.add_dependency(%q<httpclient>, [">= 2.2.5"])
176
+ end
177
+ end
178
+
@@ -0,0 +1,15 @@
1
+ # below is an example configuration file
2
+ #
3
+ # to create you own configuration file, simply copy and adapt the text below, removing the '#' in front of the key-value pairs
4
+ #
5
+ # you'll find an example of a configuration file (used for tests) in test/config_test.yaml
6
+ #
7
+ # config:
8
+ # base_url: http://127.0.0.1/sugarcrm # where your SugarCRM instance is located
9
+ # username: admin
10
+ # password: letmein
11
+
12
+ config:
13
+ base_url: http://127.0.0.1/sugarcrm # where your SugarCRM instance is located
14
+ username: admin
15
+ password: letmein
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestGetAvailableModules < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "return an array of modules when #get_modules" do
6
+ assert_instance_of SugarCRM::Module, SugarCRM.connection.get_modules[0]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ require 'helper'
2
+
3
+ class TestGetEntries < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "return an object when #get_entries" do
6
+ @response = SugarCRM.connection.get_entries(
7
+ "Users",
8
+ [1,"seed_sally_id"],
9
+ {:fields => ["first_name", "last_name"]}
10
+ )
11
+ assert_instance_of Array, @response
12
+ assert_instance_of SugarCRM::User, @response[0]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class TestGetEntry < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ setup do
6
+ @response = SugarCRM.connection.get_entry(
7
+ "Users",
8
+ 1,
9
+ {:fields => ["first_name", "last_name", "deleted", "date_modified"]}
10
+ )
11
+ end
12
+ should "return an object when #get_entry" do
13
+ assert_instance_of SugarCRM::User, @response
14
+ end
15
+ should "typecast boolean fields properly" do
16
+ assert_instance_of FalseClass, @response.deleted
17
+ end
18
+ should "typecast date_time fields properly" do
19
+ assert_instance_of DateTime, @response.date_modified
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ class TestGetEntryList < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "return a list of entries when sent #get_entry_list" do
6
+ users = SugarCRM.connection.get_entry_list(
7
+ "Users",
8
+ "users.deleted = 0"
9
+ )
10
+ assert_kind_of Array, users
11
+ assert_equal SugarCRM.config[:username], users.first.user_name
12
+ end
13
+ should "return an object when #get_entry_list" do
14
+ @response = SugarCRM.connection.get_entry_list(
15
+ "Users",
16
+ "users.deleted = 0",
17
+ {:fields => ["first_name", "last_name"]}
18
+ )
19
+ assert_instance_of Array, @response
20
+ assert_instance_of SugarCRM::User, @response[0]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'helper'
2
+
3
+ class TestModuleFields < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "return a hash of module fields when #get_module_fields" do
6
+ fields = SugarCRM.connection.get_module_fields("Users")
7
+ assert_kind_of Hash, fields
8
+ assert "address_city", fields.keys[0]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'helper'
2
+
3
+ class TestGetRelationships < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "return a list of email_addresses when sent #get_relationship and a user_id" do
6
+ email_addresses = SugarCRM.connection.get_relationships(
7
+ "Users",1,"email_addresses"
8
+ )
9
+ assert_instance_of SugarCRM::EmailAddress, email_addresses.first
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestGetServerInfo < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "get server info" do
6
+ assert_instance_of String, SugarCRM.connection.get_server_info["version"]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestGetUserID < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "get the ID of the logged in user" do
6
+ assert true, SugarCRM.connection.get_user_id
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestGetUserTeamID < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "get the team ID of the logged in user" do
6
+ assert true, SugarCRM.connection.get_user_team_id
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestLogin < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "login and set session id" do
6
+ assert SugarCRM.connection.sugar_session_id.class == String
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class TestLogout < ActiveSupport::TestCase
4
+ context "A SugarCRM.connection" do
5
+ should "logout and not be able to login with the old session id" do
6
+ assert (SugarCRM.connection.logout.class == Hash)
7
+ end
8
+ end
9
+ end