<commit_before>module TextMagic

  class API

    extend Charset
    extend Validation

    # Creates new API instance with specified credentials. These will be
    # used in all requests to the TextMagic's HTTP gateway done through
    # this instance. Multiple instances with different credentials can
    # be used at the same time.
    #
    # Example usage:
    #
    #  api = TextMagic::API.new('fred', 'secret')
    def initialize(username, password)
      @username = username
      @password = password
    end

    # Executes an account command and returns a hash with account's balance
    # if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # Example usage:
    #
    #  api.account
    #  # => { 'balance' => 314.15 }
    #
    # Using custom reader:
    #
    #  api.account.balance
    #  # => 314.15
    def account
      response = Executor.execute('account', @username, @password)
      response.extend(TextMagic::API::Response::Account)
    end

    # Executes a send command and returns a hash with message ids, sent text and
    # number of parts if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of phone numbers and an additional
    # options hash.
    #
    # The optional parameters you can specify in the options hash are:
    # * +unicode+: accepted values are true, false, 0 and 1
    # * +max_length+: accepted values are nil, 1, 2 and 3, defaults to nil
    # If not specified, the method will determine the unicode value based on the
    # characters in the text.
    #
    # Example usage:
    #
    #  api.send('Hi Vilma', '999314159265')
    #  # => { 'message_ids' => [141421], 'message_id_hash' => { '999314159265' => '141421' }, 'sent_text' => '<NAME>', 'parts_count' => 1 }
    #  api.send(text, phone, :unicode => true)
    #  api.send(text, phone1, phone2, :max_length => 2)
    #  api.send(text, [phone1, phone2])
    #
    # Using custom readers:
    #
    #  response = api.send('Hi Vilma', '999314159265', '999271828182')
    #  response.message_ids
    #  # => ['141421', '173205']
    #  response.message_id_hash
    #  # => { '999314159265' => '141421', '999271828182' => '173205' }
    #  response.message_id
    #  # => '141421'
    #  response.message_id('999271828182')
    #  # => '173205'
    #  response.parts_count
    #  # => 1
    def send(text, *args)
      raise Error.new(1, 'Message text is empty') if text.nil? || text.blank?
      options = args.last.is_a?(Hash) ? args.pop : {}
      unicode = API.is_unicode(text)
      options[:unicode] = case options[:unicode]
      when 1, true: 1
      when 0, false: 0
      when nil: unicode ? 1 : 0
      else raise Error.new(10, "Wrong parameter value #{options[:unicode]} for parameter unicode")
      end
      raise Error.new(6, 'Message contains invalid characters') if unicode && options[:unicode] == 0
      raise Error.new(7, 'Message too long') unless API.validate_text_length(text, unicode)
      phones = args.flatten
      raise Error.new(9, 'Invalid phone number format') unless API.validate_phones(phones)
      response = Executor.execute('send', @username, @password, options.merge(:text => text, :phone => phones.join(',')))
      response.extend(TextMagic::API::Response::Send)
      response
    end

    # Executes a message_status command and returns a hash with states of
    # messages for specified ids if successful, otherwise it raises a
    # TextMagic::API::Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of ids specified as an array
    # or as a list of arguments
    #
    # Example usage:
    #
    #  api.message_status('141421')
    #  # => { '141421' => { 'text' => 'Hi Vilma', 'status' => 'd' , 'created_time' => Mon May 25 16:42:30 +0200 2009, 'reply_number' => '447624800500', 'completed_time' => nil, 'credits_cost' => 0.5 } }
    #  api.message_status('141421', '173205')
    #  api.message_status(['141421', '173205'])
    #
    # Using custom readers:
    #
    #  response = api.message_status('141421', '173205')
    #  response['141421'].text
    #  # => 'Hi Vilma'
    #  response['141421'].status
    #  # => 'd'
    #  response['141421'].created_time
    #  # => Fri May 22 10:10:18 +0200 2009
    def message_status(*ids)
      single = ids.size == 1 && ids.first.is_a?(String)
      ids.flatten!
      raise TextMagic::API::Error.new(4, 'Insufficient parameters') if ids.empty?
      response = Executor.execute('message_status', @username, @password, :ids => ids.join(','))
      response.extend(TextMagic::API::Response::MessageStatus)
      single ? response[ids.first] : response
    end

    # Executes a receive command and returns a hash with unread messages
    # if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts an optional +last_retrieved_id+ value.
    #
    # Example usage:
    #
    #  api.receive
    #  # => { 'messages' => [{ 'message_id' => '141421', 'from' => '999314159265', 'timestamp' => Fri May 22 12:12:55 +0200 2009, 'text' => 'Hi Fred!' }], 'unread' => 0 }
    #  api.receive '141421'
    #
    # Using custom readers:
    #
    #  response = api.receive
    #  response.messages
    #  # => [{ 'timestamp' => Fri May 22 12:12:55 +0200 2009, 'from' => '999314159265', 'text' => 'Hi Fred', 'message_id' => '141421' }]
    #  response.unread
    #  # => 0
    #  response.messages[0].timestamp
    #  # => Fri May 22 12:12:55 +0200 2009
    def receive(last_retrieved_id = nil)
      response = Executor.execute('receive', @username, @password, :last_retrieved_id => last_retrieved_id)
      response.extend(TextMagic::API::Response::Receive)
    end

    # Executes a delete_reply command and returns a hash with a list of deleted
    # message ids if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of ids specified as an array
    # or as a list of arguments.
    #
    # Example usage:
    #
    #  api.delete_reply('141421')
    #  # => { 'deleted' => ['141421'] }
    #  api.delete_reply('141421', '173205')
    #  api.delete_reply(['141421', '173205'])
    #
    # Using custom readers:
    #
    #  response = api.delete_reply('141421', '173205')
    #  response.deleted
    #  # => ['141421', '173205']
    def delete_reply(*ids)
      ids.flatten!
      raise TextMagic::API::Error.new(4, 'Insufficient parameters') if ids.empty?
      response = Executor.execute('delete_reply', @username, @password, :ids => ids.join(','))
      response.extend(TextMagic::API::Response::DeleteReply)
    end
  end
