greensms 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/ruby.yml +35 -0
- data/.gitignore +9 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +21 -0
- data/README.md +102 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/account.rb +12 -0
- data/examples/call.rb +11 -0
- data/examples/env.rb +13 -0
- data/examples/general.rb +6 -0
- data/examples/hlr.rb +11 -0
- data/examples/init.rb +6 -0
- data/examples/pay.rb +11 -0
- data/examples/sms.rb +11 -0
- data/examples/social.rb +11 -0
- data/examples/token.rb +11 -0
- data/examples/viber.rb +11 -0
- data/examples/voice.rb +11 -0
- data/examples/whois.rb +6 -0
- data/greensms.gemspec +33 -0
- data/lib/greensms.rb +6 -0
- data/lib/greensms/api/module.rb +37 -0
- data/lib/greensms/api/module_loader.rb +89 -0
- data/lib/greensms/api/modules.rb +153 -0
- data/lib/greensms/api/schema.rb +186 -0
- data/lib/greensms/client.rb +100 -0
- data/lib/greensms/constants.rb +10 -0
- data/lib/greensms/http/error.rb +32 -0
- data/lib/greensms/http/rest.rb +86 -0
- data/lib/greensms/utils/str.rb +24 -0
- data/lib/greensms/utils/url.rb +17 -0
- data/lib/greensms/utils/validator.rb +12 -0
- data/lib/greensms/utils/version.rb +18 -0
- data/lib/greensms/version.rb +3 -0
- metadata +141 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
require "greensms/version"
|
2
|
+
require "greensms/utils/str"
|
3
|
+
require "greensms/utils/url"
|
4
|
+
require "greensms/utils/version"
|
5
|
+
require "greensms/http/rest"
|
6
|
+
require "greensms/api/module_loader"
|
7
|
+
|
8
|
+
module GreenSMS
|
9
|
+
class Error < StandardError; end
|
10
|
+
|
11
|
+
class MethodInvoker
|
12
|
+
end
|
13
|
+
|
14
|
+
class GreenSMSClient
|
15
|
+
attr_reader :call
|
16
|
+
attr_reader :voice
|
17
|
+
|
18
|
+
def initialize(user: nil, pass: nil, token: nil, version: nil, camel_case_response: false, use_token_for_requests: false)
|
19
|
+
@user = ENV.fetch("GREENSMS_USER", user)
|
20
|
+
@pass = ENV.fetch("GREENSMS_PASS", pass)
|
21
|
+
@token = ENV.fetch("GREENSMS_TOKEN", token)
|
22
|
+
|
23
|
+
@version = version
|
24
|
+
@camel_case_response = camel_case_response
|
25
|
+
@use_token_for_requests = use_token_for_requests
|
26
|
+
|
27
|
+
if !GreenSMS.is_null_or_empty(@token)
|
28
|
+
@user = ""
|
29
|
+
@password = ""
|
30
|
+
end
|
31
|
+
|
32
|
+
if GreenSMS.is_null_or_empty(@token) and (GreenSMS.is_null_or_empty(@user) || GreenSMS.is_null_or_empty(@pass))
|
33
|
+
raise StandardError.new "Either User/Pass or Auth Token is required!"
|
34
|
+
end
|
35
|
+
|
36
|
+
shared_options = {
|
37
|
+
"use_token_for_requests" => @use_token_for_requests,
|
38
|
+
"version" => GreenSMS.get_version(@version),
|
39
|
+
"rest_client" => _get_http_client(use_camel_case: @camel_case_response),
|
40
|
+
"base_url" => GreenSMS.base_url(),
|
41
|
+
}
|
42
|
+
|
43
|
+
_add_modules(shared_options)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def _add_modules(shared_options)
|
49
|
+
module_loader = GreenSMS::API::ModuleLoader.new
|
50
|
+
modules = module_loader.register_modules(shared_options)
|
51
|
+
build_module_invoker(self, modules, "root")
|
52
|
+
end
|
53
|
+
|
54
|
+
def build_module_invoker(obj, hash, obj_name)
|
55
|
+
hash.each do |key_name, key_value|
|
56
|
+
if key_value.is_a?(Hash)
|
57
|
+
new_item = MethodInvoker.new
|
58
|
+
build_module_invoker(new_item, key_value, key_name)
|
59
|
+
obj.instance_variable_set("@#{key_name}", new_item)
|
60
|
+
obj.instance_eval %{
|
61
|
+
def #{key_name}
|
62
|
+
instance_variable_get("@#{key_name}")
|
63
|
+
end
|
64
|
+
}
|
65
|
+
else
|
66
|
+
func = key_value.clone
|
67
|
+
obj.instance_variable_set("@#{key_name}", func.method(:api_func))
|
68
|
+
|
69
|
+
obj.instance_eval %{
|
70
|
+
def #{key_name}(*args)
|
71
|
+
instance_variable_get("@#{key_name}").call(*args)
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def _get_http_client(**kwargs)
|
79
|
+
default_params = {}
|
80
|
+
|
81
|
+
if GreenSMS.is_null_or_empty(@token) && !GreenSMS.is_null_or_empty(@user)
|
82
|
+
default_params["user"] = @user
|
83
|
+
default_params["pass"] = @pass
|
84
|
+
end
|
85
|
+
|
86
|
+
http_args = {
|
87
|
+
'default_params': default_params,
|
88
|
+
'default_data': {},
|
89
|
+
'token': @token,
|
90
|
+
}
|
91
|
+
|
92
|
+
kwargs.each do |key, val|
|
93
|
+
http_args[key] = val
|
94
|
+
end
|
95
|
+
|
96
|
+
rest_client = GreenSMS::Http::Client.new(http_args)
|
97
|
+
return rest_client
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module GreenSMS
|
2
|
+
class RestError < StandardError
|
3
|
+
attr_reader :params
|
4
|
+
attr_reader :code
|
5
|
+
attr_reader :error_type
|
6
|
+
|
7
|
+
def initialize(msg = "RestError", code = 9, params = {})
|
8
|
+
@code = code
|
9
|
+
@name = "RestError"
|
10
|
+
@params = params
|
11
|
+
@error_type = _get_error_type(code)
|
12
|
+
super(msg)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def _get_error_type(code)
|
18
|
+
case code
|
19
|
+
when 0
|
20
|
+
return "AUTH_DECLINED"
|
21
|
+
when 1
|
22
|
+
return "MISSING_INPUT_PARAM"
|
23
|
+
when 2
|
24
|
+
return "INVALID_INPUT_PARAM"
|
25
|
+
when 404
|
26
|
+
return "NOT_FOUND"
|
27
|
+
else
|
28
|
+
return "INTERNAL_SERVER_ERROR"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "json"
|
3
|
+
require "greensms/utils/str"
|
4
|
+
require "greensms/http/error"
|
5
|
+
|
6
|
+
module GreenSMS
|
7
|
+
module Http
|
8
|
+
class Client
|
9
|
+
def initialize(opts)
|
10
|
+
@token = nil
|
11
|
+
@default_data = {}
|
12
|
+
@default_params = {}
|
13
|
+
@use_camel_case = false
|
14
|
+
|
15
|
+
opts.each { |name, value| instance_variable_set("@#{name}", value) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def request(kwargs)
|
19
|
+
if !kwargs.has_key? "method"
|
20
|
+
raise StandardError.new "Http Method is required"
|
21
|
+
end
|
22
|
+
method = kwargs["method"]
|
23
|
+
|
24
|
+
if !kwargs.has_key? "url"
|
25
|
+
raise StandardError.new "URL is required"
|
26
|
+
end
|
27
|
+
|
28
|
+
url = kwargs["url"]
|
29
|
+
|
30
|
+
kwargs.delete("url")
|
31
|
+
kwargs.delete("method")
|
32
|
+
|
33
|
+
headers = {}
|
34
|
+
if kwargs.has_key? "headers"
|
35
|
+
kwargs["headers"].each { |name, value| headers[name] = value }
|
36
|
+
end
|
37
|
+
|
38
|
+
if !GreenSMS.is_null_or_empty(@token)
|
39
|
+
headers["Authorization"] = "Bearer " + @token
|
40
|
+
end
|
41
|
+
|
42
|
+
params = {}
|
43
|
+
|
44
|
+
@connection = Faraday.new(url: url) do |f|
|
45
|
+
f.request :multipart
|
46
|
+
f.request :url_encoded
|
47
|
+
f.headers = headers
|
48
|
+
f.adapter Faraday.default_adapter
|
49
|
+
end
|
50
|
+
|
51
|
+
if !@default_params.empty?
|
52
|
+
@default_params.each { |name, value| params[name] = value }
|
53
|
+
end
|
54
|
+
|
55
|
+
if kwargs.has_key? "params"
|
56
|
+
kwargs["params"].each { |name, value| params[name] = value }
|
57
|
+
end
|
58
|
+
|
59
|
+
d = {}
|
60
|
+
if method == "POST"
|
61
|
+
d = d.to_json
|
62
|
+
end
|
63
|
+
|
64
|
+
url = url + "?" + hash_to_query(params)
|
65
|
+
|
66
|
+
resp = @connection.send(method.downcase.to_sym, url, d)
|
67
|
+
resp = JSON.parse resp.body
|
68
|
+
if resp.has_key? "error"
|
69
|
+
raise RestError.new(resp["error"], resp["code"])
|
70
|
+
end
|
71
|
+
|
72
|
+
if @use_camel_case
|
73
|
+
resp = GreenSMS.camelize(resp)
|
74
|
+
end
|
75
|
+
|
76
|
+
return resp
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def hash_to_query(hash)
|
82
|
+
return hash.map { |k, v| "#{k}=#{v}" }.join("&")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module GreenSMS
|
2
|
+
def GreenSMS.is_null_or_empty(input)
|
3
|
+
if input.nil?
|
4
|
+
return true
|
5
|
+
elsif input.empty?
|
6
|
+
return true
|
7
|
+
else
|
8
|
+
return false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def GreenSMS.camelize(value)
|
13
|
+
case value
|
14
|
+
when Array
|
15
|
+
value.map { |v| GreenSMS.camelize(v) }
|
16
|
+
when Hash
|
17
|
+
Hash[value.map { |k, v| [GreenSMS.camelize(k), GreenSMS.camelize(v)] }]
|
18
|
+
when String
|
19
|
+
value.split("_").inject { |m, p| m + p.capitalize }
|
20
|
+
else
|
21
|
+
value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "greensms/constants"
|
2
|
+
require "greensms/utils/str"
|
3
|
+
|
4
|
+
module GreenSMS
|
5
|
+
def GreenSMS.base_url()
|
6
|
+
return GreenSMS::BASE_URL
|
7
|
+
end
|
8
|
+
|
9
|
+
def GreenSMS.build_url(base_url, url_parts)
|
10
|
+
if GreenSMS.is_null_or_empty(base_url)
|
11
|
+
raise StandardError.new "Base URL cannot be empty"
|
12
|
+
end
|
13
|
+
|
14
|
+
url = base_url + "/" + url_parts.join("/")
|
15
|
+
return url
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "json-schema"
|
2
|
+
require "greensms/http/error"
|
3
|
+
|
4
|
+
module GreenSMS
|
5
|
+
def GreenSMS.validate(schema, data)
|
6
|
+
res = JSON::Validator.fully_validate(schema, data, :errors_as_objects => true)
|
7
|
+
if !res.nil? && res.length > 0
|
8
|
+
raise RestError.new("Validation Error", 1, res)
|
9
|
+
end
|
10
|
+
return nil
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "greensms/constants"
|
2
|
+
require "greensms/utils/str"
|
3
|
+
|
4
|
+
module GreenSMS
|
5
|
+
def GreenSMS.get_version(version)
|
6
|
+
if GreenSMS::is_null_or_empty(version)
|
7
|
+
version = GreenSMS::VERSIONS["v1"]
|
8
|
+
end
|
9
|
+
|
10
|
+
version = version.downcase
|
11
|
+
if GreenSMS::VERSIONS.has_key? version
|
12
|
+
version = GreenSMS::VERSIONS[version]
|
13
|
+
else
|
14
|
+
raise StandardError.new "Invalid Version"
|
15
|
+
end
|
16
|
+
return version
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: greensms
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Team GreenSMS
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json-schema
|
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: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: 'GREENSMS API: SMS, Viber, Voce, Call, HLR, Pay'
|
70
|
+
email:
|
71
|
+
- support@greensms.ru
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".github/workflows/ruby.yml"
|
77
|
+
- ".gitignore"
|
78
|
+
- ".travis.yml"
|
79
|
+
- CODE_OF_CONDUCT.md
|
80
|
+
- Gemfile
|
81
|
+
- Gemfile.lock
|
82
|
+
- LICENSE.txt
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- bin/console
|
86
|
+
- bin/setup
|
87
|
+
- examples/account.rb
|
88
|
+
- examples/call.rb
|
89
|
+
- examples/env.rb
|
90
|
+
- examples/general.rb
|
91
|
+
- examples/hlr.rb
|
92
|
+
- examples/init.rb
|
93
|
+
- examples/pay.rb
|
94
|
+
- examples/sms.rb
|
95
|
+
- examples/social.rb
|
96
|
+
- examples/token.rb
|
97
|
+
- examples/viber.rb
|
98
|
+
- examples/voice.rb
|
99
|
+
- examples/whois.rb
|
100
|
+
- greensms.gemspec
|
101
|
+
- lib/greensms.rb
|
102
|
+
- lib/greensms/api/module.rb
|
103
|
+
- lib/greensms/api/module_loader.rb
|
104
|
+
- lib/greensms/api/modules.rb
|
105
|
+
- lib/greensms/api/schema.rb
|
106
|
+
- lib/greensms/client.rb
|
107
|
+
- lib/greensms/constants.rb
|
108
|
+
- lib/greensms/http/error.rb
|
109
|
+
- lib/greensms/http/rest.rb
|
110
|
+
- lib/greensms/utils/str.rb
|
111
|
+
- lib/greensms/utils/url.rb
|
112
|
+
- lib/greensms/utils/validator.rb
|
113
|
+
- lib/greensms/utils/version.rb
|
114
|
+
- lib/greensms/version.rb
|
115
|
+
homepage: https://github.com/greensms-ru/greensms-ruby
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata:
|
119
|
+
homepage_uri: https://github.com/greensms-ru/greensms-ruby
|
120
|
+
source_code_uri: https://github.com/greensms-ru/greensms-ruby
|
121
|
+
changelog_uri: https://github.com/greensms-ru/greensms-ruby
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 2.3.0
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubygems_version: 3.1.2
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: GreenSMS Ruby Gem
|
141
|
+
test_files: []
|