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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/README.md +26 -6
  4. data/lib/sms77.rb +0 -1
  5. data/lib/sms77/client.rb +18 -87
  6. data/lib/sms77/{contacts_action.rb → contacts.rb} +2 -2
  7. data/lib/sms77/endpoint.rb +12 -12
  8. data/lib/sms77/hooks.rb +64 -0
  9. data/lib/sms77/journal.rb +38 -0
  10. data/lib/sms77/{lookup_type.rb → lookup.rb} +2 -2
  11. data/lib/sms77/resource.rb +93 -0
  12. data/lib/sms77/resources/analytics.rb +16 -0
  13. data/lib/sms77/resources/balance.rb +16 -0
  14. data/lib/sms77/resources/contacts.rb +26 -0
  15. data/lib/sms77/resources/hooks.rb +30 -0
  16. data/lib/sms77/resources/journal.rb +16 -0
  17. data/lib/sms77/resources/lookup.rb +30 -0
  18. data/lib/sms77/resources/pricing.rb +16 -0
  19. data/lib/sms77/resources/sms.rb +16 -0
  20. data/lib/sms77/resources/status.rb +16 -0
  21. data/lib/sms77/resources/validate_for_voice.rb +16 -0
  22. data/lib/sms77/resources/voice.rb +16 -0
  23. data/lib/sms77/sms.rb +8 -0
  24. data/lib/sms77/util.rb +68 -0
  25. data/lib/sms77/version.rb +1 -1
  26. data/release.sh +8 -0
  27. data/sms77.gemspec +13 -16
  28. data/spec/EnvKeyStore.rb +15 -0
  29. data/spec/matchers.rb +23 -0
  30. data/spec/sms77/balance_spec.rb +4 -7
  31. data/spec/sms77/client_spec.rb +15 -0
  32. data/spec/sms77/contacts_spec.rb +22 -24
  33. data/spec/sms77/hooks_spec.rb +106 -0
  34. data/spec/sms77/instance_spec.rb +20 -0
  35. data/spec/sms77/journal_spec.rb +86 -0
  36. data/spec/sms77/lookup_spec.rb +73 -82
  37. data/spec/sms77/pricing_spec.rb +25 -29
  38. data/spec/sms77/sms_spec.rb +20 -20
  39. data/spec/sms77/validate_for_voice_spec.rb +6 -6
  40. data/spec/sms77/voice_spec.rb +11 -8
  41. data/spec/sms77_spec.rb +0 -8
  42. data/spec/spec_helper.rb +31 -34
  43. metadata +60 -25
  44. data/lib/sms77/header.rb +0 -7
  45. 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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sms77::Sms
4
+ module Type
5
+ DIRECT = 'direct'
6
+ ECONOMY = 'economy'
7
+ end
8
+ end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sms77
4
- VERSION = '0.0.1'
4
+ VERSION = '0.4.0'
5
5
  end
data/release.sh ADDED
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+
3
+ gem build --strict
4
+
5
+ # MY_VARIABLE=$(find . -name "*.gem" -print0 | xargs -r -0 ls -1 -t | head -1)
6
+ # echo "$MY_VARIABLE"
7
+
8
+ gem push "$(find . -name "*.gem" -print0 | xargs -r -0 ls -1 -t | head -1)"
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.name = 'sms77'
8
- spec.version = Sms77::VERSION.dup
9
- spec.summary = 'Official Sms77.io API Client for Ruby'
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.authors = ['sms77 e.K.']
12
- spec.email = ['support@sms77.io']
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.required_ruby_version = '>= 2.6.5'
16
- spec.require_paths = ['lib']
17
- spec.files = `git ls-files`.split("\n")
18
- spec.test_files = Dir['test/**/*']
19
-
20
- spec.add_runtime_dependency 'faraday', '~> 1'
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
@@ -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
@@ -1,15 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'sms77/endpoint'
4
+ require 'sms77/resources/balance'
5
5
 
6
6
  RSpec.describe Sms77, 'balance' do
7
7
  it 'returns the account balance' do
8
- Helper.stubs.get("/api/#{Sms77::Endpoint::BALANCE}") { |_env| [200, {}, '12.34'] } unless Helper.is_http
9
-
10
- response = Helper.client.balance
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
@@ -1,19 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'sms77/endpoint'
5
- require 'sms77/contacts_action'
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['return']
16
- $new_contact_id = response_body['id']
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['ID']
32
- name = contact['Name']
33
- number = contact['Number']
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(Sms77::ContactsAction::READ, stub)
54
+ body = HELPER.request(HELPER.resource.method(:read), stub)
58
55
 
59
- expect(body).to be_kind_of(String)
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 CSV' do
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(Sms77::ContactsAction::READ, stub, { json: 1 })
75
+ body = HELPER.request(HELPER.resource.method(:read), stub, { json: true })
79
76
 
80
- expect(body).to be_kind_of(Array)
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(Sms77::ContactsAction::WRITE, stub)
90
+ body = HELPER.request(HELPER.resource.method(:write), stub, {})
94
91
 
95
- expect(body).to be_kind_of(String)
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(Sms77::ContactsAction::DEL, 152, { id: $new_contact_id })).to be_kind_of(Integer)
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(Sms77::ContactsAction::WRITE, { id: 4868401, return: '152' }, { json: 1 })
102
+ body = HELPER.request(HELPER.resource.method(:write), { id: 4868401, return: '152' }, { json: true })
106
103
 
107
- expect(body).to be_kind_of(Hash)
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(Sms77::ContactsAction::DEL, { return: '152' }, { id: $new_contact_id, json: 1 })
110
+ body = HELPER.request(
111
+ HELPER.resource.method(:delete), { return: '152' }, { id: $new_contact_id, json: true })
114
112
 
115
- expect(body).to be_kind_of(Hash)
116
- expect(body['return']).to be_kind_of(String)
113
+ expect(body).to be_a(Hash)
114
+ expect(body[:return]).to be_a(String)
117
115
  end
118
116
  end