props 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +8 -0
- data/Rakefile +3 -3
- data/lib/props/db/deleter.rb +15 -0
- data/lib/props/db/models.rb +13 -0
- data/lib/props/db/schema.rb +23 -0
- data/lib/props/db.rb +41 -0
- data/lib/props/env.rb +30 -0
- data/lib/props/ini.rb +84 -0
- data/lib/props/props.rb +64 -0
- data/lib/props/version.rb +5 -0
- data/lib/props.rb +23 -139
- data/test/test_ini.rb +10 -10
- metadata +14 -6
    
        data/Manifest.txt
    CHANGED
    
    | @@ -3,5 +3,13 @@ Manifest.txt | |
| 3 3 | 
             
            README.md
         | 
| 4 4 | 
             
            Rakefile
         | 
| 5 5 | 
             
            lib/props.rb
         | 
| 6 | 
            +
            lib/props/db.rb
         | 
| 7 | 
            +
            lib/props/db/deleter.rb
         | 
| 8 | 
            +
            lib/props/db/models.rb
         | 
| 9 | 
            +
            lib/props/db/schema.rb
         | 
| 10 | 
            +
            lib/props/env.rb
         | 
| 11 | 
            +
            lib/props/ini.rb
         | 
| 12 | 
            +
            lib/props/props.rb
         | 
| 13 | 
            +
            lib/props/version.rb
         | 
| 6 14 | 
             
            test/helper.rb
         | 
| 7 15 | 
             
            test/test_ini.rb
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            require 'hoe'
         | 
| 2 | 
            -
            require './lib/props.rb'
         | 
| 2 | 
            +
            require './lib/props/version.rb'
         | 
| 3 3 |  | 
| 4 4 | 
             
            Hoe.spec 'props' do
         | 
| 5 5 |  | 
| 6 | 
            -
              self.version =  | 
| 7 | 
            -
             | 
| 6 | 
            +
              self.version = ConfUtils::VERSION
         | 
| 7 | 
            +
             | 
| 8 8 | 
             
              self.summary = 'props - Manage Settings Hierachies (Commandline, User, Home, Defaults, etc.)'
         | 
| 9 9 | 
             
              self.description = summary
         | 
| 10 10 |  | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module ConfDb
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            class CreateDb < ActiveRecord::Migration
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def up
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            create_table :props do |t|
         | 
| 9 | 
            +
              t.string :key,   :null => false
         | 
| 10 | 
            +
              t.string :value, :null => false
         | 
| 11 | 
            +
              t.string :kind     # e.g. version|user|sys(tem)|db etc. # note: can NOT use type - already used by ActiveRecord
         | 
| 12 | 
            +
              t.timestamps
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def down
         | 
| 18 | 
            +
                raise ActiveRecord::IrreversibleMigration
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            end  # class CreateDb
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            end  # module ConfDb
         | 
    
        data/lib/props/db.rb
    ADDED
    
    | @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            #########################################
         | 
| 2 | 
            +
            # NB: only load on demand
         | 
| 3 | 
            +
            #  we do NOT want to pull in activerecord gem/dep for simple scripts
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # rubygems / 3rd party libs
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require 'active_record'   ## todo: add sqlite3? etc.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # our own code
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            require 'props/db/models'
         | 
| 12 | 
            +
            require 'props/db/schema'
         | 
| 13 | 
            +
            require 'props/db/deleter'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
             | 
| 16 | 
            +
            module ConfDb
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def self.banner
         | 
| 19 | 
            +
                "confdb #{ConfUtils::VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def self.create
         | 
| 23 | 
            +
                CreateDb.new.up
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # delete ALL records (use with care!)
         | 
| 27 | 
            +
              def self.delete!
         | 
| 28 | 
            +
                puts '*** deleting props table records/data...'
         | 
| 29 | 
            +
                Deleter.new.run
         | 
| 30 | 
            +
              end # method delete!
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def self.stats
         | 
| 33 | 
            +
                # to be done
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
             | 
| 37 | 
            +
            end # module ConfDb
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
            # say hello
         | 
| 41 | 
            +
            puts ConfDb.banner
         | 
    
        data/lib/props/env.rb
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module ConfUtils
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Env
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def self.home
         | 
