greensms 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,10 @@
1
+ module GreenSMS
2
+ BASE_URL = "https://api3.greensms.ru"
3
+
4
+ VERSIONS = {
5
+ "v1" => "v1",
6
+ }
7
+
8
+ RES_STATUS_ACCEPTED = "Accepted"
9
+ RES_STATUS_DELAYED = "Delayed"
10
+ 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
@@ -0,0 +1,3 @@
1
+ module GreenSMS
2
+ VERSION = "0.1.0"
3
+ 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: []