jurnal_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ # JurnalApi
2
+
3
+ A Ruby wrapper for the Jurnal REST APIs
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jurnal_api'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install jurnal_api
20
+
21
+ ## Usage
22
+ ```
23
+ $ bundle exec irb -I lib
24
+
25
+ require 'jurnal_api'
26
+ client = JurnalApi::Client.new(access_token: ENV['JURNAL_COMPANY_API_KEY'], base_url: ENV['JURNAL_API_BASE_URL'])
27
+ client.products
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mekari/ruby-jurnal-client.
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "jurnal/api"
5
+ require "json"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,44 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require File.expand_path('../lib/jurnal_api/version', __FILE__)
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "jurnal_api"
9
+ spec.version = JurnalApi::VERSION
10
+ spec.authors = ["mekari-devs"]
11
+ spec.email = ["developer@mekari.com"]
12
+
13
+ spec.summary = %q{Ruby wrapper for the Jurnal API.}
14
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
15
+ spec.homepage = "https://github.com/mekari-engineering/jurnal_api"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "byebug", "11.1.3"
31
+ spec.add_development_dependency "capybara", "2.5.0"
32
+ spec.add_development_dependency "pry"
33
+ spec.add_development_dependency "rack", "2.2.3"
34
+ spec.add_development_dependency "rake", "~> 13.0"
35
+ spec.add_development_dependency "rspec", "~> 3.0"
36
+ spec.add_development_dependency "shoulda-context", "1.2.2"
37
+ spec.add_development_dependency "shoulda-matchers", "3.1.1"
38
+ spec.add_development_dependency "webmock", "3.8.3"
39
+
40
+ # dependency
41
+ spec.add_dependency "faraday", "0.15.4"
42
+ spec.add_dependency "faraday_middleware", "0.13.1"
43
+ spec.add_dependency "dotenv", "2.7.5"
44
+ end
@@ -0,0 +1,47 @@
1
+ require 'faraday'
2
+
3
+ # @private
4
+ module FaradayMiddleware
5
+ # @private
6
+ class RaiseHttpException < Faraday::Middleware
7
+ def call(env)
8
+ @app.call(env).on_complete do |response|
9
+ case response[:status].to_i
10
+ when 400
11
+ raise JurnalApi::BadRequest, error_message_400(response)
12
+ when 404
13
+ raise JurnalApi::NotFound, error_message_400(response)
14
+ when 409
15
+ raise JurnalApi::Conflict.new error_message_400(response), response[:body]
16
+ when 422
17
+ raise JurnalApi::UnprocessableEntity.new error_message_400(response), response[:body]
18
+ when 429
19
+ raise JurnalApi::TooManyRequests, error_message_400(response)
20
+ when 500
21
+ raise JurnalApi::InternalServerError, error_message_500(response, "Something is went wrong.")
22
+ when 502
23
+ raise JurnalApi::BadGateway, error_message_500(response, "Bad gateway.")
24
+ when 503
25
+ raise JurnalApi::ServiceUnavailable, error_message_500(response, "Jurnal is rate limiting your requests.")
26
+ when 504
27
+ raise JurnalApi::GatewayTimeout, error_message_500(response, "504 Gateway Time-out")
28
+ end
29
+ end
30
+ end
31
+
32
+ def initialize(app)
33
+ super app
34
+ @parser = nil
35
+ end
36
+
37
+ private
38
+
39
+ def error_message_400(response)
40
+ "#{response[:method].to_s.upcase} #{response[:url].to_s}: #{response[:status]}"
41
+ end
42
+
43
+ def error_message_500(response, body=nil)
44
+ "#{response[:method].to_s.upcase} #{response[:url].to_s}: #{[response[:status].to_s + ':', body].compact.join(' ')}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../jurnal_api/error', __FILE__)
2
+ require File.expand_path('../jurnal_api/configuration', __FILE__)
3
+ require File.expand_path('../jurnal_api/api', __FILE__)
4
+ require File.expand_path('../jurnal_api/client', __FILE__)
5
+ require File.expand_path('../jurnal_api/response', __FILE__)
6
+
7
+ require 'dotenv/load'
8
+
9
+ module JurnalApi
10
+ extend Configuration
11
+
12
+ def self.client(options={})
13
+ JurnalApi::Client.new(options)
14
+ end
15
+
16
+ # Delegate to JurnalApi::Client
17
+ def self.method_missing(method, *args, &block)
18
+ return super unless client.respond_to?(method)
19
+ client.send(method, *args, &block)
20
+ end
21
+
22
+ # Delegate to JurnalApi::Client
23
+ def self.respond_to?(method, include_all=false)
24
+ return client.respond_to?(method, include_all) || super
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../connection', __FILE__)
2
+ require File.expand_path('../request', __FILE__)
3
+
4
+ module JurnalApi
5
+ # @private
6
+ class API
7
+ # @private
8
+ attr_accessor *Configuration::VALID_OPTIONS_KEYS
9
+ attr_reader :endpoint
10
+
11
+ # Creates a new API
12
+ def initialize(options={})
13
+ options = JurnalApi.options.merge(options)
14
+ Configuration::VALID_OPTIONS_KEYS.each do |key|
15
+ send("#{key}=", options[key])
16
+ end
17
+ end
18
+
19
+ def config
20
+ conf = {}
21
+ Configuration::VALID_OPTIONS_KEYS.each do |key|
22
+ conf[key] = send key
23
+ end
24
+ conf
25
+ end
26
+
27
+ def endpoint
28
+ base_url + '/' + authorization_path + '/' + api_version
29
+ end
30
+
31
+ include Connection
32
+ include Request
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ module JurnalApi
2
+ # Wrapper for the JurnalApi REST API
3
+ class Client < API
4
+ Dir[File.expand_path('../client/*.rb', __FILE__)].each{|f| require f}
5
+
6
+ include JurnalApi::Client::Customers
7
+ include JurnalApi::Client::JournalEntries
8
+ include JurnalApi::Client::Products
9
+ include JurnalApi::Client::RecurringSchedules
10
+ include JurnalApi::Client::ReceivePayment
11
+ include JurnalApi::Client::SalesOrderPayments
12
+ include JurnalApi::Client::SalesOrders
13
+ include JurnalApi::Client::SalesInvoices
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to SalesOrders
4
+ module Customers
5
+
6
+ def customers(params = {})
7
+ response = get('customers', params)
8
+ response
9
+ end
10
+
11
+ def customer_find(id)
12
+ response = get("customers/#{id}")
13
+ response
14
+ end
15
+
16
+ def customer_create(params = {})
17
+ response = post('customers', params)
18
+ response
19
+ end
20
+
21
+ def customer_update(id, params = {})
22
+ response = put("customers/#{id}", params)
23
+ response
24
+ end
25
+
26
+ def customer_delete(id)
27
+ response = delete("customers/#{id}")
28
+ response
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to SalesOrders
4
+ module JournalEntries
5
+
6
+ def journal_entries(params = {})
7
+ response = get('journal_entries', params)
8
+ response
9
+ end
10
+
11
+ def journal_entry_find(id)
12
+ response = get("journal_entries/#{id}")
13
+ response
14
+ end
15
+
16
+ def journal_entry_create(params = {})
17
+ response = post('journal_entries', params)
18
+ response
19
+ end
20
+
21
+ def journal_entry_update(id, params = {})
22
+ response = put("journal_entries/#{id}", params)
23
+ response
24
+ end
25
+
26
+ def journal_entry_delete(id)
27
+ response = delete("journal_entries/#{id}")
28
+ response
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to Products
4
+ module Products
5
+
6
+ def products(params = {})
7
+ response = get('products', params)
8
+ response
9
+ end
10
+
11
+ def product_find(id)
12
+ response = get("products/#{id}")
13
+ response
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to ReceivePayment
4
+ module ReceivePayment
5
+
6
+ def receive_payments(params = {})
7
+ response = get('receive_payments', params)
8
+ response
9
+ end
10
+
11
+ def receive_payment_find(id)
12
+ response = get("receive_payments/#{id}")
13
+ response
14
+ end
15
+
16
+ def receive_payment_create(params = {})
17
+ response = post('receive_payments', params)
18
+ response
19
+ end
20
+
21
+ def receive_payment_update(id, params = {})
22
+ response = put("receive_payments/#{id}", params)
23
+ response
24
+ end
25
+
26
+ def receive_payment_delete(id)
27
+ response = delete("receive_payments/#{id}")
28
+ response
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to RecurringSchedules
4
+ module RecurringSchedules
5
+
6
+ def recurring_schedules_create(params = {})
7
+ response = post('recurring_schedules', params)
8
+ response
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to SalesOrders
4
+ module SalesInvoices
5
+
6
+ def sales_invoices(params = {})
7
+ response = get('sales_invoices', params)
8
+ response
9
+ end
10
+
11
+ def sales_invoice_find(id)
12
+ response = get("sales_invoices/#{id}")
13
+ response
14
+ end
15
+
16
+ def sales_invoice_create(params = {})
17
+ response = post('sales_invoices', params)
18
+ response
19
+ end
20
+
21
+ def sales_invoice_update(id, params = {})
22
+ response = put("sales_invoices/#{id}", params)
23
+ response
24
+ end
25
+
26
+ def sales_invoice_delete(id)
27
+ response = delete("sales_invoices/#{id}")
28
+ response
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to SalesOrderPayments
4
+ module SalesOrderPayments
5
+
6
+ def sales_order_payments(params = {})
7
+ response = get('sales_order_payments', params)
8
+ response
9
+ end
10
+
11
+ def sales_order_payments_find(id)
12
+ response = get("sales_order_payments/#{id}")
13
+ response
14
+ end
15
+
16
+ def sales_order_payment_create(params = {})
17
+ response = post('sales_order_payments', params)
18
+ response
19
+ end
20
+
21
+ def sales_order_payment_delete(id)
22
+ response = delete("sales_order_payments/#{id}")
23
+ response
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ module JurnalApi
2
+ class Client
3
+ # Defines methods related to SalesOrders
4
+ module SalesOrders
5
+
6
+ def sales_orders(params = {})
7
+ response = get('sales_orders', params)
8
+ response
9
+ end
10
+
11
+ def sales_order_find(id)
12
+ response = get("sales_orders/#{id}")
13
+ response
14
+ end
15
+
16
+ def sales_order_create(params = {})
17
+ response = post('sales_orders', params)
18
+ response
19
+ end
20
+
21
+ def sales_order_convert_to_invoice(id, params = {})
22
+ url = "sales_orders/#{id}/convert_to_invoice"
23
+ response = post(url, params)
24
+
25
+ response
26
+ end
27
+
28
+ def sales_order_close(id)
29
+ url = "sales_orders/#{id}/close_order"
30
+ response = post(url)
31
+
32
+ response
33
+ end
34
+ end
35
+ end
36
+ end