File: monkey_patch.rb

package info (click to toggle)
ruby-toml 0.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 296 kB
  • sloc: ruby: 666; sh: 7; makefile: 4
file content (87 lines) | stat: -rw-r--r-- 1,863 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Adds to_toml methods to base Ruby classes used by the generator.
class Object
  def toml_table?
    self.kind_of?(Hash)
  end
  def toml_table_array?
    self.kind_of?(Array) && self.first.toml_table?
  end
end
class Hash
  def to_toml(path = "")
    return "" if self.empty?

    tables = {}
    values = {}
    self.keys.sort.each do |key|
      val = self[key]
      if val.kind_of?(NilClass)
        next
      elsif val.toml_table? || val.toml_table_array?
        tables[key] = val
      else
        values[key] = val
      end
    end

    toml = ""
    values.each do |key, val|
      toml << "#{key} = #{val.to_toml(key)}\n"
    end

    tables.each do |key, val|
      key = "#{path}.#{key}" unless path.empty?
      toml_val = val.to_toml(key)
      unless toml_val.empty?
        if val.toml_table?
          non_table_vals = val.values.reject do |v|
            v.toml_table? || v.toml_table_array?
          end

          # Only add the table key if there are non table values.
          if non_table_vals.length > 0
            toml << "\n[#{key}]\n"
          end
        end
        toml << toml_val
      end
    end

    toml
  end
end
class Array
  def to_toml(path = "")
    unless self.map(&:class).uniq.length == 1
      raise "All array values must be the same type"
    end

    if self.first.toml_table?
      toml = ""
      self.each do |val|
        toml << "\n[[#{path}]]\n"
        toml << val.to_toml(path)
      end
      return toml
    else
      "[" + self.map {|v| v.to_toml(path) }.join(",") + "]"
    end
  end
end
class TrueClass
  def to_toml(path = ""); "true"; end
end
class FalseClass
  def to_toml(path = ""); "false"; end
end
class String
  def to_toml(path = ""); self.inspect; end
end
class Numeric
  def to_toml(path = ""); self.to_s; end
end
class DateTime
  def to_toml(path = "")
    self.rfc3339
  end
end