tms_client 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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