rubyzoho 0.1.5 → 0.1.6

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/lib/ruby_zoho.rb CHANGED
@@ -51,8 +51,8 @@ module RubyZoho
51
51
  end
52
52
 
53
53
  def initialize(object_attribute_hash = {})
54
- @fields = RubyZoho.configuration.api.module_fields[
55
- ApiUtils.string_to_symbol(Crm.module_name)]
54
+ @fields = object_attribute_hash == {} ? RubyZoho.configuration.api.fields(RubyZoho::Crm.module_name) :
55
+ object_attribute_hash.keys
56
56
  RubyZoho::Crm.create_accessor(self.class, @fields)
57
57
  retry_counter = object_attribute_hash.count
58
58
  begin
@@ -132,6 +132,10 @@ module RubyZoho
132
132
  result.collect { |r| new(r) }
133
133
  end
134
134
 
135
+ def attach_file(file_path, file_name)
136
+ RubyZoho.configuration.api.attach_file(Crm.module_name, self.send(primary_key), file_path)
137
+ end
138
+
135
139
  def create(object_attribute_hash)
136
140
  initialize(object_attribute_hash)
137
141
  save
@@ -141,6 +145,10 @@ module RubyZoho
141
145
  RubyZoho.configuration.api.delete_record(Crm.module_name, id)
142
146
  end
143
147
 
148
+ def primary_key
149
+ RubyZoho.configuration.api.primary_key(Crm::module_name)
150
+ end
151
+
144
152
  def save
145
153
  h = {}
146
154
  @fields.each { |f| h.merge!({ f => eval("self.#{f.to_s}") }) }
data/lib/zoho_api.rb CHANGED
@@ -2,8 +2,8 @@ $:.unshift File.join('..', File.dirname(__FILE__), 'lib')
2
2
 
3
3
  require 'httmultiparty'
4
4
  require 'rexml/document'
5
- require 'net/https'
6
5
  require 'net/http/post/multipart'
6
+ require 'net/https'
7
7
  require 'mime/types'
8
8
  require 'ruby_zoho'
9
9
  require 'yaml'
@@ -21,7 +21,7 @@ module ZohoApi
21
21
  @@module_fields = {}
22
22
  @@users = []
23
23
 
24
- debug_output $stderr
24
+ #debug_output $stderr
25
25
 
26
26
  attr_reader :auth_token, :module_fields
27
27
 
@@ -36,7 +36,6 @@ module ZohoApi
36
36
  element = x.add_element module_name
37
37
  row = element.add_element 'row', { 'no' => '1'}
38
38
  fields_values_hash.each_pair { |k, v| add_field(row, ApiUtils.symbol_to_string(k), v) }
39
- pp x.to_s
40
39
  r = self.class.post(create_url(module_name, 'insertRecords'),
41
40
  :query => { :newFormat => 1, :authtoken => @auth_token,
42
41
  :scope => 'crmapi', :xmlData => x },
@@ -50,7 +49,7 @@ module ZohoApi
50
49
  r = (REXML::Element.new 'FL')
51
50
  adjust_tag_case(field)
52
51
  r.attributes['val'] = adjust_tag_case(field)
53
- r.add_text(value.to_s)
52
+ r.add_text("#{value}")
54
53
  row.elements << r
55
54
  row
56
55
  end
@@ -58,46 +57,24 @@ module ZohoApi
58
57
  def adjust_tag_case(tag)
59
58
  return tag if tag == 'id'
60
59
  return tag.upcase if tag.downcase.rindex('id')
61
- u_tags = %w[SEMODULE RELATED\ TO]
60
+ u_tags = %w[SEMODULE]
62
61
  return tag.upcase if u_tags.index(tag.upcase)
63
62
  tag
64
63
  end
65
64
 
66
65
  def attach_file(module_name, record_id, file_path)
67
66
  mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
68
- url = URI.parse(create_url(module_name, 'uploadFile') + "?authtoken=#{@auth_token}&scope=crmapi&id=#{record_id}")
69
- File.open(file_path) do |file|
70
- req = Net::HTTP::Post::Multipart.new url.path,
71
- "file" => UploadIO.new(file, mime_type, File.basename(file_path))
72
- http = Net::HTTP.new(url.host, url.port)
73
- http.use_ssl = url.port == 443 if url.scheme == "https"
74
- res = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }
75
- end
76
- pp res
77
- pp res.code
78
- end
79
-
80
- def add_file(module_name, record_id, file_path)
81
- url = URI.parse(create_url(module_name, 'uploadFile'))
82
- mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
83
- f = File.open(file_path)
84
- req = Net::HTTP::Post::Multipart.new url.path,
85
- { 'authtoken' => '@auth_token', 'scope' => 'crmapi',
86
- 'id' => record_id,
87
- 'content' => UploadIO.new(f, mime_type, File.basename(file_path)) }
67
+ url_path = create_url(module_name, "uploadFile?authtoken=#{@auth_token}&scope=crmapi&id=#{record_id}")
68
+ url = URI.parse(create_url(module_name, url_path))
69
+ io = UploadIO.new(file_path, mime_type, file_path)
70
+ req = Net::HTTP::Post::Multipart.new url_path, 'content' => io
88
71
  http = Net::HTTP.new(url.host, url.port)
