lib/calais/client.rb in calais-0.0.5 vs lib/calais/client.rb in calais-0.0.6

- old
+ new

@@ -1,47 +1,110 @@ module Calais class Client - attr_accessor :license_id + # base attributes of the call attr_accessor :content - attr_accessor :content_type, :output_format - attr_accessor :allow_distribution, :allow_search, :submitter, :external_id + attr_accessor :license_id + + # processing directives + attr_accessor :content_type, :output_format, :reltag_base_url, :calculate_relevance, :omit_outputting_original_text + attr_accessor :metadata_enables, :metadata_discards + + # user directives + attr_accessor :allow_distribution, :allow_search, :external_id, :submitter + attr_accessor :external_metadata - + + attr_accessor :use_beta + def initialize(options={}, &block) options.each {|k,v| send("#{k}=", v)} yield(self) if block_given? end - - def call(method) - method = method.intern unless method.is_a?(Symbol) - raise ArgumentError.new("Unknown method: #{method}") unless AVAILABLE_METHODS.keys.include? method - + + def enlighten post_args = { "licenseID" => @license_id, "content" => Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "#{@content} ").first[0..-2], "paramsXML" => params_xml } - - url = URI.parse(POST_URL + AVAILABLE_METHODS[method]) - resp, data = Net::HTTP.post_form(url, post_args) - - return resp.is_a?(Net::HTTPOK) ? data : [data, "API Error: #{resp}"] + + @client ||= Curl::Easy.new + @client.url = @use_beta ? BETA_REST_ENDPOINT : REST_ENDPOINT + @client.timeout = HTTP_TIMEOUT + + post_fields = post_args.map {|k,v| Curl::PostField.content(k, v) } + + do_request(post_fields) end - + + def params_xml + check_params + + params_node = XML::Node.new('c:params') + params_node['xmlns:c'] = 'http://s.opencalais.com/1/pred/' + params_node['xmlns:rdf'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' + + processing_node = XML::Node.new('c:processingDirectives') + processing_node['c:contentType'] = AVAILABLE_CONTENT_TYPES[@content_type] if @content_type + processing_node['c:outputFormat'] = AVAILABLE_OUTPUT_FORMATS[@output_format] if @output_format + processing_node['c:reltagBaseURL'] = @reltag_base_url.to_s if @reltag_base_url + + processing_node['c:enableMetadataType'] = @metadata_enables.join(';') unless @metadata_enables.empty? + processing_node['c:discardMetadata'] = @metadata_discards.join(';') unless @metadata_discards.empty? + processing_node['c:omitOutputtingOriginalText'] = 'true' if @omit_outputting_original_text + + user_node = XML::Node.new('c:userDirectives') + user_node['c:allowDistribution'] = @allow_distribution.to_s unless @allow_distribution.nil? + user_node['c:allowSearch'] = @allow_search.to_s unless @allow_search.nil? + user_node['c:externalID'] = @external_id.to_s if @external_id + user_node['c:submitter'] = @submitter.to_s if @submitter + + params_node << processing_node + params_node << user_node + + if @external_metadata + external_node = XML::Node.new('c:externalMetadata') + external_node << @external_metadata + params_node << external_node + end + + params_node.to_s + end + private - def params_xml - content_type = @content_type && AVAILABLE_CONTENT_TYPES.keys.include?(@content_type) ? AVAILABLE_CONTENT_TYPES[@content_type] : AVAILABLE_CONTENT_TYPES[DEFAULT_CONTENT_TYPE] - output_format = @output_format && AVAILABLE_OUTPUT_FORMATS.keys.include?(@output_format) ? AVAILABLE_OUTPUT_FORMATS[@output_format] : AVAILABLE_OUTPUT_FORMATS[DEFAULT_OUTPUT_FORMAT] - allow_distribution = @allow_distribution ? "true" : "false" - allow_search = @allow_search ? "true" : "false" - submitter = @submitter || DEFAULT_SUBMITTER - external_id = @external_id || Digest::SHA1.hexdigest(@content.inspect) - external_metadata = @external_metadata || "" - - xml = %[<c:params xmlns:c="http://s.opencalais.com/1/pred/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">] - xml += %[<c:processingDirectives c:contentType="#{content_type}" c:outputFormat="#{output_format}"></c:processingDirectives>] - xml += %[<c:userDirectives c:allowDistribution="#{allow_distribution}" c:allowSearch="#{allow_search}" c:externalID="#{external_id}" c:submitter="#{submitter}"></c:userDirectives>] - xml += %[<c:externalMetadata>#{external_metadata}</c:externalMetadata>] - xml += %[</c:params>] + def check_params + raise 'missing content' if @content.nil? || @content.empty? + + content_length = @content.length + raise 'content is too small' if content_length < MIN_CONTENT_SIZE + raise 'content is too large' if content_length > MAX_CONTENT_SIZE + + raise 'missing license id' if @license_id.nil? || @license_id.empty? + + raise 'unknown content type' unless AVAILABLE_CONTENT_TYPES.keys.include?(@content_type) if @content_type + raise 'unknown output format' unless AVAILABLE_OUTPUT_FORMATS.keys.include?(@output_format) if @output_format + + %w[calculate_relevance allow_distribution allow_search].each do |variable| + value = self.send(variable) + unless NilClass === value || TrueClass === value || FalseClass === value + raise "expected a boolean value for #{variable} but got #{value}" + end + end + + @metadata_enables ||= [] + unknown_enables = Set.new(@metadata_enables) - KNOWN_ENABLES + raise "unknown metadata enables: #{unknown_enables.to_ainspect}" unless unknown_enables.empty? + + @metadata_discards ||= [] + unknown_discards = Set.new(@metadata_discards) - KNOWN_DISCARDS + raise "unknown metadata discards: #{unknown_discards.to_ainspect}" unless unknown_discards.empty? + end + + def do_request(post_fields) + unless @client.http_post(post_fields) + raise 'unable to post to api endpoint' + end + + @client.body_str end end end \ No newline at end of file