| 6 | 
            +
                path = if( ENV['HOME'] || ENV['USERPROFILE'] )
         | 
| 7 | 
            +
                         ENV['HOME'] || ENV['USERPROFILE']
         | 
| 8 | 
            +
                       elsif( ENV['HOMEDRIVE'] && ENV['HOMEPATH'] )
         | 
| 9 | 
            +
                         "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}"
         | 
| 10 | 
            +
                       else
         | 
| 11 | 
            +
                         begin
         | 
| 12 | 
            +
                            File.expand_path('~')
         | 
| 13 | 
            +
                         rescue
         | 
| 14 | 
            +
                            if File::ALT_SEPARATOR
         | 
| 15 | 
            +
                               'C:/'
         | 
| 16 | 
            +
                            else
         | 
| 17 | 
            +
                               '/'
         | 
| 18 | 
            +
                            end
         | 
| 19 | 
            +
                         end
         | 
| 20 | 
            +
                       end
         | 
| 21 | 
            +
                 
         | 
| 22 | 
            +
                # todo: use logger - how?
         | 
| 23 | 
            +
                ## puts "env home=>#{path}<"
         | 
| 24 | 
            +
                
         | 
| 25 | 
            +
                path
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            end # class Env
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            end # module ConfUtils
         | 
    
        data/lib/props/ini.rb
    ADDED
    
    | @@ -0,0 +1,84 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            module ConfUtils
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            class IniFile
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              # returns a nested hash
         | 
| 8 | 
            +
              #  (compatible structure - works like YAML.load_file)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def self.load_file( path )
         | 
| 11 | 
            +
                text = File.open( path, 'r:bom|utf-8' ).read
         | 
| 12 | 
            +
                self.load( text )
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def self.load( text )
         | 
| 16 | 
            +
                IniFile.new( text ).parse
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
              def initialize( text )
         | 
| 21 | 
            +
                @text = text
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def parse
         | 
| 25 | 
            +
                hash = top_hash = Hash.new
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                text = @text
         | 
| 28 | 
            +
                text = text.gsub( "\t", ' ' )   # replace all tabs w/ spaces
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                text.each_line do |line|
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  ### skip comments
         | 
| 33 | 
            +
                  #  e.g.   # this is a comment line
         | 
| 34 | 
            +
                  #  or     ; this too
         | 
| 35 | 
            +
                  #  or     --  haskell style
         | 
| 36 | 
            +
                  #  or     %   text style
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  if line =~ /^\s*#/ || line =~ /^\s*;/ || line =~ /^\s*--/ || line =~ /^\s*%/
         | 
| 39 | 
            +
                    ## logger.debug 'skipping comment line'
         | 
| 40 | 
            +
                    next
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  ### skip blank lines
         | 
| 44 | 
            +
                  if line =~ /^\s*$/ 
         | 
| 45 | 
            +
                    ## logger.debug 'skipping blank line'
         | 
| 46 | 
            +
                    next
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  # pass 1) remove possible trailing eol comment
         | 
| 50 | 
            +
                  ##  e.g    -> New York   # Sample EOL Comment Here (with or without commas,,,,)
         | 
| 51 | 
            +
                  ## becomes -> New York
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  line = line.sub( /\s+#.*$/, '' )
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  # pass 2) remove leading and trailing whitespace
         | 
| 56 | 
            +
                  
         | 
| 57 | 
            +
                  line = line.strip
         | 
| 58 | 
            +
             
         | 
| 59 | 
            +
                  ## check for new section e.g.  [planet012-xxx_bc]
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  ### todo: allow _ or - in strict section key? why? why not??
         | 
| 62 | 
            +
                  ###   allow _ or - in value key? why why not??
         | 
| 63 | 
            +
                  if line =~ /^\s*\[\s*([a-z0-9_\-]+)\s*\]\s*$/   # strict section
         | 
| 64 | 
            +
                    key = $1.to_s.dup
         | 
| 65 | 
            +
                    hash = top_hash[ key ] = Hash.new
         | 
| 66 | 
            +
                  elsif line =~ /^\s*\[\s*([^ \]]+)\s*\]\s*$/     # liberal section; allow everything in key
         | 
| 67 | 
            +
                    key = $1.to_s.dup
         | 
| 68 | 
            +
                    hash = top_hash[ key ] = Hash.new
         | 
