rubyzoho 0.1.6 → 0.1.7
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/.travis.yml +4 -7
- data/Gemfile +1 -0
- data/README.rdoc +56 -19
- data/VERSION +1 -1
- data/lib/ruby_zoho.rb +70 -57
- data/lib/zoho_api.rb +59 -56
- data/rubyzoho-0.1.6.gem +0 -0
- data/rubyzoho.gemspec +6 -2
- data/spec/ruby_zoho_spec.rb +62 -37
- data/spec/zoho_api_spec.rb +7 -13
- metadata +19 -2
    
        data/.travis.yml
    CHANGED
    
    | @@ -2,16 +2,13 @@ | |
| 2 2 | 
             
            language: ruby
         | 
| 3 3 | 
             
            rvm:
         | 
| 4 4 | 
             
            - 1.9.3
         | 
| 5 | 
            -
            # - jruby
         | 
| 6 | 
            -
             | 
| 7 5 | 
             
            matrix:
         | 
| 8 6 | 
             
              allow-failures:
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 7 | 
            +
              - rvm: jruby
         | 
| 11 8 | 
             
            env:
         | 
| 12 9 | 
             
              global:
         | 
| 13 | 
            -
              - secure: ! ' | 
| 10 | 
            +
              - secure: ! 'Es86LRVpGFcxK8Ay0NzjtPgL1a7GQ25WRq4FgixHplZ8BbB2g/LGm2hFFnrD
         | 
| 14 11 |  | 
| 15 | 
            -
                   | 
| 12 | 
            +
                  TQHNvTttEhrXDRXvYqv0ePTSb2I4Tn6xOzBZTIwZlmNDl6uj/5ZL9C9I3LQb
         | 
| 16 13 |  | 
| 17 | 
            -
                   | 
