Class: App::Config::YAML

Inherits:
Hash
  • Object
show all
Defined in:
lib/app/config/yaml.rb

Constant Summary collapse

DEFAULT_MASK =
"*.{yml,yaml}"
DEFAULT_SUFFIX =
".yaml"

Instance Method Summary collapse

Methods inherited from Hash

#deeply_dup, #deeply_map, #deeply_map!, #deeply_merge, #deeply_merge!, #deeply_stringify_keys, #deeply_stringify_keys!, #deeply_symbolize_keys, #deeply_symbolize_keys!

Constructor Details

#initialize(**opts) ⇒ YAML

Returns a new instance of YAML.



12
13
14
15
16
17
18
# File 'lib/app/config/yaml.rb', line 12

def initialize( **opts )
  super
  self.default_proc  =  proc do |hash, key|
    hash[key]  =  {}
  end
  reload( **opts )
end

Instance Method Details

#load(section) ⇒ Object

load configuration.

Raises:

  • (ArgumentError)


38
39
40
41
42
43
# File 'lib/app/config/yaml.rb', line 38

def load( section )
  raise  ArgumentError, "'#{ section }' is not String."    unless  String === section

  self[section].clear
  load_overlay( section + DEFAULT_SUFFIX )
end

#load_overlay(filename) ⇒ Object

load configuration.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/app/config/yaml.rb', line 46

def load_overlay( filename )
  @paths.each do |path|
    begin
      dirname  =  ::File.expand_path( path )
      if  ::Dir.exist?( dirname )
        ::Dir.glob( "#{ dirname }/#{ filename }" ) do |pathname|
          text  =  ::File.open( pathname ).read    rescue  raise( ArgumentError, "could not load #{ pathname }" )
          yaml  =  ::ERB.new( text ).result        rescue  raise( ArgumentError, "could not parse by ERB: #{ pathname }" )
          hash  =  ::YAML.load( yaml, **@decode )
          self.deeply_merge!( hash )
        end
      end
    rescue => e
      STDERR.puts e.message
    end
  end
end

#reload(root: nil, path: nil, encode: nil, decode: nil) ⇒ Object

bulk load configuration in search paths.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/app/config/yaml.rb', line 21

def reload( root: nil, path: nil, encode: nil, decode: nil )
  clear
  @root  =  root || Dir.pwd
  @paths  =  ( path || DEFAULT_PATH ).gsub('$ROOT', @root).split(':')
  @paths  =  @paths.map{|it| !it.nil? && !it.empty? ? it : nil}.compact
  @paths  <<  "."    if @paths.empty?

  @vardir  =  @paths.last
  Dir.mkdir( @vardir )    unless ::Dir.exist?( @vardir )

  @encode  =  {}.merge( encode || {} )
  @decode  =  {}.merge( decode || {} )

  load_overlay( DEFAULT_MASK )
end

#reset(section) ⇒ Object

remove and load configuration.

Raises:

  • (ArgumentError)


75
76
77
78
79
80
81
# File 'lib/app/config/yaml.rb', line 75

def reset( section )
  raise  ArgumentError, "'#{ section }' is not String."    unless  String === section

  pathname  =  savepathname(section)
  ::FileUtils.remove( pathname )    if ::File.exist?( pathname )
  load( section )
end

#save(section) ⇒ Object

save configuration.

Raises:

  • (ArgumentError)


65
66
67
68
69
70
71
72
# File 'lib/app/config/yaml.rb', line 65

def save( section )
  raise  ArgumentError, "'#{ section }' is not String."    unless  String === section
  pathname  =  savepathname(section)
  hash  =  { section => self[section] }.deeply_stringify_keys
  ::File.open( pathname, "w" ) do |file|
    file.puts( ::YAML.dump( hash, **@encode ) )
  end
end

#savepathname(section) ⇒ Object



83
84
85
# File 'lib/app/config/yaml.rb', line 83

def savepathname( section )
  ::File.join( @vardir, section + DEFAULT_SUFFIX )
end