| 69 | 
            +
                  elsif line =~ /^\s*([a-z0-9_\-]+)\s*[:=](.*)$/
         | 
| 70 | 
            +
                    key   = $1.to_s.dup
         | 
| 71 | 
            +
                    value = $2.to_s.strip.dup   # check if it can be nil? if yes use blank string e.g. ''
         | 
| 72 | 
            +
                    ### todo:  strip quotes from value??? why? why not?
         | 
| 73 | 
            +
                    hash[ key ] = value
         | 
| 74 | 
            +
                  else
         | 
| 75 | 
            +
                    puts "*** warn: skipping unknown line type in ini >#{line}<"
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end # each lines
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                top_hash
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
              
         | 
| 82 | 
            +
            end # class IniReader
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            end # module ConfUtils
         | 
    
        data/lib/props/props.rb
    ADDED
    
    | @@ -0,0 +1,64 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            module ConfUtils
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Props
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              VERSION = ConfUtils::VERSION  # remove version; depreciated api/constant; use ConfUtils::VERSION
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              attr_reader :path
         | 
| 10 | 
            +
              attr_reader :parent
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
              def self.load_file( path, parent=nil )
         | 
| 14 | 
            +
                h = YAML.load_file( path )
         | 
| 15 | 
            +
                Props.new( h, path, parent )
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
              
         | 
| 18 | 
            +
              ### todo: use TOP_LEVEL_BINDING for binding default?
         | 
| 19 | 
            +
              def self.load_file_with_erb( path, binding, parent=nil )  # run through erb first
         | 
| 20 | 
            +
                text = ERB.new( File.read( path ) ).result( binding )
         | 
| 21 | 
            +
                h = YAML.load( text )
         | 
| 22 | 
            +
                Props.new( h, path, parent )
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
              def initialize( hash, path, parent=nil)
         | 
| 27 | 
            +
                @hash   = hash
         | 
| 28 | 
            +
                @path   = path
         | 
| 29 | 
            +
                @parent = parent
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def dump   # for debugging
         | 
| 33 | 
            +
                puts "dump of >#{@path}<:"
         | 
| 34 | 
            +
                pp @hash
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                
         | 
| 38 | 
            +
              def fetch(key, default)
         | 
| 39 | 
            +
                value = get( key )
         | 
| 40 | 
            +
                value.nil? ? default : value
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
              
         | 
| 43 | 
            +
              def fetch_from_section(section, key, default)
         | 
| 44 | 
            +
                value = get_from_section( section, key )
         | 
| 45 | 
            +
                value.nil? ? default : value
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              def [](key)  get( key );  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              def get( key )
         | 
| 51 | 
            +
                value = @hash.fetch( key.to_s, nil )
         | 
| 52 | 
            +
                # if not found try lookup in parent hash
         | 
| 53 | 
            +
                (value.nil? && parent) ? parent.get(key) : value
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              def get_from_section( section, key )
         | 
| 57 | 
            +
                value = @hash.fetch( section.to_s, {} ).fetch( key.to_s, nil )
         | 
| 58 | 
            +
                # if not found try lookup in parent hash
         | 
| 59 | 
            +
                (value.nil? && parent) ? parent.get_from_section(section,key) : value
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            end # class Props
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            end # module ConfUtils
         | 
    
        data/lib/props.rb
    CHANGED
    
    | @@ -8,161 +8,45 @@ require 'fileutils' | |
| 8 8 | 
             
            require 'erb'
         | 
| 9 9 |  | 
| 10 10 |  | 
| 11 | 
            +
            # our own code
         | 
| 11 12 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                         ENV['HOME'] || ENV['USERPROFILE']
         | 
| 17 | 
            -
                       elsif( ENV['HOMEDRIVE'] && ENV['HOMEPATH'] )
         | 
| 18 | 
            -
                         "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}"
         | 
| 19 | 
            -
                       else
         | 
| 20 | 
            -
                         begin
         | 
| 21 | 
            -
                            File.expand_path('~')
         | 
| 22 | 
            -
                         rescue
         | 
| 23 | 
            -
                            if File::ALT_SEPARATOR
         | 
| 24 | 
            -
                               'C:/'
         | 
| 25 | 
            -
                            else
         | 
