nofxx-activesms 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.autotest +17 -0
  2. data/CHANGELOG +5 -0
  3. data/History.txt +25 -0
  4. data/License.txt +22 -0
  5. data/MIT-LICENSE +22 -0
  6. data/Manifest.txt +56 -0
  7. data/README.txt +54 -0
  8. data/Rakefile +16 -0
  9. data/activesms.gemspec +36 -0
  10. data/config/hoe.rb +78 -0
  11. data/config/requirements.rb +15 -0
  12. the PDU format.webarchive +0 -0
  13. data/generators/sms/USAGE +20 -0
  14. data/generators/sms/sms_generator.rb +35 -0
  15. data/generators/sms/templates/fixture.rhtml +1 -0
  16. data/generators/sms/templates/model.rb +19 -0
  17. data/generators/sms/templates/sms.yml +103 -0
  18. data/generators/sms/templates/unit_test.rb +31 -0
  19. data/init.rb +4 -0
  20. data/lib/activesms.rb +79 -0
  21. data/lib/activesms/adv_attr_accessor.rb +32 -0
  22. data/lib/activesms/base.rb +249 -0
  23. data/lib/activesms/config.rb +20 -0
  24. data/lib/activesms/connection_adapters/abstract_adapter.rb +52 -0
  25. data/lib/activesms/connection_adapters/bulk_sms_adapter.rb +67 -0
  26. data/lib/activesms/connection_adapters/clickatell_adapter.rb +51 -0
  27. data/lib/activesms/connection_adapters/human_adapter.rb +174 -0
  28. data/lib/activesms/connection_adapters/simplewire_adapter.rb +73 -0
  29. data/lib/activesms/connections.rb +63 -0
  30. data/lib/activesms/email.rb +60 -0
  31. data/lib/activesms/exceptions.rb +35 -0
  32. data/lib/activesms/sms.rb +9 -0
  33. data/lib/activesms/sms2email.rb +21 -0
  34. data/lib/activesms/validations.rb +86 -0
  35. data/lib/activesms/version.rb +9 -0
  36. data/lib/activesms/views/active_sms/sms2_email/sms_message.html.erb +1 -0
  37. data/script/console +10 -0
  38. data/script/destroy +14 -0
  39. data/script/generate +14 -0
  40. data/script/txt2html +82 -0
  41. data/setup.rb +1585 -0
  42. data/spec/activesms/base_spec.rb +11 -0
  43. data/spec/activesms/connection_adapters/abstract_adapter_spec.rb +30 -0
  44. data/spec/activesms/connection_adapters/human_adapter_spec.rb +38 -0
  45. data/spec/activesms/connection_adapters/simplewire_spec.rb +75 -0
  46. data/spec/activesms/email_spec.rb +72 -0
  47. data/spec/activesms/sms2email_spec.rb +31 -0
  48. data/spec/activesms/sms_spec.rb +31 -0
  49. data/spec/activesms_spec.rb +15 -0
  50. data/spec/spec.opts +1 -0
  51. data/spec/spec_helper.rb +57 -0
  52. data/tasks/deployment.rake +34 -0
  53. data/tasks/environment.rake +7 -0
  54. data/tasks/rspec.rake +21 -0
  55. data/views/active_sms/base/sms2_email/sms_message.html.erb +1 -0
  56. metadata +130 -0
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe ActiveSms::Base do
4
+
5
+ it "should be 8" do
6
+ x = ActiveSms::VERSION::STRING
7
+ x.should =~ /0.8/
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require 'net/https'
3
+
4
+ include ConnectionAdapters
5
+
6
+ describe AbstractAdapter do
7
+
8
+ before(:each) do
9
+ @abstract_adapter = AbstractAdapter.new(nil)
10
+ end
11
+
12
+ it "should instantiate" do
13
+ violated unless @abstract_adapter
14
+ end
15
+
16
+ it "should have a name" do
17
+ @abstract_adapter.adapter_name.should eql("Abstract")
18
+ end
19
+
20
+ it "should have a default deliver method, to be implemented by subclasses" do
21
+ @abstract_adapter.should_receive(:deliver)
22
+ @abstract_adapter.deliver(mock(Sms))
23
+ end
24
+
25
+ it "should respond to parse with nil.. for some obscure reason" do
26
+ @abstract_adapter.parse(mock(Sms)).should eql(nil)
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ include ConnectionAdapters
3
+
4
+ describe HumanAdapter do
5
+
6
+ before(:each) do
7
+ @human_adapter = HumanAdapter.new(nil, {:use_ssl => false})
8
+ end
9
+
10
+ it "should instantiate" do
11
+ violated unless @human_adapter
12
+ end
13
+
14
+ it "should have a name" do
15
+ @human_adapter.adapter_name.should eql("Human")
16
+ end
17
+
18
+ it "should have a good url to send" do
19
+ @human_adapter.service_url.should eql("http://system.human.com.br:8080/GatewayIntegration/msgSms.do")
20
+ end
21
+
22
+ it "should parse time nicely" do
23
+ @human_adapter.date_format_human('Fri Aug 08 01:18:56 -0300 2008').should eql("08/08/2008 01:18:56")
24
+ end
25
+
26
+ it "should call http to send the message" do
27
+ sms = mock(Sms, :recipients => 'x@xx.com', :body => 'hi', :id => 1,
28
+ :from => 'no@mail.com', :schedule => "08/08/2008 01:18:56")
29
+
30
+ @human_adapter.should_receive(:send_http_request).\
31
+ with("http://system.human.com.br:8080/GatewayIntegration/msgSms.do", {
32
+ :type=>"E", :from=>"no@mail.com", :msg=>"hi",
33
+ :account=>nil, :dispatch=>"send", :schedule=>"08/08/2008 01:18:56",
34
+ :to=>"x@xx.com", :code=>nil, :id => 1
35
+ }).and_return(true)
36
+ @human_adapter.deliver(sms)#.should be_true
37
+ end
38
+ end
@@ -0,0 +1,75 @@
1
+ # puts "test"
2
+ #
3
+ # require File.dirname(__FILE__) + "/../test_helper"
4
+ #
5
+ # # Only run this test if using jruby
6
+ # if RUBY_PLATFORM =~ /java/
7
+ # class SimplewireAdapterTest < Test::Unit::TestCase
8
+ # def setup
9
+ # @simplewire_adapter = ActiveSms::ConnectionAdapters::SimplewireAdapter.new(nil, {
10
+ # :subscriber_id => 'id',
11
+ # :subscriber_password => 'password'})
12
+ # end
13
+ #
14
+ # def test_instantiation
15
+ # assert_raise(RuntimeError) { ActiveSms::ConnectionAdapters::SimplewireAdapter.new(nil, {}) }
16
+ # assert @simplewire_adapter
17
+ # end
18
+ #
19
+ # def test_sms_size
20
+ # sms = flexmock("sms")
21
+ # sms.should_receive(:subscriber_id).and_return("id")
22
+ # sms.should_receive(:subscriber_password).and_return("password")
23
+ # sms.should_receive(:recipients).and_return("4081234567")
24
+ # sms.should_receive(:from).and_return("6502435555")
25
+ # long_body = ""
26
+ # 150.times {long_body += "x"}
27
+ # sms.should_receive(:body).and_return(long_body)
28
+ #
29
+ # assert_raise(StandardError) do
30
+ # s = @simplewire_adapter.create_sms(sms)
31
+ # end
32
+ # end
33
+ #
34
+ # def test_parse_sms
35
+ # xmldata = create_sms('121212', '6502435555', 'blah blah')
36
+ # sms = @simplewire_adapter.parse(xmldata)
37
+ # assert_equal 'blah blah', sms.body
38
+ # assert_equal '121212', sms.to
39
+ # assert_equal '6502435555', sms.from
40
+ # end
41
+ #
42
+ # def test_create_sms
43
+ # sms = flexmock("sms")
44
+ # sms.should_receive(:subscriber_id).and_return("id")
45
+ # sms.should_receive(:subscriber_password).and_return("password")
46
+ # sms.should_receive(:recipients).and_return("4081234567")
47
+ # sms.should_receive(:from).and_return("6502435555")
48
+ # sms.should_receive(:body).and_return("This is the body of the sms")
49
+ #
50
+ # s = @simplewire_adapter.create_sms(sms)
51
+ #
52
+ # assert_equal "id", s.subscriber_id
53
+ # assert_equal "password", s.subscriber_password
54
+ # assert_equal "4081234567", s.destination_addr.address
55
+ # assert_equal "6502435555", s.source_addr.address
56
+ # assert_equal "This is the body of the sms", s.msg_text
57
+ # end
58
+ #
59
+ # protected
60
+ # def create_sms(to, from, body)
61
+ # xmldata =<<END
62
+ # <?xml version="1.0" ?>
63
+ # <request version="3.0" protocol="wmp" type="deliver">
64
+ # <account id="123-456-789-12345"/>
65
+ # <destination ton="3" address="#{to}"/>
66
+ # <source carrier="348" ton="1" address="#{from}"/>
67
+ # <option datacoding="7bit" />
68
+ # <message udhi="true" data="0605040B8423F0#{body.unpack('H*')}"/>
69
+ # <ticket id="12004-0923R-1845S-10M25"/>
70
+ # </request>
71
+ # END
72
+ # xmldata
73
+ # end
74
+ # end
75
+ # end
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class Noter < ActiveSms::Base
4
+ def emaio
5
+ @delivery = :email
6
+ @carrier = 'tim' #
7
+ @recipients = '5555555555'
8
+ @from = 'me@somewhere.net'
9
+ @body = "Hi Friend"
10
+ #@id = ''
11
+ #@schedule = "dd/mm/aaaa hh:mm:ss"
12
+ @options = {}
13
+ end
14
+ end
15
+
16
+ describe Email do
17
+
18
+ it "should deliver an sms" do
19
+ sms = mock(Sms, :delivery => :email, :recipients => '5555555555', :body => 'hi', :options => {},
20
+ :id => 1, :carrier => :tim, :from => 'other@domain.com', :schedule => "08/08/2008 01:18:56")
21
+ Sms2Email.should_receive(:deliver_sms_message).with("5555555555@tim.com.br", "hi", "noreply@domain.com").and_return(true)
22
+ Noter.deliver(sms)
23
+ end
24
+
25
+ describe "Include Module" do
26
+ include Email
27
+
28
+ it "should format number" do
29
+ stub!(:valid?).and_return(false)
30
+ #format_number('555444').should eql('555555555')
31
+ end
32
+
33
+ it "should determine a correct email address" do
34
+ get_sms_address('5543214321', 'tim').should eql('5543214321@tim.com.br')
35
+ end
36
+
37
+ it "should determine two time to be sure" do
38
+ get_sms_address('5543214321', 'oi').should eql('5543214321@sms.oi.com.br')
39
+ end
40
+
41
+ it "should be valid with more than 10 digits" do
42
+ is_valid?('1234567890').should be_true
43
+ end
44
+
45
+ it "should be invalid with lesse than 10 digits" do
46
+ is_valid?('123456789').should_not be_true
47
+ end
48
+
49
+ it "should be invalid if it has something that is not a number.. NaN hehe" do
50
+ is_valid?('123456789a').should_not be_true
51
+ end
52
+
53
+ it "should clean the number from evil chars" do
54
+ get_sms_address('5-54g3-2=143h21', 'tim').should eql('5543214321@tim.com.br')
55
+ end
56
+
57
+ it "should throw an error if the carrier is not known" do
58
+ lambda {get_sms_address('5543214321', 'nofxx-telecom')}.should raise_error(ActiveSms::CarrierException)
59
+ end
60
+
61
+ it "should throw an error if the carrier is blank" do
62
+ lambda {get_sms_address('5543214321', '')}.should raise_error(ActiveSms::CarrierException)
63
+ end
64
+
65
+ describe "Email2Sms" do
66
+ it "should throw an error if the carrier is blank" do
67
+ @sms = ActiveSms::Sms.new
68
+ lambda {email_deliver(@sms)}.should raise_error(ActiveSms::CarrierException)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Sms2Email do
4
+ context 'The SomeMailer mailer' do
5
+ CHARSET = 'utf-8'
6
+ include ActionMailer::Quoting
7
+
8
+ setup do
9
+ # You don't need these lines while you are using create_ instead of deliver_
10
+ #ActionMailer::Base.delivery_method = :test
11
+ #ActionMailer::Base.perform_deliveries = true
12
+ #ActionMailer::Base.deliveries = []
13
+
14
+ @expected = TMail::Mail.new
15
+ @expected.set_content_type 'text', 'plain', { 'charset' => CHARSET }
16
+ @expected.mime_version = '1.0'
17
+ end
18
+
19
+ specify 'should send sms via email' do
20
+ #@expected.subject = 'Account activation'
21
+ @expected.body = 'hi' #read_fixture('sms_mesage')
22
+ @expected.from = 'no-email@example.com'
23
+ @expected.to = 'some@mail.com'
24
+
25
+ Sms2Email.create_sms_message("some@mail.com", "hi", "no-email@example.com").\
26
+ encoded.should == @expected.encoded
27
+ end
28
+ end
29
+ end
30
+ # good post about testing mailers
31
+ # => http://kpumuk.info/ruby-on-rails/testing-mailers-with-rspec/
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module SmsSpecHelper
4
+ def attr_valid_sms
5
+ {
6
+ :delivery => :email,
7
+ :carrier => 'tim',
8
+ :recipients => '5544443333',
9
+ :from => 'someone@somewher.net',
10
+ :body => 'hello...how are your family?',
11
+ :id => 1,
12
+ :schedule => Time.parse('Sat Aug 09 03:44:19 -0300 2008')
13
+ }
14
+ end
15
+ end
16
+ describe Sms do
17
+ include SmsSpecHelper
18
+
19
+ before(:each) do
20
+ @sms = Sms.new
21
+ end
22
+
23
+ it "should be a valid sms" do
24
+ violated unless @sms
25
+ end
26
+
27
+ it "should return a nice string" do
28
+ @sms.attr = attr_valid_sms
29
+ @sms.to_s.should eql("#<ActiveSms::Sms @recipients=\"5544443333\" @from=\"someone@somewher.net\" @body=\"hello...how are your family?\" @id=1 @schedule=Sat Aug 09 03:44:19 -0300 2008>")
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+ include ActiveSms
3
+ # Time to add your specs!
4
+ # http://rspec.info/
5
+ describe ActiveSms do
6
+
7
+ it "find this spec in spec directory" do
8
+ end
9
+
10
+
11
+
12
+
13
+
14
+
15
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,57 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
10
+ #$:.unshift(File.dirname(__FILE__) + '/../lib/activesms')
11
+ #$:.unshift(File.dirname(__FILE__) + '/../lib/activesms/connection_adapters')
12
+ require 'activesms'
13
+
14
+ include ActiveSms
15
+
16
+ # #
17
+ # HELPERS
18
+ #
19
+ #
20
+ class Object
21
+
22
+ def attr=(options = {})
23
+ options.each do |attribute, value|
24
+ self.send("#{attribute}=", value)
25
+ end
26
+ end
27
+ end
28
+
29
+ # ##
30
+ # * http://wincent.com/knowledge-base/Fixtures_considered_harmful%3F
31
+ # * Neil Rahilly
32
+ class Hash
33
+ ##
34
+ # Filter keys out of a Hash.
35
+ #
36
+ # { :a => 1, :b => 2, :c => 3 }.except(:a)
37
+ # => { :b => 2, :c => 3 }
38
+ def except(*keys)
39
+ self.reject { |k,v| keys.include?(k || k.to_sym) }
40
+ end
41
+ ##
42
+ # Override some keys.
43
+ #
44
+ # { :a => 1, :b => 2, :c => 3 }.with(:a => 4)
45
+ # => { :a => 4, :b => 2, :c => 3 }
46
+ def with(overrides = {})
47
+ self.merge overrides
48
+ end
49
+ ##
50
+ # Returns a Hash with only the pairs identified by +keys+.
51
+ #
52
+ # { :a => 1, :b => 2, :c => 3 }.only(:a)
53
+ # => { :a => 1 }
54
+ def only(*keys)
55
+ self.reject { |k,v| !keys.include?(k || k.to_sym) }
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nofxx-activesms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Robert Cottrell
8
+ - Marcos Piccinini
9
+ - Ben Curren
10
+ - Dean Mao
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+
15
+ date: 2008-09-09 00:00:00 -07:00
16
+ default_executable:
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: hoe
20
+ version_requirement:
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 1.7.0
26
+ version:
27
+ description: Active SMS is a framework for sending and receiving SMS messages
28
+ email:
29
+ - rgcottrell@rubyforge.org
30
+ - x@nofxx.com
31
+ - ben@esomnie.com
32
+ - dean@esomnie.com
33
+ executables: []
34
+
35
+ extensions: []
36
+
37
+ extra_rdoc_files:
38
+ - History.txt
39
+ - License.txt
40
+ - Manifest.txt
41
+ - README.txt
42
+ files:
43
+ - .autotest
44
+ - CHANGELOG
45
+ - History.txt
46
+ - License.txt
47
+ - MIT-LICENSE
48
+ - Manifest.txt
49
+ - README.txt
50
+ - Rakefile
51
+ - activesms.gemspec
52
+ - config/hoe.rb
53
+ - config/requirements.rb
54
+ - docs/SMS messages and the PDU format.webarchive
55
+ - generators/sms/USAGE
56
+ - generators/sms/sms_generator.rb
57
+ - generators/sms/templates/fixture.rhtml
58
+ - generators/sms/templates/model.rb
59
+ - generators/sms/templates/sms.yml
60
+ - generators/sms/templates/unit_test.rb
61
+ - init.rb
62
+ - lib/activesms.rb
63
+ - lib/activesms/adv_attr_accessor.rb
64
+ - lib/activesms/base.rb
65
+ - lib/activesms/config.rb
66
+ - lib/activesms/connection_adapters/abstract_adapter.rb
67
+ - lib/activesms/connection_adapters/bulk_sms_adapter.rb
68
+ - lib/activesms/connection_adapters/clickatell_adapter.rb
69
+ - lib/activesms/connection_adapters/human_adapter.rb
70
+ - lib/activesms/connection_adapters/simplewire_adapter.rb
71
+ - lib/activesms/connections.rb
72
+ - lib/activesms/email.rb
73
+ - lib/activesms/exceptions.rb
74
+ - lib/activesms/sms.rb
75
+ - lib/activesms/sms2email.rb
76
+ - lib/activesms/validations.rb
77
+ - lib/activesms/version.rb
78
+ - lib/activesms/views/active_sms/sms2_email/sms_message.html.erb
79
+ - script/console
80
+ - script/destroy
81
+ - script/generate
82
+ - script/txt2html
83
+ - setup.rb
84
+ - spec/activesms/base_spec.rb
85
+ - spec/activesms/connection_adapters/abstract_adapter_spec.rb
86
+ - spec/activesms/connection_adapters/human_adapter_spec.rb
87
+ - spec/activesms/connection_adapters/simplewire_spec.rb
88
+ - spec/activesms/email_spec.rb
89
+ - spec/activesms/sms2email_spec.rb
90
+ - spec/activesms/sms_spec.rb
91
+ - spec/activesms_spec.rb
92
+ - spec/spec.opts
93
+ - spec/spec_helper.rb
94
+ - tasks/deployment.rake
95
+ - tasks/environment.rake
96
+ - tasks/rspec.rake
97
+ - tasks/website.rake
98
+ - views/active_sms/base/sms2_email/sms_message.html.erb
99
+ has_rdoc: true
100
+ homepage: http://github.com/nofxx/activesms
101
+ post_install_message: |+
102
+
103
+ For more information on activesms, see http://github.com/nofxx/activesms
104
+
105
+ rdoc_options:
106
+ - --main
107
+ - README.txt
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: "0"
115
+ version:
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: "0"
121
+ version:
122
+ requirements: []
123
+
124
+ rubyforge_project: activesms
125
+ rubygems_version: 1.2.0
126
+ signing_key:
127
+ specification_version: 2
128
+ summary: Active SMS is a framework for sending and receiving SMS messages
129
+ test_files: []
130
+