txtlocal 0.0.1

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,5 @@
1
+ Autotest.add_hook :initialize do |at|
2
+ at.add_mapping(%r%^lib/txtlocal/(.*)\.rb$%, true) do |_, m|
3
+ "spec/#{m[1]}_spec.rb"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ txtlocal.komodoproject
5
+ README.html
6
+ api_login.rb
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --debug
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :gemcutter
2
+
3
+ # Specify your gem's dependencies in txtlocal.gemspec
4
+ gemspec
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ txtlocal (0.0.1)
5
+ json
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ ZenTest (4.4.2)
11
+ addressable (2.2.2)
12
+ autotest (4.4.6)
13
+ ZenTest (>= 4.4.1)
14
+ columnize (0.3.2)
15
+ crack (0.1.8)
16
+ diff-lcs (1.1.2)
17
+ json (1.4.6)
18
+ linecache (0.43)
19
+ rspec (2.4.0)
20
+ rspec-core (~> 2.4.0)
21
+ rspec-expectations (~> 2.4.0)
22
+ rspec-mocks (~> 2.4.0)
23
+ rspec-core (2.4.0)
24
+ rspec-expectations (2.4.0)
25
+ diff-lcs (~> 1.1.2)
26
+ rspec-mocks (2.4.0)
27
+ ruby-debug (0.10.4)
28
+ columnize (>= 0.1)
29
+ ruby-debug-base (~> 0.10.4.0)
30
+ ruby-debug-base (0.10.4)
31
+ linecache (>= 0.3)
32
+ webmock (1.6.2)
33
+ addressable (>= 2.2.2)
34
+ crack (>= 0.1.7)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ autotest
41
+ bundler (>= 1.0.0)
42
+ json
43
+ rspec
44
+ ruby-debug
45
+ txtlocal!
46
+ webmock
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 epiGenesys Limited
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,46 @@
1
+ # txtlocal.co.uk API Wrapper
2
+
3
+ This gem is intended to provide a simple API for sending text messages via txtlocal's API.
4
+
5
+ ## Installing
6
+
7
+ Add the gem to your gemfile
8
+
9
+ gem 'txtlocal', :git => 'git://github.com/epigenesys/txtlocal.git'
10
+
11
+ ## Usage
12
+
13
+ Configure the default settings
14
+
15
+ Txtlocal.config do |c|
16
+ c.from = "My App"
17
+ c.username = "txtlocal_username"
18
+ c.password = "txtlocal_password"
19
+ end
20
+
21
+ Use Txtlocal.send_message to send messages
22
+
23
+ Txtlocal.send_message("You have 1 new friend request!", "07729435xxx")
24
+
25
+ Or create a message manually
26
+
27
+ msg = Txtlocal::Message.new
28
+ msg.body = "Tickets will be available tomorrow morning at 9am"
29
+ msg.recipients = ["0712 3893 xxx", "447923176xxx"]
30
+ msg.add_recipient "+447729435xxx"
31
+ msg.send!
32
+
33
+ You can override the sender on a per message basis
34
+
35
+ Txtlocal.send_message("You have 1 new friend request!", "07729435xxx", :from => "someone")
36
+
37
+ msg = Txtlocal::Message.new
38
+ msg.from = "a mystery"
39
+
40
+ ## Testing
41
+
42
+ Set test = true in the configuration to use the API's test mode
43
+
44
+ Txtlocal.config.test = true
45
+ Txtlocal.config.testing?
46
+ => true
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,26 @@
1
+ require 'txtlocal/config'
2
+ require 'txtlocal/message'
3
+
4
+ module Txtlocal
5
+ class << self
6
+
7
+ def config
8
+ @config ||= Config.new
9
+ if block_given?
10
+ yield @config
11
+ end
12
+ @config
13
+ end
14
+
15
+ def reset_config
16
+ @config = nil
17
+ end
18
+
19
+ def send_message(message, recipients, options={})
20
+ msg = Txtlocal::Message.new(message, recipients, options)
21
+ msg.send!
22
+ msg
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ module Txtlocal
2
+ class Config
3
+
4
+ # The default FROM value for sent messages
5
+ # this can be overridden on a per-message basis
6
+ attr_accessor :from
7
+
8
+ # The username of the txtlocal account to use when accessing the API
9
+ attr_accessor :username
10
+
11
+ # The password of the txtlocal account to use when accessing the API
12
+ attr_accessor :password
13
+
14
+ # Access the API in test mode
15
+ attr_accessor :test
16
+
17
+ def initialize
18
+ @test = false
19
+ end
20
+
21
+ # Nice wrapper to check if we're testing
22
+ def testing?
23
+ !!@test
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,90 @@
1
+ require 'net/https'
2
+ require 'uri'
3
+ require 'json'
4
+
5
+ module Txtlocal
6
+ class Message
7
+
8
+ attr_accessor :body
9
+ attr_accessor :recipients
10
+ attr_accessor :from
11
+
12
+ attr_accessor :response
13
+
14
+ def initialize(message=nil, recipients=nil, options=nil)
15
+ self.body = message if message
16
+ self.recipients = recipients if recipients
17
+ self.options = options if options
18
+ end
19
+
20
+ def body=(body)
21
+ @body = body.strip.gsub(/\n/, '%n')
22
+ end
23
+
24
+ def recipients
25
+ @recipients ||= []
26
+ end
27
+ def recipients=(recipients)
28
+ @recipients = []
29
+ [*recipients].each do |recip|
30
+ add_recipient(recip)
31
+ end
32
+ end
33
+ def add_recipient(recipient)
34
+ recipient = recipient.gsub(/\s/, '')
35
+ recipient = case recipient
36
+ when /^447\d{9}$/
37
+ recipient
38
+ when /^(?:\+447|07)(\d{9})$/
39
+ "447#{$1}"
40
+ else
41
+ return
42
+ end
43
+ recipients << recipient
44
+ end
45
+
46
+ def from
47
+ self.from = Txtlocal.config.from if not @from
48
+ @from
49
+ end
50
+ def from=(from)
51
+ if from.to_s.length < 3
52
+ @from = nil
53
+ else
54
+ @from = from.strip.gsub(/[^\w ]/, '').to_s[0, 11]
55
+ end
56
+ end
57
+
58
+ def options=(options)
59
+ self.from = options[:from] if options.has_key?(:from)
60
+ end
61
+
62
+ def response=(response)
63
+ if not response.body.empty?
64
+ @response = {}
65
+ data = JSON.parse(response.body)
66
+ data.each_pair do |k, v|
67
+ key = k.gsub(/\B[A-Z]+/, '_\0').downcase.to_sym
68
+ @response[key] = v
69
+ end
70
+ end
71
+ end
72
+
73
+ API_ENDPOINT = URI.parse("https://www.txtlocal.com/sendsmspost.php")
74
+ def send!
75
+ http = Net::HTTP.new(API_ENDPOINT.host, API_ENDPOINT.port)
76
+ http.use_ssl = true
77
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
78
+ req = Net::HTTP::Post.new(API_ENDPOINT.path)
79
+ req.set_form_data(:json => 1,
80
+ :test => Txtlocal.config.testing? ? 1 : 0,
81
+ :from => from,
82
+ :message => body,
83
+ :selectednums => recipients.join(","),
84
+ :uname => Txtlocal.config.username,
85
+ :pword => Txtlocal.config.password)
86
+ result = http.start { |http| http.request(req) }
87
+ self.response = result
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,3 @@
1
+ module Txtlocal
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,42 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe Txtlocal::Config do
4
+ let(:config) { Txtlocal::Config.new }
5
+
6
+ describe "attributes" do
7
+ attributes = %w(test from username password)
8
+ attributes.each do |attr|
9
+ it "should have the '#{attr}' attribute" do
10
+ value = mock("value")
11
+ config.send("#{attr}=", value)
12
+ config.send(attr).should == value
13
+ end
14
+ end
15
+ end
16
+
17
+ describe "defaults" do
18
+ defaults = {
19
+ :test => false,
20
+ :username => nil,
21
+ :password => nil,
22
+ :from => nil
23
+ }
24
+
25
+ defaults.each_pair do |attr, default|
26
+ example "#{attr} should default to #{default.inspect}" do
27
+ config.send(attr).should == default
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "testing?" do
33
+ it "should return false if test isnt true" do
34
+ config.testing?.should be_false
35
+ end
36
+ it "should return true if test is true" do
37
+ config.test = true
38
+ config.testing?.should be_true
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,187 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe Txtlocal::Message do
4
+ describe "initialize" do
5
+ let(:new) { Txtlocal::Message.allocate }
6
+ let(:body) { double("body text") }
7
+ let(:recipients) { double("recipients") }
8
+ let(:options) { double("options") }
9
+ before(:each) do
10
+ Txtlocal::Message.stub!(:new) do |*args|
11
+ new.tap do |n|
12
+ n.send :initialize, *args
13
+ end
14
+ end
15
+ end
16
+
17
+ it "should call internal setter methods" do
18
+ new.should_receive(:body=).with(body)
19
+ new.should_receive(:recipients=).with(recipients)
20
+ new.should_receive(:options=).with(options)
21
+ msg = Txtlocal::Message.new(body, recipients, options)
22
+ end
23
+ end
24
+
25
+ describe "body text" do
26
+ let(:msg) { Txtlocal::Message.new }
27
+ describe "body" do
28
+ it "should be accessible" do
29
+ msg.body = "body text"
30
+ msg.body.should == "body text"
31
+ end
32
+ it "should replace newlines with %n" do
33
+ msg.body = "once\nupon\na time"
34
+ msg.body.should == "once%nupon%na time"
35
+ end
36
+ it "should trim trailing and leading whitespace" do
37
+ msg.body = " a short message\n\n"
38
+ msg.body.should == "a short message"
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "recipients" do
44
+ let(:msg) { Txtlocal::Message.new }
45
+ describe "accessor" do
46
+ it "should accept single value" do
47
+ msg.recipients = "447729416732"
48
+ msg.recipients.should == ["447729416732"]
49
+ end
50
+ it "should accept multiple values" do
51
+ msg.recipients = ["447729416732", "447923732984"]
52
+ msg.recipients.should == ["447729416732", "447923732984"]
53
+ end
54
+ it "should be using add_recipient internally" do
55
+ msg.should_receive(:add_recipient).with("447729416732")
56
+ msg.recipients = "447729416732"
57
+ end
58
+ end
59
+ describe "add_recipient" do
60
+ it "should accept txtlocal format number" do
61
+ msg.add_recipient("447729416732")
62
+ msg.recipients.should == ["447729416732"]
63
+ end
64
+ it "should accept 07 format number" do
65
+ msg.add_recipient("07729416745")
66
+ msg.recipients.should == ["447729416745"]
67
+ end
68
+ it "should accept international format number" do
69
+ msg.add_recipient("+447729416745")
70
+ msg.recipients.should == ["447729416745"]
71
+ end
72
+ it "should accept numbers with spaces" do
73
+ msg.add_recipient("07729 457 756")
74
+ msg.recipients.should == ["447729457756"]
75
+ end
76
+ it "should not add invalid numbers" do
77
+ # TODO: exception here?
78
+ msg.add_recipient("qwdcs")
79
+ msg.add_recipient("0114 245 9832")
80
+ msg.add_recipient("0800 800 8000")
81
+ msg.recipients.should be_empty
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "from" do
87
+ let(:msg) { Txtlocal::Message.new }
88
+ before(:each) do
89
+ Txtlocal.config.from = "default"
90
+ end
91
+ after(:each) do
92
+ Txtlocal.reset_config
93
+ end
94
+ it "should default to config.from" do
95
+ msg.from.should == "default"
96
+ end
97
+ it "should be overridable" do
98
+ msg.from = "overridden"
99
+ msg.from.should == "overridden"
100
+ end
101
+ it "should revert to default if set to nil" do
102
+ msg.from = "overridden"
103
+ msg.from.should == "overridden"
104
+ msg.from = nil
105
+ msg.from.should == "default"
106
+ end
107
+ it "should truncate if set to longer than 11 characters" do
108
+ msg.from = "123456789012345"
109
+ msg.from.should == "12345678901"
110
+ end
111
+ it "should fail silently if set to less than 3 characters" do
112
+ msg.from = "12"
113
+ msg.from.should == "default"
114
+ end
115
+ it "should trim whitespace and remove any non alphanumeric or space characters" do
116
+ msg.from = " a person! "
117
+ msg.from.should == "a person"
118
+ end
119
+ end
120
+
121
+ describe "options" do
122
+ let(:msg) { Txtlocal::Message.new }
123
+ it "should accept :from" do
124
+ msg.options = {:from => "my name"}
125
+ msg.from.should == "my name"
126
+ end
127
+ end
128
+
129
+ describe "send!" do
130
+ context "web mocked" do
131
+ before(:each) do
132
+ WebMock.disable_net_connect!
133
+ stub_request(:post, "https://www.txtlocal.com/sendsmspost.php")
134
+ Txtlocal.config do |c|
135
+ c.from = "testing"
136
+ c.username = "testuser"
137
+ c.password = "testpass"
138
+ c.test = false
139
+ end
140
+ end
141
+ after(:each) do
142
+ Txtlocal.reset_config
143
+ end
144
+ it "should send data to the API endpoint" do
145
+ msg = Txtlocal::Message.new("a message", "447729416583")
146
+ msg.send!
147
+ WebMock.should have_requested(:post, "https://www.txtlocal.com/sendsmspost.php").with(
148
+ :body => {'uname' => "testuser", 'pword' => "testpass", 'json' => '1', 'test' => '0',
149
+ 'from' => "testing", 'selectednums' => "447729416583", 'message' => "a message"}
150
+ )
151
+ end
152
+ it "should comma sepratate multiple recipients" do
153
+ msg = Txtlocal::Message.new("a message", ["447729416583", "447984534657"])
154
+ msg.send!
155
+ WebMock.should have_requested(:post, "https://www.txtlocal.com/sendsmspost.php").with(
156
+ :body => {'uname' => "testuser", 'pword' => "testpass", 'json' => '1', 'test' => '0',
157
+ 'from' => "testing", 'selectednums' => "447729416583,447984534657",
158
+ 'message' => "a message"}
159
+ )
160
+ end
161
+ end
162
+ context "api test mode" do
163
+ if not (File.readable?('api_login.rb') and load('api_login.rb') and
164
+ API_USERNAME and API_PASSWORD)
165
+ pending "\n" +
166
+ "Please create a file api_login.rb that defines API_USERNAME and API_PASSWORD " +
167
+ "to run tests against the real server"
168
+ else
169
+ before(:each) do
170
+ WebMock.allow_net_connect!
171
+ Txtlocal.config do |c|
172
+ c.from = "testing"
173
+ c.username = API_USERNAME
174
+ c.password = API_PASSWORD
175
+ c.test = true
176
+ end
177
+ end
178
+ it "should send data to the API endpoint" do
179
+ msg = Txtlocal::Message.new("a message", "447729467413")
180
+ msg.send!
181
+ msg.response.should_not be_nil
182
+ msg.response[:error].should include "testmode"
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+
3
+ require 'txtlocal'
4
+
5
+ require 'webmock/rspec'
6
+
7
+ Rspec.configure do |c|
8
+ c.mock_with :rspec
9
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe Txtlocal do
4
+
5
+ describe "config" do
6
+ it "should be accessible" do
7
+ Txtlocal.config.should be_a Txtlocal::Config
8
+ end
9
+ it "should be modifiable with a block" do
10
+ remember = nil
11
+ Txtlocal.config do |c|
12
+ c.should be_a Txtlocal::Config
13
+ remember = c
14
+ end
15
+ Txtlocal.config.should == remember
16
+ end
17
+ it "should be resettable" do
18
+ c = Txtlocal.config
19
+ Txtlocal.reset_config
20
+ Txtlocal.config.should_not == c
21
+ end
22
+ end
23
+
24
+ describe "send_message" do
25
+ let(:message) { double("message body") }
26
+ let(:recipients) { double("list of recipients") }
27
+ let(:options) { double("additional message options") }
28
+ let(:msg_instance) { double("message instance") }
29
+
30
+ it "should construct a Message instance and send! it" do
31
+ msg_instance.should_receive(:send!).with(no_args)
32
+ Txtlocal::Message.should_receive(:new).with(message, recipients, options) { msg_instance }
33
+ Txtlocal.send_message(message, recipients, options).should == msg_instance
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/txtlocal/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "txtlocal"
6
+ s.version = Txtlocal::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Glen Mailer"]
9
+ s.email = ["glen@epigenesys.co.uk"]
10
+ s.homepage = "https://github.com/epigenesys/txtlocal"
11
+ s.summary = "An API wrapper for txtlocal.co.uk"
12
+ s.description = "An API wrapper for txtlocal.co.uk"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ #s.rubyforge_project = "txtlocal"
16
+
17
+ s.add_dependency "json"
18
+
19
+ s.add_development_dependency "bundler", ">= 1.0.0"
20
+ s.add_development_dependency "rspec"
21
+ s.add_development_dependency "ruby-debug"
22
+ s.add_development_dependency "autotest"
23
+ s.add_development_dependency "webmock"
24
+
25
+ s.files = `git ls-files`.split("\n")
26
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
27
+ s.require_path = 'lib'
28
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: txtlocal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Glen Mailer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-13 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: &70290906322080 !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: *70290906322080
25
+ - !ruby/object:Gem::Dependency
26
+ name: bundler
27
+ requirement: &70290906316680 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70290906316680
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &70290906315460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70290906315460
47
+ - !ruby/object:Gem::Dependency
48
+ name: ruby-debug
49
+ requirement: &70290906311120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70290906311120
58
+ - !ruby/object:Gem::Dependency
59
+ name: autotest
60
+ requirement: &70290906306060 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70290906306060
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: &70290906301840 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70290906301840
80
+ description: An API wrapper for txtlocal.co.uk
81
+ email:
82
+ - glen@epigenesys.co.uk
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - .autotest
88
+ - .gitignore
89
+ - .rspec
90
+ - Gemfile
91
+ - Gemfile.lock
92
+ - LICENSE
93
+ - README.md
94
+ - Rakefile
95
+ - lib/txtlocal.rb
96
+ - lib/txtlocal/config.rb
97
+ - lib/txtlocal/message.rb
98
+ - lib/txtlocal/version.rb
99
+ - spec/config_spec.rb
100
+ - spec/message_spec.rb
101
+ - spec/spec_helper.rb
102
+ - spec/txtlocal_spec.rb
103
+ - txtlocal.gemspec
104
+ homepage: https://github.com/epigenesys/txtlocal
105
+ licenses: []
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: 1.3.6
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 1.8.10
125
+ signing_key:
126
+ specification_version: 3
127
+ summary: An API wrapper for txtlocal.co.uk
128
+ test_files: []