| 26 | 
            -
                               '/'
         | 
| 27 | 
            -
                            end
         | 
| 28 | 
            -
                         end
         | 
| 29 | 
            -
                       end
         | 
| 30 | 
            -
                 
         | 
| 31 | 
            -
                # todo: use logger - how?
         | 
| 32 | 
            -
                ## puts "env home=>#{path}<"
         | 
| 33 | 
            -
                
         | 
| 34 | 
            -
                path
         | 
| 35 | 
            -
              end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            end # class Env
         | 
| 13 | 
            +
            require 'props/version'   # version always goes first
         | 
| 14 | 
            +
            require 'props/env'
         | 
| 15 | 
            +
            require 'props/ini'
         | 
| 16 | 
            +
            require 'props/props'
         | 
| 38 17 |  | 
| 39 18 |  | 
| 40 | 
            -
             | 
| 19 | 
            +
            ######################
         | 
| 20 | 
            +
            # add top_level convenience alias for classes
         | 
| 41 21 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
                #  (compatible structure - works like YAML.load_file)
         | 
| 22 | 
            +
            Env   = ConfUtils::Env
         | 
| 23 | 
            +
            Props = ConfUtils::Props
         | 
| 45 24 |  | 
| 46 | 
            -
                text = File.open( path, 'r:bom|utf-8' ).read
         | 
| 47 | 
            -
                self.load( text )
         | 
| 48 | 
            -
              end
         | 
| 49 25 |  | 
| 26 | 
            +
            module INI
         | 
| 50 27 |  | 
| 51 | 
            -
               | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
                text = text.gsub( "\t", ' ' )   # replace all tabs w/ spaces
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                text.each_line do |line|
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                  ### skip comments
         | 
| 59 | 
            -
                  #  e.g.   # this is a comment line
         | 
| 60 | 
            -
                  #  or     ; this too
         | 
| 61 | 
            -
                  #  or     --  haskell style
         | 
| 62 | 
            -
                  #  or     %   text style
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                  if line =~ /^\s*#/ || line =~ /^\s*;/ || line =~ /^\s*--/ || line =~ /^\s*%/
         | 
| 65 | 
            -
                    ## logger.debug 'skipping comment line'
         | 
| 66 | 
            -
                    next
         | 
| 67 | 
            -
                  end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                  ### skip blank lines
         | 
| 70 | 
            -
                  if line =~ /^\s*$/ 
         | 
| 71 | 
            -
                    ## logger.debug 'skipping blank line'
         | 
| 72 | 
            -
                    next
         | 
| 73 | 
            -
                  end
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                  # pass 1) remove possible trailing eol comment
         | 
| 76 | 
            -
                  ##  e.g    -> New York   # Sample EOL Comment Here (with or without commas,,,,)
         | 
| 77 | 
            -
                  ## becomes -> New York
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                  line = line.sub( /\s+#.*$/, '' )
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                  # pass 2) remove leading and trailing whitespace
         | 
| 82 | 
            -
                  
         | 
| 83 | 
            -
                  line = line.strip
         | 
| 84 | 
            -
             
         | 
| 85 | 
            -
                  ## check for new section e.g.  [planet012-xxx_bc]
         | 
| 86 | 
            -
             | 
| 87 | 
            -
                  ### todo: allow _ or - in strict section key? why? why not??
         | 
| 88 | 
            -
                  ###   allow _ or - in value key? why why not??
         | 
| 89 | 
            -
                  if line =~ /^\s*\[\s*([a-z0-9_\-]+)\s*\]\s*$/   # strict section
         | 
| 90 | 
            -
                    key = $1.to_s.dup
         | 
| 91 | 
            -
                    hash = top_hash[ key ] = Hash.new
         | 
| 92 | 
            -
                  elsif line =~ /^\s*\[\s*([^ \]]+)\s*\]\s*$/     # liberal section; allow everything in key
         | 
| 93 | 
            -
                    key = $1.to_s.dup
         | 
| 94 | 
            -
                    hash = top_hash[ key ] = Hash.new
         | 
| 95 | 
            -
                  elsif line =~ /^\s*([a-z0-9_\-]+)\s*[:=](.*)$/
         | 
| 96 | 
            -
                    key   = $1.to_s.dup
         | 
