lib/redd/clients/base/utilities.rb in redd-0.7.8 vs lib/redd/clients/base/utilities.rb in redd-0.7.9

- old
+ new

@@ -1,104 +1,104 @@ -require_relative "../../objects/base" -require_relative "../../objects/thing" -require_relative "../../objects/listing" -require_relative "../../objects/wiki_page" -require_relative "../../objects/labeled_multi" -require_relative "../../objects/more_comments" -require_relative "../../objects/comment" -require_relative "../../objects/user" -require_relative "../../objects/submission" -require_relative "../../objects/private_message" -require_relative "../../objects/subreddit" - -module Redd - module Clients - class Base - # Internal methods that make life easier. - # @todo Move this out to Redd::Utils? - module Utilities - # The kind strings and the objects that should be used for them. - OBJECT_KINDS = { - "Listing" => Objects::Listing, - "wikipage" => Objects::WikiPage, - "LabeledMulti" => Objects::LabeledMulti, - "more" => Objects::MoreComments, - "t1" => Objects::Comment, - "t2" => Objects::User, - "t3" => Objects::Submission, - "t4" => Objects::PrivateMessage, - "t5" => Objects::Subreddit - } - - # Request and create an object from the response. - # @param [Symbol] meth The method to use. - # @param [String] path The path to visit. - # @param [Hash] params The data to send with the request. - # @return [Objects::Base] The object returned from the request. - def request_object(meth, path, params = {}) - body = send(meth, path, params).body - object_from_body(body) - end - - # Create an object instance with the correct attributes when given a - # body. - # - # @param [Hash] body A JSON hash. - # @return [Objects::Thing, Objects::Listing] - def object_from_body(body) - return nil unless body.is_a?(Hash) - object = object_from_kind(body[:kind]) - flat = flatten_body(body) - object.new(self, flat) - end - - # @param [Objects::Submission, Objects::Comment] base The start of the - # comment tree. - # @author Bryce Boe (@bboe) in Python - # @return [Array<Objects::Comment, Objects::MoreComments>] A linear - # array of the submission's comments or the comments' replies. - def flat_comments(base) - meth = (base.is_a?(Objects::Submission) ? :comments : :replies) - stack = base.send(meth).dup - flattened = [] - - until stack.empty? - comment = stack.shift - if comment.is_a?(Objects::Comment) - replies = comment.replies - stack = replies + stack if replies - end - flattened << comment - end - - flattened - end - - # Get a given property of a given object. - # @param [Objects::Base, String] object The object with the property. - # @param [Symbol] property The property to get. - def property(object, property) - object.respond_to?(property) ? object.send(property) : object.to_s - end - - private - - # Take a multilevel body ({kind: "tx", data: {...}}) and flatten it - # into something like {kind: "tx", ...} - # @param [Hash] body The response body. - # @return [Hash] The flattened hash. - def flatten_body(body) - data = body[:data] || body - data[:kind] = body[:kind] - data - end - - # @param [String] kind A kind in the format /t[1-5]/. - # @return [Objects::Base, Objects::Listing] The appropriate object for - # a given kind. - def object_from_kind(kind) - OBJECT_KINDS.fetch(kind, Objects::Base) - end - end - end - end -end +require_relative "../../objects/base" +require_relative "../../objects/thing" +require_relative "../../objects/listing" +require_relative "../../objects/wiki_page" +require_relative "../../objects/labeled_multi" +require_relative "../../objects/more_comments" +require_relative "../../objects/comment" +require_relative "../../objects/user" +require_relative "../../objects/submission" +require_relative "../../objects/private_message" +require_relative "../../objects/subreddit" + +module Redd + module Clients + class Base + # Internal methods that make life easier. + # @todo Move this out to Redd::Utils? + module Utilities + # The kind strings and the objects that should be used for them. + OBJECT_KINDS = { + "Listing" => Objects::Listing, + "wikipage" => Objects::WikiPage, + "LabeledMulti" => Objects::LabeledMulti, + "more" => Objects::MoreComments, + "t1" => Objects::Comment, + "t2" => Objects::User, + "t3" => Objects::Submission, + "t4" => Objects::PrivateMessage, + "t5" => Objects::Subreddit + } + + # Request and create an object from the response. + # @param [Symbol] meth The method to use. + # @param [String] path The path to visit. + # @param [Hash] params The data to send with the request. + # @return [Objects::Base] The object returned from the request. + def request_object(meth, path, params = {}) + body = send(meth, path, params).body + object_from_body(body) + end + + # Create an object instance with the correct attributes when given a + # body. + # + # @param [Hash] body A JSON hash. + # @return [Objects::Thing, Objects::Listing] + def object_from_body(body) + return nil unless body.is_a?(Hash) + object = object_from_kind(body[:kind]) + flat = flatten_body(body) + object.new(self, flat) + end + + # @param [Objects::Submission, Objects::Comment] base The start of the + # comment tree. + # @author Bryce Boe (@bboe) in Python + # @return [Array<Objects::Comment, Objects::MoreComments>] A linear + # array of the submission's comments or the comments' replies. + def flat_comments(base) + meth = (base.is_a?(Objects::Submission) ? :comments : :replies) + stack = base.send(meth).dup + flattened = [] + + until stack.empty? + comment = stack.shift + if comment.is_a?(Objects::Comment) + replies = comment.replies + stack = replies + stack if replies + end + flattened << comment + end + + flattened + end + + # Get a given property of a given object. + # @param [Objects::Base, String] object The object with the property. + # @param [Symbol] property The property to get. + def property(object, property) + object.respond_to?(property) ? object.send(property) : object.to_s + end + + private + + # Take a multilevel body ({kind: "tx", data: {...}}) and flatten it + # into something like {kind: "tx", ...} + # @param [Hash] body The response body. + # @return [Hash] The flattened hash. + def flatten_body(body) + data = body[:data] || body + data[:kind] = body[:kind] + data + end + + # @param [String] kind A kind in the format /t[1-5]/. + # @return [Objects::Base, Objects::Listing] The appropriate object for + # a given kind. + def object_from_kind(kind) + OBJECT_KINDS.fetch(kind, Objects::Base) + end + end + end + end +end