sms77 0.0.1 → 0.4.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -2
- data/README.md +26 -6
- data/lib/sms77.rb +0 -1
- data/lib/sms77/client.rb +18 -87
- data/lib/sms77/{contacts_action.rb → contacts.rb} +2 -2
- data/lib/sms77/endpoint.rb +12 -12
- data/lib/sms77/hooks.rb +64 -0
- data/lib/sms77/journal.rb +38 -0
- data/lib/sms77/{lookup_type.rb → lookup.rb} +2 -2
- data/lib/sms77/resource.rb +93 -0
- data/lib/sms77/resources/analytics.rb +16 -0
- data/lib/sms77/resources/balance.rb +16 -0
- data/lib/sms77/resources/contacts.rb +26 -0
- data/lib/sms77/resources/hooks.rb +30 -0
- data/lib/sms77/resources/journal.rb +16 -0
- data/lib/sms77/resources/lookup.rb +30 -0
- data/lib/sms77/resources/pricing.rb +16 -0
- data/lib/sms77/resources/sms.rb +16 -0
- data/lib/sms77/resources/status.rb +16 -0
- data/lib/sms77/resources/validate_for_voice.rb +16 -0
- data/lib/sms77/resources/voice.rb +16 -0
- data/lib/sms77/sms.rb +8 -0
- data/lib/sms77/util.rb +68 -0
- data/lib/sms77/version.rb +1 -1
- data/release.sh +8 -0
- data/sms77.gemspec +13 -16
- data/spec/EnvKeyStore.rb +15 -0
- data/spec/matchers.rb +23 -0
- data/spec/sms77/balance_spec.rb +4 -7
- data/spec/sms77/client_spec.rb +15 -0
- data/spec/sms77/contacts_spec.rb +22 -24
- data/spec/sms77/hooks_spec.rb +106 -0
- data/spec/sms77/instance_spec.rb +20 -0
- data/spec/sms77/journal_spec.rb +86 -0
- data/spec/sms77/lookup_spec.rb +73 -82
- data/spec/sms77/pricing_spec.rb +25 -29
- data/spec/sms77/sms_spec.rb +20 -20
- data/spec/sms77/validate_for_voice_spec.rb +6 -6
- data/spec/sms77/voice_spec.rb +11 -8
- data/spec/sms77_spec.rb +0 -8
- data/spec/spec_helper.rb +31 -34
- metadata +60 -25
- data/lib/sms77/header.rb +0 -7
- data/spec/sms77/http_spec.rb +0 -40
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Balance < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::BALANCE
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :get,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve
|
13
|
+
request
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Contacts < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::CONTACTS
|
8
|
+
@http_methods = {
|
9
|
+
:delete => :post,
|
10
|
+
:read => :get,
|
11
|
+
:write => :post,
|
12
|
+
}
|
13
|
+
|
14
|
+
def read(params = {})
|
15
|
+
request(params.merge({ :action => Sms77::Contacts::Action::READ }))
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(params)
|
19
|
+
request({}, params.merge({ :action => Sms77::Contacts::Action::DEL }))
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(params)
|
23
|
+
request({}, params.merge({ :action => Sms77::Contacts::Action::WRITE }))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Hooks < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::HOOKS
|
8
|
+
@http_methods = {
|
9
|
+
:read => :get,
|
10
|
+
:subscribe => :post,
|
11
|
+
:unsubscribe => :post,
|
12
|
+
}
|
13
|
+
|
14
|
+
def read(params = {})
|
15
|
+
request(params.merge({ :action => Sms77::Hooks::Action::READ }))
|
16
|
+
end
|
17
|
+
|
18
|
+
def subscribe(params)
|
19
|
+
Sms77::Hooks::Validator::subscribe(params)
|
20
|
+
|
21
|
+
request(params.merge({ :action => Sms77::Hooks::Action::SUBSCRIBE }))
|
22
|
+
end
|
23
|
+
|
24
|
+
def unsubscribe(params)
|
25
|
+
Sms77::Hooks::Validator::unsubscribe(params)
|
26
|
+
|
27
|
+
request(params.merge({ :action => Sms77::Hooks::Action::UNSUBSCRIBE }))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Journal < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::JOURNAL
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :get,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve(params)
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
module Sms77::Resources
|
5
|
+
class Lookup < Sms77::Resource
|
6
|
+
@endpoint = Sms77::Endpoint::LOOKUP
|
7
|
+
@http_methods = {
|
8
|
+
:cnam => :post,
|
9
|
+
:format => :post,
|
10
|
+
:hlr => :post,
|
11
|
+
:mnp => :post,
|
12
|
+
}
|
13
|
+
|
14
|
+
def cnam(params)
|
15
|
+
request(params.merge({ :type => Sms77::Lookup::Type::CNAM }))
|
16
|
+
end
|
17
|
+
|
18
|
+
def format(params)
|
19
|
+
request(params.merge({ :type => Sms77::Lookup::Type::FORMAT }))
|
20
|
+
end
|
21
|
+
|
22
|
+
def hlr(params)
|
23
|
+
request(params.merge({ :type => Sms77::Lookup::Type::HLR }))
|
24
|
+
end
|
25
|
+
|
26
|
+
def mnp(params)
|
27
|
+
request(params.merge({ :type => Sms77::Lookup::Type::MNP }))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Pricing < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::PRICING
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :get,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve(params = {})
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Sms < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::SMS
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :post,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve(params)
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Status < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::STATUS
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :get,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve(params)
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class ValidateForVoice < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::VALIDATE_FOR_VOICE
|
8
|
+
@http_methods = {
|
9
|
+
:retrieve => :post,
|
10
|
+
}
|
11
|
+
|
12
|
+
def retrieve(params)
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/resource'
|
4
|
+
|
5
|
+
module Sms77::Resources
|
6
|
+
class Voice < Sms77::Resource
|
7
|
+
@endpoint = Sms77::Endpoint::VOICE
|
8
|
+
@http_methods = {
|
9
|
+
:send => :post,
|
10
|
+
}
|
11
|
+
|
12
|
+
def send(params)
|
13
|
+
request(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/sms77/sms.rb
ADDED
data/lib/sms77/util.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Sms77::Util
|
4
|
+
def self.to_numbered_bool(val)
|
5
|
+
if true == val
|
6
|
+
return 1
|
7
|
+
elsif false == val
|
8
|
+
return 0
|
9
|
+
end
|
10
|
+
|
11
|
+
return val
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_namespace_members_by_type(ns, type)
|
15
|
+
ns.constants.map(&ns.method(:const_get)).grep(type)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.get_namespace_classes(ns)
|
19
|
+
return self.get_namespace_members_by_type(ns, Class)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_module_constant_values(mod)
|
23
|
+
mod.constants(false).map &mod.method(:const_get)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.is_valid_url?(str)
|
27
|
+
str =~ URI::regexp
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.is_valid_datetime?(str)
|
31
|
+
begin
|
32
|
+
DateTime.parse(str)
|
33
|
+
true
|
34
|
+
rescue ArgumentError
|
35
|
+
false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.is_positive_integer?(val)
|
40
|
+
/\A\d+\z/.match?(val.to_s)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.in_module_constants?(needle, mod)
|
44
|
+
get_module_constant_values(mod).include?(needle)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.valid_float?(str)
|
48
|
+
!!Float(str) rescue false
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.numeric?(val)
|
52
|
+
return true if val.is_a?(Integer)
|
53
|
+
|
54
|
+
val.scan(/\D/).empty?
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.boolean?(val)
|
58
|
+
[true, false].include? val
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.nil_or_lengthy_string?(val)
|
62
|
+
val.nil? || (val.is_a?(String) && val.length)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.lengthy_string?(val)
|
66
|
+
return val.is_a?(String) && !val.empty?
|
67
|
+
end
|
68
|
+
end
|
data/lib/sms77/version.rb
CHANGED
data/release.sh
ADDED
data/sms77.gemspec
CHANGED
@@ -4,22 +4,19 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'sms77/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.
|
8
|
-
spec.
|
9
|
-
spec.
|
7
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
8
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
9
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
10
|
+
spec.add_runtime_dependency 'faraday', '~> 1.1'
|
11
|
+
spec.author = 'sms77 e.K.'
|
10
12
|
spec.description = 'Send SMS & Text2Voice messages via the Sms77.io SMS Gateway.'
|
11
|
-
spec.
|
12
|
-
spec.
|
13
|
+
spec.email = 'support@sms77.io'
|
14
|
+
spec.files = `git ls-files`.split("\n")
|
13
15
|
spec.homepage = 'https://github.com/sms77io/ruby-client'
|
14
16
|
spec.license = 'MIT'
|
15
|
-
spec.
|
16
|
-
spec.
|
17
|
-
spec.
|
18
|
-
spec.test_files = Dir['
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
spec.add_development_dependency 'bundler', '~> 2.1'
|
23
|
-
spec.add_development_dependency 'rake', '~> 13'
|
24
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
25
|
-
end
|
17
|
+
spec.name = 'sms77'
|
18
|
+
spec.required_ruby_version = '>= 2.6.0'
|
19
|
+
spec.summary = 'Official API Client for the Sms77.io SMS Gateway'
|
20
|
+
spec.test_files = Dir['spec/**/*']
|
21
|
+
spec.version = Sms77::VERSION
|
22
|
+
end
|
data/spec/EnvKeyStore.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
class EnvKeyStore
|
2
|
+
def initialize(key)
|
3
|
+
@key = "SMS77_TEST_#{key}"
|
4
|
+
|
5
|
+
@store = ENV[@key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(fallback = nil)
|
9
|
+
@store.nil? ? fallback : @store
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(val, only_on_nil = false)
|
13
|
+
@store = val unless only_on_nil
|
14
|
+
end
|
15
|
+
end
|
data/spec/matchers.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
RSpec::Matchers.define :be_nil_or_lengthy_string do
|
2
|
+
match do |val|
|
3
|
+
Sms77::Util::nil_or_lengthy_string?(val)
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
RSpec::Matchers.define :be_boolean do
|
8
|
+
match do |val|
|
9
|
+
Sms77::Util::boolean?(val)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
RSpec::Matchers.define :be_numeric do
|
14
|
+
match do |val|
|
15
|
+
Sms77::Util::numeric?(val)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec::Matchers.define :be_lengthy_string do
|
20
|
+
match do |val|
|
21
|
+
Sms77::Util::lengthy_string?(val)
|
22
|
+
end
|
23
|
+
end
|
data/spec/sms77/balance_spec.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
|
-
require 'sms77/
|
4
|
+
require 'sms77/resources/balance'
|
5
5
|
|
6
6
|
RSpec.describe Sms77, 'balance' do
|
7
7
|
it 'returns the account balance' do
|
8
|
-
Helper.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
expect(response.class).to eq(Faraday::Response)
|
13
|
-
expect(response.body.to_f).to be_kind_of(Float)
|
8
|
+
helper = Helper.new(Sms77::Resources::Balance)
|
9
|
+
balance = helper.request(helper.resource.method(:retrieve), 155.55)
|
10
|
+
expect(balance).to be_a(Float)
|
14
11
|
end
|
15
12
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sms77/client'
|
4
|
+
require 'sms77/resource'
|
5
|
+
require 'spec_helper'
|
6
|
+
|
7
|
+
RSpec.describe Sms77, 'client' do
|
8
|
+
it 'should contain all resource modules' do
|
9
|
+
client = Sms77::Client.new(Sms77::Resource.new('x'))
|
10
|
+
|
11
|
+
client.instance_variables.each do |var|
|
12
|
+
expect(Sms77::Resources.const_get(client.instance_variable_get(var).class.name)).to be_truthy
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/spec/sms77/contacts_spec.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
|
-
require 'sms77/
|
5
|
-
require 'sms77/
|
4
|
+
require 'sms77/contacts'
|
5
|
+
require 'sms77/resources/contacts'
|
6
6
|
|
7
7
|
RSpec.describe Sms77, 'contacts' do
|
8
8
|
$new_contact_id = nil
|
9
|
+
HELPER = Helper.new(Sms77::Resources::Contacts)
|
9
10
|
|
10
11
|
def assert_new(response_body)
|
11
12
|
if response_body.is_a?(String)
|
12
13
|
code, $new_contact_id = response_body.split("\n")
|
13
14
|
$new_contact_id = $new_contact_id.to_i
|
14
15
|
else
|
15
|
-
code = response_body[
|
16
|
-
$new_contact_id = response_body[
|
16
|
+
code = response_body[:return]
|
17
|
+
$new_contact_id = response_body[:id]
|
17
18
|
end
|
18
19
|
|
19
20
|
expect(code).to be_numeric
|
@@ -28,9 +29,9 @@ RSpec.describe Sms77, 'contacts' do
|
|
28
29
|
name = name.gsub('"', '')
|
29
30
|
number = number.gsub('"', '')
|
30
31
|
else
|
31
|
-
id = contact[
|
32
|
-
name = contact[
|
33
|
-
number = contact[
|
32
|
+
id = contact[:ID]
|
33
|
+
name = contact[:Name]
|
34
|
+
number = contact[:Number]
|
34
35
|
end
|
35
36
|
|
36
37
|
expect(id).to be_numeric
|
@@ -38,10 +39,6 @@ RSpec.describe Sms77, 'contacts' do
|
|
38
39
|
expect(number.sub('+', '')).to be_numeric
|
39
40
|
end
|
40
41
|
|
41
|
-
def request(action, stub, extra_params = {})
|
42
|
-
Helper.request(Sms77::Endpoint::CONTACTS, { action: action }.merge(extra_params), stub)
|
43
|
-
end
|
44
|
-
|
45
42
|
it 'returns all contacts as CSV' do
|
46
43
|
stub = <<~CSV
|
47
44
|
"4848436";"";""
|
@@ -54,16 +51,16 @@ RSpec.describe Sms77, 'contacts' do
|
|
54
51
|
"2925186";"Tom Tester";"004901234567890"
|
55
52
|
CSV
|
56
53
|
|
57
|
-
body = request(
|
54
|
+
body = HELPER.request(HELPER.resource.method(:read), stub)
|
58
55
|
|
59
|
-
expect(body).to
|
56
|
+
expect(body).to be_a(String)
|
60
57
|
|
61
58
|
body.split("\n").each do |contact|
|
62
59
|
assert_contact(contact)
|
63
60
|
end
|
64
61
|
end
|
65
62
|
|
66
|
-
it 'returns all contacts as
|
63
|
+
it 'returns all contacts as JSON' do
|
67
64
|
stub = [
|
68
65
|
{ ID: '4848436', Name: '', Number: '' },
|
69
66
|
{ ID: '4848437', Name: '', Number: '' },
|
@@ -75,9 +72,9 @@ RSpec.describe Sms77, 'contacts' do
|
|
75
72
|
{ ID: '2925186', Name: 'Tom Tester', Number: '004901234567890' }
|
76
73
|
]
|
77
74
|
|
78
|
-
body = request(
|
75
|
+
body = HELPER.request(HELPER.resource.method(:read), stub, { json: true })
|
79
76
|
|
80
|
-
expect(body).to
|
77
|
+
expect(body).to be_a(Array)
|
81
78
|
|
82
79
|
body.each do |contact|
|
83
80
|
assert_contact(contact)
|
@@ -90,29 +87,30 @@ RSpec.describe Sms77, 'contacts' do
|
|
90
87
|
4868400
|
91
88
|
TEXT
|
92
89
|
|
93
|
-
body = request(
|
90
|
+
body = HELPER.request(HELPER.resource.method(:write), stub, {})
|
94
91
|
|
95
|
-
expect(body).to
|
92
|
+
expect(body).to be_a(String)
|
96
93
|
|
97
94
|
assert_new(body)
|
98
95
|
end
|
99
96
|
|
100
97
|
it 'deletes a contact with given ID and return code' do
|
101
|
-
expect(request(
|
98
|
+
expect(HELPER.request(HELPER.resource.method(:delete), 152, { id: $new_contact_id })).to be_a(Integer)
|
102
99
|
end
|
103
100
|
|
104
101
|
it 'creates a contact and returns its ID as JSON' do
|
105
|
-
body = request(
|
102
|
+
body = HELPER.request(HELPER.resource.method(:write), { id: 4868401, return: '152' }, { json: true })
|
106
103
|
|
107
|
-
expect(body).to
|
104
|
+
expect(body).to be_a(Hash)
|
108
105
|
|
109
106
|
assert_new(body)
|
110
107
|
end
|
111
108
|
|
112
109
|
it 'deletes a contact with given ID and return code as JSON' do
|
113
|
-
body = request(
|
110
|
+
body = HELPER.request(
|
111
|
+
HELPER.resource.method(:delete), { return: '152' }, { id: $new_contact_id, json: true })
|
114
112
|
|
115
|
-
expect(body).to
|
116
|
-
expect(body[
|
113
|
+
expect(body).to be_a(Hash)
|
114
|
+
expect(body[:return]).to be_a(String)
|
117
115
|
end
|
118
116
|
end
|