end
<commit_msg>updated rdoc comment<commit_after>module TextMagic

  class API

    extend Charset
    extend Validation

    # Creates new API instance with specified credentials. These will be
    # used in all requests to the TextMagic's HTTP gateway done through
    # this instance. Multiple instances with different credentials can
    # be used at the same time.
    #
    # Example usage:
    #
    #  api = TextMagic::API.new('fred', 'secret')
    def initialize(username, password)
      @username = username
      @password = password
    end

    # Executes an account command and returns a hash with account's balance
    # if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # Example usage:
    #
    #  api.account
    #  # => { 'balance' => 314.15 }
    #
    # Using custom reader:
    #
    #  api.account.balance
    #  # => 314.15
    def account
      response = Executor.execute('account', @username, @password)
      response.extend(TextMagic::API::Response::Account)
    end

    # Executes a send command and returns a hash with message ids, sent text and
    # number of parts if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of phone numbers and an additional
    # options hash.
    #
    # The optional parameters you can specify in the options hash are:
    # * +unicode+: accepted values are true, false, 0 and 1
    # * +max_length+: accepted values are nil, 1, 2 and 3, defaults to nil
    # If not specified, the method will determine the unicode value based on the
    # characters in the text.
    #
    # Example usage:
    #
    #  api.send('Hi Vilma', '999314159265')
    #  # => { 'message_ids' => [141421], 'message_id_hash' => { '999314159265' => '141421' }, 'sent_text' => 'Hi Vilma', 'parts_count' => 1 }
    #  api.send(text, phone, :unicode => true)
    #  api.send(text, phone1, phone2, :max_length => 2)
    #  api.send(text, [phone1, phone2])
    #
    # Using custom readers:
    #
    #  response = api.send('Hi Vilma', '999314159265', '999271828182')
    #  response.message_ids
    #  # => ['141421', '173205']
    #  response['999314159265']
    #  # => '141421'
    #  response.parts_count
    #  # => 1
    def send(text, *args)
      raise Error.new(1, 'Message text is empty') if text.nil? || text.blank?
      options = args.last.is_a?(Hash) ? args.pop : {}
      unicode = API.is_unicode(text)
      options[:unicode] = case options[:unicode]
      when 1, true: 1
      when 0, false: 0
      when nil: unicode ? 1 : 0
      else raise Error.new(10, "Wrong parameter value #{options[:unicode]} for parameter unicode")
      end
      raise Error.new(6, 'Message contains invalid characters') if unicode && options[:unicode] == 0
      raise Error.new(7, 'Message too long') unless API.validate_text_length(text, unicode)
      phones = args.flatten
      raise Error.new(9, 'Invalid phone number format') unless API.validate_phones(phones)
      response = Executor.execute('send', @username, @password, options.merge(:text => text, :phone => phones.join(',')))
      response.extend(TextMagic::API::Response::Send)
      response
    end

    # Executes a message_status command and returns a hash with states of
    # messages for specified ids if successful, otherwise it raises a
    # TextMagic::API::Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of ids specified as an array
    # or as a list of arguments
    #
    # Example usage:
    #
    #  api.message_status('141421')
    #  # => { '141421' => { 'text' => 'Hi Vilma', 'status' => 'd' , 'created_time' => Mon May 25 16:42:30 +0200 2009, 'reply_number' => '447624800500', 'completed_time' => nil, 'credits_cost' => 0.5 } }
    #  api.message_status('141421', '173205')
    #  api.message_status(['141421', '173205'])
    #
    # Using custom readers:
    #
    #  response = api.message_status('141421', '173205')
    #  response['141421'].text
    #  # => 'Hi Vilma'
    #  response['141421'].status
    #  # => 'd'
    #  response['141421'].created_time
    #  # => Fri May 22 10:10:18 +0200 2009
    def message_status(*ids)
      single = ids.size == 1 && ids.first.is_a?(String)
      ids.flatten!
      raise TextMagic::API::Error.new(4, 'Insufficient parameters') if ids.empty?
      response = Executor.execute('message_status', @username, @password, :ids => ids.join(','))
      response.extend(TextMagic::API::Response::MessageStatus)
      single ? response[ids.first] : response
    end

    # Executes a receive command and returns a hash with unread messages
    # if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts an optional +last_retrieved_id+ value.
    #
    # Example usage:
    #
    #  api.receive
    #  # => { 'messages' => [{ 'message_id' => '141421', 'from' => '999314159265', 'timestamp' => Fri May 22 12:12:55 +0200 2009, 'text' => 'Hi Fred!' }], 'unread' => 0 }
    #  api.receive '141421'
    #
    # Using custom readers:
    #
    #  response = api.receive
    #  response.messages
    #  # => [{ 'timestamp' => Fri May 22 12:12:55 +0200 2009, 'from' => '999314159265', 'text' => 'Hi Fred', 'message_id' => '141421' }]
    #  response.unread
    #  # => 0
    #  response.messages[0].timestamp
    #  # => Fri May 22 12:12:55 +0200 2009
    def receive(last_retrieved_id = nil)
      response = Executor.execute('receive', @username, @password, :last_retrieved_id => last_retrieved_id)
      response.extend(TextMagic::API::Response::Receive)
    end

    # Executes a delete_reply command and returns a hash with a list of deleted
    # message ids if successful, otherwise it raises an Error.
    # The returned hash will be extended with custom reader method defined
    # in Response module.
    #
    # This method accepts any positive number of ids specified as an array
    # or as a list of arguments.
    #
    # Example usage:
    #
    #  api.delete_reply('141421')
    #  # => { 'deleted' => ['141421'] }
    #  api.delete_reply('141421', '173205')
    #  api.delete_reply(['141421', '173205'])
    #
    # Using custom readers:
    #
    #  response = api.delete_reply('141421', '173205')
    #  response.deleted
    #  # => ['141421', '173205']
    def delete_reply(*ids)
      ids.flatten!
      raise TextMagic::API::Error.new(4, 'Insufficient parameters') if ids.empty?
      response = Executor.execute('delete_reply', @username, @password, :ids => ids.join(','))
      response.extend(TextMagic::API::Response::DeleteReply)
    end
  end
end

{'fraction_non_alphanumeric': 0.12719581271958127, 'fraction_numerical': 0.0593676059367606, 'mean_word_length': 2.9290140845070423, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 102, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3126722', 'n_tokens_mistral': 4872, 'n_tokens_neox': 4267, 'n_words': 1300}