nofxx-activesms 0.9.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.
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
+