|
# Here is an example using APISmith https://github.com/filtersquad/api_smith |
|
# It could be simpler, especially with RateInfoList and RoomGroup |
|
# that are useless intermediate data structures |
|
|
|
# I'm not sure about the custom transformers for Date, Boolean and BigDecimal |
|
# it seems a bit weird to do this but it works. |
|
|
|
require 'rubygems' |
|
require 'pathname' |
|
require 'bigdecimal' |
|
require 'multi_json' |
|
require 'money' |
|
require 'pry' |
|
|
|
require 'api_smith/smash.rb' |
|
|
|
module Mapping |
|
|
|
class DateParser |
|
def self.call(v) |
|
Date.strptime(v, '%d/%M/%Y') |
|
end |
|
end |
|
class BigDecimalParser |
|
def self.call(v) |
|
BigDecimal.new(v) |
|
end |
|
end |
|
class BooleanParser |
|
def self.call(v) |
|
true_values = %w[ 1 on t true y yes ].freeze |
|
false_values = %w[ 0 off f false n no ].freeze |
|
boolean_map = ::Hash[ true_values.product([ true ]) + false_values.product([ false ]) ].freeze |
|
|
|
case v |
|
when String |
|
boolean_map.fetch(v.downcase) |
|
when Numeric |
|
v > 0 |
|
else |
|
!!v |
|
end |
|
end |
|
end |
|
|
|
class Room < APISmith::Smash |
|
property :number_of_adults, :from => :numberOfAdults, :transformer => :to_i |
|
property :number_of_children, :from => :numberOfChildren, :transformer => :to_i |
|
end |
|
|
|
class PriceRateInfo < APISmith::Smash |
|
property :average_base_rate, :from => :@averageBaseRate, :transformer => BigDecimalParser |
|
property :average_rate, :from => :@averageRate, :transformer => BigDecimalParser |
|
property :commissionable_usd_total, :from => :@commissionableUsdTotal, :transformer => BigDecimalParser |
|
property :currency_code, :from => :@currencyCode |
|
property :max_nightly_rate, :from => :@maxNightlyRate, :transformer => BigDecimalParser |
|
property :nightly_rate_total, :from => :@nightlyRateTotal, :transformer => BigDecimalParser |
|
property :total, :from => :@total, :transformer => BigDecimalParser |
|
|
|
def price |
|
::Money.new(total * 100, currency_code) |
|
end |
|
end |
|
|
|
class RoomGroup < APISmith::Smash |
|
property :room, :from => :Room, :transformer => Room |
|
end |
|
|
|
class RateInfo < APISmith::Smash |
|
property :price_breakdown, :from => :@priceBreakdown, :transformer => BooleanParser |
|
property :promo, :from => :@promo, :transformer => BooleanParser |
|
property :rate_change, :from => :@rateChange, :transformer => BooleanParser |
|
property :rooms, :from => :RoomGroup, :transformer => RoomGroup |
|
property :chargeable_rate_info, :from => :ChargeableRateInfo, :transformer => PriceRateInfo |
|
property :converted_rate_info, :from => :ConvertedRateInfo, :transformer => PriceRateInfo |
|
end |
|
|
|
class RateInfoList < APISmith::Smash |
|
property :rate_info, :from => :RateInfo, :transformer => RateInfo |
|
end |
|
|
|
class Room < APISmith::Smash |
|
property :cancellation_policy, :from => :cancellationPolicy |
|
property :rate_code, :from => :rateCode, :transformer => :to_i |
|
property :room_type_code, :from => :roomTypeCode, :transformer => :to_i |
|
property :rate_description, :from => :rateDescription |
|
property :room_type_description, :from => :roomTypeDescription |
|
property :supplier_type, :from => :supplierType |
|
property :tax_rate, :from => :taxRate, :transformer => BigDecimalParser |
|
property :rate_change, :from => :rateChange, :transformer => BooleanParser |
|
property :non_refundable, :from => :nonRefundable, :transformer => BooleanParser |
|
property :guarantee_required, :from => :guaranteeRequired, :transformer => BooleanParser |
|
property :deposit_required, :from => :depositRequired, :transformer => BooleanParser |
|
property :immediate_charge_required, :from => :immediateChargeRequired, :transformer => BooleanParser |
|
property :current_allotment, :from => :currentAllotment, :transformer => :to_i |
|
property :promo_description, :from => :promoDescription |
|
property :smoking_preferences, :from => :smokingPreferences |
|
property :rate_occupancy_per_room, :from => :rateOccupancyPerRoom, :transformer => :to_i |
|
property :quoted_occupancy, :from => :quotedOccupancy, :transformer => :to_i |
|
property :min_guest_age, :from => :minGuestAge, :transformer => :to_i |
|
property :rate_infos, :from => :RateInfos, :transformer => RateInfoList |
|
end |
|
|
|
class HotelResponse < APISmith::Smash |
|
property :hotel_id, :from => :hotelId, :transformer => :to_i |
|
property :arrival_date, :from => :arrivalDate, :transformer => DateParser |
|
property :departure_date, :from => :departureDate, :transformer => DateParser |
|
property :rooms_count, :from => :numberOfRoomsRequested, :transformer => :to_i |
|
property :rate_key, :from => :rateKey |
|
property :rooms, :from => :HotelRoomResponse, :transformer => Room |
|
end |
|
|
|
end |
|
|
|
json = Pathname.new('/Users/jlecour/Desktop/data.json').read; |
|
data = MultiJson.load(json)["HotelRoomAvailabilityResponse"]; |
|
response = Mapping::HotelResponse.new(data) |
|
|
|
puts response.rooms[0].rate_infos.rate_info.chargeable_rate_info.price |
|
|
|
binding.pry |