lib/parliament/response.rb in parliament-ruby-0.5.19 vs lib/parliament/response.rb in parliament-ruby-0.6.0

- old
+ new

@@ -1,18 +1,67 @@ require 'forwardable' module Parliament + # API response object that wraps an Array of Grom::Node objects with common helper methods. + # + # Delegates a number of common methods to the array of Grom::Nodes including, but not limited to, :size, :each, :map, :count etc. + # + # @since 0.1.0 + # + # @attr_reader [Array<Grom::Node>] nodes Graph nodes. class Response include Enumerable extend Forwardable attr_reader :nodes def_delegators :@nodes, :size, :each, :select, :map, :select!, :map!, :count, :length, :[], :empty? + # @param [Array<Grom::Node>] nodes An array of nodes the response should wrap def initialize(nodes) @nodes = nodes end + # Given our array of Grom::Nodes, filter them into arrays of 'types' of nodes. + # + # Note: this method assumes all of your nodes include a #type attribute. + # + # @since 0.2.0 + # + # @example Filtering for a single type + # node_1 = Grom::Node.new + # node_1.instance_variable_set(:type, 'type_1') + # node_2 = Grom::Node.new + # node_2.instance_variable_set(:type, 'type_3') + # node_3 = Grom::Node.new + # node_3.instance_variable_set(:type, 'type_1') + # node_4 = Grom::Node.new + # node_4.instance_variable_set(:type, 'type_2') + # nodes = [node_1, node_2, node_3, node_4] + # + # response = Parliament::Response.new(nodes) + # response.filter('type_2') #=> [#<Grom::Node @type='type_2'>] + # + # @example Filtering for multiple types + # node_1 = Grom::Node.new + # node_1.instance_variable_set(:type, 'type_1') + # node_2 = Grom::Node.new + # node_2.instance_variable_set(:type, 'type_3') + # node_3 = Grom::Node.new + # node_3.instance_variable_set(:type, 'type_1') + # node_4 = Grom::Node.new + # node_4.instance_variable_set(:type, 'type_2') + # nodes = [node_1, node_2, node_3, node_4] + # + # response = Parliament::Response.new(nodes) + # response.filter('type_2', 'type_1') #=> [[#<Grom::Node @type='type_2'>], [#<Grom::Node @type='type_1'>, #<Grom::Node @type='type_1'>]] + # + # # Also consider + # type_2, type_1 = response.filter('type_2', 'type_1') + # type_2 #=> [#<Grom::Node @type='type_2'>] + # type_1 #=> [#<Grom::Node @type='type_1'>, #<Grom::Node @type='type_1'>] + # + # @param [Array<String>] types An array of type strings that you are looking for. + # @return [Array<Grom::Node> || Array<*Array<Grom::Node>>] If you pass one type, this returns an Array of Grom::Node objects. If you pass multiple, it returns an array, of arrays of Grom::Node objects. def filter(*types) filtered_objects = Array.new(types.size) { [] } unless types.empty? @nodes.each do |node| @@ -24,29 +73,47 @@ result = build_responses(filtered_objects) types.size == 1 ? result.first : result end - def build_responses(filtered_objects) - result = [] - - filtered_objects.each do |objects| - result << Parliament::Response.new(objects) - end - result - end - + # Sort the Parliament::Response nodes in ascending order by a set of attributes on each node. + # + # @see Parliament::Utils.sort_by + # + # @since 0.5.0 + # + # @param [Array<Symbol>] parameters Attributes to sort on - left to right. + # @return [Array<Grom::Node>] A sorted array of nodes. def sort_by(*parameters) Parliament::Utils.sort_by({ list: @nodes, parameters: parameters }) end + # Sort the Parliament::Response nodes in descending order by a set of attributes on each node. + # + # @see Parliament::Utils.reverse_sort_by + # + # @since 0.5.0 + # + # @param [Array<Symbol>] parameters Attributes to sort on - left to right. + # @return [Array<Grom::Node>] A sorted array of nodes. def reverse_sort_by(*parameters) Parliament::Utils.reverse_sort_by({ list: @nodes, parameters: parameters }) + end + + private + + def build_responses(filtered_objects) + result = [] + + filtered_objects.each do |objects| + result << Parliament::Response.new(objects) + end + result end end end