lib/response.rb in textmagic-0.2.2 vs lib/response.rb in textmagic-0.3.0

- old
+ new

@@ -1,142 +1,65 @@ +require 'ostruct' + module TextMagic class API - # Used to cleanup response hash and extend it with custom reader methods. - # - # === Account response hash - # - # When extended, it - # * converts the +balance+ value to +float+ and - # * adds a reader method +balance+. - # - # === Send response hash - # - # When extended, it - # * inverts the +message_id+ hash and puts it in +message_id_hash+, - # * adds an array of ids to +message_ids+, - # * adds reader methods +message_id_hash+, +message_ids+, +sent_text+ and - # +parts_count+ to the hash. - # * adds a reader method +message_id+, which returns a +message_id+ for - # a given phone number, or the first message_id if no phone number - # is specified. - # - # === Message status response hash - # - # When extended, it - # * converts the +credits_cost+ value to +float+, - # * converts the +created_time+ and +completed_time+ values to +Time+, - # * adds reader methods +text+, +status+, +reply_number+, +credits_cost+, - # +created_time+ and +completed_time+ to all values of the hash. - # - # === Receive status response hash - # - # When extended, it - # * converts the +timestamp+ value to +Time+, - # * adds reader methods +messages+ and +unread+ to the hash - # * adds reader methods +message_id+, +timestamp+, +text+ and +from+ - # to all members of the +messages+ array. - # - # === Delete reply response hash - # - # When extended, it - # * adds a reader method +deleted+. - module Response + class Response - module Account #:nodoc: all - - def self.extended(base) - return unless base.is_a?(Hash) - base['balance'] = base['balance'].to_f if base['balance'] - end - - def balance - self['balance'] - end + def self.account(hash) + response = OpenStruct.new(hash) + response.balance = response.balance.to_f + response end - module Send #:nodoc: all - - def self.extended(base) - return unless base.is_a?(Hash) && base['message_id'] - base['message_ids'] = base['message_id'].keys.sort - base.merge! base.delete('message_id').invert + def self.send(hash, single) + response = nil + if single + response = hash['message_id'].keys.first.dup + else + response = hash['message_id'].invert end - - %w(message_ids sent_text parts_count).each do |method| - module_eval <<-EOS - def #{method} - self['#{method}'] - end - EOS - end - - def message_id(phone = nil) - phone ? self[phone] : self['message_ids'].first - end + metaclass = class << response; self; end + metaclass.send :attr_accessor, :sent_text, :parts_count, :message_id + response.sent_text = hash['sent_text'] + response.parts_count = hash['parts_count'] + response.message_id = hash['message_id'] + response end - module MessageStatus #:nodoc: all - - def self.extended(base) - return unless base.is_a?(Hash) - base.values.each do |status| - status['credits_cost'] = status['credits_cost'].to_f if status['credits_cost'] - status['created_time'] = Time.at(status['created_time'].to_i) if status['created_time'] - status['completed_time'] = Time.at(status['completed_time'].to_i) if status['completed_time'] - status.extend Status - end + def self.message_status(hash, single) + response = {} + hash.each do |message_id, message_hash| + status = message_hash['status'].dup + metaclass = class << status; self; end + metaclass.send :attr_accessor, :text, :credits_cost, :reply_number, :message_status, :created_time, :completed_time + status.text = message_hash['text'] + status.credits_cost = message_hash['credits_cost'] + status.reply_number = message_hash['reply_number'] + status.message_status = message_hash['message_status'] + status.created_time = Time.at(message_hash['created_time'].to_i) if message_hash['created_time'] + status.completed_time = Time.at(message_hash['completed_time'].to_i) if message_hash['completed_time'] + response[message_id] = status end - - module Status - - %w(text status reply_number credits_cost created_time completed_time).each do |method| - module_eval <<-EOS - def #{method} - self['#{method}'] - end - EOS - end - end + single ? response.values.first : response end - module Receive #:nodoc: all - - def self.extended(base) - return unless base.is_a?(Hash) && base['messages'] - base['message_ids'] = base['messages'].collect { |message| message['message_id'] }.sort - base['messages'].each do |message| - message['timestamp'] = Time.at(message['timestamp'].to_i) if message['timestamp'] - message.extend Message - end + def self.receive(hash) + response = hash['messages'].collect do |message_hash| + message = "#{message_hash['from']}: #{message_hash['text']}" + metaclass = class << message; self; end + metaclass.send :attr_accessor, :timestamp, :message_id, :text, :from + message.text = message_hash['text'] + message.from = message_hash['from'] + message.message_id = message_hash['message_id'] + message.timestamp = Time.at(message_hash['timestamp'].to_i) + message end - - %w(messages message_ids unread).each do |method| - module_eval <<-EOS, __FILE__, __LINE__ + 1 - def #{method} - self['#{method}'] - end - EOS - end - - module Message - - %w(message_id timestamp text from).each do |method| - module_eval <<-EOS - def #{method} - self['#{method}'] - end - EOS - end - end - end - - module DeleteReply #:nodoc: all - - def deleted - self['deleted'] - end + metaclass = class << response; self; end + metaclass.send :attr_accessor, :unread + response.unread = hash['unread'] + response end end end end