Module: Sqreen::BindingAccessor::Transforms

Included in:
Sqreen::BindingAccessor
Defined in:
lib/sqreen/binding_accessor/transforms.rb

Overview

Available final transformations

Instance Method Summary collapse

Instance Method Details

#concat_keys_and_values(value, max_size = nil) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/sqreen/binding_accessor/transforms.rb', line 64

def concat_keys_and_values(value, max_size = nil)
  return nil if value.nil?
  values = Set.new
  max_size = max_size.to_i if max_size
  res = ''
  descend(value) do |x|
    next unless values.add?(x)
    x = x.to_s
    return res if max_size && res.size + x.size + 1 > max_size
    res << "\n" unless res.empty?
    res << x
  end
  res
end

#flat_keys(value, max_iter = 1000) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/sqreen/binding_accessor/transforms.rb', line 12

def flat_keys(value, max_iter = 1000)
  return nil if value.nil?
  seen = Set.new
  look_into = [value]
  keys = []
  idx = 0
  until look_into.empty? || max_iter <= idx
    idx += 1
    val = look_into.pop
    next unless seen.add?(val.object_id)
    case val
    when Hash
      # convert symbols are converted to strings (ARB-60)
      keys.concat(val.keys.map { |x| sym_to_s(x) })
      look_into.concat(val.values)
    when Array
      look_into.concat(val)
    else
      next if val.respond_to?(:seek)
      val.each { |v| look_into << v } if val.respond_to?(:each)
    end
  end
  keys
end

#flat_values(value, max_iter = 1000) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/sqreen/binding_accessor/transforms.rb', line 37

def flat_values(value, max_iter = 1000)
  return nil if value.nil?
  seen = Set.new
  look_into = [value]
  values = []
  idx = 0
  until look_into.empty? || max_iter <= idx
    idx += 1
    val = look_into.shift
    next unless seen.add?(val.object_id)
    case val
    when Hash
      look_into.concat(val.values)
    when Array
      look_into.concat(val)
    else
      next if val.respond_to?(:seek)
      if val.respond_to?(:each)
        val.each { |v| look_into << v }
      else
        values << val
      end
    end
  end
  values
end