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,11 @@
1
+ require_relative "init"
2
+
3
+ @client = Example::CLIENT
4
+
5
+ puts "Fetch Token"
6
+ token_resp = @client.account.token(token: 100)
7
+ token = token_resp["access_token"]
8
+
9
+ puts "Run with Token"
10
+ @token_client = GreenSMS::GreenSMSClient.new(token: token)
11
+ puts @token_client.status
@@ -0,0 +1,11 @@
1
+ require_relative "init"
2
+
3
+ @client = Example::CLIENT
4
+
5
+ puts "Viber Send"
6
+ resp = @client.viber.send(to: "79260000121", txt: "Hello Message Content")
7
+ puts resp
8
+
9
+ sleep(3)
10
+ puts "Viber Status"
11
+ puts @client.viber.status(id: resp["request_id"])
@@ -0,0 +1,11 @@
1
+ require_relative "init"
2
+
3
+ @client = Example::CLIENT
4
+
5
+ puts "Voice Send"
6
+ resp = @client.voice.send(to: "79260000121", txt: "8601")
7
+ puts resp
8
+
9
+ sleep(3)
10
+ puts "Voice Status"
11
+ puts @client.voice.status(id: resp["request_id"])
@@ -0,0 +1,6 @@
1
+ require_relative "init"
2
+
3
+ @client = Example::CLIENT
4
+
5
+ puts "Whois Lookup"
6
+ puts @client.whois.lookup(to: "79260000000")
@@ -0,0 +1,33 @@
1
+ require_relative "lib/greensms/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "greensms"
5
+ spec.version = GreenSMS::VERSION
6
+ spec.platform = Gem::Platform::RUBY
7
+ spec.authors = ["Team GreenSMS"]
8
+ spec.email = ["support@greensms.ru"]
9
+
10
+ spec.summary = "GreenSMS Ruby Gem"
11
+ spec.description = "GREENSMS API: SMS, Viber, Voce, Call, HLR, Pay"
12
+ spec.homepage = "https://github.com/greensms-ru/greensms-ruby"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = spec.homepage
19
+
20
+ spec.add_development_dependency "bundler", ">= 1.0.0"
21
+ spec.add_dependency "faraday"
22
+ spec.add_dependency "json-schema"
23
+ spec.add_dependency "rake"
24
+
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+ end
@@ -0,0 +1,6 @@
1
+ require "greensms/version"
2
+ require "greensms/client"
3
+
4
+ module GreenSMS
5
+ class Error < StandardError; end
6
+ end
@@ -0,0 +1,37 @@
1
+ require "greensms/utils/validator"
2
+
3
+ module GreenSMS
4
+ module API
5
+ class Module
6
+ attr_reader :module_schema
7
+ attr_reader :module_name
8
+ attr_reader :function_name
9
+
10
+ def initialize(rest_client, module_schema, kwargs, module_name, function_name)
11
+ @rest_client = rest_client
12
+ @module_schema = module_schema
13
+ @params = {}
14
+ kwargs.each { |name, value| @params[name] = value }
15
+ end
16
+
17
+ def api_func(kwargs = {})
18
+ kwargs = kwargs.transform_keys(&:to_s)
19
+
20
+ if !@module_schema.nil?
21
+ errors = GreenSMS.validate(@module_schema, kwargs)
22
+ if !errors.nil?
23
+ return errors
24
+ end
25
+ end
26
+
27
+ api_params = {}
28
+ kwargs.each { |name, value| api_params[name] = value }
29
+ request_params = @params.clone
30
+ request_params["params"] = api_params
31
+
32
+ response = @rest_client.request(request_params)
33
+ return response
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,89 @@
1
+ require "greensms/api/modules"
2
+ require "greensms/api/module"
3
+ require "greensms/utils/url"
4
+
5
+ module GreenSMS
6
+ module API
7
+ class ModuleLoader
8
+ def initialize()
9
+ @module_map = {}
10
+ end
11
+
12
+ def register_modules(shared_options, filters = {})
13
+ if filters.nil?
14
+ filters = {}
15
+ end
16
+
17
+ current_version = shared_options["version"]
18
+ modules = GreenSMS::MODULES
19
+
20
+ modules.each do |module_name, module_info|
21
+ if !@module_map.has_key?(module_name.to_sym)
22
+ @module_map[module_name] = {}
23
+ end
24
+
25
+ module_versions = module_info["versions"]
26
+ module_schema = nil
27
+
28
+ is_static_module = filters.has_key?("load_static") && module_info.has_key?("static") && filters["load_static"] == true && module_info["static"] = true
29
+
30
+ next if is_static_module
31
+
32
+ module_versions.each do |version, version_functions|
33
+ if !@module_map[module_name].has_key?(version)
34
+ @module_map[module_name][version] = {}
35
+ end
36
+
37
+ version_functions.each do |function_name, definition|
38
+ if !@module_map[module_name][version].has_key?(function_name)
39
+ @module_map[module_name][version][function_name] = {}
40
+ end
41
+
42
+ module_schema = nil
43
+ schema_exists = module_info.has_key?("schema") && module_info["schema"].has_key?(version) && module_info["schema"][version].has_key?(function_name)
44
+ if schema_exists == true
45
+ module_schema = module_info["schema"][version][function_name]
46
+ end
47
+
48
+ url_args = []
49
+ if !module_info.has_key?("static") || module_info["static"] != true
50
+ url_args.append(module_name)
51
+ end
52
+ url_args.append(function_name)
53
+
54
+ api_url = GreenSMS.build_url(shared_options["base_url"], url_args)
55
+ @module_map[module_name][version][function_name] = module_api(
56
+ shared_options: shared_options, api_url: api_url, definition: definition, module_schema: module_schema, module_name: module_name, function_name: function_name,
57
+ )
58
+
59
+ if version == current_version
60
+ @module_map[module_name][function_name] = @module_map[module_name][version][function_name]
61
+ end
62
+
63
+ if module_info.has_key?("static") && module_info["static"] == true
64
+ @module_map[function_name] = @module_map[module_name][version][function_name]
65
+ @module_map.delete(module_name)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ return @module_map
71
+ end
72
+
73
+ private
74
+
75
+ def module_api(kwargs)
76
+ rest_client = kwargs[:shared_options]["rest_client"]
77
+ module_schema = kwargs[:module_schema]
78
+
79
+ request_params = {
80
+ "url" => kwargs[:api_url],
81
+ "method" => kwargs[:definition]["method"],
82
+ }
83
+
84
+ mod = GreenSMS::API::Module.new(rest_client, module_schema, request_params, kwargs[:module_name], kwargs[:function_name])
85
+ return mod # Return the module instance
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,153 @@
1
+ require "greensms/api/schema"
2
+
3
+ module GreenSMS
4
+ MODULES = {
5
+ "account" => {
6
+ "schema" => GreenSMS::VALIDATION_SCHEMA["account"],
7
+ "versions" => {
8
+ "v1" => {
9
+ "balance" => {
10
+ "args" => nil,
11
+ "method" => "GET",
12
+ },
13
+ "token" => {
14
+ "args" => ["params"],
15
+ "method" => "POST",
16
+ },
17
+ "tariff" => {
18
+ "args" => nil,
19
+ "method" => "GET",
20
+ },
21
+ },
22
+ },
23
+ },
24
+ "general" => {
25
+ "schema" => {},
26
+ "static" => true,
27
+ "versions" => {
28
+ "v1" => {
29
+ "status" => {
30
+ "args" => nil,
31
+ "method" => "GET",
32
+ },
33
+ },
34
+ },
35
+ },
36
+ "call" => {
37
+ "schema" => GreenSMS::VALIDATION_SCHEMA["call"],
38
+ "versions" => {
39
+ "v1" => {
40
+ "send" => {
41
+ "args" => ["params"],
42
+ "method" => "POST",
43
+ },
44
+ "status" => {
45
+ "args" => ["params"],
46
+ "method" => "GET",
47
+ },
48
+ },
49
+ },
50
+ },
51
+ "whois" => {
52
+ "schema" => GreenSMS::VALIDATION_SCHEMA["whois"],
53
+ "versions" => {
54
+ "v1" => {
55
+ "lookup" => {
56
+ "args" => ["params"],
57
+ "method" => "GET",
58
+ },
59
+ },
60
+ },
61
+ },
62
+ "voice" => {
63
+ "schema" => GreenSMS::VALIDATION_SCHEMA["voice"],
64
+ "versions" => {
65
+ "v1" => {
66
+ "send" => {
67
+ "args" => ["params"],
68
+ "method" => "POST",
69
+ },
70
+ "status" => {
71
+ "args" => ["params"],
72
+ "method" => "GET",
73
+ },
74
+ },
75
+ },
76
+ },
77
+ "pay" => {
78
+ "schema" => GreenSMS::VALIDATION_SCHEMA["pay"],
79
+ "versions" => {
80
+ "v1" => {
81
+ "send" => {
82
+ "args" => ["params"],
83
+ "method" => "POST",
84
+ },
85
+ "status" => {
86
+ "args" => ["params"],
87
+ "method" => "GET",
88
+ },
89
+ },
90
+ },
91
+ },
92
+ "hlr" => {
93
+ "schema" => GreenSMS::VALIDATION_SCHEMA["hlr"],
94
+ "versions" => {
95
+ "v1" => {
96
+ "send" => {
97
+ "args" => ["params"],
98
+ "method" => "POST",
99
+ },
100
+ "status" => {
101
+ "args" => ["params"],
102
+ "method" => "GET",
103
+ },
104
+ },
105
+ },
106
+ },
107
+ "sms" => {
108
+ "schema" => GreenSMS::VALIDATION_SCHEMA["sms"],
109
+ "versions" => {
110
+ "v1" => {
111
+ "send" => {
112
+ "args" => ["params"],
113
+ "method" => "POST",
114
+ },
115
+ "status" => {
116
+ "args" => ["params"],
117
+ "method" => "GET",
118
+ },
119
+ },
120
+ },
121
+ },
122
+ "viber" => {
123
+ "schema" => GreenSMS::VALIDATION_SCHEMA["viber"],
124
+ "versions" => {
125
+ "v1" => {
126
+ "send" => {
127
+ "args" => ["params"],
128
+ "method" => "POST",
129
+ },
130
+ "status" => {
131
+ "args" => ["params"],
132
+ "method" => "GET",
133
+ },
134
+ },
135
+ },
136
+ },
137
+ "social" => {
138
+ "schema" => GreenSMS::VALIDATION_SCHEMA["social"],
139
+ "versions" => {
140
+ "v1" => {
141
+ "send" => {
142
+ "args" => ["params"],
143
+ "method" => "POST",
144
+ },
145
+ "status" => {
146
+ "args" => ["params"],
147
+ "method" => "GET",
148
+ },
149
+ },
150
+ },
151
+ },
152
+ }
153
+ end
@@ -0,0 +1,186 @@
1
+ module GreenSMS
2
+ class ::Hash
3
+ def deep_merge(second)
4
+ merger = proc { |_, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
5
+ merge(second.to_h, &merger)
6
+ end
7
+ end
8
+
9
+ to_schema = {
10
+ "type" => "string",
11
+ "minlength" => 11,
12
+ "maxlength" => 14,
13
+ "pattern" => "^[0-9]+",
14
+ }
15
+
16
+ id_schema = {
17
+ "type" => "string",
18
+ "minlength" => 36,
19
+ "maxlength" => 36,
20
+ }
21
+
22
+ common_schema = {
23
+ "v1" => {
24
+ "send" => {
25
+ "type" => "object",
26
+ "required" => ["to"],
27
+ "properties" => {
28
+ "to" => to_schema,
29
+ },
30
+ },
31
+ "status" => {
32
+ "type" => "object",
33
+ "required" => ["id"],
34
+ "properties" => {
35
+ "id" => id_schema,
36
+ "extended" => {
37
+ "type" => "boolean",
38
+ },
39
+ },
40
+ },
41
+ },
42
+ }
43
+
44
+ VALIDATION_SCHEMA = {
45
+ "account" => {
46
+ "v1" => {
47
+ "token" => {
48
+ "type" => "object",
49
+ "required" => [],
50
+ "properties" => {
51
+ "expire" => {
52
+ "type" => "integer",
53
+ "minimum" => 0,
54
+ },
55
+ },
56
+ },
57
+ },
58
+ },
59
+ "call" => common_schema.clone,
60
+ "hlr" => common_schema.clone,
61
+ "whois" => {
62
+ "v1" => {
63
+ "lookup" => {
64
+ "type" => "object",
65
+ "required" => ["to"],
66
+ "properties" => {
67
+ "to" => to_schema,
68
+ },
69
+ },
70
+ },
71
+ },
72
+ "general" => {},
73
+ "voice" => common_schema.clone.deep_merge(
74
+ {
75
+ "v1" => {
76
+ "send" => {
77
+ "type" => "object",
78
+ "required" => ["txt"],
79
+ "properties" => {
80
+ "txt" => {
81
+ "type" => "string",
82
+ "minlength" => 1,
83
+ "maxlength" => 5,
84
+ "pattern" => "^[0-9]+",
85
+ },
86
+ "lang" => {
87
+ "type" => "string",
88
+ # "allowed" => ["ru", "en"],
89
+ },
90
+ },
91
+ },
92
+ },
93
+ }
94
+ ),
95
+ "pay" => common_schema.clone.deep_merge({
96
+ "v1" => {
97
+ "send" => {
98
+ "type" => "object",
99
+ "required" => ["amount"],
100
+ "properties" => {
101
+ "amount" => {
102
+ "type" => "number",
103
+ "min" => 1,
104
+ },
105
+ "tag" => {
106
+ "type" => "string",
107
+ },
108
+ },
109
+ },
110
+ },
111
+ }),
112
+ "sms" => common_schema.clone.deep_merge(
113
+ {
114
+ "v1" => {
115
+ "send" => {
116
+ "type" => "object",
117
+ "required" => ["txt"],
118
+ "properties" => {
119
+ "txt" => {
120
+ "type" => "string",
121
+ "minlength" => 1,
122
+ },
123
+ "from" => {
124
+ "type" => "string",
125
+ },
126
+ "tag" => {
127
+ "type" => "string",
128
+ },
129
+ "hidden" => {
130
+ "type" => "string",
131
+ },
132
+ },
133
+ },
134
+ },
135
+ }
136
+ ),
137
+ "viber" => common_schema.clone.deep_merge(
138
+ {
139
+ "v1" => {
140
+ "send" => {
141
+ "type" => "object",
142
+ "required" => ["txt"],
143
+ "properties" => {
144
+ "txt" => {
145
+ "type" => "string",
146
+ "minlength" => 1,
147
+ },
148
+ "from" => {
149
+ "type" => "string",
150
+ },
151
+ "cascade" => {
152
+ "type" => "string",
153
+ "allowed" => ["sms", "voice"],
154
+ },
155
+ },
156
+ },
157
+ },
158
+ }
159
+ ),
160
+ "social" => common_schema.clone.deep_merge(
161
+ {
162
+ "v1" => {
163
+ "send" => {
164
+ "type" => "object",
165
+ "required" => ["txt"],
166
+ "properties" => {
167
+ "txt" => {
168
+ "type" => "string",
169
+ "minlength" => 1,
170
+ },
171
+ "from" => {
172
+ "type" => "string",
173
+ },
174
+ "tag" => {
175
+ "type" => "string",
176
+ },
177
+ "hidden" => {
178
+ "type" => "string",
179
+ },
180
+ },
181
+ },
182
+ },
183
+ }
184
+ ),
185
+ }
186
+ end