tms_client 0.0.2

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.
@@ -0,0 +1,22 @@
1
+ module TMS #:nodoc:
2
+ # A Keyword is a word that TMS will detect in an incoming SMS message. Keywords can have Commands, and
3
+ # when an incoming text message has a keyword, TMS will execute the keyword's Commands.
4
+ #
5
+ # ==== Attributes
6
+ #
7
+ # * +name+ - The name of the keyword.
8
+ #
9
+ # === Examples
10
+ # keyword = client.keywords.build(:name => "HOWDY")
11
+ # keyword.post
12
+ # keyword.name = "DOODY"
13
+ # keyword.put
14
+ # keyword.delete
15
+ class Keyword
16
+ include InstanceResource
17
+
18
+ writeable_attributes :name
19
+ collection_attributes :commands
20
+
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ module TMS #:nodoc:
2
+ class Recipient
3
+ include InstanceResource
4
+
5
+ writeable_attributes :phone
6
+ readonly_attributes :formatted_phone, :error_message, :status
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module TMS #:nodoc:
2
+ class SmsMessage
3
+ include InstanceResource
4
+
5
+ writeable_attributes :from, :body, :subject
6
+ readonly_attributes :created_at, :completed_at
7
+ collection_attributes :recipients
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module TMS #:nodoc:
2
+ class VoiceMessage
3
+ include InstanceResource
4
+
5
+ writeable_attributes :play_url
6
+ readonly_attributes :created_at, :completed_at
7
+ collection_attributes :recipients
8
+
9
+ def self.to_s
10
+ "VoiceMessage"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ require 'active_support/inflector'
2
+
3
+ module TMS::CoreExt
4
+ def demodulize(path)
5
+ ActiveSupport::Inflector.demodulize(path)
6
+ end
7
+
8
+ def classify(str)
9
+ ActiveSupport::Inflector.camelize(str)
10
+ end
11
+
12
+ def singularize(str)
13
+ ActiveSupport::Inflector.singularize(str)
14
+ end
15
+
16
+ def pluralize(str)
17
+ ActiveSupport::Inflector.pluralize(str)
18
+ end
19
+
20
+ def tmsify(klassname)
21
+ ActiveSupport::Inflector.underscore(demodulize(klassname))
22
+ end
23
+
24
+ def instance_class(klass)
25
+ ActiveSupport::Inflector.constantize(singularize(klass.to_s))
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ module TMS::Util
2
+ module HalLinkParser
3
+
4
+ #def self.included(base)
5
+ # base.send(:include, TMS::CoreExt)
6
+ #end
7
+
8
+ def parse_links(_links)
9
+ @resources = {}
10
+ return if _links.nil?
11
+ parse_link(_links) and return if _links.is_a?(Hash)
12
+ _links.each { |link| parse_link(link) }
13
+ end
14
+
15
+ def subresources
16
+ @resources
17
+ end
18
+
19
+ protected
20
+
21
+ def metaclass
22
+ @metaclass ||= class << self;
23
+ self;
24
+ end
25
+ end
26
+
27
+ def parse_link(link)
28
+ link.each do |rel, href|
29
+ if rel == 'self'
30
+ self.href = href
31
+ else
32
+ klass = ::TMS.const_get(classify(rel)) rescue nil
33
+ klass = self.class if ['first', 'prev', 'next', 'last'].include?(rel)
34
+ if klass
35
+ subresources[rel] = klass.new(self.client, href)
36
+ setup_subresource(link)
37
+ else
38
+ puts "Don't know what to do with link rel '#{rel}' for class #{self.class.to_s}!"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
45
+ def setup_subresource(link)
46
+ return unless link
47
+ link.each { |rel, href| self.metaclass.send(:define_method, rel.to_sym, &lambda { subresources[rel] }) unless rel == 'self' }
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module TMS #:nodoc:
2
+ VERSION = "0.0.2"
3
+ end
data/lib/tms_client.rb ADDED
@@ -0,0 +1,30 @@
1
+ module TMS #:nodoc:
2
+ end
3
+
4
+ require 'active_support'
5
+ require 'tms_client/version'
6
+ require 'faraday'
7
+ require 'link_header'
8
+ require 'faraday_middleware'
9
+
10
+ require 'tms_client/util/hal_link_parser'
11
+ require 'tms_client/util/core_ext'
12
+ require 'tms_client/connection'
13
+ require 'tms_client/client'
14
+ require 'tms_client/logger'
15
+ require 'tms_client/base'
16
+ require 'tms_client/instance_resource'
17
+ require 'tms_client/collection_resource'
18
+ require 'tms_client/request'
19
+
20
+ require 'tms_client/resource/collections'
21
+ require 'tms_client/resource/recipient'
22
+ require 'tms_client/resource/email_recipient'
23
+ require 'tms_client/resource/sms_message'
24
+ require 'tms_client/resource/voice_message'
25
+ require 'tms_client/resource/inbound_message'
26
+ require 'tms_client/resource/command_type'
27
+ require 'tms_client/resource/command'
28
+ require 'tms_client/resource/commands'
29
+ require 'tms_client/resource/keyword'
30
+ require 'tms_client/resource/email'
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ describe TMS::Client do
3
+ context "creating a new client" do
4
+ before do
5
+ response = double('response', :status=>200, :body => {"_links" => [{"self" => "/"}, {"horse" => "/horses/new"}, {"rabbits" => "/rabbits"}]})
6
+ @raw_connection = double('raw_connection', :get => response)
7
+ @connection = TMS::Connection.stub(:new).and_return(double('connection', :connection => @raw_connection))
8
+ @client = TMS::Client.new('username', 'password', :api_root => 'null_url')
9
+ end
10
+ it 'should discover endpoints for known services' do
11
+ @client.horse.should be_kind_of(TMS::Horse)
12
+ @client.rabbits.should be_kind_of(TMS::Rabbits)
13
+ end
14
+ it 'should handle 4xx responses' do
15
+ @raw_connection.stub(:get).and_return(double('response', :status => 404, :body => {'message' => 'hi'}))
16
+ expect { @client.get('/blargh') }.to raise_error(TMS::Request::Error)
17
+ end
18
+ it 'should handle 202 responses' do
19
+ @raw_connection.stub(:get).and_return(double('response', :status => 202, :body => {'message' => 'hi'}))
20
+ expect { @client.get('/blargh') }.to raise_error(TMS::Request::InProgress)
21
+ end
22
+ end
23
+
24
+
25
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::CommandTypes do
4
+ context "loading command types" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @command_types = TMS::CommandTypes.new(client, '/command_types')
10
+ end
11
+ it 'should GET ok' do
12
+ body = [{"fields"=>["dcm_account_codes"], "name"=>"dcm_unsubscribe"},
13
+ {"fields"=>["dcm_account_code", "dcm_topic_codes"], "name"=>"dcm_subscribe"},
14
+ {"fields"=>["http_method", "username", "password", "url"], "name"=>"forward"}]
15
+ @command_types.client.should_receive(:get).and_return(double('response', :body => body, :status => 200, :headers => {}))
16
+ @command_types.get
17
+ @command_types.collection.length.should == 3
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::InboundMessages do
4
+ context "creating a new inbound messages list" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @messages = TMS::InboundMessages.new(client, '/inbound_messages')
10
+ end
11
+ it 'should GET itself' do
12
+ body = [{:body=>"HELP", :from=>"+16125551212", :created_at=>"a while ago", :to=>"(651) 433-6258"}, {:body=>"STOP", :from=>"+16125551212", :created_at=>"a while ago", :to=>"(651) 433-6258"}]
13
+ @messages.client.should_receive(:get).and_return(double('response', :body => body, :status => 200, :headers => {}))
14
+
15
+ @messages.get
16
+ @messages.collection.length.should == 2
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::Keyword do
4
+ context "creating a new keyword" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @keyword = TMS::Keyword.new(client, nil, {:name => 'LOL'})
10
+ end
11
+ it 'should initialize with attrs' do
12
+ @keyword.name.should == 'LOL'
13
+ end
14
+ it 'should post successfully' do
15
+ response = {:name => 'lol'}
16
+ @keyword.client.should_receive('post').with(@keyword).and_return(double('response', :status => 201, :body => response))
17
+ @keyword.post
18
+ @keyword.name.should == 'lol'
19
+ end
20
+ it 'should handle errors' do
21
+ response = {'errors' => {:name => "can't be nil"}}
22
+ @keyword.client.should_receive('post').with(@keyword).and_return(double('response', :status => 422, :body => response))
23
+ @keyword.post
24
+ @keyword.name.should == 'LOL'
25
+ @keyword.errors.should == {:name => "can't be nil"}
26
+ end
27
+ end
28
+
29
+ context 'an existing keyword' do
30
+ let(:client) do
31
+ double('client')
32
+ end
33
+ before do
34
+ # blank hash prevents the client from doing a GET in the initialize method
35
+ @keyword = TMS::Keyword.new(client, '/keywords/99', {})
36
+ end
37
+ it 'should GET cleanly' do
38
+ response = {:name => 'FOO'}
39
+ @keyword.client.should_receive('get').with(@keyword.href).and_return(double('response', :status => 200, :body => response))
40
+ @keyword.get
41
+ @keyword.name.should == 'FOO'
42
+ end
43
+ it 'should PUT cleanly' do
44
+ @keyword.name = "GOVLIE"
45
+ response = {:name => 'govlie'}
46
+ @keyword.client.should_receive('put').with(@keyword).and_return(double('response', :status => 200, :body => response))
47
+ @keyword.put
48
+ @keyword.name.should == 'govlie'
49
+
50
+ end
51
+ it 'should DELETE cleanly' do
52
+ @keyword.client.should_receive('delete').with(@keyword.href).and_return(double('response', :status => 200, :body => ''))
53
+ @keyword.delete
54
+ end
55
+ end
56
+
57
+
58
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::Keywords do
4
+ context "loading keywords" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @keywords = TMS::Keywords.new(client, '/keywords')
10
+ end
11
+ it 'should GET ok' do
12
+ body = [
13
+ {"name"=>"services", "_links"=>{"self"=>"/keywords/1"}},
14
+ {"name"=>"subscribe", "_links"=>{"self"=>"/keywords/2"}}
15
+ ]
16
+ @keywords.client.should_receive(:get).and_return(double('response', :body => body, :status => 200, :headers => {}))
17
+ @keywords.get
18
+ @keywords.collection.length.should == 2
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::SmsMessage do
4
+ context "creating a new message" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @message = TMS::SmsMessage.new(client, nil, {:body => '12345678', :created_at => 'BAAAAAD'})
10
+ end
11
+ it 'should not render readonly attrs in json hash' do
12
+ @message.to_json[:body].should == '12345678'
13
+ @message.to_json[:created_at].should == nil
14
+ end
15
+ it 'should initialize with attrs and collections' do
16
+ @message.body.should == '12345678'
17
+ @message.recipients.class.should == TMS::Recipients
18
+ end
19
+ it 'should post successfully' do
20
+ response = {:body => 'processed', :recipients => [{:phone => '22345678'}], :created_at => 'time'}
21
+ @message.client.should_receive('post').with(@message).and_return(double('response', :status => 201, :body => response))
22
+ @message.post
23
+ @message.body.should == 'processed'
24
+ @message.created_at.should == 'time'
25
+ @message.recipients.class.should == TMS::Recipients
26
+ @message.recipients.collection.first.class.should == TMS::Recipient
27
+ end
28
+ it 'should handle errors' do
29
+ response = {'errors' => {:body => "can't be nil"}}
30
+ @message.client.should_receive('post').with(@message).and_return(double('response', :status => 422, :body => response))
31
+ @message.post
32
+ @message.body.should == '12345678'
33
+ @message.errors.should == {:body => "can't be nil"}
34
+ end
35
+ end
36
+
37
+ context 'an existing message' do
38
+ let(:client) do
39
+ double('client')
40
+ end
41
+ before do
42
+ # blank hash prevents the client from doing a GET in the initialize method
43
+ @message = TMS::SmsMessage.new(client, '/messages/99', {})
44
+ end
45
+ it 'should GET cleanly' do
46
+ response = {:body => 'processed', :recipients => [{:phone => '22345678'}], :created_at => 'time'}
47
+ @message.client.should_receive('get').with(@message.href).and_return(double('response', :status => 200, :body => response))
48
+ @message.get
49
+ @message.body.should == 'processed'
50
+ @message.created_at.should == 'time'
51
+ end
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS::SmsMessages do
4
+ context "creating a new messages list" do
5
+ let(:client) do
6
+ double('client')
7
+ end
8
+ before do
9
+ @messages = TMS::SmsMessages.new(client, '/messages')
10
+ end
11
+ it 'should GET itself' do
12
+ body = [{:short_body => 'hi ho', :created_at => 'a while ago'}, {:short_body => 'feel me flow', :created_at => 'longer ago'}]
13
+ @messages.client.should_receive(:get).and_return(double('response', :body => body, :status => 200, :headers => {'link' => "</messages/page/2>; rel=\"next\",</messages/page/11>; rel=\"last\""}))
14
+
15
+ @messages.get
16
+ @messages.collection.length.should == 2
17
+ @messages.next.href.should == '/messages/page/2'
18
+ @messages.last.href.should == '/messages/page/11'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ $: << File.expand_path("../lib", __FILE__)
2
+ require 'tms_client'
3
+
4
+ class TMS::Horse
5
+ def initialize(client, href)
6
+ end
7
+ end
8
+
9
+ class TMS::Rabbits
10
+ def initialize(client, href)
11
+ end
12
+ end
13
+
14
+ # This file was generated by the `rspec --init` command. Conventionally, all
15
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
16
+ # Require this file using `require "spec_helper"` to ensure that it is only
17
+ # loaded once.
18
+ #
19
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
20
+ RSpec.configure do |config|
21
+ config.treat_symbols_as_metadata_keys_with_true_values = true
22
+ config.run_all_when_everything_filtered = true
23
+ config.filter_run :focus
24
+
25
+ # Run specs in random order to surface order dependencies. If you find an
26
+ # order dependency and want to debug it, you can fix the order by providing
27
+ # the seed, which is printed after each run.
28
+ # --seed 1234
29
+ config.order = 'random'
30
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TMS, "version" do
4
+ it "should exist" do
5
+ TMS::VERSION.should be_an_instance_of(String)
6
+ end
7
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tms_client/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tms_client"
7
+ s.version = TMS::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["GovDelivery"]
10
+ s.email = ["support@govdelivery.com"]
11
+ s.homepage = "http://govdelivery.com"
12
+ s.summary = %q{A ruby client to interact with the GovDelivery TMS REST API.}
13
+ s.description = %q{A reference implementation, written in Ruby, to interact with GovDelivery's TMS API. The client is compatible with Ruby versions 1.8.7 and 1.9.3. }
14
+
15
+ if RUBY_VERSION < "1.9"
16
+ s.add_runtime_dependency "json" # this is part of 1.9's stdlib
17
+ end
18
+
19
+ s.add_runtime_dependency "faraday"
20
+ s.add_runtime_dependency "faraday_middleware"
21
+ s.add_runtime_dependency "activesupport"
22
+ s.add_runtime_dependency "link_header"
23
+ s.add_development_dependency "rspec"
24
+ s.add_development_dependency "rake"
25
+ s.add_development_dependency "rubygems-tasks"
26
+
27
+ s.files = %w{
28
+ Gemfile
29
+ README.md
30
+ Rakefile
31
+ tms_client.gemspec
32
+ } + Dir["lib/**/*"]
33
+
34
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
35
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
36
+ s.require_paths = ["lib"]
37
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tms_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - GovDelivery
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: faraday_middleware
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activesupport
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: link_header
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubygems-tasks
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
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
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: ! 'A reference implementation, written in Ruby, to interact with GovDelivery''s
127
+ TMS API. The client is compatible with Ruby versions 1.8.7 and 1.9.3. '
128
+ email:
129
+ - support@govdelivery.com
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - Gemfile
135
+ - README.md
136
+ - Rakefile
137
+ - tms_client.gemspec
138
+ - lib/tms_client/base.rb
139
+ - lib/tms_client/client.rb
140
+ - lib/tms_client/collection_resource.rb
141
+ - lib/tms_client/connection.rb
142
+ - lib/tms_client/instance_resource.rb
143
+ - lib/tms_client/logger.rb
144
+ - lib/tms_client/request.rb
145
+ - lib/tms_client/resource/collections.rb
146
+ - lib/tms_client/resource/command.rb
147
+ - lib/tms_client/resource/command_type.rb
148
+ - lib/tms_client/resource/commands.rb
149
+ - lib/tms_client/resource/email.rb
150
+ - lib/tms_client/resource/email_recipient.rb
151
+ - lib/tms_client/resource/inbound_message.rb
152
+ - lib/tms_client/resource/keyword.rb
153
+ - lib/tms_client/resource/recipient.rb
154
+ - lib/tms_client/resource/sms_message.rb
155
+ - lib/tms_client/resource/voice_message.rb
156
+ - lib/tms_client/util/core_ext.rb
157
+ - lib/tms_client/util/hal_link_parser.rb
158
+ - lib/tms_client/version.rb
159
+ - lib/tms_client.rb
160
+ - spec/client_spec.rb
161
+ - spec/command_types_spec.rb
162
+ - spec/inbound_messages_spec.rb
163
+ - spec/keyword_spec.rb
164
+ - spec/keywords_spec.rb
165
+ - spec/message_spec.rb
166
+ - spec/messages_spec.rb
167
+ - spec/spec_helper.rb
168
+ - spec/tms_client_spec.rb
169
+ homepage: http://govdelivery.com
170
+ licenses: []
171
+ post_install_message:
172
+ rdoc_options: []
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ segments:
182
+ - 0
183
+ hash: 335366191
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ segments:
191
+ - 0
192
+ hash: 335366191
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 1.8.24
196
+ signing_key:
197
+ specification_version: 3
198
+ summary: A ruby client to interact with the GovDelivery TMS REST API.
199
+ test_files:
200
+ - spec/client_spec.rb
201
+ - spec/command_types_spec.rb
202
+ - spec/inbound_messages_spec.rb
203
+ - spec/keyword_spec.rb
204
+ - spec/keywords_spec.rb
205
+ - spec/message_spec.rb
206
+ - spec/messages_spec.rb
207
+ - spec/spec_helper.rb
208
+ - spec/tms_client_spec.rb