myerp_api 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +17 -0
- data/README.md +106 -0
- data/Rakefile +28 -0
- data/VERSION +1 -0
- data/lib/ext/array.rb +52 -0
- data/lib/ext/date.rb +9 -0
- data/lib/ext/hash.rb +17 -0
- data/lib/ext/time.rb +5 -0
- data/lib/myerp/account.rb +9 -0
- data/lib/myerp/api/accounts.rb +9 -0
- data/lib/myerp/api/base.rb +67 -0
- data/lib/myerp/api/currencies.rb +9 -0
- data/lib/myerp/api/customers.rb +9 -0
- data/lib/myerp/api/item_families.rb +9 -0
- data/lib/myerp/api/items.rb +9 -0
- data/lib/myerp/api/payment_terms.rb +9 -0
- data/lib/myerp/api/projects.rb +9 -0
- data/lib/myerp/api/sales_orders.rb +9 -0
- data/lib/myerp/api/transactions.rb +9 -0
- data/lib/myerp/base.rb +55 -0
- data/lib/myerp/credentials.rb +27 -0
- data/lib/myerp/crud.rb +52 -0
- data/lib/myerp/currency.rb +9 -0
- data/lib/myerp/customer.rb +9 -0
- data/lib/myerp/errors.rb +28 -0
- data/lib/myerp/item.rb +9 -0
- data/lib/myerp/item_family.rb +9 -0
- data/lib/myerp/model.rb +65 -0
- data/lib/myerp/payment_term.rb +9 -0
- data/lib/myerp/project.rb +9 -0
- data/lib/myerp/sales_order.rb +9 -0
- data/lib/myerp/transaction.rb +9 -0
- data/lib/myerp_api.rb +30 -0
- data/myerp_api.gemspec +105 -0
- metadata +248 -0
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
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,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
|
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
|
data/lib/myerp/errors.rb
ADDED
@@ -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
data/lib/myerp/model.rb
ADDED
@@ -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
|
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:
|