| 14 | 
            +
                  1MP0XFN0GfkOpw4DqVerdzDDoRzQw7AbTBttaOVyO3Nhiddtc3E='
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 | 
            -
            {<img src="https://travis-ci.org/amalc/rubyzoho.png?branch=master" alt="Build Status" />}[https://travis-ci.org/amalc/rubyzoho]
         | 
| 1 | 
            +
            = rubyzoho {<img src="https://travis-ci.org/amalc/rubyzoho.png?branch=master" alt="Build Status" />}[https://travis-ci.org/amalc/rubyzoho] {<img src="https://gemnasium.com/amalc/rubyzoho.png" alt="Dependency Status" />}[https://gemnasium.com/amalc/rubyzoho] {<img src="https://codeclimate.com/github/amalc/rubyzoho.png" />}[https://codeclimate.com/github/amalc/rubyzoho]
         | 
| 2 2 |  | 
| 3 | 
            -
            {<img src="https://gemnasium.com/amalc/rubyzoho.png" alt="Dependency Status" />}[https://gemnasium.com/amalc/rubyzoho]
         | 
| 4 3 |  | 
| 5 4 |  | 
| 6 | 
            -
            = rubyzoho
         | 
| 7 5 |  | 
| 8 6 | 
             
            Abstracting Zoho's API into a set of Ruby classes, with reflection of Zoho's fields using a more familiar
         | 
| 9 7 | 
             
            ActiveRecord lifecycle, but without ActiveRecord. Current focus is on Zoho CRM.
         | 
| 10 8 |  | 
| 9 | 
            +
            <b>Release notes are at the \end of this page.</b>
         | 
| 10 | 
            +
             | 
| 11 11 | 
             
            == Install
         | 
| 12 12 | 
             
                gem install rubyzoho
         | 
| 13 13 |  | 
| @@ -86,7 +86,7 @@ To get a list of all accounts: | |
| 86 86 | 
             
            Or for all task subjects:
         | 
| 87 87 |  | 
| 88 88 | 
             
                t = RubyZoho::Crm::Task.all
         | 
| 89 | 
            -
                pp t.collect { |task| task.subject }
         | 
| 89 | 
            +
                pp t.collect { |task| task.subject }  # => ['Subject 1'], ['Subject 2'], ... ['Subject n']
         | 
| 90 90 |  | 
| 91 91 | 
             
            Or for all quotes:
         | 
| 92 92 |  | 
| @@ -109,7 +109,7 @@ works. | |
| 109 109 | 
             
            To sort a result set:
         | 
| 110 110 | 
             
                r = RubyZoho::Crm::Contact.all
         | 
| 111 111 | 
             
                sorted =  r.sort {|a, b| a.last_name <=> b.last_name }
         | 
| 112 | 
            -
                pp sorted.collect { |c| c.last_name }
         | 
| 112 | 
            +
                pp sorted.collect { |c| c.last_name }  # => ['Name 1', ['Name 2'], ... ['Name n']]
         | 
| 113 113 |  | 
| 114 114 | 
             
            To find by ID, note well, ID is a *string*:
         | 
| 115 115 | 
             
                leads = RubyZoho::Crm::Lead.all
         | 
| @@ -148,11 +148,28 @@ To update a record (<b>Note, that the attribute is :id</b>): | |
| 148 148 | 
             
                    :email => 'changed_email@domain.com'
         | 
| 149 149 | 
             
                )
         | 
| 150 150 |  | 
| 151 | 
            +
            Custom fields are like any other field or method in Ruby:
         | 
| 152 | 
            +
                a = RubyZoho::Crm::Account.find_by_account_name('Very Big Account')
         | 
| 153 | 
            +
                pp a.custom_field # => 'Custom field content'
         | 
| 154 | 
            +
             | 
| 155 | 
            +
            Or:
         | 
| 156 | 
            +
                c = RubyZoho::Crm::Contact.new(
         | 
| 157 | 
            +
                  :first_name => 'First Name',
         | 
| 158 | 
            +
                  :last_name => 'Last Name',
         | 
| 159 | 
            +
                  :email => 'email@domain.com',
         | 
| 160 | 
            +
                  :account_name => a.first.account_name,
         | 
| 161 | 
            +
                  :accountid => a.first.accountid,  # accountid instead of account_id because of Zoho's convention
         | 
| 162 | 
            +
                  :custom_field_2 => 'Custom text'
         | 
| 163 | 
            +
                )
         | 
| 164 | 
            +
                pp c.save   # Reflects back the new Zoho record ID, and various create and modify times and users
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            To attach a file to a record (Tested for +Accounts+, +Contacts+, +Leads+, +Potentials+ and +Tasks+ only):
         | 
| 167 | 
            +
                l = RubyZoho::Crm::Lead.find_by_email('email@domain.com')
         | 
| 168 | 
            +
                l.attach_file(file_path, file_name)     # Can only be attached to a pre-existing record
         | 
| 151 169 |  | 
| 152 | 
            -
             | 
| 170 | 
            +
            Classes (Zoho modules) currently supported are:
         | 
| 153 171 | 
             
                RubyZoho::Crm::Account
         | 
| 154 172 | 
             
                RubyZoho::Crm::Contact
         | 
| 155 | 
            -
                RubyZoho::Crm::Event
         | 
| 156 173 | 
             
                RubyZoho::Crm::Lead
         | 
| 157 174 | 
             
                RubyZoho::Crm::Potential
         | 
| 158 175 | 
             
                RubyZoho::Crm::Task
         | 
| @@ -165,7 +182,7 @@ or where the Zoho API sends back an explicit error code which <b>isn't</b> in th | |
| 165 182 |  | 
| 166 183 | 
             
                ['4422', '5000']
         | 
| 167 184 |  | 
| 168 | 
            -
            a standard Ruby +RuntimeError+ exception is raised with the Zoho API message.
         | 
| 185 | 
            +
            a standard Ruby +RuntimeError+ exception is raised with the Zoho's API message.
         | 
| 169 186 |  | 
| 170 187 | 
             
            == Optimizations for Development and Testing
         | 
| 171 188 | 
             
            Set <tt>config.cache_fields = true</tt> in the configuration block. This caches \module field
         | 
| @@ -196,22 +213,20 @@ either the related \module's record id, which is stored with the Task. But no, c | |
| 196 213 | 
             
            Please open an issue on GitHub. Or better yet, send in a pull request with the fix or enhancement!
         | 
| 197 214 |  | 
| 198 215 | 
             
            === Known Bugs or Issues
         | 
| 199 | 
            -
            1.  | 
| 200 | 
            -
            2. If you're having trouble with updating custom fields, be sure to check the permission of the user that created the custom field.
         | 
| 216 | 
            +
            1. If you're having trouble with updating custom fields, be sure to check the permission of the user that created the custom field.
         | 
| 201 217 |  | 
| 202 218 | 
             
            === Roadmap (Ranked)
         | 
| 203 | 
            -
            1.  | 
| 204 | 
            -
                    pp a.contacts
         | 
| 205 | 
            -
               to get contacts associated with an account.
         | 
| 206 | 
            -
            2. Support for multiple find fields.
         | 
| 207 | 
            -
            3. AR style master/detail updates e.g. where +a+ is an account.
         | 
| 219 | 
            +
            1. AR style master/detail updates e.g. where +a+ is an account.
         | 
| 208 220 | 
             
                a << RubyZoho::Crm::Contact.new(
         | 
| 209 221 | 
             
                    :last_name => 'Last Name',
         | 
| 210 222 | 
             
                    :first_name => 'First Name'
         | 
| 211 223 | 
             
                )
         | 
| 224 | 
            +
            2. Get related records using AR style syntax, e.g.
         | 
| 225 | 
            +
                    pp a.contacts
         | 
| 226 | 
            +
               to get contacts associated with an account.
         | 
| 227 | 
            +
            3. Support for multiple find fields.
         | 
| 212 228 |  | 
| 213 229 | 
             
            == Contributing to rubyzoho
         | 
| 214 | 
            -
             | 
| 215 230 | 
             
            * Pull requests with unit tests or specs and a version branch are welcomed.
         | 
| 216 231 | 
             
            * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
         | 
| 217 232 | 
             
            * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
         | 
| @@ -222,13 +237,35 @@ Please open an issue on GitHub. Or better yet, send in a pull request with the f | |
| 222 237 | 
             
            * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
         | 
| 223 238 |  | 
| 224 239 | 
             
            ---
         | 
| 240 | 
            +
            == Acknowledgements
         | 
| 241 | 
            +
            Giant buckets of Gratitude to the giants, sung and unsung heroes who put together and support the Open Source movement,
         | 
| 242 | 
            +
            Linux, Ruby and Rails. We stand on the shoulders of giants. Thank you.
         | 
| 225 243 |  | 
| 226 | 
            -
            ==  | 
| 244 | 
            +
            == Credits
         | 
| 245 | 
            +
            wcgiles@github (\@\waynecgiles) for professional and patient debugging and continued debugging of this gem.
         | 
| 227 246 |  | 
| 247 | 
            +
            == Trademarks
         | 
| 228 248 | 
             
            Zoho, the Zoho suite and related applications are owned, trademarked and copyrighted by the Zoho Corporation Pvt. Ltd.
         | 
| 229 249 | 
             
            This software is not associated in anyway with the Zoho Corporation Pvt. Ltd.
         | 
| 230 250 |  | 
| 231 251 | 
             
            == Copyright
         | 
| 252 | 
            +
            Copyright (c) 2013 amalc (\@\amalc). Released under the MIT license. See LICENSE.txt for further details.
         | 
| 253 | 
            +
             | 
| 254 | 
            +
            ---
         | 
| 255 | 
            +
            = Releases
         | 
| 256 | 
            +
            == Release Candidates
         | 
| 257 | 
            +
             | 
| 258 | 
            +
            == Development
         | 
| 259 | 
            +
            [0.1.8]
         | 
| 260 | 
            +
                    1. Modules Supported: Accounts, Contacts, Leads, Potentials, Quotes, Tasks and Users
         | 
| 261 | 
            +
                    2. ActiveRecord style syntax for Class.\new, Class.delete, Class.find, Class.update, Object.save
         | 
| 262 | 
            +
                    3. << syntax for Account/Tasks on Master/Detail relationships
         | 
| 263 | 
            +
            [0.1.7]
         | 
| 264 | 
            +
                    1. Bug for attach_file method, respect the file_name parameter.
         | 
| 265 | 
            +
                    2. \:\id is the primary key across all classes in addition to Zoho's existing convention.
         | 
| 266 | 
            +
             | 
| 267 | 
            +
            == Released
         | 
| 268 | 
            +
            [0.1.1 - 0.1.6] Alpha Releases
         | 
| 269 | 
            +
                            1. Configuration block signature changed
         | 
| 270 | 
            +
            [0.0.1 - 0.0.5] Alpha Releases
         | 
| 232 271 |  | 
| 233 | 
            -
            Copyright (c) 2013 amalc. Released under the MIT license. See LICENSE.txt for
         | 
| 234 | 
            -
            further details.
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.1. | 
| 1 | 
            +
            0.1.7
         | 
    
        data/lib/ruby_zoho.rb
    CHANGED
    
    | @@ -49,26 +49,28 @@ module RubyZoho | |
| 49 49 | 
             
                class << self
         | 
| 50 50 | 
             
                  attr_accessor :module_name
         | 
| 51 51 | 
             
                end
         | 
| 52 | 
            +
                @module_name = 'Crm'
         | 
| 52 53 |  | 
| 53 54 | 
             
                def initialize(object_attribute_hash = {})
         | 
| 54 | 
            -
                  @fields = object_attribute_hash == {} ? RubyZoho.configuration.api.fields( | 
| 55 | 
            +
                  @fields = object_attribute_hash == {} ? RubyZoho.configuration.api.fields(self.class.module_name) :
         | 
| 55 56 | 
             
                      object_attribute_hash.keys
         | 
| 56 57 | 
             
                  RubyZoho::Crm.create_accessor(self.class, @fields)
         | 
| 58 | 
            +
                  RubyZoho::Crm.create_accessor(self.class, [:module_name])
         | 
| 59 | 
            +
                  public_send(:module_name=, self.class.module_name)
         | 
| 60 | 
            +
                  update_or_create_attrs(object_attribute_hash)
         | 
| 61 | 
            +
                  self
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def update_or_create_attrs(object_attribute_hash)
         | 
| 57 65 | 
             
                  retry_counter = object_attribute_hash.count
         | 
| 58 66 | 
             
                  begin
         | 
| 59 67 | 
             
                    object_attribute_hash.map { |(k, v)| public_send("#{k}=", v) }
         | 
| 60 68 | 
             
                  rescue NoMethodError => e
         | 
| 61 69 | 
             
                    m = e.message.slice(/`(.*?)=/)
         | 
| 62 | 
            -
                    unless m.nil?
         | 
| 63 | 
            -
                      m.gsub!('`', '')
         | 
| 64 | 
            -
                      m.gsub!('(', '')
         | 
| 65 | 
            -
                      m.gsub!(')', '')
         | 
| 66 | 
            -
                      RubyZoho::Crm.create_accessor(self.class, [m.chop])
         | 
| 67 | 
            -
                    end
         | 
| 70 | 
            +
                    RubyZoho::Crm.create_accessor(self.class, [m.gsub(/[`()]*/, '').chop]) unless m.nil?
         | 
| 68 71 | 
             
                    retry_counter -= 1
         | 
| 69 72 | 
             
                    retry if retry_counter > 0
         | 
| 70 73 | 
             
                  end
         | 
| 71 | 
            -
                  self
         | 
| 72 74 | 
             
                end
         | 
| 73 75 |  | 
| 74 76 | 
             
                def attr_writers
         | 
| @@ -103,6 +105,10 @@ module RubyZoho | |
| 103 105 | 
             
                  end
         | 
| 104 106 | 
             
                end
         | 
| 105 107 |  | 
| 108 | 
            +
                def self.find(id)
         | 
| 109 | 
            +
                  self.find_by_id(id)
         | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 106 112 | 
             
                def self.method_missing(meth, *args, &block)
         | 
| 107 113 | 
             
                  if meth.to_s =~ /^find_by_(.+)$/
         | 
| 108 114 | 
             
                    run_find_by_method($1, *args, &block)
         | 
| @@ -111,29 +117,64 @@ module RubyZoho | |
| 111 117 | 
             
                  end
         | 
| 112 118 | 
             
                end
         | 
| 113 119 |  | 
| 120 | 
            +
                def method_missing(meth, *args, &block)
         | 
| 121 | 
            +
                  if [:seid=, :semodule=].index(meth)
         | 
| 122 | 
            +
                    run_create_accessor(self.class, meth)
         | 
| 123 | 
            +
                    self.send(meth, args[0])
         | 
| 124 | 
            +
                  else
         | 
| 125 | 
            +
                    super
         | 
| 126 | 
            +
                  end
         | 
| 127 | 
            +
                end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                def self.method_is_module?(str_or_sym)
         | 
| 130 | 
            +
                  return nil if str_or_sym.nil?
         | 
| 131 | 
            +
                  s = str_or_sym.class == String ? str_or_sym : ApiUtils.symbol_to_string(str_or_sym)
         | 
| 132 | 
            +
                  possible_module = s[s.length - 1].downcase == 's' ? s : s + 's'
         | 
| 133 | 
            +
                  i = RubyZoho.configuration.crm_modules.index(possible_module.capitalize)
         | 
| 134 | 
            +
                  return str_or_sym unless i.nil?
         | 
| 135 | 
            +
                  nil
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                def run_create_accessor(klass, meth)
         | 
| 139 | 
            +
                  method = meth.to_s.chop.to_sym
         | 
| 140 | 
            +
                  RubyZoho::Crm.create_accessor(klass, [method])
         | 
| 141 | 
            +
                  nil
         | 
| 142 | 
            +
                end
         | 
| 143 | 
            +
             | 
| 114 144 | 
             
                def self.run_find_by_method(attrs, *args, &block)
         | 
| 115 145 | 
             
                  attrs = attrs.split('_and_')
         | 
| 116 146 | 
             
                  conditions = Array.new(args.size, '=')
         | 
| 117 147 | 
             
                  h = RubyZoho.configuration.api.find_records(
         | 
| 118 | 
            -
                       | 
| 148 | 
            +
                      self.module_name, ApiUtils.string_to_symbol(attrs[0]), conditions[0], args[0]
         | 
| 119 149 | 
             
                  )
         | 
| 120 150 | 
             
                  return h.collect { |r| new(r) } unless h.nil?
         | 
| 121 151 | 
             
                  nil
         | 
| 122 152 | 
             
                end
         | 
| 123 153 |  | 
| 124 154 | 
             
                def self.all         #TODO Refactor into low level API
         | 
| 155 | 
            +
                  max_records = 200
         | 
| 125 156 | 
             
                  result = []
         | 
| 126 157 | 
             
                  i = 1
         | 
| 127 | 
            -
                   | 
| 128 | 
            -
             | 
| 129 | 
            -
                    i  | 
| 158 | 
            +
                  batch = []
         | 
| 159 | 
            +
                  until batch.nil?
         | 
| 160 | 
            +
                    batch = RubyZoho.configuration.api.some(self.module_name, i, max_records)
         | 
| 130 161 | 
             
                    result.concat(batch) unless batch.nil?
         | 
| 131 | 
            -
             | 
| 162 | 
            +
                    break if !batch.nil? && batch.count < max_records
         | 
| 163 | 
            +
                    i += max_records
         | 
| 164 | 
            +
                  end
         | 
| 132 165 | 
             
                  result.collect { |r| new(r) }
         | 
| 133 166 | 
             
                end
         | 
| 134 167 |  | 
| 168 | 
            +
                def << object
         | 
| 169 | 
            +
                  object.semodule = self.module_name
         | 
| 170 | 
            +
                  object.seid = self.id
         | 
| 171 | 
            +
                  object.fields << :seid
         | 
| 172 | 
            +
                  object.fields << :semodule
         | 
| 173 | 
            +
                  save_object(object)
         | 
| 174 | 
            +
                end
         | 
| 175 | 
            +
             | 
| 135 176 | 
             
                def attach_file(file_path, file_name)
         | 
| 136 | 
            -
                  RubyZoho.configuration.api.attach_file( | 
| 177 | 
            +
                  RubyZoho.configuration.api.attach_file(self.class.module_name, self.send(primary_key), file_path, file_name)
         | 
| 137 178 | 
             
                end
         | 
| 138 179 |  | 
| 139 180 | 
             
                def create(object_attribute_hash)
         | 
| @@ -142,18 +183,26 @@ module RubyZoho | |
| 142 183 | 
             
                end
         | 
| 143 184 |  | 
| 144 185 | 
             
                def self.delete(id)
         | 
| 145 | 
            -
                  RubyZoho.configuration.api.delete_record( | 
| 186 | 
            +
                  RubyZoho.configuration.api.delete_record(self.module_name, id)
         | 
| 146 187 | 
             
                end
         | 
| 147 188 |  | 
| 148 189 | 
             
                def primary_key
         | 
| 149 | 
            -
                  RubyZoho.configuration.api.primary_key( | 
| 190 | 
            +
                  RubyZoho.configuration.api.primary_key(self.class.module_name)
         | 
| 150 191 | 
             
                end
         | 
| 151 192 |  | 
| 152 193 | 
             
                def save
         | 
| 153 194 | 
             
                  h = {}
         | 
| 154 195 | 
             
                  @fields.each { |f| h.merge!({ f => eval("self.#{f.to_s}") }) }
         | 
| 155 196 | 
             
                  h.delete_if { |k, v| v.nil? }
         | 
| 156 | 
            -
                  r = RubyZoho.configuration.api.add_record( | 
| 197 | 
            +
                  r = RubyZoho.configuration.api.add_record(self.class.module_name, h)
         | 
| 198 | 
            +
                  up_date(r)
         | 
| 199 | 
            +
                end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                def save_object(object)
         | 
| 202 | 
            +
                  h = {}
         | 
| 203 | 
            +
                  object.fields.each { |f| h.merge!({ f => object.send(f) }) }
         | 
| 204 | 
            +
                  h.delete_if { |k, v| v.nil? }
         | 
| 205 | 
            +
                  r = RubyZoho.configuration.api.add_record(object.module_name, h)
         | 
| 157 206 | 
             
                  up_date(r)
         | 
| 158 207 | 
             
                end
         | 
| 159 208 |  | 
| @@ -161,58 +210,22 @@ module RubyZoho | |
| 161 210 | 
             
                  raise(RuntimeError, 'No ID found', object_attribute_hash.to_s) if object_attribute_hash[:id].nil?
         | 
| 162 211 | 
             
                  id = object_attribute_hash[:id]
         | 
| 163 212 | 
             
                  object_attribute_hash.delete(:id)
         | 
| 164 | 
            -
                  RubyZoho.configuration.api.update_record( | 
| 213 | 
            +
                  r = RubyZoho.configuration.api.update_record(self.module_name, id, object_attribute_hash)
         | 
| 214 | 
            +
                  new(object_attribute_hash.merge!(r))
         | 
| 165 215 | 
             
                end
         | 
| 166 216 |  | 
| 167 217 | 
             
                def up_date(object_attribute_hash)
         | 
| 168 | 
            -
                   | 
| 169 | 
            -
                  begin
         | 
| 170 | 
            -
                    object_attribute_hash.map { |(k, v)| public_send("#{k}=", v) }
         | 
| 171 | 
            -
                  rescue NoMethodError => e
         | 
| 172 | 
            -
                    m = e.message.slice(/`(.*?)=/)
         | 
| 173 | 
            -
                    unless m.nil?
         | 
| 174 | 
            -
                      m.gsub!('`', '')
         | 
| 175 | 
            -
                      m.gsub!('(', '')
         | 
| 176 | 
            -
                      m.gsub!(')', '')
         | 
| 177 | 
            -
                      RubyZoho::Crm.create_accessor(self.class, [m.chop])
         | 
| 178 | 
            -
                    end
         | 
| 179 | 
            -
                    retry_counter -= 1
         | 
| 180 | 
            -
                    retry if retry_counter > 0
         | 
| 181 | 
            -
                  end
         | 
| 218 | 
            +
                  update_or_create_attrs(object_attribute_hash)
         | 
| 182 219 | 
             
                  self
         | 
| 183 220 | 
             
                end
         | 
| 184 221 |  | 
| 185 | 
            -
             | 
| 186 222 | 
             
                def self.setup_classes
         | 
| 187 223 | 
             
                  RubyZoho.configuration.crm_modules.each do |module_name|
         | 
| 188 224 | 
             
                    klass_name = module_name.chop
         | 
| 189 225 | 
             
                    c = Class.new(RubyZoho::Crm) do
         | 
| 190 226 | 
             
                      include RubyZoho
         | 
| 191 227 | 
             
                      attr_reader :fields
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                      def initialize(object_attribute_hash = {})
         | 
| 194 | 
            -
                        klass = self.class.to_s
         | 
| 195 | 
            -
                        Crm.module_name = klass.slice(klass.rindex('::') + 2, klass.length) + 's'
         | 
| 196 | 
            -
                        super
         | 
| 197 | 
            -
                      end
         | 
| 198 | 
            -
             | 
| 199 | 
            -
                      def self.all
         | 
| 200 | 
            -
                        klass = self.to_s
         | 
| 201 | 
            -
                        Crm.module_name = klass.slice(klass.rindex('::') + 2, klass.length) + 's'
         | 
| 202 | 
            -
                        super
         | 
| 203 | 
            -
                      end
         | 
| 204 | 
            -
             | 
| 205 | 
            -
                      def self.delete(id)
         | 
| 206 | 
            -
                        klass = self.to_s
         | 
| 207 | 
            -
                        Crm.module_name = klass.slice(klass.rindex('::') + 2, klass.length) + 's'
         | 
| 208 | 
            -
                        super
         | 
| 209 | 
            -
                      end
         | 
| 210 | 
            -
             | 
| 211 | 
            -
                      def self.method_missing(meth, *args, &block)
         | 
| 212 | 
            -
                        klass = self.to_s
         | 
| 213 | 
            -
                        Crm.module_name = klass.slice(klass.rindex('::') + 2, klass.length) + 's'
         | 
| 214 | 
            -
                        super
         | 
| 215 | 
            -
                      end
         | 
| 228 | 
            +
                      @module_name = module_name
         | 
| 216 229 | 
             
                    end
         | 
| 217 230 | 
             
                    const_set(klass_name, c)
         | 
| 218 231 | 
             
                  end
         | 
    
        data/lib/zoho_api.rb
    CHANGED
    
    | @@ -42,7 +42,7 @@ module ZohoApi | |
| 42 42 | 
             
                      :headers => { 'Content-length' => '0' })
         | 
| 43 43 | 
             
                  check_for_errors(r)
         | 
| 44 44 | 
             
                  x_r = REXML::Document.new(r.body).elements.to_a('//recorddetail')
         | 
| 45 | 
            -
                   | 
| 45 | 
            +
                  to_hash(x_r, module_name)[0]
         | 
| 46 46 | 
             
                end
         | 
| 47 47 |  | 
| 48 48 | 
             
                def add_field(row, field, value)
         | 
| @@ -62,11 +62,11 @@ module ZohoApi | |
| 62 62 | 
             
                  tag
         | 
| 63 63 | 
             
                end
         | 
| 64 64 |  | 
| 65 | 
            -
                def attach_file(module_name, record_id, file_path)
         | 
| 65 | 
            +
                def attach_file(module_name, record_id, file_path, file_name)
         | 
| 66 66 | 
             
                  mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
         | 
| 67 67 | 
             
                  url_path = create_url(module_name, "uploadFile?authtoken=#{@auth_token}&scope=crmapi&id=#{record_id}")
         | 
| 68 68 | 
             
                  url = URI.parse(create_url(module_name, url_path))
         | 
| 69 | 
            -
                  io = UploadIO.new(file_path, mime_type,  | 
| 69 | 
            +
                  io = UploadIO.new(file_path, mime_type, file_name)
         | 
| 70 70 | 
             
                  req = Net::HTTP::Post::Multipart.new url_path, 'content' => io
         | 
| 71 71 | 
             
                  http = Net::HTTP.new(url.host, url.port)
         | 
| 72 72 | 
             
                  http.use_ssl = true
         | 
| @@ -92,12 +92,7 @@ module ZohoApi | |
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 94 | 
             
                def delete_record(module_name, record_id)
         | 
| 95 | 
            -
                   | 
| 96 | 
            -
                    :query => { :newFormat => 1, :authtoken => @auth_token,
         | 
| 97 | 
            -
                      :scope => 'crmapi', :id => record_id },
         | 
| 98 | 
            -
                    :headers => { 'Content-length' => '0' })
         | 
| 99 | 
            -
                  raise('Adding contact failed', RuntimeError, r.response.body.to_s) unless r.response.code == '200'
         | 
| 100 | 
            -
                  check_for_errors(r)
         | 
| 95 | 
            +
                  post_action(module_name, record_id, 'deleteRecords')
         | 
| 101 96 | 
             
                end
         | 
| 102 97 |  | 
| 103 98 | 
             
                def fields(module_name)
         | 
| @@ -129,7 +124,7 @@ module ZohoApi | |
| 129 124 | 
             
                end
         | 
| 130 125 |  | 
| 131 126 | 
             
                def find_records(module_name, field, condition, value)
         | 
| 132 | 
            -
                  sc_field = ApiUtils.symbol_to_string(field)
         | 
| 127 | 
            +
                  sc_field = field == :id ? primary_key(module_name) : ApiUtils.symbol_to_string(field)
         | 
| 133 128 | 
             
                  return find_record_by_related_id(module_name, sc_field, value) if related_id?(module_name, sc_field)
         | 
| 134 129 | 
             
                  primary_key?(module_name, sc_field) == false ? find_record_by_field(module_name, sc_field, condition, value) :
         | 
| 135 130 | 
             
                      find_record_by_id(module_name, value)
         | 
| @@ -144,7 +139,7 @@ module ZohoApi | |
| 144 139 | 
             
                                                :fromIndex => 1, :toIndex => NUMBER_OF_RECORDS_TO_GET})
         | 
| 145 140 | 
             
                  check_for_errors(r)
         | 
| 146 141 | 
             
                  x = REXML::Document.new(r.body).elements.to_a("/response/result/#{module_name}/row")
         | 
| 147 | 
            -
                  to_hash(x)
         | 
| 142 | 
            +
                  to_hash(x, module_name)
         | 
| 148 143 | 
             
                end
         | 
| 149 144 |  | 
| 150 145 | 
             
                def find_record_by_id(module_name, id)
         | 
| @@ -154,7 +149,7 @@ module ZohoApi | |
| 154 149 | 
             
                  raise(RuntimeError, 'Bad query', "#{module_name} #{id}") unless r.body.index('<error>').nil?
         | 
| 155 150 | 
             
                  check_for_errors(r)
         | 
| 156 151 | 
             
                  x = REXML::Document.new(r.body).elements.to_a("/response/result/#{module_name}/row")
         | 
| 157 | 
            -
                  to_hash(x)
         | 
| 152 | 
            +
                  to_hash(x, module_name)
         | 
| 158 153 | 
             
                end
         | 
| 159 154 |  | 
| 160 155 | 
             
                def find_record_by_related_id(module_name, sc_field, value)
         | 
| @@ -167,43 +162,22 @@ module ZohoApi | |
| 167 162 | 
             
                         :searchValue => value})
         | 
| 168 163 | 
             
                  check_for_errors(r)
         | 
| 169 164 | 
             
                  x = REXML::Document.new(r.body).elements.to_a("/response/result/#{module_name}/row")
         | 
| 170 | 
            -
                  to_hash(x)
         | 
| 171 | 
            -
                end
         | 
| 172 | 
            -
             | 
| 173 | 
            -
                def valid_related?(module_name, field)
         | 
| 174 | 
            -
                  return nil if field.downcase == 'smownerid'
         | 
| 175 | 
            -
                  valid_relationships = {
         | 
| 176 | 
            -
                      'Leads' => %w(email),
         | 
| 177 | 
            -
                      'Accounts' => %w(accountid accountname),
         | 
| 178 | 
            -
                      'Contacts' => %w(contactid accountid vendorid email),
         | 
| 179 | 
            -
                      'Potentials' => %w(potentialid accountid campaignid contactid potentialname),
         | 
| 180 | 
            -
                      'Campaigns' => %w(campaignid campaignname),
         | 
| 181 | 
            -
                      'Cases' => %w(caseid productid accountid potentialid),
         | 
| 182 | 
            -
                      'Solutions' => %w(solutionid productid),
         | 
| 183 | 
            -
                      'Products' => %w(productid vendorid productname),
         | 
| 184 | 
            -
                      'Purchase Order' => %w(purchaseorderid contactid vendorid),
         | 
| 185 | 
            -
                      'Quotes' => %w(quoteid potentialid accountid contactid),
         | 
| 186 | 
            -
                      'Sales Orders' => %w(salesorderid potentialid accountid contactid quoteid),
         | 
| 187 | 
            -
                      'Invoices' => %w(invoiceid accountid salesorderid contactid),
         | 
| 188 | 
            -
                      'Vendors' => %w(vendorid vendorname),
         | 
| 189 | 
            -
                      'Tasks' => %w(taskid),
         | 
| 190 | 
            -
                      'Events' => %w(eventid),
         | 
| 191 | 
            -
                      'Notes' => %w(notesid)
         | 
| 192 | 
            -
                  }
         | 
| 193 | 
            -
                  valid_relationships[module_name].index(field.downcase)
         | 
| 194 | 
            -
                end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                def related_id?(module_name, field_name)
         | 
| 197 | 
            -
                  field = field_name.to_s
         | 
| 198 | 
            -
                  return false if field.rindex('id').nil?
         | 
| 199 | 
            -
                  return false if %w[Calls Events Tasks].index(module_name) && field_name.downcase == 'activityid'
         | 
| 200 | 
            -
                  field.downcase.gsub('id', '') != module_name.chop.downcase
         | 
| 165 | 
            +
                  to_hash(x, module_name)
         | 
| 201 166 | 
             
                end
         | 
| 202 167 |  | 
| 203 168 | 
             
                def method_name?(n)
         | 
| 204 169 | 
             
                  return /[@$"]/ !~ n.inspect
         | 
| 205 170 | 
             
                end
         | 
| 206 171 |  | 
| 172 | 
            +
                def post_action(module_name, record_id, action_type)
         | 
| 173 | 
            +
                  r = self.class.post(create_url(module_name, action_type),
         | 
| 174 | 
            +
                                      :query => {:newFormat => 1, :authtoken => @auth_token,
         | 
| 175 | 
            +
                                                 :scope => 'crmapi', :id => record_id},
         | 
| 176 | 
            +
                                      :headers => {'Content-length' => '0'})
         | 
| 177 | 
            +
                  raise('Adding contact failed', RuntimeError, r.response.body.to_s) unless r.response.code == '200'
         | 
| 178 | 
            +
                  check_for_errors(r)
         | 
| 179 | 
            +
                end
         | 
| 180 | 
            +
             | 
| 207 181 | 
             
                def primary_key(module_name)
         | 
| 208 182 | 
             
                  activity_keys = { 'Tasks' => :activityid, 'Events' => :activityid, 'Calls' => :activityid }
         | 
| 209 183 | 
             
                  return activity_keys[module_name] unless activity_keys[module_name].nil?
         | 
| @@ -211,8 +185,18 @@ module ZohoApi | |
| 211 185 | 
             
                end
         | 
| 212 186 |  | 
| 213 187 | 
             
                def primary_key?(module_name, field_name)
         | 
| 214 | 
            -
                  return  | 
| 215 | 
            -
                  field_name. | 
| 188 | 
            +
                  return nil if field_name.nil? || module_name.nil?
         | 
| 189 | 
            +
                  fn = field_name.class == String ? field_name : field_name.to_s
         | 
| 190 | 
            +
                  return true if fn == 'id'
         | 
| 191 | 
            +
                  return true if %w[Calls Events Tasks].index(module_name) && fn.downcase == 'activityid'
         | 
| 192 | 
            +
                  fn.downcase.gsub('id', '') == module_name.chop.downcase
         | 
| 193 | 
            +
                end
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                def related_id?(module_name, field_name)
         | 
| 196 | 
            +
                  field = field_name.to_s
         | 
| 197 | 
            +
                  return false if field.rindex('id').nil?
         | 
| 198 | 
            +
                  return false if %w[Calls Events Tasks].index(module_name) && field_name.downcase == 'activityid'
         | 
| 199 | 
            +
                  field.downcase.gsub('id', '') != module_name.chop.downcase
         | 
| 216 200 | 
             
                end
         | 
| 217 201 |  | 
| 218 202 | 
             
                def reflect_module_fields
         | 
| @@ -236,17 +220,19 @@ module ZohoApi | |
| 236 220 | 
             
                  return nil unless r.response.code == '200'
         | 
| 237 221 | 
             
                  check_for_errors(r)
         | 
| 238 222 | 
             
                  x = REXML::Document.new(r.body).elements.to_a("/response/result/#{module_name}/row")
         | 
| 239 | 
            -
                  to_hash(x)
         | 
| 223 | 
            +
                  to_hash(x, module_name)
         | 
| 240 224 | 
             
                end
         | 
| 241 225 |  | 
| 242 | 
            -
                def to_hash(xml_results)
         | 
| 226 | 
            +
                def to_hash(xml_results, module_name)
         | 
| 243 227 | 
             
                  r = []
         | 
| 244 228 | 
             
                  xml_results.each do |e|
         | 
| 245 229 | 
             
                    record = {}
         | 
| 230 | 
            +
                    record[:module_name] = module_name
         | 
| 246 231 | 
             
                    e.elements.to_a.each do |n|
         | 
| 247 232 | 
             
                      k = ApiUtils.string_to_symbol(n.attribute('val').to_s.gsub('val=', ''))
         | 
| 248 233 | 
             
                      v = n.text == 'null' ? nil : n.text
         | 
| 249 234 | 
             
                      record.merge!({ k => v })
         | 
| 235 | 
            +
                      record.merge!({ :id => v }) if primary_key?(module_name, k)
         | 
| 250 236 | 
             
                    end
         | 
| 251 237 | 
             
                    r << record
         | 
| 252 238 | 
             
                  end
         | 
| @@ -255,13 +241,7 @@ module ZohoApi | |
| 255 241 | 
             
                end
         | 
| 256 242 |  | 
| 257 243 | 
             
                def to_hash_with_id(xml_results, module_name)
         | 
| 258 | 
            -
                   | 
| 259 | 
            -
                  primary_key = module_name.chop.downcase + 'id'
         | 
| 260 | 
            -
                  h.each do |e|
         | 
| 261 | 
            -
                    e.merge!({ primary_key.to_sym => e[:id] }) if e[primary_key.to_sym].nil? && !e[:id].nil?
         | 
| 262 | 
            -
                    e.merge!({ e[:id] => primary_key.to_sym }) if e[:id].nil? && !e[primary_key.to_sym].nil?
         | 
| 263 | 
            -
                  end
         | 
| 264 | 
            -
                  h
         | 
| 244 | 
            +
                  to_hash(xml_results, module_name)
         | 
| 265 245 | 
             
                end
         | 
| 266 246 |  | 
| 267 247 | 
             
                def update_module_fields(mod_name, module_name, r)
         | 
| @@ -287,8 +267,8 @@ module ZohoApi | |
| 287 267 | 
             
                                  :xmlData => x },
         | 
| 288 268 | 
             
                      :headers => { 'Content-length' => '0' })
         | 
| 289 269 | 
             
                  check_for_errors(r)
         | 
| 290 | 
            -
                   | 
| 291 | 
            -
                   | 
| 270 | 
            +
                  x_r = REXML::Document.new(r.body).elements.to_a('//recorddetail')
         | 
| 271 | 
            +
                  to_hash_with_id(x_r, module_name)[0]
         | 
| 292 272 | 
             
                end
         | 
| 293 273 |  | 
| 294 274 | 
             
                def user_fields
         | 
| @@ -316,6 +296,29 @@ module ZohoApi | |
| 316 296 | 
             
                  @@users = result
         | 
| 317 297 | 
             
                end
         | 
| 318 298 |  | 
| 299 | 
            +
                def valid_related?(module_name, field)
         | 
| 300 | 
            +
                  return nil if field.downcase == 'smownerid'
         | 
| 301 | 
            +
                  valid_relationships = {
         | 
| 302 | 
            +
                      'Leads' => %w(email),
         | 
| 303 | 
            +
                      'Accounts' => %w(accountid accountname),
         | 
| 304 | 
            +
                      'Contacts' => %w(contactid accountid vendorid email),
         | 
| 305 | 
            +
                      'Potentials' => %w(potentialid accountid campaignid contactid potentialname),
         | 
| 306 | 
            +
                      'Campaigns' => %w(campaignid campaignname),
         | 
| 307 | 
            +
                      'Cases' => %w(caseid productid accountid potentialid),
         | 
| 308 | 
            +
                      'Solutions' => %w(solutionid productid),
         | 
| 309 | 
            +
                      'Products' => %w(productid vendorid productname),
         | 
| 310 | 
            +
                      'Purchase Order' => %w(purchaseorderid contactid vendorid),
         | 
| 311 | 
            +
                      'Quotes' => %w(quoteid potentialid accountid contactid),
         | 
| 312 | 
            +
                      'Sales Orders' => %w(salesorderid potentialid accountid contactid quoteid),
         | 
| 313 | 
            +
                      'Invoices' => %w(invoiceid accountid salesorderid contactid),
         | 
| 314 | 
            +
                      'Vendors' => %w(vendorid vendorname),
         | 
| 315 | 
            +
                      'Tasks' => %w(taskid),
         | 
| 316 | 
            +
                      'Events' => %w(eventid),
         | 
| 317 | 
            +
                      'Notes' => %w(notesid)
         | 
| 318 | 
            +
                  }
         | 
| 319 | 
            +
                  valid_relationships[module_name].index(field.downcase)
         | 
| 320 | 
            +
                end
         | 
| 321 | 
            +
             | 
| 319 322 | 
             
              end
         | 
| 320 323 |  | 
| 321 324 | 
             
            end
         | 
    
        data/rubyzoho-0.1.6.gem
    ADDED
    
    | Binary file | 
    
        data/rubyzoho.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = "rubyzoho"
         | 
| 8 | 
            -
              s.version = "0.1. | 
| 8 | 
            +
              s.version = "0.1.7"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["amalc"]
         | 
| 12 | 
            -
              s.date = "2013-02- | 
| 12 | 
            +
              s.date = "2013-02-24"
         | 
| 13 13 | 
             
              s.description = ""
         | 
| 14 14 | 
             
              s.email = ""
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -29,6 +29,7 @@ Gem::Specification.new do |s| | |
| 29 29 | 
             
                "lib/api_utils.rb",
         | 
| 30 30 | 
             
                "lib/ruby_zoho.rb",
         | 
| 31 31 | 
             
                "lib/zoho_api.rb",
         | 
| 32 | 
            +
                "rubyzoho-0.1.6.gem",
         | 
| 32 33 | 
             
                "rubyzoho.gemspec",
         | 
| 33 34 | 
             
                "spec/api_utils_spec.rb",
         | 
| 34 35 | 
             
                "spec/fixtures/sample.pdf",
         | 
| @@ -56,6 +57,7 @@ Gem::Specification.new do |s| | |
| 56 57 | 
             
                  s.add_runtime_dependency(%q<multipart-post>, [">= 0"])
         | 
| 57 58 | 
             
                  s.add_development_dependency(%q<bundler>, [">= 1.2"])
         | 
| 58 59 | 
             
                  s.add_development_dependency(%q<cucumber>, [">= 1.2.1"])
         | 
| 60 | 
            +
                  s.add_development_dependency(%q<holepicker>, [">= 0"])
         | 
| 59 61 | 
             
                  s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
         | 
| 60 62 | 
             
                  s.add_development_dependency(%q<relish>, [">= 0.6"])
         | 
| 61 63 | 
             
                  s.add_development_dependency(%q<rdoc>, [">= 3.12.1"])
         | 
| @@ -67,6 +69,7 @@ Gem::Specification.new do |s| | |
| 67 69 | 
             
                  s.add_dependency(%q<multipart-post>, [">= 0"])
         | 
| 68 70 | 
             
                  s.add_dependency(%q<bundler>, [">= 1.2"])
         | 
| 69 71 | 
             
                  s.add_dependency(%q<cucumber>, [">= 1.2.1"])
         | 
| 72 | 
            +
                  s.add_dependency(%q<holepicker>, [">= 0"])
         | 
| 70 73 | 
             
                  s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
         | 
| 71 74 | 
             
                  s.add_dependency(%q<relish>, [">= 0.6"])
         | 
| 72 75 | 
             
                  s.add_dependency(%q<rdoc>, [">= 3.12.1"])
         | 
| @@ -79,6 +82,7 @@ Gem::Specification.new do |s| | |
| 79 82 | 
             
                s.add_dependency(%q<multipart-post>, [">= 0"])
         | 
| 80 83 | 
             
                s.add_dependency(%q<bundler>, [">= 1.2"])
         | 
| 81 84 | 
             
                s.add_dependency(%q<cucumber>, [">= 1.2.1"])
         | 
| 85 | 
            +
                s.add_dependency(%q<holepicker>, [">= 0"])
         | 
| 82 86 | 
             
                s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
         | 
| 83 87 | 
             
                s.add_dependency(%q<relish>, [">= 0.6"])
         | 
| 84 88 | 
             
                s.add_dependency(%q<rdoc>, [">= 3.12.1"])
         | 
    
        data/spec/ruby_zoho_spec.rb
    CHANGED
    
    | @@ -7,13 +7,9 @@ describe RubyZoho::Crm do | |
| 7 7 |  | 
| 8 8 | 
             
              before(:all) do
         | 
| 9 9 | 
             
                base_path = File.join(File.dirname(__FILE__), 'fixtures')
         | 
| 10 | 
            -
                config_file = File.join(base_path, 'zoho_api_configuration.yaml')
         | 
| 11 10 | 
             
                @sample_pdf = File.join(base_path, 'sample.pdf')
         | 
| 12 | 
            -
                #params = YAML.load(File.open(config_file))
         | 
| 13 11 | 
             
                RubyZoho.configure do |config|
         | 
| 14 | 
            -
                   | 
| 15 | 
            -
                  #config.api_key = 'e194b2951fb238e26bc096de9d0cf5f8'
         | 
| 16 | 
            -
                  config.api_key = '62cedfe9427caef8afb9ea3b5bf68154'
         | 
| 12 | 
            +
                  config.api_key =  ENV['ZOHO_API_KEY'].strip
         | 
| 17 13 | 
             
                  config.crm_modules = %w(Quotes)
         | 
| 18 14 | 
             
                  config.cache_fields = true
         | 
| 19 15 | 
             
                end
         | 
| @@ -29,11 +25,12 @@ describe RubyZoho::Crm do | |
| 29 25 | 
             
                c.first_name.should eq('Raj')
         | 
| 30 26 | 
             
                c.email = 'raj@portra.com'
         | 
| 31 27 | 
             
                c.email.should eq('raj@portra.com')
         | 
| 28 | 
            +
                c.module_name.should eq('Contacts')
         | 
| 32 29 | 
             
              end
         | 
| 33 30 |  | 
| 34 31 | 
             
              it 'should attach a file to an account' do
         | 
| 35 32 | 
             
                r = RubyZoho::Crm::Account.all.first
         | 
| 36 | 
            -
                r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
         | 
| 33 | 
            +
                r.attach_file(@sample_pdf, '1_' + File.basename(@sample_pdf)).should eq('200')
         | 
| 37 34 | 
             
              end
         | 
| 38 35 |  | 
| 39 36 | 
             
              it 'should attach a file to a contact' do
         | 
| @@ -56,9 +53,31 @@ describe RubyZoho::Crm do | |
| 56 53 | 
             
                r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
         | 
| 57 54 | 
             
              end
         | 
| 58 55 |  | 
| 56 | 
            +
              it 'should concatenate a related object and save it' do
         | 
| 57 | 
            +
                subject = "[DELETE THIS] New subject as of #{Time.now}"
         | 
| 58 | 
            +
                a = RubyZoho::Crm::Account.all.last
         | 
| 59 | 
            +
                a << RubyZoho::Crm::Task.new(
         | 
| 60 | 
            +
                    :subject => subject,
         | 
| 61 | 
            +
                    :description => 'Nothing',
         | 
| 62 | 
            +
                    :status => 'Not Started',
         | 
| 63 | 
            +
                    :priority => 'High',
         | 
| 64 | 
            +
                    :send_notification_email => 'False',
         | 
| 65 | 
            +
                    :due_date => '2014-02-16 16:00:00',
         | 
| 66 | 
            +
                    :start_datetime => Time.now.to_s[1,19],
         | 
| 67 | 
            +
                    :end_datetime => '2014-02-16 16:00:00'
         | 
| 68 | 
            +
                )
         | 
| 69 | 
            +
                r = RubyZoho::Crm::Task.find_by_subject(subject)
         | 
| 70 | 
            +
                r.first.relatedtoid.should eq(a.accountid)
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              it 'should determine if a method is a module' do
         | 
| 74 | 
            +
                good_methods = [:contact, :contacts, 'contacts', 'lead', 'leads', :potentials, :quotes]
         | 
| 75 | 
            +
                good_methods.map { |m| RubyZoho::Crm.method_is_module?(m).should_not eq(nil) }
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 59 78 | 
             
              it 'should find a contact by email or last name' do
         | 
| 60 79 | 
             
                r = RubyZoho::Crm::Contact.find_by_email('bob@smith.com')
         | 
| 61 | 
            -
                r.each { |m| RubyZoho::Crm::Contact.delete(m. | 
| 80 | 
            +
                r.each { |m| RubyZoho::Crm::Contact.delete(m.id) } unless r.nil?
         | 
| 62 81 | 
             
                1.upto(3) do
         | 
| 63 82 | 
             
                  c = RubyZoho::Crm::Contact.new(
         | 
| 64 83 | 
             
                    :first_name => 'Bob',
         | 
| @@ -74,21 +93,21 @@ describe RubyZoho::Crm do | |
| 74 93 | 
             
                r.should_not eq(nil)
         | 
| 75 94 | 
             
                r.map { |c| c.last_name }.count.should eq(3)
         | 
| 76 95 | 
             
                r.first.last_name.should eq('Smithereens')
         | 
| 77 | 
            -
                r.each { |m| RubyZoho::Crm::Contact.delete(m. | 
| 96 | 
            +
                r.each { |m| RubyZoho::Crm::Contact.delete(m.id) }
         | 
| 78 97 | 
             
              end
         | 
| 79 98 |  | 
| 80 99 | 
             
              it 'should find a contact by ID' do
         | 
| 81 100 | 
             
                contacts = RubyZoho::Crm::Contact.all
         | 
| 82 | 
            -
                 | 
| 83 | 
            -
                c = RubyZoho::Crm::Contact.find_by_contactid( | 
| 84 | 
            -
                c.first.contactid.should eq( | 
| 101 | 
            +
                id = contacts.first.id
         | 
| 102 | 
            +
                c = RubyZoho::Crm::Contact.find_by_contactid(id)
         | 
| 103 | 
            +
                c.first.contactid.should eq(id)
         | 
| 85 104 | 
             
                c.first.last_name.should eq(contacts.first.last_name)
         | 
| 86 105 | 
             
                c.first.email.should eq(contacts.first.email)
         | 
| 87 106 | 
             
              end
         | 
| 88 107 |  | 
| 89 108 | 
             
              it 'should find a lead by ID' do
         | 
| 90 109 | 
             
                leads = RubyZoho::Crm::Lead.all
         | 
| 91 | 
            -
                lead_id = leads.first. | 
| 110 | 
            +
                lead_id = leads.first.id
         | 
| 92 111 | 
             
                l = RubyZoho::Crm::Lead.find_by_leadid(lead_id)
         | 
| 93 112 | 
             
                l.first.leadid.should eq(lead_id)
         | 
| 94 113 | 
             
              end
         | 
| @@ -136,42 +155,50 @@ describe RubyZoho::Crm do | |
| 136 155 | 
             
              end
         | 
| 137 156 |  | 
| 138 157 | 
             
              it 'should get a list of calls' do
         | 
| 139 | 
            -
                pending
         | 
| 158 | 
            +
                #pending
         | 
| 140 159 | 
             
                r = RubyZoho::Crm::Call.all
         | 
| 141 | 
            -
                 | 
| 142 | 
            -
             | 
| 160 | 
            +
                unless r.nil?
         | 
| 161 | 
            +
                  #r.count.should be > 1
         | 
| 162 | 
            +
                  r.map { |e| e.class.should eq(RubyZoho::Crm::Call) }
         | 
| 163 | 
            +
                  r.map { |e| e.id.should eq(e.activityid)}
         | 
| 164 | 
            +
                end
         | 
| 143 165 | 
             
              end
         | 
| 144 166 |  | 
| 145 167 | 
             
              it 'should get a list of contacts' do
         | 
| 146 168 | 
             
                r = RubyZoho::Crm::Contact.all
         | 
| 147 169 | 
             
                r.count.should be > 1
         | 
| 148 | 
            -
                r.map { | | 
| 170 | 
            +
                r.map { |e| e.class.should eq(RubyZoho::Crm::Contact) }
         | 
| 171 | 
            +
                r.map { |e| e.id.should eq(e.contactid)}
         | 
| 149 172 | 
             
              end
         | 
| 150 173 |  | 
| 151 174 | 
             
              it 'should get a list of events' do
         | 
| 152 175 | 
             
                r = RubyZoho::Crm::Event.all
         | 
| 153 176 | 
             
                r.map { |r| r.class.should eq(RubyZoho::Crm::Event) } unless r.nil?
         | 
| 177 | 
            +
                r.map { |e| e.id.should eq(e.eventid)}
         | 
| 154 178 | 
             
              end
         | 
| 155 179 |  | 
| 156 180 | 
             
              it 'should get a list of potentials' do
         | 
| 157 181 | 
             
                r = RubyZoho::Crm::Potential.all
         | 
| 158 182 | 
             
                r.count.should be > 1
         | 
| 159 183 | 
             
                r.map { |r| r.class.should eq(RubyZoho::Crm::Potential) }
         | 
| 184 | 
            +
                r.map { |e| e.id.should eq(e.potentialid)}
         | 
| 160 185 | 
             
              end
         | 
| 161 186 |  | 
| 162 187 | 
             
              it 'should get a list of quotes' do
         | 
| 163 188 | 
             
                r = RubyZoho::Crm::Quote.all
         | 
| 164 189 | 
             
                r.count.should be >= 1
         | 
| 165 190 | 
             
                r.map { |r| r.class.should eq(RubyZoho::Crm::Quote) }
         | 
| 191 | 
            +
                r.map { |e| e.id.should eq(e.quoteid)}
         | 
| 166 192 | 
             
              end
         | 
| 167 193 |  | 
| 168 194 | 
             
              it 'should get a list of tasks' do
         | 
| 169 195 | 
             
                r = RubyZoho::Crm::Task.all
         | 
| 170 196 | 
             
                r.map { |r| r.class.should eq(RubyZoho::Crm::Task) } unless r.nil?
         | 
| 197 | 
            +
                r.map { |e| e.id.should eq(e.activityid)}
         | 
| 171 198 | 
             
              end
         | 
| 172 199 |  | 
| 173 200 | 
             
              it 'should get a list of users' do
         | 
| 174 | 
            -
                r = RubyZoho::Crm::User.all
         | 
| 201 | 
            +
                pp r = RubyZoho::Crm::User.all
         | 
| 175 202 | 
             
                r.count.should be >= 1
         | 
| 176 203 | 
             
              end
         | 
| 177 204 |  | 
| @@ -195,7 +222,7 @@ describe RubyZoho::Crm do | |
| 195 222 | 
             
                r = RubyZoho::Crm::Lead.find_by_email('raj@portra.com')
         | 
| 196 223 | 
             
                r.should_not eq(nil)
         | 
| 197 224 | 
             
                r.first.email.should eq(l.email)
         | 
| 198 | 
            -
                r.each { |c|  RubyZoho::Crm::Lead.delete(c. | 
| 225 | 
            +
                r.each { |c|  RubyZoho::Crm::Lead.delete(c.id) }
         | 
| 199 226 | 
             
              end
         | 
| 200 227 |  | 
| 201 228 | 
             
              it 'should save and retrieve an account record with a custom field' do
         | 
| @@ -203,10 +230,10 @@ describe RubyZoho::Crm do | |
| 203 230 | 
             
                a = accounts.first
         | 
| 204 231 | 
             
                if defined?(a.par_ltd)
         | 
| 205 232 | 
             
                  RubyZoho::Crm::Lead.update(
         | 
| 206 | 
            -
                      :id => a. | 
| 233 | 
            +
                      :id => a.id,
         | 
| 207 234 | 
             
                      :test_custom => '$1,000,000'
         | 
| 208 235 | 
             
                  )
         | 
| 209 | 
            -
                  a2 = RubyZoho::Crm::Account. | 
| 236 | 
            +
                  a2 = RubyZoho::Crm::Account.find(a.accountid)
         | 
| 210 237 | 
             
                  a2.first.test_custom.should eq('$1,000,000')
         | 
| 211 238 | 
             
                end
         | 
| 212 239 | 
             
              end
         | 
| @@ -226,7 +253,7 @@ describe RubyZoho::Crm do | |
| 226 253 | 
             
                p.save
         | 
| 227 254 | 
             
                r = RubyZoho::Crm::Potential.find_by_potential_name(p.potential_name)
         | 
| 228 255 | 
             
                r.first.potential_name.should eq(h[:potential_name])
         | 
| 229 | 
            -
                potential = RubyZoho::Crm::Potential. | 
| 256 | 
            +
                potential = RubyZoho::Crm::Potential.find(r.first.potentialid)
         | 
| 230 257 | 
             
                potential.first.potentialid.should eq(r.first.potentialid)
         | 
| 231 258 | 
             
                p_by_account_id = RubyZoho::Crm::Potential.find_by_accountid(accounts.first.accountid)
         | 
| 232 259 | 
             
                p_found = p_by_account_id.map { |pn| pn if pn.potential_name == h[:potential_name]}.compact
         | 
| @@ -255,16 +282,11 @@ describe RubyZoho::Crm do | |
| 255 282 | 
             
              end
         | 
| 256 283 |  | 
| 257 284 | 
             
              it 'should save an task record related to an account' do
         | 
| 258 | 
            -
                pending
         | 
| 259 285 | 
             
                a = RubyZoho::Crm::Account.all.first
         | 
| 260 | 
            -
                 | 
| 261 | 
            -
                #c = RubyZoho::Crm::Contact.all.last
         | 
| 262 | 
            -
                #pp tasks = RubyZoho::Crm::Task.all
         | 
| 263 | 
            -
                #throw :stop
         | 
| 264 | 
            -
                e = RubyZoho::Crm::Tassk.new(
         | 
| 286 | 
            +
                e = RubyZoho::Crm::Task.new(
         | 
| 265 287 | 
             
                    :task_owner =>  a.account_owner,
         | 
| 266 288 | 
             
                    :subject => "Task should be related to #{a.account_name} #{Time.now}",
         | 
| 267 | 
            -
                     | 
| 289 | 
            +
                    :description => 'Nothing',
         | 
| 268 290 | 
             
                    :smownerid => "#{a.smownerid}",
         | 
| 269 291 | 
             
                    :status => 'Not Started',
         | 
| 270 292 | 
             
                    :priority => 'High',
         | 
| @@ -273,19 +295,20 @@ describe RubyZoho::Crm do | |
| 273 295 | 
             
                    :start_datetime => Time.now.to_s[1,19],
         | 
| 274 296 | 
             
                    :end_datetime => '2014-02-16 16:00:00',
         | 
| 275 297 | 
             
                    :related_to => "#{a.account_name}",
         | 
| 276 | 
            -
                    : | 
| 298 | 
            +
                    :seid => "#{a.accountid}",
         | 
| 277 299 | 
             
                    :semodule => "Accounts"
         | 
| 278 | 
            -
                    #:contact_name => "#{c.first_name} #{c.last_name}",
         | 
| 279 | 
            -
                    #:contactid => c.contactid
         | 
| 280 300 | 
             
                )
         | 
| 281 | 
            -
                 | 
| 301 | 
            +
                r_expected  = e.save
         | 
| 302 | 
            +
                r = RubyZoho::Crm::Task.find_by_activityid(r_expected.id)
         | 
| 303 | 
            +
                r.first.subject.should eq(r_expected.subject)
         | 
| 282 304 | 
             
              end
         | 
| 283 305 |  | 
| 284 306 | 
             
              it 'should get tasks by user' do
         | 
| 285 | 
            -
                 | 
| 286 | 
            -
                 | 
| 287 | 
            -
                 | 
| 288 | 
            -
                 | 
| 307 | 
            +
                pending
         | 
| 308 | 
            +
                pp u = RubyZoho::Crm::User.all.first
         | 
| 309 | 
            +
                pp tasks = RubyZoho::Crm::Task.find_by_smownerid(u.id)
         | 
| 310 | 
            +
                pp tasks = RubyZoho::Crm::Task.all
         | 
| 311 | 
            +
                tasks.map { |t| RubyZoho::Crm::Task.delete(t.activityid)} unless tasks.nil?
         | 
| 289 312 | 
             
              end
         | 
| 290 313 |  | 
| 291 314 | 
             
              it 'should sort contact records' do
         | 
| @@ -295,6 +318,8 @@ describe RubyZoho::Crm do | |
| 295 318 | 
             
              end
         | 
| 296 319 |  | 
| 297 320 | 
             
              it 'should update a lead record' do
         | 
| 321 | 
            +
                r_changed = RubyZoho::Crm::Lead.find_by_email('changed_raj@portra.com')
         | 
| 322 | 
            +
                r_changed.each { |c|  RubyZoho::Crm::Lead.delete(c.leadid) } unless r_changed.nil?
         | 
| 298 323 | 
             
                l = RubyZoho::Crm::Lead.new(
         | 
| 299 324 | 
             
                  :first_name => 'Raj',
         | 
| 300 325 | 
             
                  :last_name => 'Portra',
         | 
| @@ -307,8 +332,8 @@ describe RubyZoho::Crm do | |
| 307 332 | 
             
                )
         | 
| 308 333 | 
             
                r_changed = RubyZoho::Crm::Lead.find_by_email('changed_raj@portra.com')
         | 
| 309 334 | 
             
                r.first.leadid.should eq(r_changed.first.leadid)
         | 
| 310 | 
            -
                r_changed.should_not eq(nil)
         | 
| 311 335 | 
             
                r.each { |c|  RubyZoho::Crm::Lead.delete(c.leadid) }
         | 
| 336 | 
            +
                r_changed.each { |c|  RubyZoho::Crm::Lead.delete(c.leadid) }
         | 
| 312 337 | 
             
              end
         | 
| 313 338 |  | 
| 314 339 | 
             
              it 'should validate a field name' do
         | 
    
        data/spec/zoho_api_spec.rb
    CHANGED
    
    | @@ -33,15 +33,9 @@ describe ZohoApi do | |
| 33 33 |  | 
| 34 34 | 
             
              before(:all) do
         | 
| 35 35 | 
             
                base_path = File.join(File.dirname(__FILE__), 'fixtures')
         | 
| 36 | 
            -
                config_file = File.join(base_path, 'zoho_api_configuration.yaml')
         | 
| 37 | 
            -
                #params = YAML.load(File.open(config_file))
         | 
| 38 | 
            -
                #@zoho = ZohoApi::Crm.new(params['auth_token'])
         | 
| 39 36 | 
             
                @sample_pdf = File.join(base_path, 'sample.pdf')
         | 
| 40 37 | 
             
                modules = ['Accounts', 'Contacts', 'Events', 'Leads', 'Tasks', 'Potentials']
         | 
| 41 | 
            -
                 | 
| 42 | 
            -
                api_key = 'e194b2951fb238e26bc096de9d0cf5f8'
         | 
| 43 | 
            -
                #api_key = '62cedfe9427caef8afb9ea3b5bf68154'
         | 
| 44 | 
            -
                @zoho = init_api(api_key, base_path, modules)
         | 
| 38 | 
            +
                @zoho = init_api(ENV['ZOHO_API_KEY'].strip, base_path, modules)
         | 
| 45 39 | 
             
                @h_smith = { :first_name => 'Robert',
         | 
| 46 40 | 
             
                      :last_name => 'Smith',
         | 
| 47 41 | 
             
                      :email => 'rsmith@smithereens.com',
         | 
| @@ -84,14 +78,14 @@ describe ZohoApi do | |
| 84 78 | 
             
              it 'should attach a file to a contact record' do
         | 
| 85 79 | 
             
                @zoho.add_record('Contacts', @h_smith)
         | 
| 86 80 | 
             
                contacts = @zoho.find_records('Contacts', :email, '=', @h_smith[:email])
         | 
| 87 | 
            -
                @zoho.attach_file('Contacts', contacts[0][:contactid], @sample_pdf)
         | 
| 81 | 
            +
                @zoho.attach_file('Contacts', contacts[0][:contactid], @sample_pdf, File.basename(@sample_pdf))
         | 
| 88 82 | 
             
                @zoho.delete_record('Contacts', contacts[0][:contactid])
         | 
| 89 83 | 
             
              end
         | 
| 90 84 |  | 
| 91 85 | 
             
              it 'should attach a file to a potential record' do
         | 
| 92 86 | 
             
                pending
         | 
| 93 87 | 
             
                potential = @zoho.first('Potentials').first
         | 
| 94 | 
            -
                @zoho.attach_file('Potentials', potential[:potentialid], @sample_pdf)
         | 
| 88 | 
            +
                @zoho.attach_file('Potentials', potential[:potentialid], @sample_pdf, File.basename(@sample_pdf))
         | 
| 95 89 | 
             
              end
         | 
| 96 90 |  | 
| 97 91 | 
             
              it 'should delete a contact record with id' do
         | 
| @@ -146,15 +140,15 @@ describe ZohoApi do | |
| 146 140 |  | 
| 147 141 | 
             
              it 'should get a list of fields for a module' do
         | 
| 148 142 | 
             
                r = @zoho.fields('Accounts')
         | 
| 149 | 
            -
                r.count.should >=  | 
| 143 | 
            +
                r.count.should >= 10
         | 
| 150 144 | 
             
                r = @zoho.fields('Contacts')
         | 
| 151 | 
            -
                r.count.should be >=  | 
| 145 | 
            +
                r.count.should be >= 10
         | 
| 152 146 | 
             
                r = @zoho.fields('Events')
         | 
| 153 147 | 
             
                r.count.should >= 10
         | 
| 154 148 | 
             
                r = @zoho.fields('Leads')
         | 
| 155 | 
            -
                r.count.should be >=  | 
| 149 | 
            +
                r.count.should be >= 10
         | 
| 156 150 | 
             
                r = @zoho.fields('Potentials')
         | 
| 157 | 
            -
                r.count.should be >=  | 
| 151 | 
            +
                r.count.should be >= 10
         | 
| 158 152 | 
             
                r = @zoho.fields('Tasks')
         | 
| 159 153 | 
             
                r.count.should >= 10
         | 
| 160 154 | 
             
                r = @zoho.fields('Users')
         | 
    
        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. | 
| 4 | 
            +
              version: 0.1.7
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-02- | 
| 12 | 
            +
            date: 2013-02-24 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: httmultiparty
         | 
| @@ -91,6 +91,22 @@ dependencies: | |
| 91 91 | 
             
                - - ! '>='
         | 
| 92 92 | 
             
                  - !ruby/object:Gem::Version
         | 
| 93 93 | 
             
                    version: 1.2.1
         | 
| 94 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 95 | 
            +
              name: holepicker
         | 
| 96 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 97 | 
            +
                none: false
         | 
| 98 | 
            +
                requirements:
         | 
| 99 | 
            +
                - - ! '>='
         | 
| 100 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 101 | 
            +
                    version: '0'
         | 
| 102 | 
            +
              type: :development
         | 
| 103 | 
            +
              prerelease: false
         | 
| 104 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 105 | 
            +
                none: false
         | 
| 106 | 
            +
                requirements:
         | 
| 107 | 
            +
                - - ! '>='
         | 
| 108 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            +
                    version: '0'
         | 
| 94 110 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 95 111 | 
             
              name: jeweler
         | 
| 96 112 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -191,6 +207,7 @@ files: | |
| 191 207 | 
             
            - lib/api_utils.rb
         | 
| 192 208 | 
             
            - lib/ruby_zoho.rb
         | 
| 193 209 | 
             
            - lib/zoho_api.rb
         | 
| 210 | 
            +
            - rubyzoho-0.1.6.gem
         | 
| 194 211 | 
             
            - rubyzoho.gemspec
         | 
| 195 212 | 
             
            - spec/api_utils_spec.rb
         | 
| 196 213 | 
             
            - spec/fixtures/sample.pdf
         |