efax 1.1.1 → 1.2.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.2.0
@@ -4,35 +4,39 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{ruby-efax}
8
- s.version = "1.1.1"
7
+ s.name = %q{efax}
8
+ s.version = "1.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Szymon Nowak", "Pawel Kozlowski"]
12
- s.date = %q{2009-09-24}
12
+ s.date = %q{2009-09-30}
13
13
  s.email = %q{szimek@gmail.com}
14
14
  s.extra_rdoc_files = [
15
- "README"
15
+ "README.rdoc"
16
16
  ]
17
17
  s.files = [
18
18
  ".gitignore",
19
- "README",
19
+ "README.rdoc",
20
20
  "Rakefile",
21
21
  "TODO",
22
22
  "VERSION",
23
+ "efax.gemspec",
23
24
  "lib/efax.rb",
24
- "ruby-efax.gemspec",
25
- "test/efax_test.rb",
25
+ "lib/efax/inbound.rb",
26
+ "lib/efax/outbound.rb",
27
+ "test/efax_inbound_test.rb",
28
+ "test/efax_outbound_test.rb",
26
29
  "test/test_helper.rb"
27
30
  ]
28
- s.homepage = %q{http://github.com/szimek/ruby-efax}
31
+ s.homepage = %q{http://github.com/szimek/efax}
29
32
  s.rdoc_options = ["--charset=UTF-8"]
30
33
  s.require_paths = ["lib"]
31
- s.rubyforge_project = %q{ruby-efax}
34
+ s.rubyforge_project = %q{efax}
32
35
  s.rubygems_version = %q{1.3.5}
33
36
  s.summary = %q{Ruby library for accessing the eFax Developer service}
34
37
  s.test_files = [
35
- "test/efax_test.rb",
38
+ "test/efax_inbound_test.rb",
39
+ "test/efax_outbound_test.rb",
36
40
  "test/test_helper.rb"
37
41
  ]
38
42
 
data/lib/efax.rb CHANGED
@@ -22,203 +22,8 @@
22
22
  # IN THE SOFTWARE.
23
23
  #++
24
24
  #
25
+ $:.unshift(File.dirname(__FILE__)) unless
26
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
25
27
 
26
- require 'net/http'
27
- require 'net/https'
28
- require 'builder'
29
- require 'hpricot'
30
- require 'base64'
31
-
32
- module Net #:nodoc:
33
- # Helper class for making HTTPS requests
34
- class HTTPS < HTTP
35
- def self.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) #:nodoc:
36
- https = new(address, port, p_addr, p_port, p_user, p_pass)
37
- https.use_ssl = true
38
- https.start(&block)
39
- end
40
- end
41
- end
42
-
43
- module EFax
44
- # URL of eFax web service
45
- Url = "https://secure.efaxdeveloper.com/EFax_WebFax.serv"
46
- # URI of eFax web service
47
- Uri = URI.parse(Url)
48
- # Prefered content type
49
- HEADERS = {'Content-Type' => 'text/xml'}
50
-
51
- # Base class for OutboundRequest and OutboundStatus classes
52
- class Request
53
- def self.user
54
- @@user
55
- end
56
- def self.user=(name)
57
- @@user = name
58
- end
59
-
60
- def self.password
61
- @@password
62
- end
63
- def self.password=(password)
64
- @@password = password
65
- end
66
-
67
- def self.account_id
68
- @@account_id
69
- end
70
- def self.account_id=(id)
71
- @@account_id = id
72
- end
73
-
74
- def self.params(content)
75
- escaped_xml = ::URI.escape(content, Regexp.new("[^#{::URI::PATTERN::UNRESERVED}]"))
76
- "id=#{account_id}&xml=#{escaped_xml}&respond=XML"
77
- end
78
-
79
- private_class_method :params
80
- end
81
-
82
- class OutboundRequest < Request
83
- def self.post(name, company, fax_number, subject, content, content_type = :html)
84
- xml_request = xml(name, company, fax_number, subject, content, content_type)
85
- response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
86
- https.post(EFax::Uri.path, params(xml_request), EFax::HEADERS)
87
- end
88
- OutboundResponse.new(response)
89
- end
90
-
91
- def self.xml(name, company, fax_number, subject, content, content_type = :html)
92
- xml_request = ""
93
- xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
94
- xml.instruct! :xml, :version => '1.0'
95
- xml.OutboundRequest do
96
- xml.AccessControl do
97
- xml.UserName(self.user)
98
- xml.Password(self.password)
99
- end
100
- xml.Transmission do
101
- xml.TransmissionControl do
102
- xml.Resolution("FINE")
103
- xml.Priority("NORMAL")
104
- xml.SelfBusy("ENABLE")
105
- xml.FaxHeader(subject)
106
- end
107
- xml.DispositionControl do
108
- xml.DispositionLevel("NONE")
109
- end
110
- xml.Recipients do
111
- xml.Recipient do
112
- xml.RecipientName(name)
113
- xml.RecipientCompany(company)
114
- xml.RecipientFax(fax_number)
115
- end
116
- end
117
- xml.Files do
118
- xml.File do
119
- encoded_content = Base64.encode64(content).delete("\n")
120
- xml.FileContents(encoded_content)
121
- xml.FileType(content_type.to_s)
122
- end
123
- end
124
- end
125
- end
126
- xml_request
127
- end
128
-
129
- private_class_method :xml
130
- end
131
-
132
- class RequestStatus
133
- HTTP_FAILURE = 0
134
- SUCCESS = 1
135
- FAILURE = 2
136
- end
137
-
138
- class OutboundResponse
139
- attr_reader :status_code
140
- attr_reader :error_message
141
- attr_reader :error_level
142
- attr_reader :doc_id
143
-
144
- def initialize(response) #:nodoc:
145
- if response.is_a? Net::HTTPOK
146
- doc = Hpricot(response.body)
147
- @status_code = doc.at(:statuscode).inner_text.to_i
148
- @error_message = doc.at(:errormessage)
149
- @error_message = @error_message.inner_text if @error_message
150
- @error_level = doc.at(:errorlevel)
151
- @error_level = @error_level.inner_text if @error_level
152
- @doc_id = doc.at(:docid).inner_text
153
- @doc_id = @doc_id.empty? ? nil : @doc_id
154
- else
155
- @status_code = RequestStatus::HTTP_FAILURE
156
- @error_message = "HTTP request failed (#{response.code})"
157
- end
158
- end
159
- end
160
-
161
- class OutboundStatus < Request
162
- def self.post(doc_id)
163
- data = params(xml(doc_id))
164
- response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
165
- https.post(EFax::Uri.path, data, EFax::HEADERS)
166
- end
167
- OutboundStatusResponse.new(response)
168
- end
169
-
170
- def self.xml(doc_id)
171
- xml_request = ""
172
- xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
173
- xml.instruct! :xml, :version => '1.0'
174
- xml.OutboundStatus do
175
- xml.AccessControl do
176
- xml.UserName(self.user)
177
- xml.Password(self.password)
178
- end
179
- xml.Transmission do
180
- xml.TransmissionControl do
181
- xml.DOCID(doc_id)
182
- end
183
- end
184
- end
185
- xml_request
186
- end
187
-
188
- private_class_method :xml
189
- end
190
-
191
- class QueryStatus
192
- HTTP_FAILURE = 0
193
- PENDING = 3
194
- SENT = 4
195
- FAILURE = 5
196
- end
197
-
198
- class OutboundStatusResponse
199
- attr_reader :status_code
200
- attr_reader :message
201
- attr_reader :classification
202
- attr_reader :outcome
203
-
204
- def initialize(response) #:nodoc:
205
- if response.is_a? Net::HTTPOK
206
- doc = Hpricot(response.body)
207
- @message = doc.at(:message).innerText
208
- @classification = doc.at(:classification).innerText.delete('"')
209
- @outcome = doc.at(:outcome).innerText.delete('"')
210
- if @classification.empty? && @outcome.empty?
211
- @status_code = QueryStatus::PENDING
212
- elsif @classification == "Success" && @outcome == "Success"
213
- @status_code = QueryStatus::SENT
214
- else
215
- @status_code = QueryStatus::FAILURE
216
- end
217
- else
218
- @status_code = QueryStatus::HTTP_FAILURE
219
- @message = "HTTP request failed (#{response.code})"
220
- end
221
- end
222
- end
223
-
224
- end
28
+ require 'efax/outbound'
29
+ require 'efax/inbound'
@@ -0,0 +1,68 @@
1
+ require 'hpricot'
2
+ require 'base64'
3
+ require 'tempfile'
4
+ require 'time'
5
+
6
+ module EFax
7
+ class InboundPostStatus
8
+ SUCCESS = 1
9
+ end
10
+
11
+ class InboundPostRequest
12
+ attr_reader :encoded_file_contents,
13
+ :file_type,
14
+ :ani,
15
+ :account_id,
16
+ :fax_name,
17
+ :csid,
18
+ :status,
19
+ :mcfid,
20
+ :page_count,
21
+ :request_type,
22
+ :date_received,
23
+ :request_date
24
+
25
+ alias_method :sender_fax_number, :ani
26
+
27
+ def initialize(xml)
28
+ doc = Hpricot(xml)
29
+ @encoded_file_contents = doc.at(:filecontents).inner_text
30
+ @file_type = doc.at(:filetype).inner_text.to_sym
31
+ @ani = doc.at(:ani).inner_text
32
+ @account_id = doc.at(:accountid).inner_text
33
+ @fax_name = doc.at(:faxname).inner_text
34
+ @csid = doc.at(:csid).inner_text
35
+ @status = doc.at(:status).inner_text.to_i
36
+ @mcfid = doc.at(:mcfid).inner_text.to_i
37
+ @page_count = doc.at(:pagecount).inner_text.to_i
38
+ @request_type = doc.at(:requesttype).inner_text
39
+ @date_received = Time.parse("#{doc.at(:datereceived).inner_text} -08:00")
40
+ @request_date = Time.parse("#{doc.at(:requestdate).inner_text} -08:00")
41
+ end
42
+
43
+ def file_contents
44
+ @file_contents ||= Base64.decode64(encoded_file_contents)
45
+ end
46
+
47
+ def file
48
+ @file ||= begin
49
+ file = Tempfile.new(fax_name)
50
+ file << file_contents
51
+ file.rewind
52
+ file
53
+ end
54
+ end
55
+ def post_successful_message
56
+ "Post Successful"
57
+ end
58
+
59
+ def self.receive_by_params(params)
60
+ receive_by_xml(params[:xml] || params["xml"])
61
+ end
62
+
63
+ def self.receive_by_xml(xml)
64
+ new(xml)
65
+ end
66
+ end
67
+ end
68
+
@@ -0,0 +1,198 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'builder'
4
+ require 'hpricot'
5
+ require 'base64'
6
+
7
+ module Net #:nodoc:
8
+ # Helper class for making HTTPS requests
9
+ class HTTPS < HTTP
10
+ def self.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) #:nodoc:
11
+ https = new(address, port, p_addr, p_port, p_user, p_pass)
12
+ https.use_ssl = true
13
+ https.start(&block)
14
+ end
15
+ end
16
+ end
17
+
18
+ module EFax
19
+ # URL of eFax web service
20
+ Url = "https://secure.efaxdeveloper.com/EFax_WebFax.serv"
21
+ # URI of eFax web service
22
+ Uri = URI.parse(Url)
23
+ # Prefered content type
24
+ HEADERS = {'Content-Type' => 'text/xml'}
25
+
26
+ # Base class for OutboundRequest and OutboundStatus classes
27
+ class Request
28
+ def self.user
29
+ @@user
30
+ end
31
+ def self.user=(name)
32
+ @@user = name
33
+ end
34
+
35
+ def self.password
36
+ @@password
37
+ end
38
+ def self.password=(password)
39
+ @@password = password
40
+ end
41
+
42
+ def self.account_id
43
+ @@account_id
44
+ end
45
+ def self.account_id=(id)
46
+ @@account_id = id
47
+ end
48
+
49
+ def self.params(content)
50
+ escaped_xml = ::URI.escape(content, Regexp.new("[^#{::URI::PATTERN::UNRESERVED}]"))
51
+ "id=#{account_id}&xml=#{escaped_xml}&respond=XML"
52
+ end
53
+
54
+ private_class_method :params
55
+ end
56
+
57
+ class OutboundRequest < Request
58
+ def self.post(name, company, fax_number, subject, content, content_type = :html)
59
+ xml_request = xml(name, company, fax_number, subject, content, content_type)
60
+ response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
61
+ https.post(EFax::Uri.path, params(xml_request), EFax::HEADERS)
62
+ end
63
+ OutboundResponse.new(response)
64
+ end
65
+
66
+ def self.xml(name, company, fax_number, subject, content, content_type = :html)
67
+ xml_request = ""
68
+ xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
69
+ xml.instruct! :xml, :version => '1.0'
70
+ xml.OutboundRequest do
71
+ xml.AccessControl do
72
+ xml.UserName(self.user)
73
+ xml.Password(self.password)
74
+ end
75
+ xml.Transmission do
76
+ xml.TransmissionControl do
77
+ xml.Resolution("FINE")
78
+ xml.Priority("NORMAL")
79
+ xml.SelfBusy("ENABLE")
80
+ xml.FaxHeader(subject)
81
+ end
82
+ xml.DispositionControl do
83
+ xml.DispositionLevel("NONE")
84
+ end
85
+ xml.Recipients do
86
+ xml.Recipient do
87
+ xml.RecipientName(name)
88
+ xml.RecipientCompany(company)
89
+ xml.RecipientFax(fax_number)
90
+ end
91
+ end
92
+ xml.Files do
93
+ xml.File do
94
+ encoded_content = Base64.encode64(content).delete("\n")
95
+ xml.FileContents(encoded_content)
96
+ xml.FileType(content_type.to_s)
97
+ end
98
+ end
99
+ end
100
+ end
101
+ xml_request
102
+ end
103
+
104
+ private_class_method :xml
105
+ end
106
+
107
+ class RequestStatus
108
+ HTTP_FAILURE = 0
109
+ SUCCESS = 1
110
+ FAILURE = 2
111
+ end
112
+
113
+ class OutboundResponse
114
+ attr_reader :status_code
115
+ attr_reader :error_message
116
+ attr_reader :error_level
117
+ attr_reader :doc_id
118
+
119
+ def initialize(response) #:nodoc:
120
+ if response.is_a? Net::HTTPOK
121
+ doc = Hpricot(response.body)
122
+ @status_code = doc.at(:statuscode).inner_text.to_i
123
+ @error_message = doc.at(:errormessage)
124
+ @error_message = @error_message.inner_text if @error_message
125
+ @error_level = doc.at(:errorlevel)
126
+ @error_level = @error_level.inner_text if @error_level
127
+ @doc_id = doc.at(:docid).inner_text
128
+ @doc_id = @doc_id.empty? ? nil : @doc_id
129
+ else
130
+ @status_code = RequestStatus::HTTP_FAILURE
131
+ @error_message = "HTTP request failed (#{response.code})"
132
+ end
133
+ end
134
+ end
135
+
136
+ class OutboundStatus < Request
137
+ def self.post(doc_id)
138
+ data = params(xml(doc_id))
139
+ response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
140
+ https.post(EFax::Uri.path, data, EFax::HEADERS)
141
+ end
142
+ OutboundStatusResponse.new(response)
143
+ end
144
+
145
+ def self.xml(doc_id)
146
+ xml_request = ""
147
+ xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
148
+ xml.instruct! :xml, :version => '1.0'
149
+ xml.OutboundStatus do
150
+ xml.AccessControl do
151
+ xml.UserName(self.user)
152
+ xml.Password(self.password)
153
+ end
154
+ xml.Transmission do
155
+ xml.TransmissionControl do
156
+ xml.DOCID(doc_id)
157
+ end
158
+ end
159
+ end
160
+ xml_request
161
+ end
162
+
163
+ private_class_method :xml
164
+ end
165
+
166
+ class QueryStatus
167
+ HTTP_FAILURE = 0
168
+ PENDING = 3
169
+ SENT = 4
170
+ FAILURE = 5
171
+ end
172
+
173
+ class OutboundStatusResponse
174
+ attr_reader :status_code
175
+ attr_reader :message
176
+ attr_reader :classification
177
+ attr_reader :outcome
178
+
179
+ def initialize(response) #:nodoc:
180
+ if response.is_a? Net::HTTPOK
181
+ doc = Hpricot(response.body)
182
+ @message = doc.at(:message).innerText
183
+ @classification = doc.at(:classification).innerText.delete('"')
184
+ @outcome = doc.at(:outcome).innerText.delete('"')
185
+ if @classification.empty? && @outcome.empty?
186
+ @status_code = QueryStatus::PENDING
187
+ elsif @classification == "Success" && @outcome == "Success"
188
+ @status_code = QueryStatus::SENT
189
+ else
190
+ @status_code = QueryStatus::FAILURE
191
+ end
192
+ else
193
+ @status_code = QueryStatus::HTTP_FAILURE
194
+ @message = "HTTP request failed (#{response.code})"
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,70 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require File.dirname(__FILE__) + '/../lib/efax/inbound'
3
+
4
+ module EFaxInboundTest
5
+ class InboundPostRequestTest < Test::Unit::TestCase
6
+
7
+ def test_receive_by_params
8
+ EFax::InboundPostRequest.expects(:receive_by_xml).with(xml).returns(response = mock)
9
+ assert_equal(EFax::InboundPostRequest.receive_by_params({:xml => xml}), response)
10
+ end
11
+
12
+ def test_receive_by_xml
13
+ response = EFax::InboundPostRequest.receive_by_xml(xml)
14
+
15
+ assert_equal file_contents, response.encoded_file_contents
16
+ assert_equal :pdf, response.file_type
17
+ assert_equal '098-765-4321', response.sender_fax_number
18
+ assert_equal '098-765-4321', response.ani
19
+ assert_equal '1234567890', response.account_id
20
+ assert_equal '48794686', response.fax_name
21
+ assert_equal '1234567890', response.csid
22
+ assert_equal 0, response.status
23
+ assert_equal 59985697, response.mcfid
24
+ assert_equal 1, response.page_count
25
+ assert_equal 'New Inbound', response.request_type
26
+ assert_not_nil response.file_contents
27
+ assert_not_nil response.file
28
+ assert_respond_to response.file, :read
29
+ assert_equal response.file_contents, response.file.read
30
+
31
+ # According to docs these will always be "Pacific Time Zone" (sometimes -8, sometimes -7 -- using -8)
32
+ assert_equal Time.utc(2009,9,29,23,56,35), response.date_received
33
+ assert_equal Time.utc(2009,9,30, 0, 1,11), response.request_date
34
+ end
35
+
36
+
37
+ def xml
38
+ %Q{
39
+ <?xml version="1.0"?>
40
+ <InboundPostRequest>
41
+ <AccessControl>
42
+ <UserName></UserName>
43
+ <Password></Password>
44
+ </AccessControl>
45
+ <RequestControl>
46
+ <RequestDate>09/29/2009 16:01:11</RequestDate>
47
+ <RequestType>New Inbound</RequestType>
48
+ </RequestControl>
49
+ <FaxControl>
50
+ <AccountID>1234567890</AccountID>
51
+ <DateReceived>09/29/2009 15:56:35</DateReceived>
52
+ <FaxName>48794686</FaxName>
53
+ <FileType>pdf</FileType>
54
+ <PageCount>1</PageCount>
55
+ <CSID>1234567890</CSID>
56
+ <ANI>098-765-4321</ANI>
57
+ <Status>0</Status>
58
+ <MCFID>59985697</MCFID>
59
+ <FileContents>#{file_contents}</FileContents>
60
+ </FaxControl>
61
+ </InboundPostRequest>
62
+ }
63
+ end
64
+
65
+ def file_contents
66
+ %Q| JVBERi0xLjYKJeTjz9IKMSAwIG9iagpbL1BERi9JbWFnZUIvSW1hZ2VDL0ltYWdlSS9UZXh0XQplbmRvYmoKMyAwIG9iago8PC9TdWJ0eXBlL0ltYWdlCi9XaWR0aCAxNzI4Ci9IZWlnaHQgMjIwMAovQml0c1BlckNvbXBvbmVudCAxCi9Db2xvclNwYWNlL0RldmljZUdyYXkKL0ZpbHRlci9DQ0lUVEZheERlY29kZQovRGVjb2RlUGFybXM8PC9LIC0xL0VuZE9mQmxvY2sgZmFsc2U+PgovTGVuZ3RoIDQgMCBSCj4+CnN0cmVhbQrI4OaClTMigMHY4pFc7GxDtWKRdEDDBJSJJf///4ZvDKGHms1zvGoMEdjbTDNMMH//////w25DGaGRx5s/zwU5kciORwyOTkMedQuSA5zI5EcjMZDCunhswMuM+FygjMUuKJDCf/////////////pYRcBhieA9Aq3CL8NidxO7YlQHhFwGaAgRfh6NNsTuJ3YRcBhF+HoER7wdGhhF+GZhARdgwwgwj4oRfB//////////////////xWIbYQb0hxQQbppthBvENkiQQb8aabENoIN6TfsUKCDYRd0EG3okNBBv///////////////mmHnQT9Lj/286CcZUBjZC/8+JHpN4ShRoJ0m20nx//////////////8N4Rd/iHzV//CLvzbESXf4Rd5lFC4hVMnX7aX///////////////hBfzWH5O/9LCC/J3lGH/CC8nejUcwjk7vbSYrye////////////////8JJ0EyP/hvYYQX8MJJ0EyP2YbDCC7C/0EyPsMIJNJvTYYQTDCsMJNJsMJf////////////////+EIRmCMTuKCDCDCDCDBAwxCTTThEcicEYncUGIQYhAgbEJNNNidxQYhGgIgwmEDBAwxCDEodgxBNEMEDEL/////////////xERERERERURERERERERERERERER9B+P/////////5kFhTvgpWI6xGwIOzOJEZBDO0R2SRW7ByGAQrP+QRL/uwv/hV/zTc1H+Sm/m3r/hvfx///t7////ckIp0al2UI6rzaJNZqRQinR1RFEULyNrJCNaIhGtEQskIlazaIkiMRJFkhETWSEa0U6NS+ZilAh6CD8+KCIvA8EDPxyBA8nggzgpQICIvmmazDhnBfO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3r8LhBhB6DCDx71S0Di9BhB/rr3/6v/6/pur3/3/9r6va//a+v6694/vSS+P/j1TiNLe6/uI/W3tpf+k9fXt14pOl9aX19jTaT2PTfXf/+3tpdhggwUlf8MF3aX+iV0Sh31rpc/OSveaqlpf///+l+l////wf/B//rtr+lpfyUfpvSS+Si/8nPQenkoI4pL+li9NyUEcfxx////8f////+wf+wf/6f1/HH5DEp/8f+ntf9IUm6afSfpLJwn00////////////YP/YP/9Fu//////Vf96///1Su1iDBf//NUZX////mr/////lA/8nH//T7a/zVG1///Vf////9JaM/1/////////////g/+D//rf1//j///+xX///hL/0Sv//227////b9szv/+//PJ/84n//Sb//bb//9JL////9JJ/rr//+ZvM26/7aX/5m/9tJv/df8L2k2kF+0v0m91/zN5m2//0jh//1a+cNsEVDS/wlHGdT/S//dXV//f2v3X2lfa/3/9/33+v9fFf3V1a/+ukl/vH/YW1/SRBfF+uv/21bVhhfsjrbCW2F9tfbVsJNr+wwtgin+2lYSbCTaVkdWl+rf8hjS2ratr8HBxX8H/T/sbFf+7XHFf/YpimJx/x7FcfsV7FMUx/sTj4/2OKYpjjiv0m9/2KYpj93rVX/eRR/7tfr/vX/2Ewg1++1hkn+wvaaZGP/DW/7CmdNMJ5h1+k/X7CYTIx/u8mOuqf/DX+GEGF/X+GSHyY6/iIiOIiIiIiIiIiIiIjiIiOIiIiIiIiIiIiIiIjiPiIikIiIiIiOIiIjiIj/0ktLlcysrqV/9f0tL0klS8GCwYL4jQ9iExCxEYYQYXER///////8yCmdmUdI6R2BBSNskRyO9YhhSF3/g/+D//d/w//zTd/y5/+OG/H2//t3+/yDRE0SaIxHVeSaNSKdHVblCvIhFWinRqX5DWSEU6KdGtHVcpxT0aR4UjBD8CBggfnmbgRFoRTgwRFSc5BByx+cjMUpxD0CBggf5oLmYpQIegQMnFBEVqJ9B9JhOLCHpaaaafce36YTiwh+g9MJxaafRd9UXjm5yeObOlo2NGxovGjY94Ij/fou3Nzk8c2dJF30Xjm5yeNF40bH0g23pNpPTpPpdPTpN0/wh39J0np0nikg3pNpPTpN0/q9Kv/30va2q9r/b+m//eqvr/69rpO/tj1pel2Njt2P13+I9aXDSf2x69ux/3pa/8VwcGlwf+/pL/y6P9LX0uD/6UZqCf97BsHGwf+3+TAT/2/4zMJ8bB/2/Bf+9g2D2D1+/wX/3/wX9g//Uysln/lvycZOOYG/9/0Sz///NWSz8wN/9eC/+m8HB8H69v+C///KL4L/B/7e2l//ecTnE7ZqT6/Htmcl///7aX7ZqT9tLrM3/t++FwvmbC/Xv//t+raX5m//M2F/ex3Vr9rt9991fhfftK1+10r7SurX7q/IYxhLbVwvtr3tpNpNq2keor/bVwvtrG2EmwrauF9tW0uxVMVH7HvsbGxTH177FR+x0xUUxUfsUx9p2EyLD9kY/vYTCYTC4L32mRYfsjHwmg0wmRYfsJhREREREREREREOIiIiIiIiIiIiIiNfS1H/5kFR3Gf+RiM0q8KFqv////qvOLyQqolCNaOqKEUiNS4IGEDCBl4EDM7zcXI2M0FJxT0EGcEIwU0FPxcjY8X8Q9Vi1QacYTTQcWuTxhggwUnnqpOxKtou6LtwRH5uaLtou8nYlW9P9Nj9NOkG0nhCk6TpBumn////V03/TdX/r+m1Wq0nxofFJ6r//1X/papf//////JAT///+q//4L///////RLP///+q//4L//////7ZnaW2Z3//+0lX9tL//bS///1X99pdraV//7I6sEU7CR6/9sJNruFPTathL/8ccV/+xTFcexTFf/d5nWq/tNbIsPaa/iIjiIiIiIiIiIiI///x/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+ACACCmVuZHN0cmVhbQplbmRvYmoKNCAwIG9iago0MTY1CmVuZG9iago2IDAgb2JqCjw8L0xlbmd0aCA3IDAgUgovRmlsdGVyL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nCvkMjOw1LOwMDJRMABCCwMLPUMzY2MwJzmXS9/TQMElnyuQCwCiLAf0CmVuZHN0cmVhbQplbmRvYmoKNyAwIG9iago0MwplbmRvYmoKOCAwIG9iago8PC9Qcm9jU2V0IDEgMCBSCi9YT2JqZWN0PDwvSTAgMyAwIFIKPj4KPj4KZW5kb2JqCjkgMCBvYmoKPDwvQ3JlYXRpb25EYXRlIChEOjIwMDkwOTI5MTYwOTI0LTA3JzAwJykKL1Byb2R1Y2VyIChQREZsaWIgNy4wLjMgXChKREsgMS42L1dpbjMyXCkpCj4+CmVuZG9iago1IDAgb2JqCjw8L1R5cGUvUGFnZQovUGFyZW50IDIgMCBSCi9Db250ZW50cyA2IDAgUgovUmVzb3VyY2VzIDggMCBSCi9NZWRpYUJveFswIDAgNjA5Ljg4MjQgODA4LjE2MzNdCj4+CmVuZG9iagoyIDAgb2JqCjw8L1R5cGUvUGFnZXMKL0NvdW50IDEKL0tpZHNbIDUgMCBSXT4+CmVuZG9iagoxMCAwIG9iago8PC9UeXBlL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+CmVuZG9iagp4cmVmCjAgMTEKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDQ4NTAgMDAwMDAgbiAKMDAwMDAwMDA2MyAwMDAwMCBuIAowMDAwMDA0NDI1IDAwMDAwIG4gCjAwMDAwMDQ3MzkgMDAwMDAgbiAKMDAwMDAwNDQ0NSAwMDAwMCBuIAowMDAwMDA0NTYwIDAwMDAwIG4gCjAwMDAwMDQ1NzggMDAwMDAgbiAKMDAwMDAwNDYzNiAwMDAwMCBuIAowMDAwMDA0OTA0IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6ZSAxMQovUm9vdCAxMCAwIFIKL0luZm8gOSAwIFIKL0lEWzw1NUMzQUY5Rjk3QzNBQjMwN0I2OTIzNTcxM0Q1RUVFND48NTVDM0FGOUY5N0MzQUIzMDdCNjkyMzU3MTNENUVFRTQ+XQo+PgpzdGFydHhyZWYKNDk1MgolJUVPRgo=|
67
+ end
68
+ end
69
+ end
70
+
@@ -1,6 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/test_helper'
2
+ require File.dirname(__FILE__) + '/../lib/efax/outbound'
2
3
 
