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
|