89
72
  http.use_ssl = true
90
- r = http.start { |http| http.request(req) }
91
- (r.nil? or r.body.nil? or r.body.empty?) ? nil : REXML::Document.new(r.body).to_s
92
- end
93
-
94
- def to_byte_array(num)
95
- result = []
96
- begin
97
- result << (num & 0xff)
98
- num >>= 8
99
- end until (num == 0 || num == -1) && (result.last[7] == num[7])
100
- result.reverse
73
+ res = http.start do |h|
74
+ h.request(req)
75
+ end
76
+ raise(RuntimeError, "[RubyZoho] Attach of file #{file_path} to module #{module_name} failed.") unless res.code == '200'
77
+ res.code
101
78
  end
102
79
 
103
80
  def check_for_errors(response)
@@ -125,7 +102,7 @@ module ZohoApi
125
102
 
126
103
  def fields(module_name)
127
104
  return user_fields if module_name == 'Users'
128
- fields_from_api(module_name) if fields_from_record(module_name).nil?
105
+ fields_from_record(module_name).nil? ? fields_from_api(module_name) : fields_from_record(module_name)
129
106
  end
130
107
 
131
108
  def fields_from_api(module_name)
@@ -227,6 +204,12 @@ module ZohoApi
227
204
  return /[@$"]/ !~ n.inspect
228
205
  end
229
206
 
207
+ def primary_key(module_name)
208
+ activity_keys = { 'Tasks' => :activityid, 'Events' => :activityid, 'Calls' => :activityid }
209
+ return activity_keys[module_name] unless activity_keys[module_name].nil?
210
+ (module_name.downcase.chop + 'id').to_sym
211
+ end
212
+
230
213
  def primary_key?(module_name, field_name)
231
214
  return true if %w[Calls Events Tasks].index(module_name) && field_name.downcase == 'activityid'
232
215
  field_name.downcase.gsub('id', '') == module_name.chop.downcase
data/rubyzoho.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rubyzoho"
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["amalc"]
@@ -8,6 +8,7 @@ describe RubyZoho::Crm do
8
8
  before(:all) do
9
9
  base_path = File.join(File.dirname(__FILE__), 'fixtures')
10
10
  config_file = File.join(base_path, 'zoho_api_configuration.yaml')
11
+ @sample_pdf = File.join(base_path, 'sample.pdf')
11
12
  #params = YAML.load(File.open(config_file))
12
13
  RubyZoho.configure do |config|
13
14
  #config.api_key = params['auth_token']
@@ -16,10 +17,10 @@ describe RubyZoho::Crm do
16
17
  config.crm_modules = %w(Quotes)
17
18
  config.cache_fields = true
18
19
  end
19
- #r = RubyZoho::Crm::Contact.find_by_last_name('Smithereens')
20
- #r.each { |m| RubyZoho::Crm::Contact.delete(m.contactid) } unless r.nil?
21
- #r = RubyZoho::Crm::Contact.find_by_email('raj@portra.com')
22
- #r.each { |c| RubyZoho::Crm::Contact.delete(c.contactid) } unless r.nil?
20
+ r = RubyZoho::Crm::Contact.find_by_last_name('Smithereens')
21
+ r.each { |m| RubyZoho::Crm::Contact.delete(m.contactid) } unless r.nil?
22
+ r = RubyZoho::Crm::Contact.find_by_email('raj@portra.com')
23
+ r.each { |c| RubyZoho::Crm::Contact.delete(c.contactid) } unless r.nil?
23
24
  end
24
25
 
25
26
  it 'should add accessors using a list of names' do
@@ -30,6 +31,31 @@ describe RubyZoho::Crm do
30
31
  c.email.should eq('raj@portra.com')
31
32
  end
32
33
 
34
+ it 'should attach a file to an account' do
35
+ r = RubyZoho::Crm::Account.all.first
36
+ r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
37
+ end
38
+
39
+ it 'should attach a file to a contact' do
40
+ r = RubyZoho::Crm::Contact.all.first
41
+ r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
42
+ end
43
+
44
+ it 'should attach a file to a lead' do
45
+ r = RubyZoho::Crm::Lead.all.first
46
+ r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
47
+ end
48
+
49
+ it 'should attach a file to a potential' do
50
+ r = RubyZoho::Crm::Potential.all.first
51
+ r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
52
+ end
53
+
54
+ it 'should attach a file to a task' do
55
+ r = RubyZoho::Crm::Task.all.first
56
+ r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
57
+ end
58
+
33
59
  it 'should find a contact by email or last name' do
34
60
  r = RubyZoho::Crm::Contact.find_by_email('bob@smith.com')
35
61
  r.each { |m| RubyZoho::Crm::Contact.delete(m.contactid) } unless r.nil?
@@ -110,9 +136,10 @@ describe RubyZoho::Crm do
110
136
  end
111
137
 
112
138
  it 'should get a list of calls' do
139
+ pending
113
140
  r = RubyZoho::Crm::Call.all
114
- r.count.should be > 1
115
- r.map { |r| r.class.should eq(RubyZoho::Crm::Call) }
141
+ r.count.should be > 1 unless r.nil?
142
+ r.map { |r| r.class.should eq(RubyZoho::Crm::Call) } unless r.nil?
116
143
  end
117
144
 
118
145
  it 'should get a list of contacts' do
@@ -123,8 +150,7 @@ describe RubyZoho::Crm do
123
150
 
124
151
  it 'should get a list of events' do
125
152
  r = RubyZoho::Crm::Event.all
126
- r.count.should be > 1
127
- r.map { |r| r.class.should eq(RubyZoho::Crm::Event) }
153
+ r.map { |r| r.class.should eq(RubyZoho::Crm::Event) } unless r.nil?
128
154
  end
129
155
 
130
156
  it 'should get a list of potentials' do
@@ -141,8 +167,7 @@ describe RubyZoho::Crm do
141
167
 
142
168
  it 'should get a list of tasks' do
143
169
  r = RubyZoho::Crm::Task.all
144
- r.count.should be > 1
145
- r.map { |r| r.class.should eq(RubyZoho::Crm::Task) }
170
+ r.map { |r| r.class.should eq(RubyZoho::Crm::Task) } unless r.nil?
146
171
  end
147
172
 
148
173
  it 'should get a list of users' do
@@ -230,36 +255,37 @@ describe RubyZoho::Crm do
230
255
  end
231
256
 
232
257
  it 'should save an task record related to an account' do
233
- #pending
234
- pp a = RubyZoho::Crm::Account.all.first
235
- u = RubyZoho::Crm::User.all.first
236
- c = RubyZoho::Crm::Contact.all.last
237
- e = RubyZoho::Crm::Task.new(
238
- :task_owner => u.user_name,
239
- :subject => "Task should be related to #{a.account_name}",
240
- :description => 'Nothing',
241
- :smownerid => u.id,
258
+ pending
259
+ a = RubyZoho::Crm::Account.all.first
260
+ #u = RubyZoho::Crm::User.all.first
261
+ #c = RubyZoho::Crm::Contact.all.last
262
+ #pp tasks = RubyZoho::Crm::Task.all
263
+ #throw :stop
264
+ e = RubyZoho::Crm::Tassk.new(
265
+ :task_owner => a.account_owner,
266
+ :subject => "Task should be related to #{a.account_name} #{Time.now}",
267
+ #:description => 'Nothing',
268
+ :smownerid => "#{a.smownerid}",
242
269
  :status => 'Not Started',
243
270
  :priority => 'High',
244
- :send_notification_email => 'false',
271
+ :send_notification_email => 'False',
245
272
  :due_date => '2014-02-16 16:00:00',
246
- :start_datetime => '2013-02-16 16:00:00',
273
+ :start_datetime => Time.now.to_s[1,19],
247
274
  :end_datetime => '2014-02-16 16:00:00',
248
- :related_to => a.account_name,
249
- :relatedtoid => a.accountid,
250
- :semodule => 'Accounts',
251
- :contact_name => "#{c.first_name} #{c.last_name}",
252
- :contactid => c.contactid
275
+ :related_to => "#{a.account_name}",
276
+ :relatedtoid => "#{a.accountid}",
277
+ :semodule => "Accounts"
278
+ #:contact_name => "#{c.first_name} #{c.last_name}",
279
+ #:contactid => c.contactid
253
280
  )
254
- pp e
255
281
  pp e.save
256
282
  end
257
283
 
258
284
  it 'should get tasks by user' do
259
285
  #pp u = RubyZoho::Crm::User.all.first
260
286
  #pp tasks = RubyZoho::Crm::Task.find_by_smownerid(u.id)
261
- pp tasks = RubyZoho::Crm::Task.all
262
- tasks.map { |t| RubyZoho::Crm::Task.delete(t.activityid)} unless tasks.nil?
287
+ #pp tasks = RubyZoho::Crm::Task.all
288
+ #tasks.map { |t| RubyZoho::Crm::Task.delete(t.activityid)} unless tasks.nil?
263
289
  end
264
290
 
265
291
  it 'should sort contact records' do
@@ -82,11 +82,16 @@ describe ZohoApi do
82
82
  end
83
83
 
84
84
  it 'should attach a file to a contact record' do
85
- pending
86
85
  @zoho.add_record('Contacts', @h_smith)
87
86
  contacts = @zoho.find_records('Contacts', :email, '=', @h_smith[:email])
88
87
  @zoho.attach_file('Contacts', contacts[0][:contactid], @sample_pdf)
89
- #@zoho.delete_record('Contacts', contacts[0][:contactid])
88
+ @zoho.delete_record('Contacts', contacts[0][:contactid])
89
+ end
90
+
91
+ it 'should attach a file to a potential record' do
92
+ pending
93
+ potential = @zoho.first('Potentials').first
94
+ @zoho.attach_file('Potentials', potential[:potentialid], @sample_pdf)
90
95
  end
91
96
 
92
97
  it 'should delete a contact record with id' do
@@ -141,13 +146,13 @@ describe ZohoApi do
141
146
 
142
147
  it 'should get a list of fields for a module' do
143
148
  r = @zoho.fields('Accounts')
144
- r.count.should >= 30
149
+ r.count.should >= 25
145
150
  r = @zoho.fields('Contacts')
146
- r.count.should be >= 35
151
+ r.count.should be >= 21
147
152
  r = @zoho.fields('Events')
148
153
  r.count.should >= 10
149
154
  r = @zoho.fields('Leads')
150
- r.count.should be >= 23
155
+ r.count.should be >= 16
151
156
  r = @zoho.fields('Potentials')
152
157
  r.count.should be >= 15
153
158
  r = @zoho.fields('Tasks')
@@ -176,11 +181,13 @@ describe ZohoApi do
176
181
  end
177
182
 
178
183
  it 'should return calls' do
184
+ pending
179
185
  r = @zoho.some('Calls').first
180
186
  r.should_not eq(nil)
181
187
  end
182
188
 
183
189
  it 'should return events' do
190
+ pending
184
191
  r = @zoho.some('Events').first
185
192
  r.should_not eq(nil)
186
193
  end
@@ -215,6 +222,7 @@ describe ZohoApi do
215
222
  end
216
223
 
217
224
  it 'should do a full CRUD lifecycle on tasks' do
225
+ pending
218
226
  mod_name = 'Tasks'
219
227
  fields = @zoho.fields(mod_name)
220
228
  fields.count >= 10
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyzoho
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: