class NwmlsClient::Listing
Constants
- AMENITY_FILE
- DEFAULT_PTYP
- DEFAULT_SCHEMA_NAME
- MLS
Attributes
criteria[RW]
mls[RW]
password[RW]
schema_name[RW]
user_id[RW]
Public Class Methods
new(config, criteria = {})
click to toggle source
# File lib/nwmls_client/listing.rb, line 23 def initialize(config, criteria = {}) raise "Configuration data is required for authentication" if config.nil? @user_id = config.fetch("user_id") @password = config.fetch("password") @mls = config.fetch("mls") @schema_name = config.fetch("schema") @criteria = criteria @criteria[:property_type] ||= :residential @criteria[:begin_date] ||= DateTime.now-1 @criteria[:end_date] ||= DateTime.now end
Public Instance Methods
display(listing_data)
click to toggle source
# File lib/nwmls_client/listing.rb, line 59 def display(listing_data) raise "No listing data to display" if listing_data.nil? amenity_file = File.join(File.dirname(__FILE__), AMENITY_FILE) if not File.exist?(amenity_file) puts "Required file not found: #{amenity_file}" return end begin amenity = YAML.load_file(amenity_file) rescue Exception puts "Failed to load file (#{AMENITY_FILE}): #{$!}" return end # TODO: Is there a way to load the listing data and replace both # Codes and Amenities with the friendly names using regular expressions? # Check if there is a list of items to display # or only one if listing_data.is_a?(Array) listing_data.each do |item| item.each do |key, value| items = [] code = key.to_s.upcase friendly_name = NwmlsClient::Codes.expand_code(code) if amenity[code] && value amenities = value.split('|') amenities.each do |am| items << "#{amenity[code][am]}" end puts "#{friendly_name}: #{items.join(", ")}" else puts "#{friendly_name}: #{value}" end end puts "\n" end else listing_data.each do |key, value| if value != nil items = [] code = key.to_s.upcase friendly_name = NwmlsClient::Codes.expand_code(code) if amenity[code] amenities = value.split('|') amenities.each do |am| items << "#{amenity[code][am]}" end puts "#{friendly_name}: #{items.join(', ')}" else puts "#{friendly_name}: #{value}" end end end end end
retrieve_data()
click to toggle source
# File lib/nwmls_client/listing.rb, line 35 def retrieve_data() operation = ( @criteria[:operation] || :retrieve_listing_data ) data_response = ( @criteria[:data_response] || :retrieve_listing_data_response ) data_result = ( @criteria[:data_result] || :retrieve_listing_data_result ) data_types = ( @criteria[:data_types] || :listings ) data_type = ( @criteria[:data_type] || @criteria[:property_type] ) request = { 'v_strXmlQuery' => build_request()} @client = create_client() response = @client.call(operation, message: request) cdata = response.body[data_response][data_result] nori_options = { :convert_tags_to => lambda { |tag| tag.snakecase.to_sym } } result = Nori.new(nori_options).parse(cdata) raise "No listing data found:\n#{result}" if result[data_types][data_type].nil? listing_data = result[data_types][data_type] end
Private Instance Methods
build_request()
click to toggle source
# File lib/nwmls_client/listing.rb, line 140 def build_request() xm = Builder::XmlMarkup.new #Generate query to obtain data from Evernet web service xm.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8", :standalone=>"no" xm.EverNetQuerySpecification(:xmlns => "urn:www.nwmls.com/Schemas/General/EverNetQueryXML.xsd") { xm.Message { xm.Head { xm.UserId user_id xm.Password password xm.SchemaName (schema_name || DEFAULT_SCHEMA_NAME) } xm.Body { xm.Query { xm.MLS (mls || MLS) if @criteria[:listing_number] xm.ListingNumber @criteria[:listing_number] if @criteria[:listing_number] xm.PropertyType (@criteria[:property_code] || DEFAULT_PTYP) else xm.PropertyType (@criteria[:property_code] || DEFAULT_PTYP) xm.Status @criteria[:status] if @criteria[:status] xm.County @criteria[:county] if @criteria[:county] xm.Area @criteria[:area] if @criteria[:area] xm.City @criteria[:city] if @criteria[:city] xm.BeginDate @criteria[:begin_date] xm.EndDate @criteria[:end_date] xm.OfficeId @criteria[:office_id] if @criteria[:office_id] xm.AgentId @criteria[:agent_id] if @criteria[:agent_id] xm.Bedrooms @criteria[:bedrooms] if @criteria[:bedrooms] xm.Bathrooms @criteria[:bathrooms] if @criteria[:bathrooms] end } xm.Filter @criteria[:filters].join(',') if @criteria[:filters] } } } end
create_client()
click to toggle source
# File lib/nwmls_client/listing.rb, line 128 def create_client() @client = Savon.client( wsdl: "http://evernet.nwmls.com/evernetqueryservice/evernetquery.asmx?wsdl" #log_level: :debug, # can be: :debug, warn, :error, :fatal, :info #log: true, #open_timeout: 10, #read_timeout: 60 ) end