parity-gupshup 2.0.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 +7 -0
- data/History.txt +4 -0
- data/Manifest.txt +11 -0
- data/PostInstall.txt +6 -0
- data/README.rdoc +67 -0
- data/Rakefile +26 -0
- data/lib/parity-gupshup.rb +109 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/test_gupshup.rb +37 -0
- data/test/test_helper.rb +3 -0
- metadata +76 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 51f08a2eac81546f3fc1ef012873629d484ee230
|
|
4
|
+
data.tar.gz: 395305135e166bdba411d4c22b12353034d3ab07
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5fa6f769c19fb8144b9464c539bbdf0664ce873e4e421215acb8a270debd85ce052dc41097132850fd20d68cfb433db99e31935f6dcdc28f74245465128c3d6c
|
|
7
|
+
data.tar.gz: 1bf81ef8bfada13b059e3dec69b5203fe6a34c58864ad6f876624465425316405201c9486b8e1147987104940ce3bdfa1c966d4b5ea68afe2def04ea27e6df06
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/PostInstall.txt
ADDED
data/README.rdoc
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
= gupshup
|
|
2
|
+
|
|
3
|
+
* http://github.com/parity/gupshup
|
|
4
|
+
|
|
5
|
+
== DESCRIPTION
|
|
6
|
+
|
|
7
|
+
gupshup is a Ruby wrapper for the HTTP APIs provided by SMS GupShup which
|
|
8
|
+
is a Group SMS Platform for the enterprises with advanced features such as
|
|
9
|
+
masks, keywords, text/flash/vcard/bulk messages, advertising and keyword
|
|
10
|
+
campaigns and so on.
|
|
11
|
+
|
|
12
|
+
Documentation of HTTP APIs is available here:
|
|
13
|
+
http://enterprise.smsgupshup.com/doc/GatewayAPIDoc.pdf
|
|
14
|
+
|
|
15
|
+
== FEATURES
|
|
16
|
+
|
|
17
|
+
* V 0.2.0 Return boolean status instead of raising exceptions. API_URL is now configurable.
|
|
18
|
+
* V 0.1.5 Added group_post method and a generic call_api method. All methods now expect a hash of API params instead if individual arguments
|
|
19
|
+
* V 0.1.2 Bulk file upload implemented. Only CSV format supported for now.
|
|
20
|
+
* V 0.1.0 send_vcard and send_unicode_message implemented. Error checking.
|
|
21
|
+
* V 0.0.5 send_text_message and send_flash_message are implemented
|
|
22
|
+
* V 0.0.1 send_message is implemented.
|
|
23
|
+
|
|
24
|
+
== USAGE
|
|
25
|
+
|
|
26
|
+
# "target_phone_number" should be a 12 digit Indian mobile number starting with "91" (either integer or string)
|
|
27
|
+
|
|
28
|
+
gup = Gupshup::Enterprise.new(:userid => 'your_gupshup_login', :password => 'your_password')
|
|
29
|
+
|
|
30
|
+
#optional parameters
|
|
31
|
+
mask - An alphanumeric string with maximum length of 8 characters. Each enterprise account has a default mask. Each account can have multiple masks, preapproved by Enterprise Support team. If no mask is specified, the default mask is chosen.
|
|
32
|
+
|
|
33
|
+
override_dnd - Specifies if the message to be sent to a number listed in DND(Do Not Disturb) list. By default value is false
|
|
34
|
+
|
|
35
|
+
gup = Gupshup::Enterprise.new(:userid => 'your_gupshup_login', :password => 'your_password', :mask => 'maskname', :override_dnd => true)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#send a normal text message
|
|
39
|
+
gup.send_text_message(:msg => 'sms message text', :send_to => '91xxxxxxxxxx')
|
|
40
|
+
|
|
41
|
+
#flash messages appear on mobile's screen immediately but may not be saved on some handsets
|
|
42
|
+
gup.send_flash_message(:msg => 'sms message text', :send_to => '91xxxxxxxxxx')
|
|
43
|
+
|
|
44
|
+
#send a contact in VCARD format
|
|
45
|
+
vcard = "BEGIN:VCARD\r\nVERSION:1.2\r\nN:ICICI\r\nTEL:18002098888\r\nEND:VCARD"
|
|
46
|
+
gup.send_vcard(:msg => vcard, :send_to => '91xxxxxxxxxx')
|
|
47
|
+
|
|
48
|
+
#send a non-english message with a hex-encoded UTF-8 string
|
|
49
|
+
gup.send_unicode_message(:msg => "\xE0\xA4\x97\xE0\xA4\xAA\xE0\xA4\xB6\xE0\xA4\xAA", :send_to => '91xxxxxxxxxx') # will send "gupshup" in Devnagari script
|
|
50
|
+
|
|
51
|
+
#Upload a CSV file for bulk messages
|
|
52
|
+
gup.bulk_file_upload(file_path)
|
|
53
|
+
|
|
54
|
+
== REQUIREMENTS
|
|
55
|
+
|
|
56
|
+
* httpclient
|
|
57
|
+
|
|
58
|
+
== Installation
|
|
59
|
+
* Include the gem in your Gemfile:
|
|
60
|
+
|
|
61
|
+
gem 'parity-gupshup', '~> 1.0.0'
|
|
62
|
+
|
|
63
|
+
* Or
|
|
64
|
+
|
|
65
|
+
sudo gem install parity-gupshup
|
|
66
|
+
|
|
67
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
gem 'hoe', '>= 2.1.0'
|
|
3
|
+
require 'hoe'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require './lib/gupshup'
|
|
6
|
+
|
|
7
|
+
Hoe.plugin :newgem
|
|
8
|
+
# Hoe.plugin :website
|
|
9
|
+
# Hoe.plugin :cucumberfeatures
|
|
10
|
+
|
|
11
|
+
# Generate all the Rake tasks
|
|
12
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
|
13
|
+
$hoe = Hoe.spec 'gupshup' do
|
|
14
|
+
self.developer 'Beena Shetty', 'binu.shetty@gmail.com'
|
|
15
|
+
self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
|
16
|
+
self.rubyforge_name = self.name # TODO this is default value
|
|
17
|
+
# self.extra_deps = [['activesupport','>= 2.0.2']]
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
require 'newgem/tasks'
|
|
22
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
|
23
|
+
|
|
24
|
+
# TODO - want other tests/tasks run by default? Add them to the list
|
|
25
|
+
# remove_task :default
|
|
26
|
+
# task :default => [:spec, :features]
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
|
|
4
|
+
require 'net/http'
|
|
5
|
+
require 'uri'
|
|
6
|
+
require 'cgi'
|
|
7
|
+
require 'httpclient'
|
|
8
|
+
|
|
9
|
+
class NilClass
|
|
10
|
+
def blank?
|
|
11
|
+
true
|
|
12
|
+
end unless nil.respond_to? :blank?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class String
|
|
16
|
+
def blank?
|
|
17
|
+
self !~ /\S/
|
|
18
|
+
end unless "".respond_to? :blank?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module Gupshup
|
|
22
|
+
VERSION = '0.2.1'
|
|
23
|
+
class Enterprise
|
|
24
|
+
def initialize(opts)
|
|
25
|
+
@api_url = opts[:api_url] || 'http://enterprise.smsgupshup.com/GatewayAPI/rest'
|
|
26
|
+
@api_params = {}
|
|
27
|
+
@api_params[:userid] = opts[:userid]
|
|
28
|
+
@api_params[:password] = opts[:password]
|
|
29
|
+
@api_params[:mask] = opts[:mask] if opts[:mask]
|
|
30
|
+
@api_params[:override_dnd] = opts[:override_dnd] || false
|
|
31
|
+
@api_params[:v] = opts[:v] || '1.1'
|
|
32
|
+
@api_params[:auth_scheme] = opts[:auth_scheme] || 'PLAIN'
|
|
33
|
+
unless opts[:token].blank?
|
|
34
|
+
@api_params[:auth_scheme] = 'TOKEN'
|
|
35
|
+
@api_params[:token] = opts[:token]
|
|
36
|
+
@api_params.delete(:password)
|
|
37
|
+
end
|
|
38
|
+
raise "Invalid credentials" if opts[:userid].blank? || (opts[:password].blank? && opts[:token].blank?)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def call_api(opts = {})
|
|
42
|
+
res = Net::HTTP.post_form(
|
|
43
|
+
URI.parse(@api_url),
|
|
44
|
+
@api_params.merge(opts)
|
|
45
|
+
)
|
|
46
|
+
resp = res.body
|
|
47
|
+
puts "GupShup Response: #{resp}"
|
|
48
|
+
|
|
49
|
+
case res
|
|
50
|
+
when Net::HTTPSuccess
|
|
51
|
+
if resp.nil? || resp.include?("success") == false
|
|
52
|
+
puts "API call '#{opts[:method]}' failed: #{resp}"
|
|
53
|
+
return false, resp
|
|
54
|
+
end
|
|
55
|
+
return true, nil
|
|
56
|
+
else
|
|
57
|
+
return false, "HTTP Error : #{res}"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def send_message(opts)
|
|
62
|
+
msg = opts[:msg]
|
|
63
|
+
number = opts[:send_to]
|
|
64
|
+
msg_type = opts[:msg_type] || 'TEXT'
|
|
65
|
+
|
|
66
|
+
return false, 'Phone Number is too short' if number.to_s.length < 12
|
|
67
|
+
return false, 'Phone Number is too long' if number.to_s.length > 12
|
|
68
|
+
#return false, 'Phone Number should start with "91"' if number.to_s.start_with? "91"
|
|
69
|
+
return false, 'Phone Number should be numerical value' unless number.to_i.to_s == number.to_s
|
|
70
|
+
return false, 'Message cannot be empty' if msg.to_s.length == 0
|
|
71
|
+
return false, 'Message should be less than 725 characters long' if msg.to_s.length > 724
|
|
72
|
+
call_api opts.merge({ :method => 'sendMessage' })
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def send_flash_message(opts)
|
|
76
|
+
send_message(opts.merge({ :msg_type => 'FLASH'}))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def send_text_message(opts)
|
|
80
|
+
send_message(opts.merge({ :msg_type => 'TEXT'}))
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def send_vcard(opts)
|
|
84
|
+
send_message(opts.merge({ :msg_type => 'VCARD'}))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def send_unicode_message(opts)
|
|
88
|
+
send_message(opts.merge({ :msg_type => 'UNICODE_TEXT'}))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def bulk_file_upload(file_path,file_type = 'csv',mime_type = 'text/csv', opts = {})
|
|
92
|
+
msg_params = {}
|
|
93
|
+
msg_params[:method] = 'xlsUpload'
|
|
94
|
+
msg_params[:filetype] = file_type.to_s
|
|
95
|
+
file = File.new(file_path,"r")
|
|
96
|
+
def file.mime_type; "text/csv"; end
|
|
97
|
+
msg_params[:xlsFile] = file
|
|
98
|
+
resp = HTTPClient.post(@api_url,msg_params.merge(@api_params).merge(opts))
|
|
99
|
+
file.close
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def group_post(opts)
|
|
103
|
+
return false,"Invalid group name" if opts[:group_name].blank?
|
|
104
|
+
return false,"Invalid message" if opts[:msg].blank?
|
|
105
|
+
return false,"Invalid message type" if opts[:msg_type].blank?
|
|
106
|
+
call_api opts.merge({:method => 'post_group'})
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
data/script/console
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# File: script/console
|
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
|
4
|
+
|
|
5
|
+
libs = " -r irb/completion"
|
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/gupshup.rb'}"
|
|
9
|
+
puts "Loading gupshup gem"
|
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/destroy'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/generate'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
class TestGupshup < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@gup = Gupshup::Enterprise.new(:userid => '19009888', :password => 'test')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_truth
|
|
10
|
+
assert_equal([true, nil], @gup.send_text_message(msg: "Testing", send_to: "919453456689"))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_failure
|
|
14
|
+
assert_not_equal([true, nil], @gup.send_text_message(msg: "Testing", send_to: "4567777888"))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_creditional
|
|
18
|
+
assert_raise( RuntimeError ){Gupshup::Enterprise.new(userid: "")}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_short_phone_number
|
|
22
|
+
assert_equal([false, "Phone Number is too short"], @gup.send_text_message(msg: "Testing", send_to: "9194567890"))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_long_phone_number
|
|
26
|
+
assert_equal([false, "Phone Number is too long"], @gup.send_text_message(msg: "Testing", send_to: "91945678901123"))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_string
|
|
30
|
+
assert_equal([false, "Phone Number should be numerical value"], @gup.send_text_message(msg: "Testing", send_to: "hellotest123"))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_empty_msg
|
|
34
|
+
assert_equal([false, "Message cannot be empty"], @gup.send_text_message(msg: "", send_to: "919453456689"))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: parity-gupshup
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Beena Shetty
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-03-04 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: httpclient
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 2.1.5.2
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 2.1.5.2
|
|
27
|
+
description: Ruby wrapper for SMSGupShup API
|
|
28
|
+
email:
|
|
29
|
+
- binu.shetty@gmail.com
|
|
30
|
+
executables: []
|
|
31
|
+
extensions: []
|
|
32
|
+
extra_rdoc_files:
|
|
33
|
+
- History.txt
|
|
34
|
+
- Manifest.txt
|
|
35
|
+
- PostInstall.txt
|
|
36
|
+
files:
|
|
37
|
+
- History.txt
|
|
38
|
+
- Manifest.txt
|
|
39
|
+
- PostInstall.txt
|
|
40
|
+
- README.rdoc
|
|
41
|
+
- Rakefile
|
|
42
|
+
- lib/parity-gupshup.rb
|
|
43
|
+
- script/console
|
|
44
|
+
- script/destroy
|
|
45
|
+
- script/generate
|
|
46
|
+
- test/test_gupshup.rb
|
|
47
|
+
- test/test_helper.rb
|
|
48
|
+
homepage: http://github.com/parity/gupshup
|
|
49
|
+
licenses: []
|
|
50
|
+
metadata: {}
|
|
51
|
+
post_install_message: PostInstall.txt
|
|
52
|
+
rdoc_options:
|
|
53
|
+
- "--main"
|
|
54
|
+
- README.rdoc
|
|
55
|
+
require_paths:
|
|
56
|
+
- lib
|
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ">="
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0'
|
|
67
|
+
requirements: []
|
|
68
|
+
rubyforge_project: parity-gupshup
|
|
69
|
+
rubygems_version: 2.4.8
|
|
70
|
+
signing_key:
|
|
71
|
+
specification_version: 3
|
|
72
|
+
summary: Ruby wrapper for SMSGupShup API
|
|
73
|
+
test_files:
|
|
74
|
+
- test/test_gupshup.rb
|
|
75
|
+
- test/test_helper.rb
|
|
76
|
+
has_rdoc:
|