africas_talking 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4722fe942f4373d4ecc6288ac2c901ae7afe48b7
4
+ data.tar.gz: 38ad1e6863e51a4ef655b99b6313dc3aeeff5ce8
5
+ SHA512:
6
+ metadata.gz: 85860100e4df575bb327d1b9dfec5d7dd8c7331b08c424957554b455b3b49954fab44a686978f9721ef77c97e4226cd7ee14848209e7727c4b72b316c1e27d11
7
+ data.tar.gz: d37beab5f552bbe610bd1bd1a9138e00148079db3c59096bf33fa1212e3eeed6d061ca47b6bad4a13fb01e5a4210ebb9935b057e872831b4fee58e35fc4b851f
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ - 2.1.1
5
+ - 2.1.0
6
+ - 2.0.0
7
+ env:
8
+ - africas_talking_apikey="aDax7clbar5yaaAfS1Gqvw"
9
+ - africas_talking_username="5yaaAfS"
10
+ global:
11
+ - BASE_URI='https://api.africastalking.com'
12
+ # URLS:
13
+ # - sms_url='/version1/messaging' subscription_url='/version1/subscription' userdata_url='/version1/user' airtime_url='/version1/airtime' voice_url='https://voice.africastalking.com'
14
+
15
+ # script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in africas_talking.gemspec
4
+ gemspec
5
+ gem "codeclimate-test-reporter", group: :test, require: nil
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Kariuki Gathitu
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ #Africas Talking.
2
+ A fast lightweight and minimalist wrapper around the Africas Talking api
3
+
4
+
5
+ [![Build Status](https://travis-ci.org/chalchuck/africas-talking.svg?branch=master)](https://travis-ci.org/chalchuck/africas-talking)
6
+ [![Dependency Status](https://gemnasium.com/chalchuck/africas-talking.svg)](https://gemnasium.com/chalchuck/africas-talking)
7
+ [![Code Climate](https://codeclimate.com/github/chalchuck/africas-talking/badges/gpa.svg)](https://codeclimate.com/github/chalchuck/africas-talking)
8
+ [![Test Coverage](https://codeclimate.com/github/chalchuck/africas-talking/badges/coverage.svg)](https://codeclimate.com/github/chalchuck/africas-talking/coverage)
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'africas_talking'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install africas_talking
23
+
24
+
25
+ ##Setup
26
+
27
+ Obtain a Client ID and Secret
28
+ ---
29
+ 1. Go to Africas Talking website. (https://account.africastalking.com/register)
30
+ 2. In the sidebar on the left, select Settings > Api Key
31
+ 3. If you haven't generated your key already, generate a new api key credentials by clicking Generate My Api Key
32
+
33
+
34
+ ## Usage
35
+ ###Sending a message
36
+ ```ruby
37
+ AfricasTalking::Message.new.deliver(recipients, message, username)
38
+ ```
39
+ Recipients:
40
+ This are the numbers that you want to send to,
41
+ If you want to send to many people delimit the numbers using commas(',')
42
+ for example: "0700000000, 0710000000, 0720000000"
43
+
44
+ Message:
45
+ This is the message content
46
+ A message is by default 160 characters
47
+ If your message is 161-320 it will be sent as two messages and so on
48
+
49
+ Username:
50
+ This is your username on AfricasTalking.com
51
+ [If you do not have one signup and use it to send messages]
52
+
53
+ ###Sending message using sender id or shortcode parameter
54
+ ```ruby
55
+ AfricasTalking::Message.new.deliver_with_shortcode(recipients, message, from, username)
56
+ ```
57
+ Specify your AfricasTalking shortCode or sender id, sender = "shortCode or senderId"
58
+
59
+ ###Enqueue messages
60
+ ```ruby
61
+ AfricasTalking::Message.new.enqueue_messages(options)
62
+ ```
63
+ Enqueue flag is used to queue messages incase you are sending a high volume.
64
+
65
+ sender = nil # sender = "shortCode or sender id"
66
+ bulkSMSMode = 1 # This should always be 1 for bulk messages
67
+ The default value for enqueue is 0.
68
+
69
+ So as to send/enqueue a message, build a hash with the following options:
70
+ {recipients: "", message: "", sender: "", enqueue: "", bulkSMSMode: "", username: ""}
71
+
72
+
73
+
74
+
75
+
76
+ ## Contributing
77
+
78
+ 1. Fork it ( https://github.com/[my-github-username]/africas_talking/fork )
79
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
80
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
81
+ 4. Push to the branch (`git push origin my-new-feature`)
82
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ # require "bundler/gem_tasks"
2
+ # require 'rspec/core/rake_task'
3
+
4
+ # RSpec::Core::RakeTask.new(:spec)
5
+ # task :default => :spec
6
+
7
+
8
+
9
+
10
+
11
+
12
+ require 'rubygems'
13
+ require 'bundler'
14
+ begin
15
+ Bundler.setup(:default, :development)
16
+ rescue Bundler::BundlerError => e
17
+ $stderr.puts e.message
18
+ $stderr.puts "Run `bundle install` to install missing gems"
19
+ exit e.status_code
20
+ end
21
+ require 'rake'
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ task :default => :test
31
+
32
+ require 'rdoc/task'
33
+ Rake::RDocTask.new do |rdoc|
34
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
35
+
36
+ rdoc.rdoc_dir = 'rdoc'
37
+ rdoc.title = "africas_talking #{version}"
38
+ rdoc.rdoc_files.include('README*')
39
+ rdoc.rdoc_files.include('lib/**/*.rb')
40
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'africas_talking/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "africas_talking"
8
+ spec.version = AfricasTalking::VERSION
9
+ spec.authors = ["Charles Chuck"]
10
+ spec.email = ["chalcchuck@gmail.com"]
11
+ spec.summary = %q{Africa's Talking ruby API wrapper.}
12
+ spec.description = %q{Africa's Talking ruby API wrapper.}
13
+ spec.homepage = "https://bitbucket.org/chalchuck/africas-talking"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency 'json'
22
+ spec.add_runtime_dependency 'typhoeus'
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.6"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency 'rspec'
27
+ spec.add_development_dependency 'pry'
28
+ spec.add_development_dependency 'minitest'
29
+ spec.add_development_dependency 'minitest-reporters'
30
+ spec.add_development_dependency 'shoulda-context'
31
+ spec.add_development_dependency 'mocha'
32
+ end
@@ -0,0 +1,2 @@
1
+ class AfricasTalking::AfricasTalkingGatewayError < Exception
2
+ end
@@ -0,0 +1,42 @@
1
+ class AfricasTalking::Base
2
+
3
+ BASE_URI='https://api.africastalking.com'
4
+
5
+ def prepare_recipients(recipients)
6
+ recipients_array = []
7
+ recipients.split(',').each { |recip| recipients_array << recip.strip.gsub(/^0/,'254') }
8
+ recipients_array.join(', ')
9
+ end
10
+
11
+ def post(url, json_body=nil)
12
+ Typhoeus.post("#{BASE_URI}#{url}", body: json_body, headers: headers)
13
+ end
14
+
15
+ def get(url)
16
+ Typhoeus.post("#{BASE_URI}#{url}", headers: headers)
17
+ end
18
+
19
+ def parse_api_errors(response)
20
+ reports = parse_api_response(response)["SMSMessageData"]["Recipients"]
21
+ return reports.collect {|entry| AfricasTalking::StatusReport.new(entry["number"], entry["status"], entry["cost"])}
22
+ # return parsed_api_errors
23
+ end
24
+
25
+ def build_messages_array(response)
26
+ parsed_response = parse_api_response(response)["SMSMessageData"]["Messages"]
27
+ parsed_response.collect { |msg| AfricasTalking::SMSMessage.new(msg["id"], msg["text"], msg["from"] , msg["to"], msg["linkId"], msg["date"])}
28
+ end
29
+
30
+ def parse_api_response(response)
31
+ JSON.parse(response.body)
32
+ end
33
+
34
+ def api_error_messages(response)
35
+ AfricasTalking::AfricasTalkingGatewayError#, parse_api_response(response)["SMSMessageData"]["Message"]
36
+ end
37
+
38
+ def headers
39
+ {'Accept' => "application/json", 'apiKey'=> 'c6ec656ed9bceb689289ccaa6e38d7f6c1b0718a1237b4c13391d1efc1108bfb'}
40
+ end
41
+
42
+ end
@@ -0,0 +1,92 @@
1
+ class AfricasTalking::Message < AfricasTalking::Base
2
+
3
+ #POST
4
+ #/version1/messaging
5
+ #----------------------------------------------------------------------------
6
+ # Specify the numbers that you want to send to in a comma-separated list
7
+ # Please ensure you include the country code (+254 for Kenya in this case)
8
+ # to = "+254711XXXYYY,+254733YYYZZZ";
9
+ # And of course we want our recipients to know what we really do
10
+ def deliver(recipients, message, username)
11
+ response = post('/version1/messaging', {username: username, message: message, to: prepare_recipients(recipients)})
12
+ process_api_response(response)
13
+ end
14
+
15
+ #POST
16
+ #/version1/messaging
17
+ #----------------------------------------------------------------------------
18
+ # Specify your AfricasTalking shortCode or sender id
19
+ # sender = "shortCode or senderId"
20
+
21
+ def deliver_with_shortcode(recipients, message, from, username)
22
+ response = post('/version1/messaging', {username: username, message: message, to: recipients, from: from})
23
+ process_api_response(response)
24
+ end
25
+
26
+ #POST
27
+ #/version1/messaging
28
+ #----------------------------------------------------------------------------
29
+ # sender = nil #
30
+ # bulkSMSMode # This should always be 1 for bulk messages
31
+ # # enqueue flag is used to queue messages incase you are sending a high volume.
32
+ # # The default value is 0.
33
+ # opts={enqueue: 1, bulkSMSMode: 1, sender: "shortCode/senderId"}
34
+ # gateway = AfricasTalkingGateway.new(username, apikey)
35
+ # reports = gateway.sendMessage(to, message, sender, bulkSMSMode, enqueue)
36
+
37
+ def enqueue_messages(opts)
38
+ body={
39
+ to: opts.fetch(:recipients), message: opts.fetch(:message, ""), sender: opts.fetch(:sender, nil),
40
+ enqueue: opts.fetch(:enqueue,1), bulkSMSMode: opts.fetch(:bulkSMSMode, 1), username: opts.fetch(:username)}
41
+ response = post('/version1/messaging', body)
42
+ process_api_response(response)
43
+ end
44
+
45
+ #POST
46
+ #/version1/messaging#premium_messages
47
+ #----------------------------------------------------------------------------
48
+ #
49
+ #########Required fields to deliver a premium message through the API########
50
+ #############################################################################
51
+ # To send a premium message, build a HASH (as shown below) with the following attributes keeping in mind the defaults.
52
+ # 1.Specify your premium shortCode and keyword
53
+ # 2.Set keyword as None where not used (Mostly for onDemand services)
54
+ # 3.Set the bulkSMSMode flag to 0 so that the subscriber gets charged
55
+ # 4.Set the enqueue flag to 0 so that your message will not be queued or to 1 for many messages
56
+ # 5.Incase of an onDemand service, specify the link id. else set it to nil
57
+ # 6.linkId is received from the message sent by subscriber to your onDemand service
58
+ # 7.Specify retryDurationInHours: The numbers of hours our API should retry to send the message incase it doesn't go through.
59
+ # opts={recipients: "0710335602", message: "Hey there testing something awesome", bulkSMSMode: 0, shortCode:"XXXXX", enqueue: 0, keyword: nil, linkId: "messageLinkId"}
60
+
61
+ def deliver_premium_messages(opts)
62
+ body={
63
+ to: opts.fetch(:recipients), message: opts.fetch(:message),
64
+ keyword: opts.fetch(:keyword, nil), enqueue: opts.fetch(:enqueue, 0), username: opts.fetch(:username),
65
+ linkId: opts.fetch(:linkId, nil), retryDurationInHours: opts.fetch(:retryDurationInHours, 1)}
66
+ response = post('/version1/messaging', body)
67
+ process_api_response(response)
68
+ end
69
+
70
+
71
+ #GET
72
+ #/?username=#{ENV['africas_talking_username']}&lastReceivedId=#{last_received_id}
73
+ # The gateway will return 10 messages at a time back to you, starting with
74
+ # what you currently believe is the lastReceivedId. Specify 0 for the first
75
+ # time you access the gateway, and the ID of the last message we sent you
76
+ # on subsequent results
77
+
78
+ def fetch_messages(username, last_received_id=0)
79
+ response = get("/version1/messaging?username=#{username}&lastReceivedId=#{last_received_id}")
80
+ return build_messages_array(response) if response.options[:response_code] == 200
81
+ raise api_error_messages(response)
82
+ end
83
+
84
+ private
85
+
86
+ def process_api_response(response)
87
+ return parse_api_response(response) if response.options[:response_code] == 200
88
+ return parse_api_errors(response) if response.options[:response_code] == 201
89
+ raise api_error_messages(response)
90
+ end
91
+
92
+ end
@@ -0,0 +1,14 @@
1
+ class AfricasTalking::SmsMessage
2
+
3
+ attr_accessor :id, :text, :from, :to, :linkId, :date
4
+
5
+ def initialize(id, text, from, to, linkId, date)
6
+ @id = id
7
+ @text = text
8
+ @from = from
9
+ @to = to
10
+ @linkId = linkId
11
+ @date = date
12
+ end
13
+
14
+ end
@@ -0,0 +1,11 @@
1
+ class AfricasTalking::StatusReport
2
+
3
+ attr_accessor :number, :status, :cost
4
+
5
+ def initialize(number, status, cost)
6
+ @cost = cost
7
+ @number = number
8
+ @status = status
9
+ end
10
+
11
+ end
@@ -0,0 +1,3 @@
1
+ module AfricasTalking
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,10 @@
1
+ module AfricasTalking
2
+ require "africas_talking/version"
3
+ require 'typhoeus'
4
+ require 'json'
5
+ require 'africas_talking/base'
6
+ require 'africas_talking/message'
7
+ require "africas_talking/sms_message"
8
+ require "africas_talking/status_report"
9
+ require "africas_talking/africas_talking_gateway_error"
10
+ end
@@ -0,0 +1,17 @@
1
+ module AfricasTalking
2
+ module Generators
3
+ class TemplateGenerator < Rails::Generators::Base
4
+
5
+ desc "Create local africas_talking.yml template file for customizations"
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ arguement :templates_path, type: :string,
8
+ default: "config/",
9
+ banner: "path to templates"
10
+
11
+ def copy_templates
12
+ copy_file "africas_talking_config.yml.erb", "#{templates_path}/africas_talking.yml"
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ To create a local ``
@@ -0,0 +1,15 @@
1
+ development:
2
+ africas_talking_username: "mtotomzuri"
3
+ africas_talking_apikey: "EO4GM2GOGXWPGZ"
4
+
5
+ test:
6
+ africas_talking_username: "mtotomzuri"
7
+ africas_talking_apikey: "EO4GM2GOGXWPGZ"
8
+
9
+ staging:
10
+ africas_talking_username: "mtotomzuri"
11
+ africas_talking_apikey: "EO4GM2GOGXWPGZ"
12
+
13
+ produciton:
14
+ africas_talking_username: "mtotomzuri"
15
+ africas_talking_apikey: "EO4GM2GOGXWPGZ"
data/test/helper.rb ADDED
@@ -0,0 +1,28 @@
1
+ # require "codeclimate-test-reporter"
2
+ # CodeClimate::TestReporter.start
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+
14
+ require "minitest/autorun"
15
+ require 'minitest/reporters'
16
+ require 'shoulda/context'
17
+ require 'mocha/setup'
18
+ # require 'faraday'
19
+
20
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
21
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
22
+ require 'africas_talking'
23
+
24
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
25
+
26
+ class Minitest::Test
27
+ @@mock_path = File.expand_path(File.join(File.dirname(__FILE__), 'mocks'))
28
+ end
@@ -0,0 +1,5 @@
1
+ {
2
+ "cost":"0", "number":"254710abcdefg", "status":"Invalid Phone Number"
3
+ }
4
+
5
+ // "cost":"0", "number":"+254705504211", "status":"Your account can only send to verified phone numbers. Please verify this phone number on the site or top up your account"
@@ -0,0 +1,3 @@
1
+ {
2
+ "cost":"KES 1.0000", "number":"254700200200", "status":"Sucess"
3
+ }
@@ -0,0 +1,28 @@
1
+ require 'helper'
2
+
3
+ class TestAfricasTalking < Minitest::Test
4
+ include AfricasTalking
5
+
6
+
7
+ context "When connected" do
8
+ setup do
9
+ @client_mock = setup_mock_client
10
+ end
11
+ end
12
+
13
+ protected
14
+
15
+ def get_mock_body(name)
16
+ File.open(@@mock_path + '/' + name).read
17
+ end
18
+
19
+ def setup_mock_client
20
+ # client = mock('Farady::Response')
21
+ client.stubs(:finish).returns('')
22
+ client.stubs(:status).returns(200)
23
+ client.stubs(:headers).returns({"Accept"=>"application/json"})
24
+ client.stubs(:body).returns(get_mock_body('.json'))
25
+ Faraday::Response.stubs(:new).returns(:client)
26
+ end
27
+
28
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: africas_talking
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Charles Chuck
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: typhoeus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest-reporters
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: shoulda-context
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: mocha
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Africa's Talking ruby API wrapper.
154
+ email:
155
+ - chalcchuck@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".travis.yml"
163
+ - Gemfile
164
+ - LICENSE.txt
165
+ - README.md
166
+ - Rakefile
167
+ - africas_talking.gemspec
168
+ - lib/africas_talking.rb
169
+ - lib/africas_talking/africas_talking_gateway_error.rb
170
+ - lib/africas_talking/base.rb
171
+ - lib/africas_talking/message.rb
172
+ - lib/africas_talking/sms_message.rb
173
+ - lib/africas_talking/status_report.rb
174
+ - lib/africas_talking/version.rb
175
+ - lib/generators/africas_talking/template_generator.rb
176
+ - lib/generators/africas_talking/templates/README.md
177
+ - lib/generators/africas_talking/templates/africas_talking_config.yml.erb
178
+ - test/helper.rb
179
+ - test/mocks/failed_status_report.json
180
+ - test/mocks/success_status_report.json
181
+ - test/test_africas_talking.rb
182
+ homepage: https://bitbucket.org/chalchuck/africas-talking
183
+ licenses:
184
+ - MIT
185
+ metadata: {}
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubyforge_project:
202
+ rubygems_version: 2.2.2
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: Africa's Talking ruby API wrapper.
206
+ test_files:
207
+ - test/helper.rb
208
+ - test/mocks/failed_status_report.json
209
+ - test/mocks/success_status_report.json
210
+ - test/test_africas_talking.rb