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.
@@ -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,6 @@
1
+ module WAEasyAPI
2
+ # Collection class handles groups of similar
3
+ # entities
4
+ class Collection < Entity
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ # Version and other constants are defined here
2
+ module WAEasyAPI
3
+ BASE_URI = 'https://api.waeasyapi.com/v1/'.freeze
4
+ VERSION = '1.0.0'.freeze
5
+ end
@@ -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,7 @@
1
+ require 'waeasyapi/errors/waeasyapi_error'
2
+
3
+ module WAEasyAPI
4
+ # Error in Gateway Communication.
5
+ class GatewayError < WAEasyAPI::Error
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'waeasyapi/errors/waeasyapi_error'
2
+
3
+ module WAEasyAPI
4
+ # There is some problem with the server
5
+ class ServerError < WAEasyAPI::Error
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module WAEasyAPI
2
+ # Default Error class for any unknown errors
3
+ class Error < StandardError
4
+ attr_reader :code, :status
5
+
6
+ def initialize(code = nil, status = nil)
7
+ @code = code
8
+ @status = status
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ require 'waeasyapi/errors/waeasyapi_error'
2
+ require 'waeasyapi/errors/bad_request_error'
3
+ require 'waeasyapi/errors/gateway_error'
4
+ require 'waeasyapi/errors/server_error'
@@ -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: []