sugarcrm_emp 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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