Class: Muster::Strategies::Hash

Inherits:
Rack
  • Object
show all
Defined in:
lib/muster/strategies/hash.rb

Overview

Query string parsing strategy with additional value handling options for separating values and uniqueness

Examples:


strategy = Muster::Strategies::Hash.new(:unique_values => true, :value_separator => ',')
results  = strategy.parse('name=value&choices=1,2,1')  #=>  { 'name' => 'value', 'choices' => ['1', '2'] }

Direct Known Subclasses

FilterExpression, SortExpression

Instance Attribute Summary collapse

Attributes inherited from Rack

#fields, #options

Instance Method Summary collapse

Methods inherited from Rack

#fields_to_parse, #parse_query_string

Constructor Details

#initialize(options = {}) ⇒ Hash

Create a new Hash parsing strategy

Examples:


strategy = Muster::Strategies::Hash.new(:fields => [:name, :state], :value_separator => '|')
strategy = Muster::Strategies::Hash.new(:unique_values => false)

Parameters:

  • options (Hash) (defaults to: {})

    the options available for this method

Options Hash (options):

  • :fields (optional, Array<Symbol>)

    when specified, only parse the specified fields You may also use :field if you only intend to pass one field

  • :value_separator (optional, String, RegEx) — default: /, \s*/

    when specified, splits the field value into multiple values You may pass the separator as a string or a regular expression

  • :unique_values (optional, Boolean) — default: true

    when true, ensures field values do not contain duplicates



37
38
39
40
41
42
# File 'lib/muster/strategies/hash.rb', line 37

def initialize( options={} )
  super

  @unique_values   = self.options.fetch(:unique_values, true)
  @value_separator = self.options.fetch(:value_separator, /,\s*/)
end

Instance Attribute Details

#unique_valuesBoolean (readonly)

Returns when specified, ensures a fields values do not contain duplicates.

Returns:

  • (Boolean)

    when specified, ensures a fields values do not contain duplicates



22
23
24
# File 'lib/muster/strategies/hash.rb', line 22

def unique_values
  @unique_values
end

#value_separatorString, RegEx (readonly)

Returns when specified, each field value will be split into multiple values using the specified separator.

Returns:

  • (String, RegEx)

    when specified, each field value will be split into multiple values using the specified separator



18
19
20
# File 'lib/muster/strategies/hash.rb', line 18

def value_separator
  @value_separator
end

Instance Method Details

#parse(query_string) ⇒ Hash

Processes a query string and returns a hash of its fields/values

Examples:


results = strategy.parse('name=value&choices=1,2')  #=>  { 'name' => 'value', 'choices' => ['1', '2'] }

Parameters:

  • query_string (String)

    the query string to parse

Returns:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/muster/strategies/hash.rb', line 53

def parse( query_string )
  parameters = super

  parameters.each do |key, value|
    if self.value_separator.present?
      parameters[key] = self.separate_values(value)
    end

    if self.unique_values == true && value.instance_of?(Array)
      parameters[key].uniq!
    end
  end

  return parameters
end

#separate_values(value) ⇒ String, Array (protected)

Separates values into an Array of values using :values_separator

Examples:


value = self.separate_values('1')    #=> '1'
value = self.separate_values('1,2')  #=>  ['1', '2']

Parameters:

  • value (String, Array)

    the original query string field value to separate

Returns:

  • (String, Array)

    String if a single value exists, Array otherwise



81
82
83
84
85
86
87
88
89
# File 'lib/muster/strategies/hash.rb', line 81

def separate_values( value )
  values = Array.wrap(value)

  values = values.map do |value|
    value.split(self.value_separator)
  end.flatten

  return (values.size > 1) ? values : value
end