| 97 | 
            -
                    value = $2.to_s.strip.dup   # check if it can be nil? if yes use blank string e.g. ''
         | 
| 98 | 
            -
                    ### todo:  strip quotes from value??? why? why not?
         | 
| 99 | 
            -
                    hash[ key ] = value
         | 
| 100 | 
            -
                  else
         | 
| 101 | 
            -
                    puts "*** warn: skipping unknown line type in ini >#{line}<"
         | 
| 102 | 
            -
                  end
         | 
| 103 | 
            -
                end # each lines
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                top_hash
         | 
| 106 | 
            -
              end # method load
         | 
| 28 | 
            +
              # returns a nested hash
         | 
| 29 | 
            +
              #  (compatible structure - works like YAML.load_file)
         | 
| 107 30 |  | 
| 31 | 
            +
              def self.load_file( path  )   ConfUtils::IniFile.load_file( path );  end
         | 
| 32 | 
            +
              def self.load( text )         ConfUtils::IniFile.load( text );   end
         | 
| 108 33 |  | 
| 109 34 | 
             
            end  # module INI
         | 
| 110 35 |  | 
| 111 36 |  | 
| 37 | 
            +
            module ConfUtils
         | 
| 112 38 |  | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
              VERSION = '1.0.1'
         | 
| 116 | 
            -
             | 
| 117 | 
            -
              attr_reader :path
         | 
| 118 | 
            -
              attr_reader :parent
         | 
| 119 | 
            -
                
         | 
| 120 | 
            -
              def initialize( hash, path, parent=nil)
         | 
| 121 | 
            -
                @hash   = hash
         | 
| 122 | 
            -
                @path   = path
         | 
| 123 | 
            -
                @parent = parent
         | 
| 124 | 
            -
              end
         | 
| 125 | 
            -
                
         | 
| 126 | 
            -
              def self.load_file( path, parent=nil )
         | 
| 127 | 
            -
                h = YAML.load_file( path )
         | 
| 128 | 
            -
                Props.new( h, path, parent )
         | 
| 129 | 
            -
              end
         | 
| 130 | 
            -
              
         | 
| 131 | 
            -
              ### todo: use TOP_LEVEL_BINDING for binding default?
         | 
| 132 | 
            -
              def self.load_file_with_erb( path, binding, parent=nil )  # run through erb first
         | 
| 133 | 
            -
                text = ERB.new( File.read( path ) ).result( binding )
         | 
| 134 | 
            -
                h = YAML.load( text )
         | 
| 135 | 
            -
                Props.new( h, path, parent )
         | 
| 136 | 
            -
              end
         | 
| 137 | 
            -
                
         | 
| 138 | 
            -
              def dump   # for debugging
         | 
| 139 | 
            -
                puts "dump of >#{@path}<:"
         | 
| 140 | 
            -
                pp @hash
         | 
| 39 | 
            +
              def self.banner
         | 
| 40 | 
            +
                "props #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
         | 
| 141 41 | 
             
              end
         | 
| 142 42 |  | 
| 143 | 
            -
             | 
| 144 | 
            -
              def  | 
| 145 | 
            -
                 | 
| 146 | 
            -
                value.nil? ? default : value
         | 
| 43 | 
            +
            =begin
         | 
| 44 | 
            +
              def self.root
         | 
| 45 | 
            +
                "#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
         | 
| 147 46 | 
             
              end
         | 
| 47 | 
            +
            =end
         | 
| 148 48 |  | 
| 149 | 
            -
               | 
| 150 | 
            -
                value = get_from_section( section, key )
         | 
| 151 | 
            -
                value.nil? ? default : value
         | 
| 152 | 
            -
              end
         | 
| 49 | 
            +
            end  # module ConfUtils
         | 
| 153 50 |  | 
| 154 | 
            -
              def [](key)  get( key );  end
         | 
| 155 | 
            -
             | 
| 156 | 
            -
              def get( key )
         | 
| 157 | 
            -
                value = @hash.fetch( key.to_s, nil )
         | 
| 158 | 
            -
                # if not found try lookup in parent hash
         | 
| 159 | 
            -
                (value.nil? && parent) ? parent.get(key) : value
         | 
| 160 | 
            -
              end
         | 
| 161 | 
            -
             | 