3
- module EFaxTest
4
+ module EFaxOutboundTest
4
5
 
5
6
  class RequestTest < Test::Unit::TestCase
6
7
  def test_should_encode_data
data/test/test_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'test/unit'
2
2
  require 'rubygems'
3
3
  require 'mocha'
4
- require File.dirname(__FILE__) + '/../lib/efax'
5
4
 
6
5
  class Class
7
6
  def publicize_instance_methods
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: efax
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Szymon Nowak
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-09-28 00:00:00 +02:00
13
+ date: 2009-09-30 00:00:00 +10:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -47,9 +47,12 @@ files:
47
47
  - Rakefile
48
48
  - TODO
49
49
  - VERSION
50
+ - efax.gemspec
50
51
  - lib/efax.rb
51
- - ruby-efax.gemspec
52
- - test/efax_test.rb
52
+ - lib/efax/inbound.rb
53
+ - lib/efax/outbound.rb
54
+ - test/efax_inbound_test.rb
55
+ - test/efax_outbound_test.rb
53
56
  - test/test_helper.rb
54
57
  has_rdoc: true
55
58
  homepage: http://github.com/szimek/efax
@@ -80,5 +83,6 @@ signing_key:
80
83
  specification_version: 3
81
84
  summary: Ruby library for accessing the eFax Developer service
82
85
  test_files:
86
+ - test/efax_inbound_test.rb
87
+ - test/efax_outbound_test.rb
83
88
  - test/test_helper.rb
84
- - test/efax_test.rb