tourcms 0.1.2 → 0.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/Gemfile +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +11 -12
- data/VERSION +1 -1
- data/lib/tour_cms/connection.rb +19 -28
- data/lib/tour_cms/hash.rb +63 -6
- data/lib/tourcms.rb +2 -1
- data/tourcms.gemspec +6 -7
- metadata +19 -21
data/Gemfile
CHANGED
@@ -2,7 +2,7 @@ source "http://rubygems.org"
|
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
|
-
gem '
|
5
|
+
gem 'nokogiri'
|
6
6
|
|
7
7
|
# Add dependencies to develop your gem here.
|
8
8
|
# Include everything needed to run rake, tests, features, etc.
|
data/Gemfile.lock
CHANGED
@@ -6,10 +6,10 @@ GEM
|
|
6
6
|
bundler (~> 1.0.0)
|
7
7
|
git (>= 1.2.5)
|
8
8
|
rake
|
9
|
+
nokogiri (1.4.4)
|
9
10
|
rake (0.8.7)
|
10
11
|
rcov (0.9.9)
|
11
12
|
shoulda (2.11.3)
|
12
|
-
xml-object (0.9.93)
|
13
13
|
|
14
14
|
PLATFORMS
|
15
15
|
ruby
|
@@ -17,6 +17,6 @@ PLATFORMS
|
|
17
17
|
DEPENDENCIES
|
18
18
|
bundler (~> 1.0.0)
|
19
19
|
jeweler (~> 1.5.2)
|
20
|
+
nokogiri
|
20
21
|
rcov
|
21
22
|
shoulda
|
22
|
-
xml-object
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ Using the library is as simple as creating a **TourCMS::Connection** object:
|
|
12
12
|
|
13
13
|
conn = TourCMS::Connection.new(marketplace_id, private_key, result_type)
|
14
14
|
|
15
|
-
Your Marketplace ID and Private Key can be found in the TourCMS Partner Portal. The result type can be one of **
|
15
|
+
Your Marketplace ID and Private Key can be found in the TourCMS Partner Portal. The result type can be one of **hash** or **raw** where **raw** will return the raw XML from the API and **hash** will return a Ruby Hash of the result.
|
16
16
|
|
17
17
|
### Working with your connection in Raw mode
|
18
18
|
|
@@ -31,30 +31,29 @@ Your Marketplace ID and Private Key can be found in the TourCMS Partner Portal.
|
|
31
31
|
=> ""<?xml version="1.0" encoding="utf-8" ?><response><request>GET /p/channels/list.xml</request>
|
32
32
|
<error>OK</error><channel>(...)</channel></response>"
|
33
33
|
|
34
|
-
### Working with your connection in
|
34
|
+
### Working with your connection in Hash mode
|
35
35
|
|
36
36
|
# Instantiate the connection
|
37
|
-
conn = TourCMS::Connection.new("12345", "mydeepsecret", "
|
37
|
+
conn = TourCMS::Connection.new("12345", "mydeepsecret", "hash")
|
38
38
|
# Check we're working
|
39
39
|
obj = conn.api_rate_limit_status
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
obj.hourly_limit
|
40
|
+
=> {:request=>"GET /api/rate_limit_status.xml", :remaining_hits=>1999, :error=>"OK", :hourly_limit=>2000}
|
41
|
+
obj[:hourly_limit]
|
44
42
|
=> 2000
|
45
43
|
# List the channels we have access to
|
46
44
|
obj = conn.list_channels
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
=> {Hash of all connected TourCMS channels and their properties}
|
46
|
+
obj[:channel].count
|
47
|
+
=> 100 # Integer representing how many TourCMS channels you're connected to.
|
48
|
+
obj[:channel].first[:channel_name]
|
50
49
|
=> "My Adventure Tour Operator"
|
51
50
|
# Show a particular channel
|
52
51
|
obj = conn.show_channel(1234567)
|
53
|
-
obj
|
52
|
+
obj[:channel][:channel_id]
|
54
53
|
=> "1234567"
|
55
54
|
# Search for all tours in GB
|
56
55
|
obj = conn.search_tours(:country => "GB")
|
57
|
-
obj
|
56
|
+
obj[:tour].first[:tour_name]
|
58
57
|
=> "Canyoning"
|
59
58
|
|
60
59
|
### Passing parameters
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/tour_cms/connection.rb
CHANGED
@@ -9,67 +9,67 @@ module TourCMS
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def api_rate_limit_status(channel = 0)
|
12
|
-
|
12
|
+
request("/api/rate_limit_status.xml", channel)
|
13
13
|
end
|
14
14
|
|
15
15
|
def list_channels
|
16
|
-
|
16
|
+
request("/p/channels/list.xml")
|
17
17
|
end
|
18
18
|
|
19
19
|
def show_channel(channel)
|
20
|
-
|
20
|
+
request("/c/channel/show.xml", channel)
|
21
21
|
end
|
22
22
|
|
23
23
|
def search_tours(params = {}, channel = 0)
|
24
24
|
if channel == 0
|
25
|
-
|
25
|
+
request("/p/tours/search.xml", 0, params)
|
26
26
|
else
|
27
|
-
|
27
|
+
request("/c/tours/search.xml", channel, params)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
def search_hotels_range(params = {}, tour = "", channel = 0)
|
32
32
|
if channel == 0
|
33
|
-
|
33
|
+
request("/p/hotels/search_range.xml", 0, params.merge({"single_tour_id" => tour}))
|
34
34
|
else
|
35
|
-
|
35
|
+
request("/c/hotels/search_range.xml", channel, params.merge({"single_tour_id" => tour}))
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def search_hotels_specific(params = {}, tour = "", channel = 0)
|
40
40
|
if channel == 0
|
41
|
-
|
41
|
+
request("/p/hotels/search-avail.xml", 0, params.merge({"single_tour_id" => tour}))
|
42
42
|
else
|
43
|
-
|
43
|
+
request("/c/hotels/search-avail.xml", channel, params.merge({"single_tour_id" => tour}))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
def list_tours(channel = 0)
|
48
48
|
if channel == 0
|
49
|
-
|
49
|
+
request("/p/tours/list.xml")
|
50
50
|
else
|
51
|
-
|
51
|
+
request("/c/tours/list.xml", channel)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
def list_tour_images(channel = 0)
|
56
56
|
if channel == 0
|
57
|
-
|
57
|
+
request("/p/tours/images/list.xml")
|
58
58
|
else
|
59
|
-
|
59
|
+
request("/c/tours/images/list.xml", channel)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
def show_tour(tour, channel)
|
64
|
-
|
64
|
+
request("/c/tour/show.xml", channel, {"id" => tour})
|
65
65
|
end
|
66
66
|
|
67
67
|
def show_tour_departures(tour, channel)
|
68
|
-
|
68
|
+
request("/c/tour/datesprices/dep/show.xml", channel, {"id" => tour})
|
69
69
|
end
|
70
70
|
|
71
71
|
def show_tour_freesale(tour, channel)
|
72
|
-
|
72
|
+
request("/c/tour/datesprices/freesale/show.xml", channel, {"id" => tour})
|
73
73
|
end
|
74
74
|
|
75
75
|
private
|
@@ -86,7 +86,7 @@ module TourCMS
|
|
86
86
|
if param_hash.empty?
|
87
87
|
res = ""
|
88
88
|
else
|
89
|
-
qs = param_hash.
|
89
|
+
qs = param_hash.stringify.reject{|k,v| v.nil? || v.empty?}.collect{|k,v|"#{CGI.escape(k)}=#{CGI.escape(v)}"}.join("&")
|
90
90
|
qs.empty? ? res = "" : res = "?#{qs}"
|
91
91
|
end
|
92
92
|
res
|
@@ -107,17 +107,8 @@ module TourCMS
|
|
107
107
|
|
108
108
|
headers = {"Content-type" => "text/xml", "charset" => "utf-8", "Date" => req_time.strftime("%a, %d %b %Y %H:%M:%S GMT"),
|
109
109
|
"Authorization" => "TourCMS #{channel}:#{@marketp_id}:#{signature}" }
|
110
|
-
|
111
|
-
|
112
|
-
response = open(url, headers).read
|
113
|
-
rescue Exception => e
|
114
|
-
puts "Caught exception opening #{url}"
|
115
|
-
puts e.message
|
116
|
-
puts e.backtrace.inspect
|
117
|
-
rescue OpenURI::HTTPError => http_e
|
118
|
-
puts "Received HTTP Error opening #{url}"
|
119
|
-
puts http_e.io.status[0].to_s
|
120
|
-
end
|
110
|
+
|
111
|
+
@result_type == "raw" ? open(url, headers) : doc = Hash.from_xml(open(url, headers))[:response]
|
121
112
|
end
|
122
113
|
end
|
123
114
|
end
|
data/lib/tour_cms/hash.rb
CHANGED
@@ -1,10 +1,67 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
class Hash
|
2
|
+
def stringify
|
3
|
+
inject({}) do |options, (key, value)|
|
4
|
+
options[key.to_s] = value.to_s
|
5
|
+
options
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def from_xml(xml_io)
|
11
|
+
begin
|
12
|
+
result = Nokogiri::XML(xml_io)
|
13
|
+
return { result.root.name.to_sym => xml_node_to_hash(result.root)}
|
14
|
+
rescue Exception => e
|
15
|
+
raise StandardError, "Could not parse TourCMS XML Response. Server error?"
|
7
16
|
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def xml_node_to_hash(node)
|
20
|
+
# If we are at the root of the document, start the hash
|
21
|
+
if node.element?
|
22
|
+
result_hash = {}
|
23
|
+
if node.attributes != {}
|
24
|
+
result_hash[:attributes] = {}
|
25
|
+
node.attributes.keys.each do |key|
|
26
|
+
result_hash[:attributes][node.attributes[key].name.to_sym] = prepare(node.attributes[key].value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if node.children.size > 0
|
30
|
+
node.children.each do |child|
|
31
|
+
result = xml_node_to_hash(child)
|
32
|
+
|
33
|
+
if child.name == "text" || child.name == "#cdata-section"
|
34
|
+
unless child.next_sibling || child.previous_sibling
|
35
|
+
return prepare(result)
|
36
|
+
end
|
37
|
+
elsif result_hash[child.name.to_sym]
|
38
|
+
if result_hash[child.name.to_sym].is_a?(Object::Array)
|
39
|
+
result_hash[child.name.to_sym] << prepare(result)
|
40
|
+
else
|
41
|
+
result_hash[child.name.to_sym] = [result_hash[child.name.to_sym]] << prepare(result)
|
42
|
+
end
|
43
|
+
else
|
44
|
+
result_hash[child.name.to_sym] = prepare(result)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
return result_hash
|
49
|
+
else
|
50
|
+
return result_hash
|
51
|
+
end
|
52
|
+
else
|
53
|
+
return prepare(node.content.to_s)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def prepare(data)
|
58
|
+
data = "" if data == "\n\t"
|
59
|
+
(data.class == String && data.to_i.to_s == data) ? data.to_i : data
|
8
60
|
end
|
9
61
|
end
|
62
|
+
|
63
|
+
def to_struct(struct_name)
|
64
|
+
Struct.new(struct_name,*keys).new(*values)
|
65
|
+
end
|
66
|
+
|
10
67
|
end
|
data/lib/tourcms.rb
CHANGED
data/tourcms.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{tourcms}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.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 = ["Alex Kremer"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-04-19}
|
13
13
|
s.description = %q{A simple Ruby wrapper for interacting with the TourCMS API}
|
14
14
|
s.email = %q{alex@flextrip.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.homepage = %q{http://github.com/flextrip/tourcms}
|
34
34
|
s.licenses = ["MIT"]
|
35
35
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version = %q{1.
|
36
|
+
s.rubygems_version = %q{1.7.2}
|
37
37
|
s.summary = %q{A Ruby Library for the TourCMS API}
|
38
38
|
s.test_files = [
|
39
39
|
"test/helper.rb",
|
@@ -41,18 +41,17 @@ Gem::Specification.new do |s|
|
|
41
41
|
]
|
42
42
|
|
43
43
|
if s.respond_to? :specification_version then
|
44
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
44
|
s.specification_version = 3
|
46
45
|
|
47
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
-
s.add_runtime_dependency(%q<
|
47
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
49
48
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
49
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
50
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
52
51
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
53
52
|
s.add_runtime_dependency(%q<xml-object>, [">= 0"])
|
54
53
|
else
|
55
|
-
s.add_dependency(%q<
|
54
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
56
55
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
57
56
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
58
57
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -60,7 +59,7 @@ Gem::Specification.new do |s|
|
|
60
59
|
s.add_dependency(%q<xml-object>, [">= 0"])
|
61
60
|
end
|
62
61
|
else
|
63
|
-
s.add_dependency(%q<
|
62
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
64
63
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
65
64
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
66
65
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tourcms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 1
|
9
8
|
- 2
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alex Kremer
|
@@ -15,10 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-04-19 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
type: :runtime
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
23
|
none: false
|
24
24
|
requirements:
|
@@ -28,11 +28,11 @@ dependencies:
|
|
28
28
|
segments:
|
29
29
|
- 0
|
30
30
|
version: "0"
|
31
|
-
type: :runtime
|
32
|
-
name: xml-object
|
33
|
-
prerelease: false
|
34
31
|
version_requirements: *id001
|
32
|
+
name: nokogiri
|
33
|
+
prerelease: false
|
35
34
|
- !ruby/object:Gem::Dependency
|
35
|
+
type: :development
|
36
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
37
|
none: false
|
38
38
|
requirements:
|
@@ -42,11 +42,11 @@ dependencies:
|
|
42
42
|
segments:
|
43
43
|
- 0
|
44
44
|
version: "0"
|
45
|
-
|
45
|
+
version_requirements: *id002
|
46
46
|
name: shoulda
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *id002
|
49
48
|
- !ruby/object:Gem::Dependency
|
49
|
+
type: :development
|
50
50
|
requirement: &id003 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
@@ -58,11 +58,11 @@ dependencies:
|
|
58
58
|
- 0
|
59
59
|
- 0
|
60
60
|
version: 1.0.0
|
61
|
-
|
61
|
+
version_requirements: *id003
|
62
62
|
name: bundler
|
63
63
|
prerelease: false
|
64
|
-
version_requirements: *id003
|
65
64
|
- !ruby/object:Gem::Dependency
|
65
|
+
type: :development
|
66
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
68
68
|
requirements:
|
@@ -74,11 +74,11 @@ dependencies:
|
|
74
74
|
- 5
|
75
75
|
- 2
|
76
76
|
version: 1.5.2
|
77
|
-
|
77
|
+
version_requirements: *id004
|
78
78
|
name: jeweler
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *id004
|
81
80
|
- !ruby/object:Gem::Dependency
|
81
|
+
type: :development
|
82
82
|
requirement: &id005 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
@@ -88,11 +88,11 @@ dependencies:
|
|
88
88
|
segments:
|
89
89
|
- 0
|
90
90
|
version: "0"
|
91
|
-
|
91
|
+
version_requirements: *id005
|
92
92
|
name: rcov
|
93
93
|
prerelease: false
|
94
|
-
version_requirements: *id005
|
95
94
|
- !ruby/object:Gem::Dependency
|
95
|
+
type: :runtime
|
96
96
|
requirement: &id006 !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
@@ -102,10 +102,9 @@ dependencies:
|
|
102
102
|
segments:
|
103
103
|
- 0
|
104
104
|
version: "0"
|
105
|
-
|
105
|
+
version_requirements: *id006
|
106
106
|
name: xml-object
|
107
107
|
prerelease: false
|
108
|
-
version_requirements: *id006
|
109
108
|
description: A simple Ruby wrapper for interacting with the TourCMS API
|
110
109
|
email: alex@flextrip.com
|
111
110
|
executables: []
|
@@ -128,7 +127,6 @@ files:
|
|
128
127
|
- test/helper.rb
|
129
128
|
- test/test_tourcms.rb
|
130
129
|
- tourcms.gemspec
|
131
|
-
has_rdoc: true
|
132
130
|
homepage: http://github.com/flextrip/tourcms
|
133
131
|
licenses:
|
134
132
|
- MIT
|
@@ -158,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
156
|
requirements: []
|
159
157
|
|
160
158
|
rubyforge_project:
|
161
|
-
rubygems_version: 1.
|
159
|
+
rubygems_version: 1.7.2
|
162
160
|
signing_key:
|
163
161
|
specification_version: 3
|
164
162
|
summary: A Ruby Library for the TourCMS API
|