waeasyapi 1.0.0
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 +7 -0
- data/.editorconfig +12 -0
- data/.gitignore +56 -0
- data/.rubocop.yml +22 -0
- data/.simplecov +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +11 -0
- data/LICENSE +21 -0
- data/README.md +53 -0
- data/Rakefile +14 -0
- data/lib/cacert.pem +4685 -0
- data/lib/extensions/httparty/hash_conversions.rb +44 -0
- data/lib/waeasyapi/collection.rb +6 -0
- data/lib/waeasyapi/constants.rb +5 -0
- data/lib/waeasyapi/entity.rb +46 -0
- data/lib/waeasyapi/errors/bad_request_error.rb +14 -0
- data/lib/waeasyapi/errors/gateway_error.rb +7 -0
- data/lib/waeasyapi/errors/server_error.rb +7 -0
- data/lib/waeasyapi/errors/waeasyapi_error.rb +11 -0
- data/lib/waeasyapi/errors.rb +4 -0
- data/lib/waeasyapi/message.rb +26 -0
- data/lib/waeasyapi/request.rb +118 -0
- data/lib/waeasyapi/utility.rb +25 -0
- data/lib/waeasyapi.rb +20 -0
- data/waeasyapi-ruby.gemspec +36 -0
- metadata +151 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
# :nocov:
|
4
|
+
module HTTParty
|
5
|
+
# Extension of HTTParty:HashConversions. Changes made to add index to arrays
|
6
|
+
# https://github.com/jnunemaker/httparty/blob/master/lib/httparty/hash_conversions.rb#L42,L55
|
7
|
+
module HashConversions
|
8
|
+
def self.normalize_keys(key, value)
|
9
|
+
stack = []
|
10
|
+
normalized_keys = []
|
11
|
+
|
12
|
+
if value.respond_to?(:to_ary)
|
13
|
+
if value.empty?
|
14
|
+
normalized_keys << ["#{key}[]", '']
|
15
|
+
else
|
16
|
+
normalized_keys = value.to_ary.flat_map.with_index do
|
17
|
+
|element, index| normalize_keys("#{key}[#{index}]", element)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
elsif value.respond_to?(:to_hash)
|
21
|
+
stack << [key, value.to_hash]
|
22
|
+
else
|
23
|
+
normalized_keys << [key.to_s, value]
|
24
|
+
end
|
25
|
+
|
26
|
+
stack.each do |parent, hash|
|
27
|
+
hash.each do |child_key, child_value|
|
28
|
+
if child_value.respond_to?(:to_hash)
|
29
|
+
stack << ["#{parent}[#{child_key}]", child_value.to_hash]
|
30
|
+
elsif child_value.respond_to?(:to_ary)
|
31
|
+
child_value.to_ary.each_with_index do |v, index|
|
32
|
+
normalized_keys << normalize_keys("#{parent}[#{child_key}][#{index}]", v).flatten
|
33
|
+
end
|
34
|
+
else
|
35
|
+
normalized_keys << normalize_keys("#{parent}[#{child_key}]", child_value).flatten
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
normalized_keys
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
# :nocov:
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module WAEasyAPI
|
4
|
+
# Entity class is the base class for all WAEasyAPI objects
|
5
|
+
# This saves data in a hash internally, and makes it available
|
6
|
+
# via direct methods
|
7
|
+
class Entity
|
8
|
+
attr_reader :attributes
|
9
|
+
|
10
|
+
def initialize(attributes)
|
11
|
+
@attributes = attributes
|
12
|
+
end
|
13
|
+
|
14
|
+
# This method fakes attr_reader, but uses
|
15
|
+
# the @attributes hash as the source, instead of
|
16
|
+
# instance variables
|
17
|
+
def method_missing(name)
|
18
|
+
if @attributes.key? name.to_s
|
19
|
+
@attributes[name.to_s]
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def respond_to_missing?(method_name, include_private = false)
|
26
|
+
@attributes.key?(method_name.to_s) || super
|
27
|
+
end
|
28
|
+
|
29
|
+
# Public: Convert the Entity object to JSON
|
30
|
+
# Returns the JSON representation of the Entity (as a string)
|
31
|
+
def to_json(*args)
|
32
|
+
@attributes.to_json(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Mutates the entity in accordance with
|
36
|
+
# the block passed to this construct
|
37
|
+
#
|
38
|
+
# Used to implement bang methods, by calling
|
39
|
+
# the non-bang method in the passed block
|
40
|
+
def with_a_bang
|
41
|
+
mutated_entity = yield
|
42
|
+
@attributes = mutated_entity.attributes
|
43
|
+
mutated_entity
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'waeasyapi/errors/waeasyapi_error'
|
2
|
+
|
3
|
+
module WAEasyAPI
|
4
|
+
# Bad request to API. Missing a field or an invalid field.
|
5
|
+
# Error in merchant request. Check the description and correct the request accordingly.
|
6
|
+
class BadRequestError < WAEasyAPI::Error
|
7
|
+
attr_reader :field
|
8
|
+
|
9
|
+
def initialize(code, status, field = nil)
|
10
|
+
super(code, status)
|
11
|
+
@field = field
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'waeasyapi/request'
|
2
|
+
require 'waeasyapi/entity'
|
3
|
+
|
4
|
+
module WAEasyAPI
|
5
|
+
class Message < Entity
|
6
|
+
def self.request
|
7
|
+
WAEasyAPI::Request.new('send')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.sendMessage(data={})
|
11
|
+
request.post "message" , data
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.sendTemplate(data={})
|
15
|
+
request.post "template" , data
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.sendMedia(data={})
|
19
|
+
request.post "media" , data
|
20
|
+
end
|
21
|
+
|
22
|
+
def method
|
23
|
+
method_missing(:method)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'extensions/httparty/hash_conversions'
|
3
|
+
require 'waeasyapi/constants'
|
4
|
+
|
5
|
+
module WAEasyAPI
|
6
|
+
# Request objects are used to create fetch
|
7
|
+
# objects, which make requests to the server
|
8
|
+
# using HTTParty
|
9
|
+
class Request
|
10
|
+
include HTTParty
|
11
|
+
|
12
|
+
ssl_ca_file File.dirname(__FILE__) + '/../cacert.pem'
|
13
|
+
|
14
|
+
def initialize(entity_name = nil)
|
15
|
+
self.class.base_uri(WAEasyAPI::BASE_URI)
|
16
|
+
@entity_name = entity_name
|
17
|
+
custom_headers = WAEasyAPI.custom_headers || {}
|
18
|
+
predefined_headers = {
|
19
|
+
'User-Agent' => "WAEasyAPI-Ruby/#{WAEasyAPI::VERSION}; Ruby/#{RUBY_VERSION}"
|
20
|
+
}
|
21
|
+
# Order is important to give precedence to predefined headers
|
22
|
+
headers = custom_headers.merge(predefined_headers)
|
23
|
+
@options = {
|
24
|
+
basic_auth: WAEasyAPI.auth,
|
25
|
+
timeout: 30,
|
26
|
+
headers: headers
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def fetch(id)
|
31
|
+
request :get, "/#{@entity_name}/#{id}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def all(options)
|
35
|
+
request :get, "/#{@entity_name}", options
|
36
|
+
end
|
37
|
+
|
38
|
+
def post(url, data = {})
|
39
|
+
request :post, "/#{@entity_name}/#{url}", data
|
40
|
+
end
|
41
|
+
|
42
|
+
def get(url, data = {})
|
43
|
+
request :get, "/#{@entity_name}/#{url}", data
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete(url)
|
47
|
+
request :delete, "/#{@entity_name}/#{url}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def put(id, data = {})
|
51
|
+
request :put, "/#{@entity_name}/#{id}", data
|
52
|
+
end
|
53
|
+
|
54
|
+
def patch(id, data = {})
|
55
|
+
request :patch, "/#{@entity_name}/#{id}", data
|
56
|
+
end
|
57
|
+
|
58
|
+
def create(data)
|
59
|
+
request :post, "/#{@entity_name}", data
|
60
|
+
end
|
61
|
+
|
62
|
+
def request(method, url, data = {})
|
63
|
+
create_instance raw_request(method, url, data)
|
64
|
+
end
|
65
|
+
|
66
|
+
def raw_request(method, url, data = {})
|
67
|
+
case method
|
68
|
+
when :get
|
69
|
+
@options[:query] = data
|
70
|
+
when :post, :put, :patch
|
71
|
+
@options[:body] = data
|
72
|
+
end
|
73
|
+
|
74
|
+
self.class.send(method, url, @options)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Since we need to change the base route
|
78
|
+
def make_test_request
|
79
|
+
self.class.get WAEasyAPI::TEST_URL, @options
|
80
|
+
end
|
81
|
+
|
82
|
+
# Recursively builds entity instances
|
83
|
+
# out of all hashes in the response object
|
84
|
+
def create_instance(res)
|
85
|
+
response = res.parsed_response
|
86
|
+
|
87
|
+
if response.is_a?(Array)==true || response.to_s.length == 0
|
88
|
+
return response
|
89
|
+
end
|
90
|
+
|
91
|
+
# if there was an error, throw it
|
92
|
+
raise_error(response['error'], res.code) if response.nil? || response.key?('error') && res.code !=200
|
93
|
+
# There must be a top level entity
|
94
|
+
begin
|
95
|
+
class_name = response['entity'].split('_').collect(&:capitalize).join
|
96
|
+
|
97
|
+
klass = WAEasyAPI.const_get class_name
|
98
|
+
rescue NameError
|
99
|
+
# Use Entity class if we don't find any
|
100
|
+
klass = WAEasyAPI::Entity
|
101
|
+
end
|
102
|
+
klass.new(response)
|
103
|
+
end
|
104
|
+
|
105
|
+
def raise_error(error, status)
|
106
|
+
# Get the error class name, require it and instantiate an error
|
107
|
+
class_name = error['code'].split('_').map(&:capitalize).join('')
|
108
|
+
args = [error['code'], status]
|
109
|
+
args.push error['field'] if error.key?('field')
|
110
|
+
require "waeasyapi/errors/#{error['code'].downcase}"
|
111
|
+
klass = WAEasyAPI.const_get(class_name)
|
112
|
+
raise klass.new(*args), error['description']
|
113
|
+
rescue NameError, LoadError
|
114
|
+
# We got an unknown error, cast it to Error for now
|
115
|
+
raise WAEasyAPI::Error.new, 'Unknown Error'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module WAEasyAPI
|
4
|
+
# Helper functions are defined here
|
5
|
+
class Utility
|
6
|
+
class << self
|
7
|
+
private
|
8
|
+
|
9
|
+
def secure_compare(a, b)
|
10
|
+
return false unless a.bytesize == b.bytesize
|
11
|
+
|
12
|
+
l = a.unpack('C*')
|
13
|
+
r = 0
|
14
|
+
i = -1
|
15
|
+
|
16
|
+
b.each_byte do |v|
|
17
|
+
i += 1
|
18
|
+
r |= v ^ l[i]
|
19
|
+
end
|
20
|
+
|
21
|
+
r.zero?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/waeasyapi.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'waeasyapi/errors'
|
2
|
+
require 'waeasyapi/message'
|
3
|
+
require 'waeasyapi/utility'
|
4
|
+
require 'waeasyapi/constants'
|
5
|
+
require 'waeasyapi/collection'
|
6
|
+
|
7
|
+
# Base WAEasyAPI module
|
8
|
+
module WAEasyAPI
|
9
|
+
class << self
|
10
|
+
attr_accessor :auth, :custom_headers
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.setup(key_id, key_secret)
|
14
|
+
self.auth = { username: key_id, password: key_secret }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.headers=(headers = {})
|
18
|
+
self.custom_headers = headers
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
lib = File.expand_path('lib', Dir.pwd)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'waeasyapi/constants'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'waeasyapi'
|
7
|
+
spec.version = WAEasyAPI::VERSION
|
8
|
+
spec.authors = ['WA Easy API']
|
9
|
+
spec.email = ['team@waeasyapi.com']
|
10
|
+
spec.summary = "WAEasyAPI's Ruby API"
|
11
|
+
spec.description = 'Official ruby bindings for the WAEasyAPI API'
|
12
|
+
spec.homepage = 'https://waeasyapi.com/'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split("\n")
|
16
|
+
spec.executables = spec.files.grep(/^bin/) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)/)
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_dependency 'httparty', '~> 0.14'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
23
|
+
spec.add_development_dependency 'minitest', '~> 5.11'
|
24
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
25
|
+
|
26
|
+
if RUBY_VERSION >= '2.1.0'
|
27
|
+
# rubocop is only run in the latest ruby build
|
28
|
+
# so we use the latest version and don't switch to a
|
29
|
+
# older version for 1.9.3
|
30
|
+
spec.add_development_dependency 'rubocop', '~> 0.49'
|
31
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
32
|
+
else
|
33
|
+
# Webmock 3.0 does not support Ruby 1.9.3
|
34
|
+
spec.add_development_dependency 'webmock', '~> 2.3'
|
35
|
+
end
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: waeasyapi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- WA Easy API
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-06-20 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.14'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: coveralls
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.8'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.11'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.11'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '12.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '12.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.49'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.49'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: webmock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
description: Official ruby bindings for the WAEasyAPI API
|
98
|
+
email:
|
99
|
+
- team@waeasyapi.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".editorconfig"
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rubocop.yml"
|
107
|
+
- ".simplecov"
|
108
|
+
- Gemfile
|
109
|
+
- Gemfile.lock
|
110
|
+
- LICENSE
|
111
|
+
- README.md
|
112
|
+
- Rakefile
|
113
|
+
- lib/cacert.pem
|
114
|
+
- lib/extensions/httparty/hash_conversions.rb
|
115
|
+
- lib/waeasyapi.rb
|
116
|
+
- lib/waeasyapi/collection.rb
|
117
|
+
- lib/waeasyapi/constants.rb
|
118
|
+
- lib/waeasyapi/entity.rb
|
119
|
+
- lib/waeasyapi/errors.rb
|
120
|
+
- lib/waeasyapi/errors/bad_request_error.rb
|
121
|
+
- lib/waeasyapi/errors/gateway_error.rb
|
122
|
+
- lib/waeasyapi/errors/server_error.rb
|
123
|
+
- lib/waeasyapi/errors/waeasyapi_error.rb
|
124
|
+
- lib/waeasyapi/message.rb
|
125
|
+
- lib/waeasyapi/request.rb
|
126
|
+
- lib/waeasyapi/utility.rb
|
127
|
+
- waeasyapi-ruby.gemspec
|
128
|
+
homepage: https://waeasyapi.com/
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
metadata: {}
|
132
|
+
post_install_message:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubygems_version: 3.0.3.1
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: WAEasyAPI's Ruby API
|
151
|
+
test_files: []
|