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
data/examples/token.rb
ADDED
@@ -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
|
data/examples/viber.rb
ADDED
data/examples/voice.rb
ADDED
data/examples/whois.rb
ADDED
data/greensms.gemspec
ADDED
@@ -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
|
data/lib/greensms.rb
ADDED
@@ -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
|