File: document.rb

package info (click to toggle)
ruby-iniparse 1.4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 472 kB
  • sloc: ruby: 2,409; makefile: 3
file content (110 lines) | stat: -rw-r--r-- 3,014 bytes parent folder | download | duplicates (3)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
module IniParse
  # Represents an INI document.
  class Document
    include Enumerable

    attr_reader   :lines
    attr_accessor :path

    # Creates a new Document instance.
    def initialize(path = nil)
      @path  = path
      @lines = IniParse::SectionCollection.new
    end

    # Enumerates through each Section in this document.
    #
    # Does not yield blank and comment lines by default; if you want _all_
    # lines to be yielded, pass true.
    #
    # ==== Parameters
    # include_blank<Boolean>:: Include blank/comment lines?
    #
    def each(*args, &blk)
      @lines.each(*args, &blk)
    end

    # Returns the section identified by +key+.
    #
    # Returns nil if there is no Section with the given key.
    #
    def [](key)
      @lines[key.to_s]
    end

    # Returns the section identified by +key+.
    #
    # If there is no Section with the given key it will be created.
    #
    def section(key)
      @lines[key.to_s] ||= Lines::Section.new(key.to_s)
    end

    # Deletes the section whose name matches the given +key+.
    #
    # Returns the document.
    #
    def delete(*args)
      @lines.delete(*args)
      self
    end

    # Returns this document as a string suitable for saving to a file.
    def to_ini
      string = @lines.to_a.map { |line| line.to_ini }.join($/)
      string = "#{ string }\n" unless string[-1] == "\n"

      string
    end

    alias_method :to_s, :to_ini

    # Returns a has representation of the INI with multi-line options
    # as an array
    def to_hash
      result = {}
      @lines.entries.each do |section|
        result[section.key] ||= {}
        section.entries.each do |option|
          opts = Array(option)
          val = opts.map { |o| o.respond_to?(:value) ? o.value : o }
          val = val.size > 1 ? val : val.first
          result[section.key][opts.first.key] = val
        end
      end
      result
    end

    alias_method :to_h, :to_hash

    # A human-readable version of the document, for debugging.
    def inspect
      sections = @lines.select { |l| l.is_a?(IniParse::Lines::Section) }
      "#<IniParse::Document {#{ sections.map(&:key).join(', ') }}>"
    end

    # Returns true if a section with the given +key+ exists in this document.
    def has_section?(key)
      @lines.has_key?(key.to_s)
    end

    # Saves a copy of this Document to disk.
    #
    # If a path was supplied when the Document was initialized then nothing
    # needs to be given to Document#save. If Document was not given a file
    # path, or you wish to save the document elsewhere, supply a path when
    # calling Document#save.
    #
    # ==== Parameters
    # path<String>:: A path to which this document will be saved.
    #
    # ==== Raises
    # IniParseError:: If your document couldn't be saved.
    #
    def save(path = nil)
      @path = path if path
      raise IniParseError, 'No path given to Document#save' if @path !~ /\S/
      File.open(@path, 'w') { |f| f.write(self.to_ini) }
    end
  end
end