activeresource-zoho_invoice 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 72865f48ba14d0f22ca9d2529348420570c76992
4
+ data.tar.gz: 86a96cb3dadcfebf85268b6c5f59b347870d294f
5
+ SHA512:
6
+ metadata.gz: 03b5ec9c02777457ece64c4bcf9cff9326545d21e3d17b5ad2ba193c1de7e8791d3677564280d054072ea4c90456acc1ff9d472610aa6da852706a89d76f1416
7
+ data.tar.gz: 0a55ed78d609db43b07b9a423bb76a8855e41da52ddeedcf03a481e1d09cd9e58b8114c96f7b5a8d04a8b7536d1ec02c90990dc2fb5031e42b3c8628b50a7138
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in activeresource-zoho_invoice.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Toru KAWAMURA
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # ActiveResource Zoho Invoice
2
+
3
+ Zoho Invoice API accessor with ActiveResource
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'activeresource-zoho_invoice'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install activeresource-zoho_invoice
18
+
19
+ ## Usage
20
+
21
+ class Invoice < ZohoInvoiceResource::Invoice
22
+ self.auth_params = {
23
+ apikey: 'apikeyishere',
24
+ authtoken: 'authtokenishere',
25
+ scope: 'invoiceapi'
26
+ }
27
+ end
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'zoho_invoice_resource/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'activeresource-zoho_invoice'
8
+ spec.version = ZohoInvoiceResource::VERSION
9
+ spec.authors = ['Toru KAWAMURA']
10
+ spec.email = ['tkawa@4bit.net']
11
+ spec.description = %q{Zoho Invoice API accessor with ActiveResource}
12
+ spec.summary = %q{Zoho Invoice API accessor with ActiveResource}
13
+ spec.homepage = 'https://github.com/tkawa/activeresource-zoho_invoice'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'activeresource', '>= 4.0.0'
22
+ spec.add_dependency 'activerecord'
23
+ spec.add_dependency 'activesupport'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.3'
26
+ spec.add_development_dependency 'rake'
27
+ end
@@ -0,0 +1 @@
1
+ require 'zoho_invoice_resource'
@@ -0,0 +1,19 @@
1
+ require 'zoho_invoice_resource/version'
2
+ require 'active_support'
3
+ require 'active_resource'
4
+
5
+ module ZohoInvoiceResource
6
+ extend ActiveSupport::Autoload
7
+
8
+ autoload :Base
9
+ autoload :Invoice
10
+ autoload :Customer
11
+
12
+ autoload :Collection
13
+ autoload :Connection
14
+ autoload :Formats
15
+ autoload :UnderscoreKeys
16
+ autoload :Util
17
+
18
+ autoload :CachedResource
19
+ end
@@ -0,0 +1,85 @@
1
+ require 'active_record/attribute_assignment'
2
+
3
+ module ZohoInvoiceResource
4
+ class Base < ActiveResource::Base
5
+ include UnderscoreKeys
6
+ include ActiveRecord::AttributeAssignment
7
+
8
+ self.site = 'https://invoice.zoho.com/api/'
9
+ self.include_format_in_path = false
10
+ self.collection_parser = Collection
11
+ class_attribute :auth_params
12
+
13
+ class << self
14
+ def element_path(id, prefix_options = {}, query_options = {})
15
+ query_options.merge!(auth_params)
16
+ super(id, prefix_options, query_options)
17
+ end
18
+
19
+ def collection_path(prefix_options = {}, query_options = {})
20
+ query_options.merge!(auth_params)
21
+ super(prefix_options, query_options)
22
+ end
23
+
24
+ def find_all_recursively(options = {})
25
+ collection = find(:all, options.merge(params: {'Per_Page' => 500}))
26
+ while collection.page && (collection.page < collection.total_pages)
27
+ next_collection = find(:all, params: {'Page' => collection.page + 1, 'Per_Page' => 500})
28
+ collection.merge!(next_collection)
29
+ end
30
+ collection
31
+ rescue ActiveResource::ResourceNotFound
32
+ nil
33
+ end
34
+
35
+ def format
36
+ self._format ||= Formats::Base.new(self.to_s.demodulize)
37
+ end
38
+
39
+ # For CachedResource
40
+ def cached_resource(options={})
41
+ if defined?(CachedResource::Model) && self.include?(CachedResource::Model)
42
+ super.tap do
43
+ include CachedResourcePatch
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def update
50
+ run_callbacks :update do
51
+ connection.post(self.class.custom_method_collection_url(:update, prefix_options), encode, self.class.headers).tap do |response|
52
+ load_attributes_from_response(response)
53
+ end
54
+ end
55
+ end
56
+
57
+ def update_element_path(options = nil)
58
+ self.class.element_path(to_param, options || prefix_options)
59
+ end
60
+
61
+ def encode(options={})
62
+ xml = self.class.format.encode(self, {:root => self.class.element_name}.merge(options))
63
+ URI.encode_www_form(self.class.auth_params.merge('XMLString' => xml))
64
+ end
65
+
66
+ def create_resource_for(resource_name)
67
+ super.tap do |resource|
68
+ resource.send(:include, UnderscoreKeys)
69
+ resource.send(:include, ActiveRecord::AttributeAssignment)
70
+ end
71
+ end
72
+
73
+ def self.connection(refresh = false)
74
+ @connection = Connection.new(site, format) if refresh || @connection.nil?
75
+ @connection.tap do |c|
76
+ c.proxy = proxy if proxy
77
+ c.user = user if user
78
+ c.password = password if password
79
+ c.auth_type = auth_type if auth_type
80
+ c.timeout = timeout if timeout
81
+ c.ssl_options = ssl_options if ssl_options
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,21 @@
1
+ module ZohoInvoiceResource
2
+ module CachedResourcePatch
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ # override
7
+ def cache_read(key)
8
+ object = cached_resource.cache.read(key)
9
+ # dupしないといけないのかも
10
+ object && cached_resource.logger.info("#{CachedResource::Configuration::LOGGER_PREFIX} READ #{key}")
11
+ object
12
+ end
13
+ end
14
+
15
+ def expire_cache
16
+ # TODO: 本当は個別に削除したい
17
+ # self.send(:update_singles_cache, self) して collectionのを削除するとか。
18
+ self.class.clear_cache
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ module ZohoInvoiceResource
2
+ class Collection < ActiveResource::Collection
3
+ attr_reader :page, :pages, :per_page, :total, :total_pages
4
+ def initialize(hash)
5
+ @element_hash = hash
6
+ if hash['PageContext']
7
+ @page = hash['PageContext']['Page'].to_i
8
+ @pages = [@page]
9
+ @per_page = hash['PageContext']['Per_Page'].to_i
10
+ @total = hash['PageContext']['Total'].to_i
11
+ @total_pages = hash['PageContext']['Total_Pages'].to_i
12
+ end
13
+ end
14
+
15
+ def elements
16
+ @elements ||= begin
17
+ name = resource_class.name
18
+ @element_hash[name.pluralize][name]
19
+ end
20
+ end
21
+
22
+ def collect!
23
+ elements # prepare @elements
24
+ super
25
+ end
26
+
27
+ def merge!(another)
28
+ another.each do |element|
29
+ elements << element
30
+ end
31
+ @pages = [@page, another.page].flatten
32
+ @page = another.page
33
+ @per_page = another.per_page
34
+ @total = another.total
35
+ @total_pages = another.total_pages
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ module ZohoInvoiceResource
2
+ class Connection < ActiveResource::Connection
3
+ DEBUG = true
4
+ def http
5
+ configure_http(new_http).tap do |h|
6
+ h.set_debug_output($stderr) if DEBUG
7
+ end
8
+ end
9
+
10
+ def http_format_header(http_method)
11
+ {HTTP_FORMAT_HEADER_NAMES[http_method] => format.mime_type(http_method)}
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module ZohoInvoiceResource
2
+ class Customer < Base
3
+ self.primary_key = 'customer_id'
4
+
5
+ def self.format
6
+ self._format ||= Formats::Customer.new
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module ZohoInvoiceResource
2
+ module Formats
3
+ autoload :Base, 'zoho_invoice_resource/formats/base'
4
+ autoload :Invoice, 'zoho_invoice_resource/formats/invoice'
5
+ autoload :Customer, 'zoho_invoice_resource/formats/customer'
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ require 'ostruct'
2
+
3
+ module ZohoInvoiceResource
4
+ module Formats
5
+ class Base
6
+ include ActiveResource::Formats::XmlFormat
7
+
8
+ attr_reader :element_name
9
+ def initialize(element_name = nil)
10
+ @element_name = element_name || self.class.to_s.demodulize
11
+ end
12
+
13
+ def mime_type(http_method = :get)
14
+ if http_method == :post
15
+ 'application/x-www-form-urlencoded'
16
+ else
17
+ 'application/xml'
18
+ end
19
+ end
20
+
21
+ def decode(xml)
22
+ hash = ActiveResource::Formats.remove_root(Hash.from_xml(xml))
23
+ if hash['status'] == '1'
24
+ # success
25
+ # single record or collection
26
+ hash[element_name] || hash
27
+ else
28
+ # failure
29
+ api_response = OpenStruct.new(Util.underscore_keys(hash))
30
+ case api_response.code.to_i
31
+ when 1002
32
+ raise ActiveResource::ResourceNotFound.new(api_response)
33
+ else
34
+ raise ActiveResource::BadRequest.new(api_response)
35
+ end
36
+ end
37
+ end
38
+
39
+ def normalize_date(date)
40
+ if date.match %r|\d{4}/\d{2}/\d{2}|
41
+ date.tr('/', '-')
42
+ else
43
+ date
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,34 @@
1
+ module ZohoInvoiceResource
2
+ module Formats
3
+ class Customer < Base
4
+ def encode(record, options={})
5
+ options[:root] = options[:root].try(:camelize)
6
+ # updatable attributes restricted
7
+ data = {
8
+ 'CustomerID' => record.customer_id,
9
+ 'Name' => record.name,
10
+ 'PaymentsDue' => record.payments_due,
11
+ 'BillingAddress' => record.billing_address,
12
+ 'BillingCity' => record.billing_city,
13
+ 'BillingState' => record.billing_state,
14
+ 'BillingZip' => record.billing_zip,
15
+ 'BillingCountry' => record.billing_country,
16
+ 'Notes' => record.notes,
17
+ #'CustomFields' => {}
18
+ }
19
+ data.to_xml(options).tapp
20
+ end
21
+
22
+ def decode(xml)
23
+ super.tap do |hash|
24
+ # avoid weird XML structure
25
+ %w(BillingAddress ShippingAddress).each do |attr_name|
26
+ if hash[attr_name].is_a?(Array)
27
+ hash[attr_name] = hash[attr_name].find{|value| value.is_a?(String)}
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ module ZohoInvoiceResource
2
+ module Formats
3
+ class Invoice < Base
4
+ def encode(record, options={})
5
+ options[:root] = options[:root].try(:camelize)
6
+ # updatable attributes restricted
7
+ data = {
8
+ 'InvoiceID' => record.invoice_id,
9
+ 'InvoiceDate' => normalize_date(record.invoice_date),
10
+ 'DueDate' => normalize_date(record.due_date),
11
+ 'InvoiceItems' => [],
12
+ 'CustomFields' => {}
13
+ }
14
+ record.invoice_items.each do |invoice_item|
15
+ item = {
16
+ 'ItemID' => invoice_item.item_id,
17
+ 'ItemDescription' => invoice_item.item_description,
18
+ 'Price' => invoice_item.price
19
+ }
20
+ data['InvoiceItems'] << item
21
+ end
22
+ data.delete('InvoiceItems') if data['InvoiceItems'].empty?
23
+ data['CustomFields']['CustomField1'] = record.custom_fields.custom_field1 if record.custom_fields.custom_label1
24
+ data['CustomFields']['CustomField2'] = record.custom_fields.custom_field2 if record.custom_fields.custom_label2
25
+ data['CustomFields']['CustomField3'] = record.custom_fields.custom_field3 if record.custom_fields.custom_label3
26
+ data.delete('CustomFields') if data['CustomFields'].empty?
27
+ data.to_xml(options)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module ZohoInvoiceResource
2
+ class Invoice < Base
3
+ self.primary_key = 'invoice_id'
4
+
5
+ #schema do
6
+ # integer :invoice_id
7
+ #
8
+ #end
9
+
10
+ def self.format
11
+ self._format ||= Formats::Invoice.new
12
+ end
13
+
14
+ def invoice_items_attributes=(attributes_collection)
15
+ attributes_collection.each do |attributes|
16
+ attributes = attributes.with_indifferent_access
17
+ if existing_item = self.invoice_items.find{|item| item.item_id == attributes[:item_id]}
18
+ existing_item.assign_attributes(attributes)
19
+ else
20
+ # TODO: raise error
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ module ZohoInvoiceResource
2
+ module UnderscoreKeys
3
+ def load(attributes, remove_root = false, persisted = false)
4
+ raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
5
+ attributes = Util.underscore_keys(attributes)
6
+ @prefix_options, attributes = split_options(attributes)
7
+
8
+ if attributes.keys.size == 1
9
+ remove_root = self.class.element_name == attributes.keys.first.to_s
10
+ end
11
+
12
+ attributes = ActiveResource::Formats.remove_root(attributes) if remove_root
13
+
14
+ attributes.each do |key, value|
15
+ @attributes[key.to_s] =
16
+ if value.is_a?(Array) ||
17
+ (value.is_a?(Hash) && value.keys.size == 1 && value = value.values.flatten)
18
+ resource = nil
19
+ value.map do |attrs|
20
+ if attrs.is_a?(Hash)
21
+ resource ||= find_or_create_resource_for_collection(key)
22
+ resource.new(attrs, persisted)
23
+ else
24
+ attrs.duplicable? ? attrs.dup : attrs
25
+ end
26
+ end
27
+ elsif value.is_a?(Hash)
28
+ resource = find_or_create_resource_for(key)
29
+ resource.new(value, persisted)
30
+ else
31
+ value.duplicable? ? value.dup : value
32
+ end
33
+ end
34
+ self
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ module ZohoInvoiceResource
2
+ module Util
3
+ extend self
4
+
5
+ def underscore_keys(hash)
6
+ hash = hash.dup
7
+ hash.keys.each do |key|
8
+ hash[(key.to_s.underscore rescue key) || key] = hash.delete(key)
9
+ end
10
+ hash
11
+ end
12
+
13
+ def camelize_keys(hash)
14
+ hash = hash.dup
15
+ hash.keys.each do |key|
16
+ hash[(key.to_s.camelize rescue key) || key] = hash.delete(key)
17
+ end
18
+ hash
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module ZohoInvoiceResource
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activeresource-zoho_invoice
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Toru KAWAMURA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activeresource
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Zoho Invoice API accessor with ActiveResource
84
+ email:
85
+ - tkawa@4bit.net
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - activeresource-zoho_invoice.gemspec
96
+ - lib/activeresource-zoho_invoice.rb
97
+ - lib/zoho_invoice_resource.rb
98
+ - lib/zoho_invoice_resource/base.rb
99
+ - lib/zoho_invoice_resource/cached_resource_patch.rb
100
+ - lib/zoho_invoice_resource/collection.rb
101
+ - lib/zoho_invoice_resource/connection.rb
102
+ - lib/zoho_invoice_resource/customer.rb
103
+ - lib/zoho_invoice_resource/formats.rb
104
+ - lib/zoho_invoice_resource/formats/base.rb
105
+ - lib/zoho_invoice_resource/formats/customer.rb
106
+ - lib/zoho_invoice_resource/formats/invoice.rb
107
+ - lib/zoho_invoice_resource/invoice.rb
108
+ - lib/zoho_invoice_resource/underscore_keys.rb
109
+ - lib/zoho_invoice_resource/util.rb
110
+ - lib/zoho_invoice_resource/version.rb
111
+ homepage: https://github.com/tkawa/activeresource-zoho_invoice
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.1.11
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Zoho Invoice API accessor with ActiveResource
135
+ test_files: []