myerp_api 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9dd46358ff3cf30aaf0eb053299d5da6f78e4bab
4
+ data.tar.gz: e58f9d539520680c9108bb75d5fbb641a44bd3f9
5
+ SHA512:
6
+ metadata.gz: 277265e93330eadb167b26df510b09027eb16f6fccf5b08a3ec0ac27108ccedb5aeb0c090448ba9ae0b536c6079c0b83092f4a13fcb6d806d32bae758d7e9f25
7
+ data.tar.gz: 1b44d4575174b1bcb699937832587eaf231b2a41c734fad3cf0173c894028be2dab8a6c29c0b4d3697404bbf333ed5b9ff4babd1aa2113f1453004b9a90e9489
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'httparty'
4
+ gem 'hashie', '~> 1'
5
+ gem 'json'
6
+
7
+ group :development, :test do
8
+ gem 'rspec', '~> 2'
9
+ gem 'jruby-openssl', :platform => [:jruby], :require => false
10
+ gem 'webmock'
11
+ gem 'vcr'
12
+ gem 'jeweler', :require => false
13
+ gem 'debugger'
14
+ gem 'factory_girl'
15
+ gem 'yard'
16
+ gem 'redcarpet'
17
+ end
data/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # myERP API
2
+
3
+
4
+ The myERP API gem allows Ruby developers to programmatically access the data of myERP accounts.
5
+
6
+ The API is implemented as JSON over HTTP using all four verbs (GET/POST/PUT/DELETE). Each resource, like Account, Item, or Order, has its own URL and is manipulated in isolation. In other words, we’ve tried to make the API follow the REST principles as much as possible.
7
+
8
+ For more information and detailed documentation about the API visit http://developers.myerp.com
9
+
10
+ ## Installation
11
+
12
+ To easily install or upgrade to the latest release, use [gem](http://rubygems.org/)
13
+
14
+ gem install myerp_api
15
+
16
+ ## Getting Started
17
+
18
+ The myERP API uses ActiveResource to communicate with the REST web service.
19
+
20
+ - 1 - Retrieve your API_KEY and your API_EMAIL from the API settings. More information [here](http://developers.myerp.com/docs/1.0/overview/security_authentication.html).
21
+
22
+ - 2 - Initiate the client by:
23
+
24
+ ```ruby
25
+ client = MyERP.client('API_EMAIL', 'API_KEY')
26
+ ```
27
+ - 3 - Now you're ready to make authorized API requests to your domain! Data is returned as hashes:
28
+
29
+ ```ruby
30
+ # Retrieve all customers and leads
31
+ puts client.customers.all
32
+
33
+ # Get a specific customer/lead
34
+ puts client.customers.find(261367)
35
+
36
+ # Create a customer
37
+ customer = MyERP::Customer.new
38
+ customer.type = 2 #individual
39
+ customer.status = 1 #customer
40
+ customer.first_name = "John"
41
+ customer.last_name = "Doe"
42
+ customer.email = "john.doe@mail.com"
43
+
44
+ customer = client.customers.save(customer)
45
+ puts "#{customer.full_name} created [id=#{customer.id}]"
46
+
47
+ # Update some fields
48
+ customer.first_name = "Jane"
49
+ customer = client.customers.save(customer)
50
+ puts "#{customer.full_name} updated [id=#{customer.id}]"
51
+
52
+ # Delete a customer
53
+ customer = client.customers.delete(customer)
54
+ puts "#{customer.full_name} deleted [id=#{customer.id}]"
55
+
56
+ # Bulk creation/modification
57
+ customers = client.customers.bulkSave([customer, customer2])
58
+ puts customers
59
+
60
+ # Bulk deletion
61
+ customers = client.customers.delete([customer, customer2])
62
+ puts customers
63
+ ```
64
+
65
+ ## Contributing
66
+
67
+ Thanks for considering contributing to this project.
68
+
69
+ ### Finding something to do
70
+
71
+ Ask, or pick an issue and comment on it announcing your desire to work on it. Ideally wait until we assign it to you to minimize work duplication.
72
+
73
+ ### Reporting an issue
74
+
75
+ - Search existing issues before raising a new one.
76
+
77
+ - Include as much detail as possible.
78
+
79
+ ### Pull requests
80
+
81
+ - Make it clear in the issue tracker what you are working on, so that someone else doesn't duplicate the work.
82
+
83
+ - Use a feature branch, not master.
84
+
85
+ - Rebase your feature branch onto origin/master before raising the PR.
86
+
87
+ - Keep up to date with changes in master so your PR is easy to merge.
88
+
89
+ - Be descriptive in your PR message: what is it for, why is it needed, etc.
90
+
91
+ - Make sure the tests pass
92
+
93
+ - Squash related commits as much as possible.
94
+
95
+ ### Coding style
96
+
97
+ - Try to match the existing indent style.
98
+
99
+ - Don't abuse the pre-processor.
100
+
101
+ - Don't mix platform-specific stuff into the main code.
102
+
103
+
104
+ ## License
105
+
106
+ The myERP API gem is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'rubygems'
4
+ require 'rake'
5
+ require "bundler/setup"
6
+
7
+ begin
8
+ require 'jeweler'
9
+ Jeweler::Tasks.new do |gem|
10
+ gem.name = "myerp_api"
11
+
12
+ gem.author = "Didier Baquier"
13
+ gem.email = %q{didier.baquier@myerp.com}
14
+ gem.homepage = %q{http://www.myerp.com}
15
+ gem.summary = %q{The myERP API gem is a lightweight gem for accessing the myERP REST web services}
16
+ gem.description = %q{The myERP API gem is a lightweight gem for accessing the myERP REST web services}
17
+ gem.license = 'MIT'
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError => e
21
+ p e
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ require 'rspec/core/rake_task'
26
+ RSpec::Core::RakeTask.new(:spec)
27
+
28
+ task :default => %w(spec)
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
data/lib/ext/array.rb ADDED
@@ -0,0 +1,52 @@
1
+ # Shamelessly ripped from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/array/wrap.rb
2
+
3
+ unless Array.respond_to?(:wrap)
4
+ class Array
5
+ # Wraps its argument in an array unless it is already an array (or array-like).
6
+ #
7
+ # Specifically:
8
+ #
9
+ # * If the argument is +nil+ an empty list is returned.
10
+ # * Otherwise, if the argument responds to +to_ary+ it is invoked, and its result returned.
11
+ # * Otherwise, returns an array with the argument as its single element.
12
+ #
13
+ # Array.wrap(nil) # => []
14
+ # Array.wrap([1, 2, 3]) # => [1, 2, 3]
15
+ # Array.wrap(0) # => [0]
16
+ #
17
+ # This method is similar in purpose to <tt>Kernel#Array</tt>, but there are some differences:
18
+ #
19
+ # * If the argument responds to +to_ary+ the method is invoked. <tt>Kernel#Array</tt>
20
+ # moves on to try +to_a+ if the returned value is +nil+, but <tt>Arraw.wrap</tt> returns
21
+ # such a +nil+ right away.
22
+ # * If the returned value from +to_ary+ is neither +nil+ nor an +Array+ object, <tt>Kernel#Array</tt>
23
+ # raises an exception, while <tt>Array.wrap</tt> does not, it just returns the value.
24
+ # * It does not call +to_a+ on the argument, though special-cases +nil+ to return an empty array.
25
+ #
26
+ # The last point is particularly worth comparing for some enumerables:
27
+ #
28
+ # Array(:foo => :bar) # => [[:foo, :bar]]
29
+ # Array.wrap(:foo => :bar) # => [{:foo => :bar}]
30
+ #
31
+ # Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
32
+ # Array.wrap("foo\nbar") # => ["foo\nbar"]
33
+ #
34
+ # There's also a related idiom that uses the splat operator:
35
+ #
36
+ # [*object]
37
+ #
38
+ # which returns <tt>[nil]</tt> for +nil+, and calls to <tt>Array(object)</tt> otherwise.
39
+ #
40
+ # Thus, in this case the behavior is different for +nil+, and the differences with
41
+ # <tt>Kernel#Array</tt> explained above apply to the rest of +object+s.
42
+ def self.wrap(object)
43
+ if object.nil?
44
+ []
45
+ elsif object.respond_to?(:to_ary)
46
+ object.to_ary
47
+ else
48
+ [object]
49
+ end
50
+ end
51
+ end
52
+ end
data/lib/ext/date.rb ADDED
@@ -0,0 +1,9 @@
1
+ # Shamelessly ripped from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/conversions.rb
2
+
3
+ unless ::Date.respond_to?(:to_time)
4
+ class ::Date
5
+ def to_time(*)
6
+ ::Time.utc(year, month, day)
7
+ end
8
+ end
9
+ end
data/lib/ext/hash.rb ADDED
@@ -0,0 +1,17 @@
1
+ # Shamelessly ripped from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/keys.rb
2
+
3
+ unless Hash.respond_to?(:stringify_keys)
4
+ class Hash
5
+ # Return a new hash with all keys converted to strings.
6
+ def stringify_keys
7
+ dup.stringify_keys!
8
+ end
9
+
10
+ def stringify_keys!
11
+ keys.each do |key|
12
+ self[key.to_s] = delete(key)
13
+ end
14
+ self
15
+ end
16
+ end
17
+ end
data/lib/ext/time.rb ADDED
@@ -0,0 +1,5 @@
1
+ unless Time.respond_to?(:to_time)
2
+ class Time
3
+ def to_time; self; end
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Account < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/accounts'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Accounts < Base
4
+ api_model MyERP::Account
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,67 @@
1
+ module MyERP
2
+ module API
3
+ class Base
4
+ attr_reader :credentials
5
+
6
+ def initialize(credentials)
7
+ @credentials = credentials
8
+ end
9
+
10
+ class << self
11
+ def api_model(klass)
12
+ class_eval <<-END
13
+ def api_model
14
+ #{klass}
15
+ end
16
+ END
17
+ end
18
+ end
19
+
20
+ protected
21
+ def request(method, credentials, path, options = {})
22
+ params = {}
23
+ params[:path] = path
24
+ params[:options] = options
25
+ params[:method] = method
26
+
27
+ response = HTTParty.send(method, "#{credentials.host}#{path}",
28
+ :query => options[:query],
29
+ :body => options[:body],
30
+ :format => :plain,
31
+ :headers => {
32
+ "Accept" => "application/json",
33
+ "Content-Type" => "application/json; charset=utf-8",
34
+ "Authorization" => "Basic #{credentials.basic_auth}",
35
+ "User-Agent" => "myERP_api_ruby/#{MyERP::VERSION}",
36
+ }.update(options[:headers] || {})
37
+ )
38
+
39
+ params[:response] = response.inspect.to_s
40
+ case response.code
41
+ when 200..201
42
+ response
43
+ when 400
44
+ raise MyERP::BadRequest.new(response, params)
45
+ when 401
46
+ raise MyERP::AuthenticationFailed.new(response, params)
47
+ when 404
48
+ raise MyERP::NotFound.new(response, params)
49
+ when 409
50
+ raise MyERP::Conflict.new(response, params)
51
+ when 412
52
+ raise MyERP::MissingField.new(response, params)
53
+ when 422
54
+ raise MyERP::UnprocessableEntity.new(response, params)
55
+ when 429
56
+ raise MyERP::RateLimited.new(response, params)
57
+ when 500
58
+ raise MyERP::ServerError.new(response, params)
59
+ when 502
60
+ raise MyERP::Unavailable.new(response, params)
61
+ else
62
+ raise MyERP::HTTPError.new(response, params)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Currencies < Base
4
+ api_model MyERP::Currency
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Customers < Base
4
+ api_model MyERP::Customer
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class ItemFamilies < Base
4
+ api_model MyERP::ItemFamily
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Items < Base
4
+ api_model MyERP::Item
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class PaymentTerms < Base
4
+ api_model MyERP::PaymentTerm
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Projects < Base
4
+ api_model MyERP::Project
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class SalesOrders < Base
4
+ api_model MyERP::SalesOrder
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+ module API
3
+ class Transactions < Base
4
+ api_model MyERP::Transaction
5
+
6
+ include MyERP::Crud
7
+ end
8
+ end
9
+ end
data/lib/myerp/base.rb ADDED
@@ -0,0 +1,55 @@
1
+ module MyERP
2
+ class Base
3
+ attr_reader :request, :credentials
4
+
5
+ DEFAULTS = {
6
+ :protocol => 'https',
7
+ :host => 'app.myerp.com',
8
+ :port => 443,
9
+ :prefix => '/api/v1'
10
+ }
11
+
12
+ def initialize(api_email, api_key, options = {})
13
+ opts = DEFAULTS.merge! options
14
+ @credentials = Credentials.new(api_email, api_key, opts)
15
+ raise InvalidCredentials unless credentials.valid?
16
+ end
17
+
18
+ def accounts
19
+ @accounts ||= MyERP::API::Accounts.new(credentials)
20
+ end
21
+
22
+ def currencies
23
+ @currencies ||= MyERP::API::Currencies.new(credentials)
24
+ end
25
+
26
+ def customers
27
+ @customers ||= MyERP::API::Customers.new(credentials)
28
+ end
29
+
30
+ def item_families
31
+ @item_families ||= MyERP::API::ItemFamilies.new(credentials)
32
+ end
33
+
34
+ def items
35
+ @items ||= MyERP::API::Items.new(credentials)
36
+ end
37
+
38
+ def payment_terms
39
+ @payment_terms ||= MyERP::API::PaymentTerms.new(credentials)
40
+ end
41
+
42
+ def projects
43
+ @projects ||= MyERP::API::Projects.new(credentials)
44
+ end
45
+
46
+ def sales_orders
47
+ @sales_orders ||= MyERP::API::SalesOrders.new(credentials)
48
+ end
49
+
50
+ def transactions
51
+ @transactions ||= MyERP::API::Transactions.new(credentials)
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,27 @@
1
+ module MyERP
2
+ class Credentials
3
+ attr_accessor :api_key, :api_email, :options
4
+
5
+ def initialize(api_email, api_key, options)
6
+ @api_email, @api_key, @options = api_email, api_key, options
7
+ end
8
+
9
+ def valid?
10
+ !api_email.nil? && !api_key.nil? && !options.nil?
11
+ end
12
+
13
+ def basic_auth
14
+ Base64.encode64("#{api_email}:#{api_key}").delete("\r\n")
15
+ end
16
+
17
+ def host
18
+ site = "#{@options[:protocol]}://"
19
+ if (@options[:protocol] == 'http' && @options[:port] == 80) || (@options[:protocol] == 'https' && @options[:port] == 443)
20
+ site += @options[:host]
21
+ else
22
+ site += "#{@options[:host]}:#{@options[:port]}"
23
+ end
24
+ site += @options[:prefix].to_s
25
+ end
26
+ end
27
+ end
data/lib/myerp/crud.rb ADDED
@@ -0,0 +1,52 @@
1
+ module MyERP
2
+ module Crud
3
+
4
+ def all()
5
+ limit = 100; page = 0; res = [];
6
+ loop do
7
+ resp = request(:get, credentials, api_model.api_path, :query => { :offset => page * limit, :limit => limit })
8
+ page = page + 1
9
+ res += api_model.parse(resp.parsed_response)
10
+ break if resp.headers['X-MyERP-Has-Next-Page'] != "true"
11
+ end
12
+ res
13
+ end
14
+
15
+ def findAll()
16
+ all()
17
+ end
18
+
19
+ def find(id)
20
+ raise "id required" unless id
21
+ resp = request(:get, credentials, "#{api_model.api_path}/#{id}")
22
+ api_model.parse(resp.parsed_response).first
23
+ end
24
+
25
+ def save(model)
26
+ model = api_model.wrap(model)
27
+ if model.new?
28
+ resp = request(:post, credentials, "#{api_model.api_path}", :body => model.to_json)
29
+ else
30
+ resp = request(:put, credentials, "#{api_model.api_path}/#{model.to_i}", :body => model.to_json)
31
+ end
32
+ api_model.parse(resp.parsed_response).first
33
+ end
34
+
35
+ def bulkSave(models)
36
+ raise "array required" unless models.is_a?(Array)
37
+ resp = request(:put, credentials, "#{api_model.api_path}", :body => models.to_json)
38
+ api_model.parse(resp.parsed_response)
39
+ end
40
+
41
+ def delete(model)
42
+ if model.is_a?(Array)
43
+ resp = request(:delete, credentials, "#{api_model.api_path}", :body => model.to_json)
44
+ api_model.parse(resp.parsed_response)
45
+ else
46
+ raise "model unsaved" unless !model.new?
47
+ resp = request(:delete, credentials, "#{api_model.api_path}/#{model.to_i}")
48
+ api_model.parse(resp.parsed_response).first
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Currency < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/currencies'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Customer < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/customers'
7
+
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ module MyERP
2
+ class InvalidCredentials < StandardError; end
3
+
4
+ class HTTPError < StandardError
5
+ attr_reader :response
6
+ attr_reader :params
7
+
8
+ def initialize(response, params = {})
9
+ @response = response
10
+ @params = params
11
+ super(response)
12
+ end
13
+
14
+ def to_s
15
+ "#{self.class.to_s} : #{response.code} #{response.body}"
16
+ end
17
+ end
18
+
19
+ class RateLimited < HTTPError; end
20
+ class NotFound < HTTPError; end
21
+ class Unavailable < HTTPError; end
22
+ class BadRequest < HTTPError; end
23
+ class ServerError < HTTPError; end
24
+ class AuthenticationFailed < HTTPError ; end
25
+ class UnprocessableEntity < HTTPError; end
26
+ class MissingField < HTTPError; end
27
+ class Conflict < HTTPError; end
28
+ end
data/lib/myerp/item.rb ADDED
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Item < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/items'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class ItemFamily < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/item_families'
7
+
8
+ end
9
+ end
@@ -0,0 +1,65 @@
1
+ module MyERP
2
+ module Model
3
+ def self.included(base)
4
+ base.send :include, InstanceMethods
5
+ base.send :extend, ClassMethods
6
+ end
7
+
8
+ module InstanceMethods
9
+ def to_json(*args)
10
+ as_json(*args).to_json(*args)
11
+ end
12
+
13
+ def as_json(args = {})
14
+ inner_json = self.to_hash.stringify_keys
15
+ inner_json.delete("cache_version")
16
+ inner_json
17
+ end
18
+
19
+ def new?
20
+ id.nil?
21
+ end
22
+
23
+ def to_i; id; end
24
+
25
+ def ==(other)
26
+ id == other.id
27
+ end
28
+ end
29
+
30
+ module ClassMethods
31
+ # This sets the API path so the API collections can use them in an agnostic way
32
+ # @return [void]
33
+ def api_path(path = nil)
34
+ @_api_path ||= path
35
+ end
36
+
37
+ def parse(json)
38
+ parsed = String === json ? JSON.parse(json) : json
39
+ Array.wrap(parsed).map {|attrs| new(attrs) }
40
+ end
41
+
42
+ def wrap(model_or_attrs)
43
+ case model_or_attrs
44
+ when Hashie::Mash
45
+ model_or_attrs
46
+ when Hash
47
+ new(model_or_attrs)
48
+ else
49
+ model_or_attrs
50
+ end
51
+ end
52
+
53
+ def delegate_methods(options)
54
+ raise "no methods given" if options.empty?
55
+ options.each do |source, dest|
56
+ class_eval <<-EOV
57
+ def #{source}
58
+ #{dest}
59
+ end
60
+ EOV
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class PaymentTerm < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/payment_terms'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Project < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/projects'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class SalesOrder < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/sales_orders'
7
+
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module MyERP
2
+
3
+ class Transaction < Hashie::Mash
4
+ include MyERP::Model
5
+
6
+ api_path '/transactions'
7
+
8
+ end
9
+ end
data/lib/myerp_api.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'httparty'
2
+ require 'base64'
3
+ require 'delegate'
4
+ require 'hashie'
5
+ require 'json'
6
+ require 'time'
7
+ require 'csv'
8
+
9
+ require 'ext/array'
10
+ require 'ext/hash'
11
+ require 'ext/date'
12
+ require 'ext/time'
13
+
14
+ require 'myerp/credentials'
15
+ require 'myerp/errors'
16
+ require 'myerp/base'
17
+
18
+ %w(model crud account currency customer item item_family payment_term project sales_order transaction).each {|a| require "myerp/#{a}"}
19
+ %w(base accounts currencies customers items item_families payment_terms projects sales_orders transactions).each {|a| require "myerp/api/#{a}"}
20
+
21
+ module MyERP
22
+ VERSION = File.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'VERSION'))).strip
23
+
24
+ class << self
25
+
26
+ def client(api_email, api_key, options = {})
27
+ MyERP::Base.new(api_email, api_key, options)
28
+ end
29
+ end
30
+ end
data/myerp_api.gemspec ADDED
@@ -0,0 +1,105 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "myerp_api"
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Didier Baquier"]
12
+ s.date = "2014-03-06"
13
+ s.description = "The myERP API gem is a lightweight gem for accessing the myERP REST web services"
14
+ s.email = "didier.baquier@myerp.com"
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "Gemfile",
20
+ "README.md",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "lib/ext/array.rb",
24
+ "lib/ext/date.rb",
25
+ "lib/ext/hash.rb",
26
+ "lib/ext/time.rb",
27
+ "lib/myerp/account.rb",
28
+ "lib/myerp/api/accounts.rb",
29
+ "lib/myerp/api/base.rb",
30
+ "lib/myerp/api/currencies.rb",
31
+ "lib/myerp/api/customers.rb",
32
+ "lib/myerp/api/item_families.rb",
33
+ "lib/myerp/api/items.rb",
34
+ "lib/myerp/api/payment_terms.rb",
35
+ "lib/myerp/api/projects.rb",
36
+ "lib/myerp/api/sales_orders.rb",
37
+ "lib/myerp/api/transactions.rb",
38
+ "lib/myerp/base.rb",
39
+ "lib/myerp/credentials.rb",
40
+ "lib/myerp/crud.rb",
41
+ "lib/myerp/currency.rb",
42
+ "lib/myerp/customer.rb",
43
+ "lib/myerp/errors.rb",
44
+ "lib/myerp/item.rb",
45
+ "lib/myerp/item_family.rb",
46
+ "lib/myerp/model.rb",
47
+ "lib/myerp/payment_term.rb",
48
+ "lib/myerp/project.rb",
49
+ "lib/myerp/sales_order.rb",
50
+ "lib/myerp/transaction.rb",
51
+ "lib/myerp_api.rb",
52
+ "myerp_api.gemspec"
53
+ ]
54
+ s.homepage = "http://www.myerp.com"
55
+ s.licenses = ["MIT"]
56
+ s.require_paths = ["lib"]
57
+ s.rubygems_version = "2.0.3"
58
+ s.summary = "The myERP API gem is a lightweight gem for accessing the myERP REST web services"
59
+
60
+ if s.respond_to? :specification_version then
61
+ s.specification_version = 4
62
+
63
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
64
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
65
+ s.add_runtime_dependency(%q<hashie>, ["~> 1"])
66
+ s.add_runtime_dependency(%q<json>, [">= 0"])
67
+ s.add_development_dependency(%q<rspec>, ["~> 2"])
68
+ s.add_development_dependency(%q<jruby-openssl>, [">= 0"])
69
+ s.add_development_dependency(%q<webmock>, [">= 0"])
70
+ s.add_development_dependency(%q<vcr>, [">= 0"])
71
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
72
+ s.add_development_dependency(%q<debugger>, [">= 0"])
73
+ s.add_development_dependency(%q<factory_girl>, [">= 0"])
74
+ s.add_development_dependency(%q<yard>, [">= 0"])
75
+ s.add_development_dependency(%q<redcarpet>, [">= 0"])
76
+ else
77
+ s.add_dependency(%q<httparty>, [">= 0"])
78
+ s.add_dependency(%q<hashie>, ["~> 1"])
79
+ s.add_dependency(%q<json>, [">= 0"])
80
+ s.add_dependency(%q<rspec>, ["~> 2"])
81
+ s.add_dependency(%q<jruby-openssl>, [">= 0"])
82
+ s.add_dependency(%q<webmock>, [">= 0"])
83
+ s.add_dependency(%q<vcr>, [">= 0"])
84
+ s.add_dependency(%q<jeweler>, [">= 0"])
85
+ s.add_dependency(%q<debugger>, [">= 0"])
86
+ s.add_dependency(%q<factory_girl>, [">= 0"])
87
+ s.add_dependency(%q<yard>, [">= 0"])
88
+ s.add_dependency(%q<redcarpet>, [">= 0"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<httparty>, [">= 0"])
92
+ s.add_dependency(%q<hashie>, ["~> 1"])
93
+ s.add_dependency(%q<json>, [">= 0"])
94
+ s.add_dependency(%q<rspec>, ["~> 2"])
95
+ s.add_dependency(%q<jruby-openssl>, [">= 0"])
96
+ s.add_dependency(%q<webmock>, [">= 0"])
97
+ s.add_dependency(%q<vcr>, [">= 0"])
98
+ s.add_dependency(%q<jeweler>, [">= 0"])
99
+ s.add_dependency(%q<debugger>, [">= 0"])
100
+ s.add_dependency(%q<factory_girl>, [">= 0"])
101
+ s.add_dependency(%q<yard>, [">= 0"])
102
+ s.add_dependency(%q<redcarpet>, [">= 0"])
103
+ end
104
+ end
105
+
metadata ADDED
@@ -0,0 +1,248 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: myerp_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Didier Baquier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
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: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: jruby-openssl
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
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: jeweler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: debugger
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: factory_girl
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: yard
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: redcarpet
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: The myERP API gem is a lightweight gem for accessing the myERP REST web
182
+ services
183
+ email: didier.baquier@myerp.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files:
187
+ - README.md
188
+ files:
189
+ - Gemfile
190
+ - README.md
191
+ - Rakefile
192
+ - VERSION
193
+ - lib/ext/array.rb
194
+ - lib/ext/date.rb
195
+ - lib/ext/hash.rb
196
+ - lib/ext/time.rb
197
+ - lib/myerp/account.rb
198
+ - lib/myerp/api/accounts.rb
199
+ - lib/myerp/api/base.rb
200
+ - lib/myerp/api/currencies.rb
201
+ - lib/myerp/api/customers.rb
202
+ - lib/myerp/api/item_families.rb
203
+ - lib/myerp/api/items.rb
204
+ - lib/myerp/api/payment_terms.rb
205
+ - lib/myerp/api/projects.rb
206
+ - lib/myerp/api/sales_orders.rb
207
+ - lib/myerp/api/transactions.rb
208
+ - lib/myerp/base.rb
209
+ - lib/myerp/credentials.rb
210
+ - lib/myerp/crud.rb
211
+ - lib/myerp/currency.rb
212
+ - lib/myerp/customer.rb
213
+ - lib/myerp/errors.rb
214
+ - lib/myerp/item.rb
215
+ - lib/myerp/item_family.rb
216
+ - lib/myerp/model.rb
217
+ - lib/myerp/payment_term.rb
218
+ - lib/myerp/project.rb
219
+ - lib/myerp/sales_order.rb
220
+ - lib/myerp/transaction.rb
221
+ - lib/myerp_api.rb
222
+ - myerp_api.gemspec
223
+ homepage: http://www.myerp.com
224
+ licenses:
225
+ - MIT
226
+ metadata: {}
227
+ post_install_message:
228
+ rdoc_options: []
229
+ require_paths:
230
+ - lib
231
+ required_ruby_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ required_rubygems_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ requirements: []
242
+ rubyforge_project:
243
+ rubygems_version: 2.2.2
244
+ signing_key:
245
+ specification_version: 4
246
+ summary: The myERP API gem is a lightweight gem for accessing the myERP REST web services
247
+ test_files: []
248
+ has_rdoc: