clickatell 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,4 +1,15 @@
1
+ == 0.2.0
2
+
3
+ * Added Clickatell API error handling to API and sms utility.
4
+
5
+ * Handle required/optional arguments for sms utility correctly
6
+
7
+ * Added further sms utility usage information to website
8
+
9
+ * Make sure sms utility gracefully handles missing recipient/message
10
+
11
+ * Added balance query support to API and SMS utility (--check-balance).
12
+
1
13
  == 0.1.0 2007-08-17
2
14
 
3
- * 1 major enhancement:
4
- * Initial release
15
+ * Initial release.
data/Manifest.txt CHANGED
@@ -25,5 +25,6 @@ website/javascripts/codehighlighter/code_highlighter.js
25
25
  website/javascripts/codehighlighter/ruby.js
26
26
  website/javascripts/rounded_corners_lite.inc.js
27
27
  website/stylesheets/limechoc.css
28
+ website/stylesheets/rdoc.css
28
29
  website/stylesheets/screen.css
29
30
  website/template.rhtml
data/Rakefile CHANGED
@@ -127,6 +127,16 @@ task :check_version do
127
127
  end
128
128
  end
129
129
 
130
+ Rake::RDocTask.new('docs') do |rd|
131
+ rd.main = 'README.txt'
132
+ rd.rdoc_files.include('README.txt', 'License.txt', 'lib/**/*.rb')
133
+ rd.rdoc_dir = 'doc'
134
+ rd.options << '--style=http://clickatell.rubyforge.org/stylesheets/rdoc.css'
135
+ rd.options << '--tab-width=2'
136
+ rd.options << '--inline-source'
137
+ rd.options << '--line-numbers'
138
+ end
139
+
130
140
  namespace :spec do
131
141
  desc "Run the specs under spec"
132
142
  Spec::Rake::SpecTask.new('all') do |t|
data/bin/sms CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require 'pp'
3
2
 
4
3
  local_libs = [
5
4
  File.join(File.dirname(__FILE__), *%w[../lib/clickatell]),
@@ -17,7 +16,31 @@ end
17
16
  options = Clickatell::Utility::Options.parse(ARGV)
18
17
  connection = Clickatell::Connection.new(options.api_key, options.username, options.password)
19
18
 
20
- puts "Sending '#{options.message}' to #{options.recipient}."
21
- connection.send_message(options.recipient, options.message)
22
- puts "Done."
23
- exit 0
19
+ if options.show_balance
20
+ puts "Retrieving account balance..."
21
+ puts "You have #{connection.account_balance} credits remaining."
22
+ exit 0
23
+ else
24
+ begin
25
+ puts "Sending '#{options.message}' to #{options.recipient}..."
26
+ connection.send_message(options.recipient, options.message)
27
+ puts "Done."
28
+ exit 0
29
+ rescue Clickatell::API::Error => e
30
+ case e.code
31
+ when '001', '002', '003', '005'
32
+ puts "Authentication failed. Please check your username, password and API key and try again."
33
+ exit 1
34
+ when '004'
35
+ puts "Your account has been frozen. Please contact Clickatell support."
36
+ exit 1
37
+ when '007'
38
+ puts "Requests for this API key are not permitted from this IP address."
39
+ exit 1
40
+ else
41
+ puts "Unexpected error occurred. #{e.message} (error code: #{e.code})."
42
+ puts "Please contact the author (contact@lukeredpath.co.uk) with the above error."
43
+ exit 1
44
+ end
45
+ end
46
+ end
@@ -52,6 +52,13 @@ module Clickatell
52
52
  }.merge( auth_hash(auth_options) ))
53
53
  parse_response(response)['Status']
54
54
  end
55
+
56
+ # Returns the number of credits remaining as a float.
57
+ # See send_message() for auth_options.
58
+ def account_balance(auth_options)
59
+ response = execute_command('getbalance', auth_hash(auth_options))
60
+ parse_response(response)['Credit'].to_f
61
+ end
55
62
 
56
63
  protected
57
64
  # Builds a command and sends it via HTTP GET.
@@ -104,5 +111,25 @@ module Clickatell
104
111
  end
105
112
  end
106
113
 
114
+ # Clickatell API Error exception.
115
+ class Error < StandardError
116
+ attr_reader :code, :message
117
+
118
+ def initialize(code, message)
119
+ @code, @message = code, message
120
+ end
121
+
122
+ # Creates a new Error from a Clickatell HTTP response string
123
+ # e.g.:
124
+ #
125
+ # Error.parse("ERR: 001, Authentication error")
126
+ # # => #<Clickatell::API::Error code='001' message='Authentication error'>
127
+ def self.parse(error_string)
128
+ error_details = error_string.split(':').last.strip
129
+ code, message = error_details.split(',').map { |s| s.strip }
130
+ self.new(code, message)
131
+ end
132
+ end
133
+
107
134
  end
108
135
  end
@@ -10,6 +10,9 @@ module Clickatell
10
10
 
11
11
  # Returns the HTTP response body data as a hash.
12
12
  def parse(http_response)
13
+ if http_response.body.scan(/ERR/).any?
14
+ raise Clickatell::API::Error.parse(http_response.body)
15
+ end
13
16
  YAML.load(http_response.body.scan(PARSE_REGEX).join("\n"))
14
17
  end
15
18
 
@@ -7,25 +7,30 @@ module Clickatell
7
7
  def self.parse(args)
8
8
  options = self.default_options
9
9
  parser = OptionParser.new do |opts|
10
- opts.banner = "Usage: sms [options] recipient_number message"
10
+ opts.banner = "Usage: sms [options] recipient message"
11
11
  opts.separator ""
12
12
  opts.separator "Specific options:"
13
13
 
14
- opts.on('-u', '--username [USERNAME]',
14
+ opts.on('-u', '--username USERNAME',
15
15
  "Specify the clickatell username (overrides ~/.clickatell setting)") do |username|
16
16
  options.username = username
17
17
  end
18
18
 
19
- opts.on('-p', '--password [PASSWORD]',
19
+ opts.on('-p', '--password PASSWORD',
20
20
  "Specify the clickatell password (overrides ~/.clickatell setting)") do |password|
21
21
  options.password = password
22
22
  end
23
23
 
24
- opts.on('-k', '--apikey [API_KEY]',
24
+ opts.on('-k', '--apikey API_KEY',
25
25
  "Specify the clickatell API key (overrides ~/.clickatell setting)") do |key|
26
26
  options.api_key = key
27
27
  end
28
28
 
29
+ opts.on('-b', '--show-balance',
30
+ "Shows the total number of credits remaining on your account") do
31
+ options.show_balance = true
32
+ end
33
+
29
34
  opts.on_tail('-h', '--help', "Show this message") do
30
35
  puts opts
31
36
  exit
@@ -40,7 +45,20 @@ module Clickatell
40
45
  parser.parse!(args)
41
46
  options.recipient = ARGV[-2]
42
47
  options.message = ARGV[-1]
48
+
49
+ if (options.message.nil? || options.recipient.nil?) && !options.show_balance
50
+ puts "You must specify a recipient and message!"
51
+ puts parser
52
+ exit
53
+ end
54
+
43
55
  return options
56
+
57
+ rescue OptionParser::MissingArgument => e
58
+ switch_given = e.message.split(':').last.strip
59
+ puts "The #{switch_given} option requires an argument."
60
+ puts parser
61
+ exit
44
62
  end
45
63
 
46
64
  def self.default_options
@@ -1,7 +1,7 @@
1
1
  module Clickatell #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 2
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/spec/api_spec.rb CHANGED
@@ -24,7 +24,7 @@ module Clickatell
24
24
  end
25
25
 
26
26
  describe "Command executor" do
27
- it "should create an API command and send it via HTTP get" do
27
+ it "should create an API command and send it via HTTP get, returning the raw http response" do
28
28
  API::Command.should_receive(:new).with('cmdname').and_return(cmd=mock('command'))
29
29
  cmd.should_receive(:with_params).with(:param_one => 'foo').and_return(uri=mock('uri'))
30
30
  Net::HTTP.should_receive(:get_response).with(uri).and_return(raw_response=mock('http response'))
@@ -93,6 +93,39 @@ module Clickatell
93
93
  Response.should_receive(:parse).with(response).and_return('ID' => 'message_id', 'Status' => 'message_status')
94
94
  API.message_status('messageid', :session_id => 'abcde').should == 'message_status'
95
95
  end
96
+
97
+ it "should support balance query with authentication, returning number of credits as a float" do
98
+ API.should_receive(:execute_command).with('getbalance',
99
+ :api_id => '1234',
100
+ :user => 'joebloggs',
101
+ :password => 'superpass'
102
+ ).and_return(response=mock('response'))
103
+ Response.should_receive(:parse).with(response).and_return('Credit' => '10.0')
104
+ API.account_balance(:username => 'joebloggs', :password => 'superpass', :api_key => '1234').should == 10.0
105
+ end
106
+
107
+ it "should support balance query with pre-auth, returning number of credits as a float" do
108
+ API.should_receive(:execute_command).with('getbalance',
109
+ :session_id => 'abcde'
110
+ ).and_return(response=mock('response'))
111
+ Response.should_receive(:parse).with(response).and_return('Credit' => '10.0')
112
+ API.account_balance(:session_id => 'abcde').should == 10.0
113
+ end
114
+
115
+ it "should raise an API::Error if the response parser raises" do
116
+ API.stub!(:execute_command)
117
+ Response.stub!(:parse).and_raise(Clickatell::API::Error.new('', ''))
118
+ proc { API.account_balance({}) }.should raise_error(Clickatell::API::Error)
119
+ end
120
+ end
121
+
122
+ describe "API Error" do
123
+ it "should parse http response string to create error" do
124
+ response_string = "ERR: 001, Authentication error"
125
+ error = Clickatell::API::Error.parse(response_string)
126
+ error.code.should == '001'
127
+ error.message.should == 'Authentication error'
128
+ end
96
129
  end
97
130
 
98
131
  end
@@ -4,11 +4,21 @@ require File.dirname(__FILE__) + '/../lib/clickatell'
4
4
  module Clickatell
5
5
 
6
6
  describe "Response parser" do
7
+ before do
8
+ Clickatell::API::Error.stub!(:parse).and_return(Clickatell::API::Error.new('', ''))
9
+ end
10
+
7
11
  it "should return hash for one-line success response" do
8
12
  raw_response = stub('response')
9
13
  raw_response.stub!(:body).and_return('k1: foo k2: bar')
10
14
  Response.parse(raw_response).should == {'k1' => 'foo', 'k2' => 'bar'}
11
15
  end
16
+
17
+ it "should raise API::Error if response contains an error message" do
18
+ raw_response = stub('response')
19
+ raw_response.stub!(:body).and_return('ERR: 001, Authentication failed')
20
+ proc { Response.parse(raw_response) }.should raise_error(Clickatell::API::Error)
21
+ end
12
22
  end
13
23
 
14
24
  end
data/website/index.html CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  <div id="header">
18
18
 
19
- <h1>Clickatell Ruby API 0.1.0
19
+ <h1>Clickatell Ruby API <span class="version">0.2.0</span>
20
20
  <span class="tagline">gem install clickatell</span></h1>
21
21
 
22
22
  </div>
@@ -31,10 +31,15 @@
31
31
  <h3>Installing</h3>
32
32
 
33
33
 
34
- <p>Download the <a href="http://rubyforge.org/projects/clickatell">latest version of gem</a> or install using RubyGems</p>
34
+ <p>Download the <a href="http://rubyforge.org/projects/clickatell">latest version of gem</a> or install using RubyGems.</p>
35
35
 
36
36
  <pre><code>$ sudo gem install clickatell</code></pre>
37
37
 
38
+ <p>Getting the latest version from Subversion:</p>
39
+
40
+
41
+ <pre><code>&#38; svn co svn://lukeredpath.co.uk/var/svn/opensource/clickatell/trunk clickatell-trunk</code></pre>
42
+
38
43
  <h3>The basics</h3>
39
44
 
40
45
 
@@ -58,6 +63,9 @@ connection = Clickatell::Connection.new('your_api_id', 'your_username', 'your_pa
58
63
  connection.send_message('447771234567', 'Hello from clickatell')
59
64
  </code></pre>
60
65
 
66
+ <p>Full documentation for the <span class="caps">API</span> is available in the <a href="rdoc/">RDocs</a>.</p>
67
+
68
+
61
69
  <h4>Command-line <span class="caps">SMS</span> Utility</h4>
62
70
 
63
71
 
@@ -76,13 +84,33 @@ username: your_username
76
84
  password: your_password
77
85
  </code></pre>
78
86
 
79
- <p>You can then use the sms utility to send a message to a single recipient:</p>
87
+ <p>You can then use the <ins>sms</ins> utility to send a message to a single recipient:</p>
80
88
 
81
89
 
82
90
  <pre><code>
83
91
  $ sms 447771234567 'Hello from clickatell'
84
92
  </code></pre>
85
93
 
94
+ <p>Alternatively, you can specify your authentication details manually by passing in options to the <ins>sms</ins> command.</p>
95
+
96
+
97
+ <pre><code>
98
+ $ sms -u your_username -p your_password -k your_api_key 447771234567 'Hello from clickatell'
99
+ </code></pre>
100
+
101
+ <p>These values will take presedence over any values in your ~/.clickatell file.</p>
102
+
103
+
104
+ <p>You can also use the <ins>sms</ins> utility to check your Clickatell account balance:</p>
105
+
106
+
107
+ <pre><code>
108
+ $ sms --show-balance
109
+ </code></pre>
110
+
111
+ <p>Run <ins>sms</ins> without any arguments for a full list of options.</p>
112
+
113
+
86
114
  <h3>License</h3>
87
115
 
88
116
 
@@ -101,7 +129,8 @@ $ sms 447771234567 'Hello from clickatell'
101
129
  <div id="footer">
102
130
  <p class="copyright">
103
131
  <a href="http://rubyforge.org/projects/clickatell">Rubyforge Project Page</a> |
104
- <a href="http://rubyforge.org/projects/clickatell">Download latest version (0.1.0)</a>
132
+ <a href="http://rubyforge.org/frs/?group_id=4295&amp;release_id=13922">Download latest version (0.2.0)</a> |
133
+ <a href="rdoc/">RDoc</a>
105
134
  </p>
106
135
  </div>
107
136
  </div>
data/website/index.txt CHANGED
@@ -6,10 +6,14 @@ A Ruby interface to the "Clickatell":http://www.clickatell.com SMS gateway API.
6
6
 
7
7
  h3. Installing
8
8
 
9
- <p>Download the <a href="http://rubyforge.org/projects/clickatell">latest version of gem</a> or install using RubyGems</p>
9
+ <p>Download the <a href="http://rubyforge.org/projects/clickatell">latest version of gem</a> or install using RubyGems.</p>
10
10
 
11
11
  <pre><code>$ sudo gem install clickatell</code></pre>
12
12
 
13
+ Getting the latest version from Subversion:
14
+
15
+ <pre><code>& svn co svn://lukeredpath.co.uk/var/svn/opensource/clickatell/trunk clickatell-trunk</code></pre>
16
+
13
17
  h3. The basics
14
18
 
15
19
  To use this gem, you will need sign up for an account at "the Clickatell website":http://www.clickatell.com.
@@ -28,6 +32,8 @@ require 'clickatell'
28
32
  connection = Clickatell::Connection.new('your_api_id', 'your_username', 'your_password')
29
33
  connection.send_message('447771234567', 'Hello from clickatell')
30
34
  </code></pre>
35
+
36
+ Full documentation for the API is available in the <a href="rdoc/">RDocs</a>.
31
37
 
32
38
  h4. Command-line SMS Utility
33
39
 
@@ -44,12 +50,28 @@ username: your_username
44
50
  password: your_password
45
51
  </code></pre>
46
52
 
47
- You can then use the sms utility to send a message to a single recipient:
53
+ You can then use the +sms+ utility to send a message to a single recipient:
48
54
 
49
55
  <pre><code>
50
56
  $ sms 447771234567 'Hello from clickatell'
51
57
  </code></pre>
52
58
 
59
+ Alternatively, you can specify your authentication details manually by passing in options to the +sms+ command.
60
+
61
+ <pre><code>
62
+ $ sms -u your_username -p your_password -k your_api_key 447771234567 'Hello from clickatell'
63
+ </code></pre>
64
+
65
+ These values will take presedence over any values in your ~/.clickatell file.
66
+
67
+ You can also use the +sms+ utility to check your Clickatell account balance:
68
+
69
+ <pre><code>
70
+ $ sms --show-balance
71
+ </code></pre>
72
+
73
+ Run +sms+ without any arguments for a full list of options.
74
+
53
75
  h3. License
54
76
 
55
77
  This code is free to use under the terms of the MIT license.
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -89,6 +89,10 @@ h1 {
89
89
  margin: 0 0 .5em; padding: 0;
90
90
  }
91
91
 
92
+ h1 span.version {
93
+ letter-spacing: 0px;
94
+ }
95
+
92
96
  h1 a:link,
93
97
  h1 a:visited,
94
98
  h1 a:hover {
@@ -16,7 +16,7 @@
16
16
 
17
17
  <div id="header">
18
18
 
19
- <h1><%= title %> <%= version %>
19
+ <h1><%= title %> <span class="version"><%= version %></span>
20
20
  <span class="tagline">gem install clickatell</span></h1>
21
21
 
22
22
  </div>
@@ -31,7 +31,8 @@
31
31
  <div id="footer">
32
32
  <p class="copyright">
33
33
  <a href="http://rubyforge.org/projects/clickatell">Rubyforge Project Page</a> |
34
- <a href="<%= download %>">Download latest version (<%= version %>)</a>
34
+ <a href="http://rubyforge.org/frs/?group_id=4295&amp;release_id=13922">Download latest version (<%= version %>)</a> |
35
+ <a href="rdoc/">RDoc</a>
35
36
  </p>
36
37
  </div>
37
38
  </div>
metadata CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: clickatell
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
6
+ version: 0.2.0
7
7
  date: 2007-08-21 00:00:00 +01:00
8
8
  summary: Ruby interface to the Clickatell SMS gateway service.
9
9
  require_paths:
@@ -56,6 +56,7 @@ files:
56
56
  - website/javascripts/codehighlighter/ruby.js
57
57
  - website/javascripts/rounded_corners_lite.inc.js
58
58
  - website/stylesheets/limechoc.css
59
+ - website/stylesheets/rdoc.css
59
60
  - website/stylesheets/screen.css
60
61
  - website/template.rhtml
61
62
  test_files: []