| 162 | 
            -
              def get_from_section( section, key )
         | 
| 163 | 
            -
                value = @hash.fetch( section.to_s, {} ).fetch( key.to_s, nil )
         | 
| 164 | 
            -
                # if not found try lookup in parent hash
         | 
| 165 | 
            -
                (value.nil? && parent) ? parent.get_from_section(section,key) : value
         | 
| 166 | 
            -
              end
         | 
| 167 51 |  | 
| 168 | 
            -
             | 
| 52 | 
            +
            puts ConfUtils.banner    # say hello
         | 
    
        data/test/test_ini.rb
    CHANGED
    
    | @@ -6,8 +6,8 @@ | |
| 6 6 |  | 
| 7 7 | 
             
            require 'helper'
         | 
| 8 8 |  | 
| 9 | 
            -
            class TestIni < MiniTest::Unit::TestCase
         | 
| 10 9 |  | 
| 10 | 
            +
            class TestIni < MiniTest::Unit::TestCase
         | 
| 11 11 |  | 
| 12 12 | 
             
              def test_load
         | 
| 13 13 |  | 
| @@ -36,15 +36,15 @@ EOS | |
| 36 36 | 
             
                hash = INI.load( text )
         | 
| 37 37 | 
             
                pp hash
         | 
| 38 38 |  | 
| 39 | 
            -
                 | 
| 40 | 
            -
                 | 
| 41 | 
            -
                 | 
| 42 | 
            -
                 | 
| 43 | 
            -
                 | 
| 44 | 
            -
                 | 
| 45 | 
            -
                 | 
| 46 | 
            -
                 | 
| 47 | 
            -
                 | 
| 39 | 
            +
                assert_equal( 'hello', hash['key1'] )
         | 
| 40 | 
            +
                assert_equal( 'hi!',   hash['key2'] )
         | 
| 41 | 
            +
                assert_equal( 'salut', hash['section1']['key3'] )
         | 
| 42 | 
            +
                assert_equal( 'hola',  hash['section2']['key4'] )
         | 
| 43 | 
            +
                assert_equal( '',      hash['section2']['blank'] )
         | 
| 44 | 
            +
                assert_equal( '',      hash['section2']['blank2'] )
         | 
| 45 | 
            +
                assert_equal( 'A rose is a rose is a rose, eh?', hash['http://example.com']['title'] )
         | 
| 46 | 
            +
                assert_equal( 'A rose is a rose is a rose, eh?', hash['http://example.com']['title2'] )
         | 
| 47 | 
            +
                assert_equal( 'A rose is a rose is a rose, eh?', hash['http://example.com']['title3'] )
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 50 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: props
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.2
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-09- | 
| 12 | 
            +
            date: 2013-09-28 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rdoc
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &79922660 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ~>
         | 
| @@ -21,10 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: '3.10'
         | 
| 22 22 | 
             
              type: :development
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *79922660
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: hoe
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &79922080 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ~>
         | 
| @@ -32,7 +32,7 @@ dependencies: | |
| 32 32 | 
             
                    version: '3.3'
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *79922080
         | 
| 36 36 | 
             
            description: props - Manage Settings Hierachies (Commandline, User, Home, Defaults,
         | 
| 37 37 | 
             
              etc.)
         | 
| 38 38 | 
             
            email: webslideshow@googlegroups.com
         | 
| @@ -46,6 +46,14 @@ files: | |
| 46 46 | 
             
            - README.md
         | 
| 47 47 | 
             
            - Rakefile
         | 
| 48 48 | 
             
            - lib/props.rb
         | 
| 49 | 
            +
            - lib/props/db.rb
         | 
| 50 | 
            +
            - lib/props/db/deleter.rb
         | 
| 51 | 
            +
            - lib/props/db/models.rb
         | 
| 52 | 
            +
            - lib/props/db/schema.rb
         | 
| 53 | 
            +
            - lib/props/env.rb
         | 
| 54 | 
            +
            - lib/props/ini.rb
         | 
| 55 | 
            +
            - lib/props/props.rb
         | 
| 56 | 
            +
            - lib/props/version.rb
         | 
| 49 57 | 
             
            - test/helper.rb
         | 
| 50 58 | 
             
            - test/test_ini.rb
         | 
| 51 59 | 
             
            - .gemtest
         |