greensms 0.1.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,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: []