fax_finder 0.1.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/.project +11 -0
- data/Changelog +0 -0
- data/LICENSE +0 -0
- data/README.rdoc +1 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/fax_finder.gemspec +68 -0
- data/fax_finder.tmproj +124 -0
- data/lib/fax_finder/query.rb +28 -0
- data/lib/fax_finder/request.rb +64 -0
- data/lib/fax_finder/response.rb +54 -0
- data/lib/fax_finder/send.rb +65 -0
- data/lib/fax_finder.rb +32 -0
- data/test/fixtures/send_request_external.xml +35 -0
- data/test/fixtures/send_request_inline.xml +35 -0
- data/test/fixtures/send_response_success.xml +43 -0
- data/test/query_test.rb +51 -0
- data/test/request_test.rb +110 -0
- data/test/response_test.rb +62 -0
- data/test/send_test.rb +118 -0
- data/test/test_helper.rb +24 -0
- metadata +146 -0
data/.project
ADDED
data/Changelog
ADDED
File without changes
|
data/LICENSE
ADDED
File without changes
|
data/README.rdoc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Readme coming soon.
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/rdoctask'
|
6
|
+
require 'rake/testtask'
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'jeweler'
|
10
|
+
Jeweler::Tasks.new do |gem|
|
11
|
+
gem.name = "fax_finder"
|
12
|
+
gem.summary = "Provides support MultiTech's FaxFinder server"
|
13
|
+
gem.authors = ["Erich L. Timkar"]
|
14
|
+
gem.email = "erich@hordesoftware.com"
|
15
|
+
gem.homepage = "http://github.com/erichhorde/fax_finder"
|
16
|
+
gem.rubyforge_project = "fax_finder"
|
17
|
+
|
18
|
+
gem.add_dependency('nokogiri', '1.4.4')
|
19
|
+
gem.add_dependency('builder', '~> 2.1.2')
|
20
|
+
gem.add_development_dependency('test-unit', '~> 2')
|
21
|
+
gem.add_development_dependency('mocha', '>= 0.9')
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
# Jeweler::RubyforgeTasks.new do |rubyforge|
|
26
|
+
# rubyforge.doc_task = "rdoc"
|
27
|
+
# end
|
28
|
+
rescue LoadError
|
29
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
30
|
+
end
|
31
|
+
|
32
|
+
Rake::RDocTask.new do |rdoc|
|
33
|
+
files =['README.rdoc', 'lib/**/*.rb']
|
34
|
+
rdoc.rdoc_files.add(files)
|
35
|
+
rdoc.main = "README.rdoc" # page to start on
|
36
|
+
rdoc.title = "fax_finder: Ruby Support for Multitech's FaxFinder Server"
|
37
|
+
rdoc.rdoc_dir = 'rdoc' # rdoc output folder
|
38
|
+
rdoc.options << '--line-numbers'
|
39
|
+
end
|
40
|
+
|
41
|
+
Rake::TestTask.new do |t|
|
42
|
+
t.test_files = FileList['test/**/*.rb']
|
43
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/fax_finder.gemspec
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{fax_finder}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Erich L. Timkar"]
|
12
|
+
s.date = %q{2011-05-02}
|
13
|
+
s.email = %q{erich@hordesoftware.com}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE",
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".project",
|
20
|
+
"Changelog",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"fax_finder.gemspec",
|
26
|
+
"fax_finder.tmproj",
|
27
|
+
"lib/fax_finder.rb",
|
28
|
+
"lib/fax_finder/query.rb",
|
29
|
+
"lib/fax_finder/request.rb",
|
30
|
+
"lib/fax_finder/response.rb",
|
31
|
+
"lib/fax_finder/send.rb",
|
32
|
+
"test/fixtures/send_request_external.xml",
|
33
|
+
"test/fixtures/send_request_inline.xml",
|
34
|
+
"test/fixtures/send_response_success.xml",
|
35
|
+
"test/query_test.rb",
|
36
|
+
"test/request_test.rb",
|
37
|
+
"test/response_test.rb",
|
38
|
+
"test/send_test.rb",
|
39
|
+
"test/test_helper.rb"
|
40
|
+
]
|
41
|
+
s.homepage = %q{http://github.com/erichhorde/fax_finder}
|
42
|
+
s.require_paths = ["lib"]
|
43
|
+
s.rubyforge_project = %q{fax_finder}
|
44
|
+
s.rubygems_version = %q{1.7.2}
|
45
|
+
s.summary = %q{Provides support MultiTech's FaxFinder server}
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_runtime_dependency(%q<nokogiri>, ["= 1.4.4"])
|
52
|
+
s.add_runtime_dependency(%q<builder>, ["~> 2.1.2"])
|
53
|
+
s.add_development_dependency(%q<test-unit>, ["~> 2"])
|
54
|
+
s.add_development_dependency(%q<mocha>, [">= 0.9"])
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<nokogiri>, ["= 1.4.4"])
|
57
|
+
s.add_dependency(%q<builder>, ["~> 2.1.2"])
|
58
|
+
s.add_dependency(%q<test-unit>, ["~> 2"])
|
59
|
+
s.add_dependency(%q<mocha>, [">= 0.9"])
|
60
|
+
end
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<nokogiri>, ["= 1.4.4"])
|
63
|
+
s.add_dependency(%q<builder>, ["~> 2.1.2"])
|
64
|
+
s.add_dependency(%q<test-unit>, ["~> 2"])
|
65
|
+
s.add_dependency(%q<mocha>, [">= 0.9"])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
data/fax_finder.tmproj
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>currentDocument</key>
|
6
|
+
<string>lib/fax_finder/request.rb</string>
|
7
|
+
<key>documents</key>
|
8
|
+
<array>
|
9
|
+
<dict>
|
10
|
+
<key>expanded</key>
|
11
|
+
<true/>
|
12
|
+
<key>name</key>
|
13
|
+
<string>fax_finder</string>
|
14
|
+
<key>regexFolderFilter</key>
|
15
|
+
<string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
|
16
|
+
<key>sourceDirectory</key>
|
17
|
+
<string></string>
|
18
|
+
</dict>
|
19
|
+
</array>
|
20
|
+
<key>fileHierarchyDrawerWidth</key>
|
21
|
+
<integer>352</integer>
|
22
|
+
<key>metaData</key>
|
23
|
+
<dict>
|
24
|
+
<key>Changelog</key>
|
25
|
+
<dict>
|
26
|
+
<key>caret</key>
|
27
|
+
<dict>
|
28
|
+
<key>column</key>
|
29
|
+
<integer>0</integer>
|
30
|
+
<key>line</key>
|
31
|
+
<integer>0</integer>
|
32
|
+
</dict>
|
33
|
+
<key>firstVisibleColumn</key>
|
34
|
+
<integer>0</integer>
|
35
|
+
<key>firstVisibleLine</key>
|
36
|
+
<integer>0</integer>
|
37
|
+
</dict>
|
38
|
+
<key>lib/fax_finder/query.rb</key>
|
39
|
+
<dict>
|
40
|
+
<key>caret</key>
|
41
|
+
<dict>
|
42
|
+
<key>column</key>
|
43
|
+
<integer>49</integer>
|
44
|
+
<key>line</key>
|
45
|
+
<integer>14</integer>
|
46
|
+
</dict>
|
47
|
+
<key>firstVisibleColumn</key>
|
48
|
+
<integer>0</integer>
|
49
|
+
<key>firstVisibleLine</key>
|
50
|
+
<integer>0</integer>
|
51
|
+
</dict>
|
52
|
+
<key>lib/fax_finder/request.rb</key>
|
53
|
+
<dict>
|
54
|
+
<key>caret</key>
|
55
|
+
<dict>
|
56
|
+
<key>column</key>
|
57
|
+
<integer>28</integer>
|
58
|
+
<key>line</key>
|
59
|
+
<integer>5</integer>
|
60
|
+
</dict>
|
61
|
+
<key>columnSelection</key>
|
62
|
+
<false/>
|
63
|
+
<key>firstVisibleColumn</key>
|
64
|
+
<integer>0</integer>
|
65
|
+
<key>firstVisibleLine</key>
|
66
|
+
<integer>0</integer>
|
67
|
+
<key>selectFrom</key>
|
68
|
+
<dict>
|
69
|
+
<key>column</key>
|
70
|
+
<integer>15</integer>
|
71
|
+
<key>line</key>
|
72
|
+
<integer>5</integer>
|
73
|
+
</dict>
|
74
|
+
<key>selectTo</key>
|
75
|
+
<dict>
|
76
|
+
<key>column</key>
|
77
|
+
<integer>28</integer>
|
78
|
+
<key>line</key>
|
79
|
+
<integer>5</integer>
|
80
|
+
</dict>
|
81
|
+
</dict>
|
82
|
+
<key>lib/fax_finder/response.rb</key>
|
83
|
+
<dict>
|
84
|
+
<key>caret</key>
|
85
|
+
<dict>
|
86
|
+
<key>column</key>
|
87
|
+
<integer>11</integer>
|
88
|
+
<key>line</key>
|
89
|
+
<integer>42</integer>
|
90
|
+
</dict>
|
91
|
+
<key>firstVisibleColumn</key>
|
92
|
+
<integer>0</integer>
|
93
|
+
<key>firstVisibleLine</key>
|
94
|
+
<integer>0</integer>
|
95
|
+
</dict>
|
96
|
+
<key>test/response_test.rb</key>
|
97
|
+
<dict>
|
98
|
+
<key>caret</key>
|
99
|
+
<dict>
|
100
|
+
<key>column</key>
|
101
|
+
<integer>70</integer>
|
102
|
+
<key>line</key>
|
103
|
+
<integer>37</integer>
|
104
|
+
</dict>
|
105
|
+
<key>firstVisibleColumn</key>
|
106
|
+
<integer>0</integer>
|
107
|
+
<key>firstVisibleLine</key>
|
108
|
+
<integer>9</integer>
|
109
|
+
</dict>
|
110
|
+
</dict>
|
111
|
+
<key>openDocuments</key>
|
112
|
+
<array>
|
113
|
+
<string>Changelog</string>
|
114
|
+
<string>lib/fax_finder/request.rb</string>
|
115
|
+
<string>lib/fax_finder/response.rb</string>
|
116
|
+
<string>lib/fax_finder/query.rb</string>
|
117
|
+
<string>test/response_test.rb</string>
|
118
|
+
</array>
|
119
|
+
<key>showFileHierarchyDrawer</key>
|
120
|
+
<true/>
|
121
|
+
<key>windowFrame</key>
|
122
|
+
<string>{{404, 240}, {1276, 768}}</string>
|
123
|
+
</dict>
|
124
|
+
</plist>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'builder'
|
3
|
+
|
4
|
+
module FaxFinder
|
5
|
+
|
6
|
+
class Query < Request
|
7
|
+
def self.get(fax_key, entry_key)
|
8
|
+
self.post(){
|
9
|
+
construct_http_request(fax_key, entry_key)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.construct_http_request(fax_key, entry_key)
|
14
|
+
request = Net::HTTP::Get.new(self.path(fax_key, entry_key))
|
15
|
+
request.basic_auth self.user, self.password
|
16
|
+
request.set_content_type(Request::CONTENT_TYPE)
|
17
|
+
request
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.path(fax_key, entry_key)
|
21
|
+
params=[BASE_PATH, fax_key, entry_key].reject{ |p| p.nil? }
|
22
|
+
File.join(*params)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
|
4
|
+
module FaxFinder
|
5
|
+
module Constants
|
6
|
+
BASE_PATH='/ffws/v1/ofax'
|
7
|
+
DEFAULT_PORT=80
|
8
|
+
DEFAULT_SSL=false
|
9
|
+
end
|
10
|
+
|
11
|
+
module RequestClassMethods
|
12
|
+
attr_reader :host, :user, :password, :port, :ssl
|
13
|
+
def configure(_host, _user, _password, _port=Request::DEFAULT_PORT, _ssl=Request::DEFAULT_SSL)
|
14
|
+
@host, @user, @password, @port, @ssl=_host, _user, _password, _port, _ssl
|
15
|
+
end
|
16
|
+
|
17
|
+
def reset
|
18
|
+
@host=@user=@password=nil
|
19
|
+
@port=Request::DEFAULT_PORT
|
20
|
+
@ssl=Request::DEFAULT_SSL
|
21
|
+
end
|
22
|
+
|
23
|
+
def post
|
24
|
+
response_body=nil
|
25
|
+
begin
|
26
|
+
Net::HTTP.start(Request.host, Request.port) { |http|
|
27
|
+
http.use_ssl=Request.ssl
|
28
|
+
http_request = yield
|
29
|
+
http_request.basic_auth Request.user, Request.password
|
30
|
+
http_request.set_content_type(Request::CONTENT_TYPE)
|
31
|
+
http_response = http.request(http_request)
|
32
|
+
response_body=http_response.body
|
33
|
+
}
|
34
|
+
rescue Errno::ECONNREFUSED => e
|
35
|
+
response_body=Responses::NO_CONNECTION
|
36
|
+
rescue RuntimeError => e
|
37
|
+
response_body=Responses::APPLICATION_ERROR.gsub(Responses::ERROR_GSUB, e.message)
|
38
|
+
end
|
39
|
+
Response.new(Nokogiri::XML(response_body))
|
40
|
+
end
|
41
|
+
|
42
|
+
# def proces_http_response(http_response)
|
43
|
+
# return
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
def formatted_fax_finder_time(time)
|
47
|
+
result=nil
|
48
|
+
if time
|
49
|
+
result=(time.utc? ? time : time.utc).strftime(Request::TIME_FORMAT)
|
50
|
+
end
|
51
|
+
result
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class Request
|
57
|
+
include Constants
|
58
|
+
TIME_FORMAT="%Y-%m-%dT%H:%M:%S"
|
59
|
+
CONTENT_TYPE='text/xml'
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
FaxFinder::Request.send(:extend, FaxFinder::RequestClassMethods)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module FaxFinder
|
2
|
+
module Responses
|
3
|
+
ERROR_GSUB='####MESSAGE#####'
|
4
|
+
|
5
|
+
NO_CONNECTION =<<-EOXML
|
6
|
+
<response>
|
7
|
+
<message>No connection to fax server</message>
|
8
|
+
<fax_entry>
|
9
|
+
<state>error</state>
|
10
|
+
</fax_entry>
|
11
|
+
</response>
|
12
|
+
EOXML
|
13
|
+
|
14
|
+
APPLICATION_ERROR =<<-EOXML
|
15
|
+
<response>
|
16
|
+
<message>####MESSAGE#####</message>
|
17
|
+
<fax_entry>
|
18
|
+
<state>error</state>
|
19
|
+
</fax_entry>
|
20
|
+
</response>
|
21
|
+
EOXML
|
22
|
+
end
|
23
|
+
|
24
|
+
class Response
|
25
|
+
attr_reader :doc, :state, :fax_entry_url, :fax_key, :entry_key, :try_number, :message, :schedule_message
|
26
|
+
REGEXP_KEYS=/([0-9A-F]+)\/([0-9A-F]+)$/
|
27
|
+
XPATH_STATE='//fax_entry/state'
|
28
|
+
XPATH_FAX_ENTRY_URL='//fax_entry/fax_entry_url'
|
29
|
+
XPATH_TRY_NUMBER='//fax_entry/try_number'
|
30
|
+
XPATH_MESSAGE='//response/message'
|
31
|
+
XPATH_SCHEDULE_MESSAGE='//fax_entry/schedule_message'
|
32
|
+
|
33
|
+
def initialize(_doc)
|
34
|
+
@doc=_doc
|
35
|
+
if self.doc
|
36
|
+
@message=self.doc.xpath(XPATH_MESSAGE).text
|
37
|
+
@state=self.doc.xpath(XPATH_STATE).text
|
38
|
+
if @state != 'error'
|
39
|
+
@fax_entry_url=self.doc.xpath(XPATH_FAX_ENTRY_URL).text
|
40
|
+
@fax_key, @entry_key=self.extract_fax_and_entry_key(self.fax_entry_url)
|
41
|
+
@try_number=self.doc.xpath(XPATH_TRY_NUMBER).text.to_i
|
42
|
+
@schedule_message=self.doc.xpath(XPATH_SCHEDULE_MESSAGE).text
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def extract_fax_and_entry_key(_url)
|
48
|
+
match=REGEXP_KEYS.match(_url)
|
49
|
+
match[1,2] if match
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'builder'
|
3
|
+
|
4
|
+
module FaxFinder
|
5
|
+
module SendClassMethods
|
6
|
+
|
7
|
+
def post(recipient_fax, external_url, options={})
|
8
|
+
super(){
|
9
|
+
construct_http_request(recipient_fax, external_url, options)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def construct_xml(recipient_fax, external_url, options={})
|
14
|
+
xml = ""
|
15
|
+
builder = Builder::XmlMarkup.new(:target => xml, :indent => 2 )
|
16
|
+
builder.instruct!(:xml, :version=>'1.0', :encoding=>'UTF-8')
|
17
|
+
|
18
|
+
time=options[:schedule_all_at]
|
19
|
+
time=time.utc if time && !time.utc?
|
20
|
+
formatted_time=time ? time.strftime(Request::TIME_FORMAT) : nil
|
21
|
+
|
22
|
+
builder.schedule_fax {
|
23
|
+
builder.cover_page do
|
24
|
+
# builder.subject(options[:subject])
|
25
|
+
# builder.comment(options[:comment])
|
26
|
+
builder.enabled('false')
|
27
|
+
end
|
28
|
+
|
29
|
+
builder.recipient do
|
30
|
+
builder.fax_number(recipient_fax)
|
31
|
+
builder.organization(options[:recipient_organization])
|
32
|
+
builder.phone_number(options[:recipient_phone_number])
|
33
|
+
builder.name(options[:recipient_name])
|
34
|
+
end
|
35
|
+
|
36
|
+
builder.sender do
|
37
|
+
builder.fax_number(options[:sender_fax_number])
|
38
|
+
builder.phone_number(options[:sender_phone_number])
|
39
|
+
builder.organization(options[:sender_organization])
|
40
|
+
builder.name(options[:sender_name])
|
41
|
+
end
|
42
|
+
|
43
|
+
builder.attachment do
|
44
|
+
builder.location('external')
|
45
|
+
builder.url(external_url)
|
46
|
+
end
|
47
|
+
builder.schedule_all_at(formatted_fax_finder_time(options[:schedule_all_at]))
|
48
|
+
}
|
49
|
+
xml
|
50
|
+
end
|
51
|
+
|
52
|
+
def construct_http_request(recipient_fax, external_url, options={})
|
53
|
+
request = Net::HTTP::Post.new(Request::BASE_PATH)
|
54
|
+
request.body=construct_xml(recipient_fax, external_url, options)
|
55
|
+
request
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
class Send < Request
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
FaxFinder::Send.send(:extend, FaxFinder::SendClassMethods)
|
data/lib/fax_finder.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#--
|
2
|
+
# (The MIT License)
|
3
|
+
#
|
4
|
+
# Copyright (c) 2008 Szymon Nowak & Pawel Kozlowski (U2I)
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files (the "Software"), to
|
8
|
+
# deal in the Software without restriction, including without limitation the
|
9
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
10
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
22
|
+
# IN THE SOFTWARE.
|
23
|
+
#++
|
24
|
+
#
|
25
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
26
|
+
require 'net/http'
|
27
|
+
require 'net/https'
|
28
|
+
|
29
|
+
require 'fax_finder/response.rb'
|
30
|
+
require 'fax_finder/request.rb'
|
31
|
+
require 'fax_finder/send.rb'
|
32
|
+
require 'fax_finder/query.rb'
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<schedule_fax>
|
3
|
+
<cover_page>
|
4
|
+
<url>https://192.168.2.1/ffws/v1/data/cover_pages/default.pdf</url>
|
5
|
+
<enabled>true</enabled>
|
6
|
+
<subject>Test Subject</subject>
|
7
|
+
<comments>Test Message</comments>
|
8
|
+
</cover_page>
|
9
|
+
<sender>
|
10
|
+
<name>Sender Name</name>
|
11
|
+
<organization>Sender Org</organization>
|
12
|
+
<phone_number>218-555-3333</phone_number>
|
13
|
+
<fax_number>218-555-3334</fax_number>
|
14
|
+
<email_address>sender@example.com</email_address>
|
15
|
+
</sender>
|
16
|
+
<recipient>
|
17
|
+
<name>Rcpt 1 Name</name>
|
18
|
+
<organization>Rcpt 1 Org</organization>
|
19
|
+
<fax_number>-218-555-3335</fax_number>
|
20
|
+
<phone_number>218-555-3336</phone_number>
|
21
|
+
</recipient>
|
22
|
+
<attachment>
|
23
|
+
<location>inline</location>
|
24
|
+
<name>attachment1.txt</name>
|
25
|
+
<content_type>text/plain</content_type>
|
26
|
+
<content_transfer_encoding>base64</content_transfer_encoding>
|
27
|
+
<content>dGVzdA==</content>
|
28
|
+
</attachment>
|
29
|
+
<max_tries>3</max_tries>
|
30
|
+
<priority>3</priority>
|
31
|
+
<try_interval>30</try_interval>
|
32
|
+
<receipt>failure</receipt>
|
33
|
+
<receipt_attachment>none</receipt_attachment>
|
34
|
+
<schedule_all_at>2008-08-07T20:30:00</schedule_all_at>
|
35
|
+
</schedule_fax>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<schedule_fax>
|
3
|
+
<cover_page>
|
4
|
+
<url>https://192.168.2.1/ffws/v1/data/cover_pages/default.pdf</url>
|
5
|
+
<enabled>true</enabled>
|
6
|
+
<subject>Test Subject</subject>
|
7
|
+
<comments>Test Message</comments>
|
8
|
+
</cover_page>
|
9
|
+
<sender>
|
10
|
+
<name>Sender Name</name>
|
11
|
+
<organization>Sender Org</organization>
|
12
|
+
<phone_number>218-555-3333</phone_number>
|
13
|
+
<fax_number>218-555-3334</fax_number>
|
14
|
+
<email_address>sender@example.com</email_address>
|
15
|
+
</sender>
|
16
|
+
<recipient>
|
17
|
+
<name>Rcpt 1 Name</name>
|
18
|
+
<organization>Rcpt 1 Org</organization>
|
19
|
+
<fax_number>-218-555-3335</fax_number>
|
20
|
+
<phone_number>218-555-3336</phone_number>
|
21
|
+
</recipient>
|
22
|
+
<attachment>
|
23
|
+
<location>inline</location>
|
24
|
+
<name>attachment1.txt</name>
|
25
|
+
<content_type>text/plain</content_type>
|
26
|
+
<content_transfer_encoding>base64</content_transfer_encoding>
|
27
|
+
<content>dGVzdA==</content>
|
28
|
+
</attachment>
|
29
|
+
<max_tries>3</max_tries>
|
30
|
+
<priority>3</priority>
|
31
|
+
<try_interval>30</try_interval>
|
32
|
+
<receipt>failure</receipt>
|
33
|
+
<receipt_attachment>none</receipt_attachment>
|
34
|
+
<schedule_all_at>2008-08-07T20:30:00</schedule_all_at>
|
35
|
+
</schedule_fax>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<response>
|
3
|
+
<message>Success</message>
|
4
|
+
<fax_entry>
|
5
|
+
<fax_entry_url>https://192.168.2.1/ffws/v1/ofax/0000001B/0000</fax_entry_url>
|
6
|
+
<fax_url>https://192.168.2.1/ffws/v1/ofax/0000001B</fax_url>
|
7
|
+
<state>preprocessing</state>
|
8
|
+
<schedule_message>Successfully sent fax</schedule_message>
|
9
|
+
<created>2008-08-01 08:43:29</created>
|
10
|
+
<stime>2008-08-01 08:52:29</stime>
|
11
|
+
<try_number>1</try_number>
|
12
|
+
<agent>FFWS</agent>
|
13
|
+
<preview>https://192.168.2.1/ffws/v1/data/preview/0000001B-0000.pdf</preview>
|
14
|
+
<cover_page>
|
15
|
+
<url>https://192.168.2.1/ffws/v1/data/cover_pages/default.pdf</url>
|
16
|
+
<enabled>true</enabled>
|
17
|
+
<subject>Test Subject</subject>
|
18
|
+
<comments>Test Message</comments>
|
19
|
+
</cover_page>
|
20
|
+
<sender>
|
21
|
+
<username>admin</username>
|
22
|
+
<name>Sender Name</name>
|
23
|
+
<organization>Sender Org</organization>
|
24
|
+
<phone_number>218-555-3333</phone_number>
|
25
|
+
<fax_number>218-555-3334</fax_number>
|
26
|
+
<email_address>sender@example.com</email_address>
|
27
|
+
</sender>
|
28
|
+
<recipient>
|
29
|
+
<name>Rcpt 1 Name</name>
|
30
|
+
<organization>Rcpt 1 Org</organization>
|
31
|
+
<fax_number>218-555-3335</fax_number>
|
32
|
+
<phone_number>218-555-3336</phone_number>
|
33
|
+
</recipient>
|
34
|
+
<max_tries>3</max_tries>
|
35
|
+
<priority>3</priority>
|
36
|
+
<try_interval>30</try_interval>
|
37
|
+
<receipt>failure</receipt>
|
38
|
+
<receipt_attachment>none</receipt_attachment>
|
39
|
+
<pages>0</pages>
|
40
|
+
<approver></approver>
|
41
|
+
<approval_time></approval_time>
|
42
|
+
</fax_entry>
|
43
|
+
</response>
|
data/test/query_test.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
module FaxFinder
|
4
|
+
class QueryGetTest<Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
Request.configure('example.com', 'user', 'password')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_get
|
10
|
+
Query.get('user', 'password')
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_gets_returns_response
|
14
|
+
assert_instance_of(FaxFinder::Response, Query.get(nil, nil))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class QueryConstructHttpRequestTest<Test::Unit::TestCase
|
19
|
+
def setup
|
20
|
+
Request.configure('example.com', 'user', 'password')
|
21
|
+
@http_request=Query.construct_http_request('fax_key', 'entry_key')
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_returns_a_get
|
25
|
+
assert_instance_of(Net::HTTP::Get, @http_request)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_sets_path
|
29
|
+
assert_equal(Query.path('fax_key', 'entry_key'), @http_request.path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_sets_basic_auth
|
33
|
+
assert_not_nil(@http_request['authorization'])
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_sets_content_type
|
37
|
+
assert_equal('text/xml', @http_request['Content-Type'])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class QueryPathTest<Test::Unit::TestCase
|
42
|
+
def setup
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_constructs_using_base_path
|
46
|
+
assert_equal(Request::BASE_PATH+'/'+'fax_key' +'/'+'entry_key', Query.path('fax_key', 'entry_key'))
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
module FaxFinder
|
4
|
+
|
5
|
+
class RequestSetupTest<Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Request.configure('example.com', 'user', 'password', 123, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_setup_host
|
11
|
+
assert_equal('example.com', Request.host)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_setup_user
|
15
|
+
assert_equal('user', Request.user)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_setup_password
|
19
|
+
assert_equal('password', Request.password)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_setup_port
|
23
|
+
assert_equal(123, Request.port)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_setup_ssl
|
27
|
+
assert_equal(true, Request.ssl)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class RequestResetTest<Test::Unit::TestCase
|
33
|
+
def setup
|
34
|
+
Request.configure('example.com', 'user', 'password', 123, true)
|
35
|
+
Request.reset
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_resets_host
|
39
|
+
assert_nil(Request.host)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_resets_user
|
43
|
+
assert_nil(Request.user)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_resets_port
|
47
|
+
assert_nil(Request.port)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_resets_password
|
51
|
+
assert_nil(Request.password)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_resets_port
|
55
|
+
assert_equal(80, Request.port)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_resets_ssl
|
59
|
+
assert_equal(false, Request.ssl)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
class MockRequest<FaxFinder::Request
|
65
|
+
def self.post
|
66
|
+
super(){
|
67
|
+
construct_http_request
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.construct_http_request
|
72
|
+
request = Net::HTTP::Get.new('/ffws/v1/ofax')
|
73
|
+
request.basic_auth self.user, self.password
|
74
|
+
request.set_content_type(Request::CONTENT_TYPE)
|
75
|
+
request
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class RequestPostConnectionFailureTest<Test::Unit::TestCase
|
80
|
+
def setup
|
81
|
+
@response=nil
|
82
|
+
Request.configure(nil, 'user', 'password', 123, true)
|
83
|
+
@post=lambda{
|
84
|
+
@response=MockRequest.post
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_handles_connection_failure
|
89
|
+
@host=nil
|
90
|
+
assert_nothing_thrown { @post.call }
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_returns_a_response
|
94
|
+
@post.call
|
95
|
+
assert_instance_of(FaxFinder::Response, @response)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_sets_the_state
|
99
|
+
@post.call
|
100
|
+
assert_equal('error', @response.state)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_sets_the_message
|
104
|
+
@post.call
|
105
|
+
assert_equal('No connection to fax server', @response.message)
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
module FaxFinder
|
4
|
+
class ResponseConstructorTest<Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@response=Response.new(Nokogiri::XML(File.open('test/fixtures/send_response_success.xml')))
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_handles_nil
|
10
|
+
assert_nothing_thrown { Response.new(nil) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_sets_state
|
14
|
+
assert_equal('preprocessing', @response.state)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_set_fax_key
|
18
|
+
assert_equal('0000001B', @response.fax_key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_set_entry_key
|
22
|
+
assert_equal('0000', @response.entry_key)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_set_fax_entry_url
|
26
|
+
assert_equal('https://192.168.2.1/ffws/v1/ofax/0000001B/0000', @response.fax_entry_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_set_try_number
|
30
|
+
assert_equal(1, @response.try_number)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_set_message
|
34
|
+
assert_equal('Success', @response.message)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_sets_schedule_message
|
38
|
+
assert_equal('Successfully sent fax', @response.schedule_message)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class ResponseMethodsTest<Test::Unit::TestCase
|
43
|
+
def setup
|
44
|
+
@response=Response.new#(Nokogiri::XML(File.open('test/fixtures/send_response_success.xml')))
|
45
|
+
end
|
46
|
+
|
47
|
+
def extract_fax_and_entry_key_handles_nil
|
48
|
+
assert_nothing_thrown {
|
49
|
+
assert_equal([nil, nil], @response.extract_fax_and_entry_key(nil) )
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def extract_fax_and_entry_key_handles_parses_url
|
54
|
+
assert_nothing_thrown { @response.extract_fax_and_entry_key(nil) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def extract_fax_and_entry_key_handles_parses_url
|
58
|
+
assert_equal(['0000001B','0000'], @response.extract_fax_and_entry_key('https://192.168.2.1/ffws/v1/ofax/0000001B/0000'))
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/test/send_test.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
module FaxFinder
|
4
|
+
OPTIONS={:subject=>'Something',
|
5
|
+
:comment=>'Comment',
|
6
|
+
:recipient_name=>'recipient_name',
|
7
|
+
:recipient_organization=>'recipient_organization',
|
8
|
+
:recipient_phone_number=>'5647382910',
|
9
|
+
:sender_fax_number=>'0123456789',
|
10
|
+
:sender_name=>'sender_name',
|
11
|
+
:sender_organization=>'sender_organization',
|
12
|
+
:sender_phone_number=>'0987654321',
|
13
|
+
:schedule_all_at=>Time.now.utc
|
14
|
+
}
|
15
|
+
|
16
|
+
class SendPostTest<Test::Unit::TestCase
|
17
|
+
def setup
|
18
|
+
Request.configure('example.com', 'user', 'password')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_post
|
22
|
+
Send.post('user', 'password')
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_posts_returns_response
|
26
|
+
assert_instance_of(FaxFinder::Response, Send.post(nil, nil))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class SendConstructXMLTest<Test::Unit::TestCase
|
31
|
+
def setup
|
32
|
+
@doc=Nokogiri::XML(Send.construct_xml('1234567890', 'https://localhost/something', OPTIONS))
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_returns_string_and_doesnt_blow_up
|
36
|
+
assert_nothing_thrown { assert_instance_of(String, Send.construct_xml(nil, nil)) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_includes_subject
|
40
|
+
assert_equal('Something', @doc.xpath('//schedule_fax/cover_page/subject').text)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_includes_comment
|
44
|
+
assert_equal('Comment', @doc.xpath('//schedule_fax/cover_page/comment').text)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_includes_recipient_name
|
48
|
+
assert_equal('recipient_name', @doc.xpath('//schedule_fax/recipient/name').text)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_includes_recipient_organization
|
52
|
+
assert_equal('recipient_organization', @doc.xpath('//schedule_fax/recipient/organization').text)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_includes_recipient_fax_number
|
56
|
+
assert_equal('1234567890', @doc.xpath('//schedule_fax/recipient/fax_number').text)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_includes_recipient_phone_number
|
60
|
+
assert_equal('5647382910', @doc.xpath('//schedule_fax/recipient/phone_number').text)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_includes_sender_fax
|
64
|
+
assert_equal('0123456789', @doc.xpath('//schedule_fax/sender/fax_number').text)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_includes_sender_organization
|
68
|
+
assert_equal('sender_organization', @doc.xpath('//schedule_fax/sender/organization').text)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_includes_sender_fax_number
|
72
|
+
assert_equal('0123456789', @doc.xpath('//schedule_fax/sender/fax_number').text)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_includes_sender_phone_number
|
76
|
+
assert_equal('0987654321', @doc.xpath('//schedule_fax/sender/phone_number').text)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_includes_attachment_location
|
80
|
+
assert_equal('external', @doc.xpath('//schedule_fax/attachment/location').text)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_includes_attachment_url
|
84
|
+
assert_equal('https://localhost/something', @doc.xpath('//schedule_fax/attachment/url').text)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_includes_schedule_all_at
|
88
|
+
assert_equal(Time.now.utc.strftime(Request::TIME_FORMAT), @doc.xpath('//schedule_fax/schedule_all_at').text)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_converts_to_utc
|
92
|
+
@doc=Nokogiri::XML(Send.construct_xml('1234567890', 'https://localhost/something', OPTIONS.merge(:schedule_all_at=>Time.now)))
|
93
|
+
assert_equal(Time.now.utc.strftime(Request::TIME_FORMAT), @doc.xpath('//schedule_fax/schedule_all_at').text)
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
class SendConstructHttpRequestTest<Test::Unit::TestCase
|
99
|
+
def setup
|
100
|
+
Request.configure('example.com', 'user', 'password')
|
101
|
+
@http_request=Send.construct_http_request('1234567890', 'https://localhost/something', OPTIONS)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_returns_a_post
|
105
|
+
assert_instance_of(Net::HTTP::Post, @http_request)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_sets_body
|
109
|
+
assert_equal(Send.construct_xml('1234567890', 'https://localhost/something', OPTIONS), @http_request.body)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_sets_path
|
113
|
+
assert_equal(Request::BASE_PATH, @http_request.path)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'test-unit', '~> 2'
|
3
|
+
require 'test/unit'
|
4
|
+
gem 'mocha'
|
5
|
+
require 'mocha'
|
6
|
+
# require 'builder'
|
7
|
+
|
8
|
+
require File.join( File.dirname(__FILE__), '..','lib', 'fax_finder.rb')
|
9
|
+
|
10
|
+
class Class
|
11
|
+
def publicize_instance_methodss
|
12
|
+
saved_private_instance_methods = self.private_instance_methods
|
13
|
+
self.class_eval { public(*saved_private_instance_methods) }
|
14
|
+
yield
|
15
|
+
self.class_eval { private(*saved_private_instance_methods) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def publicize_class_methods
|
19
|
+
saved_private_class_methods = self.private_methods(false)
|
20
|
+
self.class_eval { public_class_method(*saved_private_class_methods) }
|
21
|
+
yield
|
22
|
+
self.class_eval { private_class_method(*saved_private_class_methods) }
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fax_finder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Erich L. Timkar
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-05-02 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: nokogiri
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - "="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 4
|
32
|
+
- 4
|
33
|
+
version: 1.4.4
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: builder
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 15
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 1
|
48
|
+
- 2
|
49
|
+
version: 2.1.2
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: test-unit
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 7
|
61
|
+
segments:
|
62
|
+
- 2
|
63
|
+
version: "2"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: mocha
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 25
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
- 9
|
78
|
+
version: "0.9"
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
description:
|
82
|
+
email: erich@hordesoftware.com
|
83
|
+
executables: []
|
84
|
+
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files:
|
88
|
+
- LICENSE
|
89
|
+
- README.rdoc
|
90
|
+
files:
|
91
|
+
- .project
|
92
|
+
- Changelog
|
93
|
+
- LICENSE
|
94
|
+
- README.rdoc
|
95
|
+
- Rakefile
|
96
|
+
- VERSION
|
97
|
+
- fax_finder.gemspec
|
98
|
+
- fax_finder.tmproj
|
99
|
+
- lib/fax_finder.rb
|
100
|
+
- lib/fax_finder/query.rb
|
101
|
+
- lib/fax_finder/request.rb
|
102
|
+
- lib/fax_finder/response.rb
|
103
|
+
- lib/fax_finder/send.rb
|
104
|
+
- test/fixtures/send_request_external.xml
|
105
|
+
- test/fixtures/send_request_inline.xml
|
106
|
+
- test/fixtures/send_response_success.xml
|
107
|
+
- test/query_test.rb
|
108
|
+
- test/request_test.rb
|
109
|
+
- test/response_test.rb
|
110
|
+
- test/send_test.rb
|
111
|
+
- test/test_helper.rb
|
112
|
+
homepage: http://github.com/erichhorde/fax_finder
|
113
|
+
licenses: []
|
114
|
+
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 3
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
version: "0"
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
hash: 3
|
135
|
+
segments:
|
136
|
+
- 0
|
137
|
+
version: "0"
|
138
|
+
requirements: []
|
139
|
+
|
140
|
+
rubyforge_project: fax_finder
|
141
|
+
rubygems_version: 1.7.2
|
142
|
+
signing_key:
|
143
|
+
specification_version: 3
|
144
|
+
summary: Provides support MultiTech's FaxFinder server
|
145
|
+
test_files: []
|
146
|
+
|