Module: Kwalify::Util

Defined in:
lib/kwalify.rb,
lib/kwalify/util.rb,
lib/kwalify/util/hashlike.rb,
lib/kwalify/util/ordered-hash.rb

Defined Under Namespace

Modules: HashLike Classes: OrderedHash

Class Method Summary collapse

Class Method Details

._traverse_rule(rule, _done = {}) {|rule| ... } ⇒ Object

Yields:

  • (rule)


77
78
79
80
81
82
83
84
85
86
87
# File 'lib/kwalify/util.rb', line 77

def _traverse_rule(rule, _done={}, &block)
   return if _done.key?(rule.__id__)
   _done[rule.__id__] = rule
   yield rule
   rule.sequence.each do |seq_rule|
      _traverse_rule(seq_rule, _done, &block)
   end if rule.sequence
   rule.mapping.each do |name, map_rule|
      _traverse_rule(map_rule, _done, &block)
   end if rule.mapping
end

._traverse_schema(hash, _done = {}) {|hash| ... } ⇒ Object

Yields:

  • (hash)


50
51
52
53
54
55
56
57
58
59
# File 'lib/kwalify/util.rb', line 50

def _traverse_schema(hash, _done={}, &block)
  return if _done.key?(hash.__id__)
  _done[hash.__id__] = hash
  yield hash
  if hash['mapping']
    hash['mapping'].each {|k, v| _traverse_schema(v, _done, &block) }
  elsif hash['sequence']
    _traverse_schema(hash['sequence'][0], _done, &block)
  end
end

.create_hashtable(hashlist, primarykey, flag_duplicate_check = true) ⇒ Object

create a hash table from list of hash with primary key.

ex.

hashlist = [
  { "name"=>"Foo", "gender"=>"M", "age"=>20, },
  { "name"=>"Bar", "gender"=>"F", "age"=>25, },
  { "name"=>"Baz", "gender"=>"M", "age"=>30, },
]
hashtable = YamlHelper.create_hashtable(hashlist, "name")
p hashtable
    # => { "Foo" => { "name"=>"Foo", "gender"=>"M", "age"=>20, },
    #      "Bar" => { "name"=>"Bar", "gender"=>"F", "age"=>25, },
    #      "Baz" => { "name"=>"Baz", "gender"=>"M", "age"=>30, }, }


118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/kwalify/util.rb', line 118

def create_hashtable(hashlist, primarykey, flag_duplicate_check=true)
  hashtable = {}
  hashlist.each do |hash|
    key = hash[primarykey]
    unless key
      riase "primary key '#{key}' not found."
    end
    if flag_duplicate_check && hashtable.key?(key)
      raise "primary key '#{key}' duplicated (value '#{hashtable[key]}')"
    end
    hashtable[key] = hash
  end if hashlist
  return hashtable
end

.get_class(classname) ⇒ Object

get class object. if not found, NameError raised.



94
95
96
97
98
99
100
# File 'lib/kwalify/util.rb', line 94

def get_class(classname)
  klass = Object
  classname.split('::').each do |name|
    klass = klass.const_get(name)
  end
  return klass
end

.get_value(obj, path) ⇒ Object

get nested value directly.

ex.

val = YamlHelper.get_value(obj, ['aaa', 0, 'xxx'])

This is equal to the following:

begin
  val = obj['aaa'][0]['xxx']
rescue NameError
  val = nil
end


147
148
149
150
151
152
153
154
# File 'lib/kwalify/util.rb', line 147

def get_value(obj, path)
  val = obj
  path.each do |key|
    return nil unless val.is_a?(Hash) || val.is_a?(Array)
    val = val[key]
  end if path
  return val
end

.traverse_rule(validator, &block) ⇒ Object

traverse rule

ex.

schema = YAML.load_file('myschema.yaml')
validator = Kwalify::Validator.new(schema)
Kwalify::Util.traverse_rule(validator) do |rule|
  p rule if rule.classname
end


71
72
73
74
75
# File 'lib/kwalify/util.rb', line 71

def traverse_rule(validator, &block)  #:yield: rule
  rule = validator.is_a?(Rule) ? validator : validator.rule
  _done = {}
  _traverse_rule(rule, _done, &block)
end

.traverse_schema(schema, &block) ⇒ Object

traverse schema

ex.

schema = YAML.load_file('myschema.yaml')
Kwalify::Util.traverse_schema(schema) do |rulehash|
  ## add module prefix to class name
  if rulehash['class']
    rulehash['class'] = 'MyModule::' + rulehash['class']
  end
end


44
45
46
47
48
# File 'lib/kwalify/util.rb', line 44

def traverse_schema(schema, &block)  #:yield: rulehash
  hash = schema
  _done = {}
  _traverse_schema(hash, _done, &block)
end

.untabify(str, width = 8) ⇒ Object

expand tab character to spaces

ex.

untabified_str = YamlHelper.untabify(tabbed_str)


19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/kwalify/util.rb', line 19

def untabify(str, width=8)
  return str if str.nil?
  list = str.split(/\t/, -1)   # if 2nd arg is negative then split() doesn't remove tailing empty strings
  last = list.pop
  sb = ''
  list.each do |s|
    column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
    n = width - (column % width)
    sb << s << (' ' * n)
  end
  sb << last if last
  return sb
end