yip 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +13 -0
- data/README +58 -0
- data/examples/example1.yml +6 -0
- data/examples/example2.yml +15 -0
- data/lib/yip.rb +95 -0
- data/tests/test_yip.rb +39 -0
- metadata +45 -0
data/CHANGES
ADDED
data/README
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
INSTALLATION
|
2
|
+
|
3
|
+
sudo ruby install.rb
|
4
|
+
|
5
|
+
LICENSE
|
6
|
+
|
7
|
+
(c) 2003-2004 Bruce Williams <wbruce@gmail.com>
|
8
|
+
|
9
|
+
Free software; modify and redistribute it under
|
10
|
+
the same terms as Ruby itself
|
11
|
+
|
12
|
+
ABOUT
|
13
|
+
|
14
|
+
yip is a library which adds interpolation to whytheluckystiff's
|
15
|
+
(http://whytheluckystiff.net) YAML implementation, Syck (included with Ruby 1.8).
|
16
|
+
|
17
|
+
This library is designed primarily for use in configuration
|
18
|
+
files, but may be useful elsewhere.
|
19
|
+
|
20
|
+
HOW TO USE IT
|
21
|
+
|
22
|
+
yip uses YPATHs to find nodes referenced for interpolation. See
|
23
|
+
http://yaml.freepan.org/index.cgi?YpathBrainstorm for more
|
24
|
+
information on YPATH.
|
25
|
+
|
26
|
+
Here's a small example:
|
27
|
+
|
28
|
+
---
|
29
|
+
author: Bruce Williams
|
30
|
+
message: %author% wrote this.
|
31
|
+
|
32
|
+
=> { 'author' => 'Bruce Williams', 'message' => 'Bruce Williams
|
33
|
+
wrote this.' }
|
34
|
+
|
35
|
+
Simple interpolation is done using %YPATH% notation, as is done
|
36
|
+
above. You can also use a sprintf variant:
|
37
|
+
|
38
|
+
---
|
39
|
+
author: Bruce Williams
|
40
|
+
version: 0.8
|
41
|
+
message: >
|
42
|
+
%author% says, "Here's the version with two extra zeros %(version)1.3f"
|
43
|
+
|
44
|
+
The sprintf notation is the standard notation %1.3f, but the
|
45
|
+
YPATH is included in parenthesis after the '%'. This may look
|
46
|
+
eerily familiar to people with Python experience.
|
47
|
+
|
48
|
+
Note: In the event a YPATH resolves to a complex datatype, the data is
|
49
|
+
interpolated as YAML (without the document separator).
|
50
|
+
|
51
|
+
Take a look at the examples/ subdirectory for additional examples.
|
52
|
+
|
53
|
+
TODO
|
54
|
+
|
55
|
+
YAML::INTERPOLATION_PATTERN
|
56
|
+
I'd like to spruce up the sprintf-matching part of the Regexp
|
57
|
+
before releasing v1.0; at the moment it's a hack.
|
58
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
project: yip; YAML/YPATH Interpolation
|
3
|
+
author:
|
4
|
+
name: Bruce Williams
|
5
|
+
email:
|
6
|
+
- wbruce@gmail.com
|
7
|
+
- bruce@codedbliss.com
|
8
|
+
version: 0.8.2
|
9
|
+
description: |
|
10
|
+
%project% v%version% by %author/name%
|
11
|
+
Feel free to contact the author at one of the following
|
12
|
+
e-mail addresses for support:
|
13
|
+
%(author/email/0)20s primary
|
14
|
+
%(author/email/1)20s secondary
|
15
|
+
|
data/lib/yip.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
# yip; YAML + YPATH Interpolation
|
6
|
+
#
|
7
|
+
# (c) 2003-2004 Bruce Williams <wbruce@gmail.com>
|
8
|
+
# Free software; modify and redistribute it under
|
9
|
+
# the same terms as Ruby itself
|
10
|
+
#
|
11
|
+
|
12
|
+
module YAML
|
13
|
+
|
14
|
+
INTERPOLATION_PATTERN = /(%\((.+?)\)([^[:alpha:]]*[[:alpha:]]+)\b|%(.+?)%)/
|
15
|
+
|
16
|
+
# For circular YPATH references
|
17
|
+
class RecursiveInterpolationError < Exception; end
|
18
|
+
|
19
|
+
# For the attempted interpolation of nodes that don't exist
|
20
|
+
class MissingInterpolationError < Exception; end
|
21
|
+
|
22
|
+
# Interpolation method
|
23
|
+
# * Works similar to YAML::load
|
24
|
+
#
|
25
|
+
# Interpolation of values occurs within all YAML strings.
|
26
|
+
# Interpolation is done using one of two formats:
|
27
|
+
#
|
28
|
+
# %<YPATH ADDRESS>%
|
29
|
+
# %(<YPATH ADDRESS>)<Kernel::printf FORMAT STRING>
|
30
|
+
#
|
31
|
+
# Examples:
|
32
|
+
#
|
33
|
+
# %general/server description%
|
34
|
+
# %(general/server description)10s
|
35
|
+
#
|
36
|
+
# For more examples, see examples/
|
37
|
+
#
|
38
|
+
# Note: YPATH addresses that resolve to collections
|
39
|
+
# interpolate as YAML (sans document separator)
|
40
|
+
#
|
41
|
+
# Resources: http://yaml.freepan.org/index.cgi?YpathBrainstorm
|
42
|
+
def YAML::interpolate( data )
|
43
|
+
# get the node tree
|
44
|
+
nodes = YAML::parse( data )
|
45
|
+
# give the DefaultLoader access to the node tree
|
46
|
+
YAML::Syck::DefaultLoader.instance_eval{ @nodes = nodes }
|
47
|
+
# do the deed
|
48
|
+
nodes.transform
|
49
|
+
rescue SystemStackError
|
50
|
+
raise YAML::RecursiveInterpolationError::new( "Circular YPATH references found; could not interpolate" )
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
module Syck
|
55
|
+
|
56
|
+
class Loader
|
57
|
+
|
58
|
+
alias_method :old_transfer, :transfer
|
59
|
+
|
60
|
+
# A redefinition of Syck::Loader#transfer to allow
|
61
|
+
# for interpolation of nodes
|
62
|
+
def transfer( yaml_type, value )
|
63
|
+
new_value = value.dup
|
64
|
+
# If a node tree has been given (second pass), and it's a string, interpolate
|
65
|
+
if @nodes and yaml_type =~ /str$/
|
66
|
+
value.scan(YAML::INTERPOLATION_PATTERN) do |field,sprintf_ypath,sprintf_format,plain_ypath|
|
67
|
+
ypath = sprintf_ypath || plain_ypath
|
68
|
+
format = "%#{sprintf_format || 's'}"
|
69
|
+
results = @nodes.select!( ypath )
|
70
|
+
replace = /#{Regexp::escape field}/
|
71
|
+
case results[0]
|
72
|
+
when nil
|
73
|
+
raise YAML::MissingInterpolationError::new( "Could not find any nodes matching YPATH '#{ypath}'" )
|
74
|
+
when String
|
75
|
+
new_value.gsub!( replace, format % results[0].to_s )
|
76
|
+
when Numeric
|
77
|
+
new_value.gsub!( replace, format % results[0].to_s )
|
78
|
+
else
|
79
|
+
new_value.gsub!( replace, format % results[0].to_yaml.sub(/^---\s*/, "\n") )
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
old_transfer( yaml_type, new_value )
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
if $0 == __FILE__ and File::exists?( ARGV[0].to_s )
|
93
|
+
data = File::read ARGV[0]
|
94
|
+
puts YAML::interpolate( data ).to_yaml
|
95
|
+
end
|
data/tests/test_yip.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
$: << File::join(File::dirname(__FILE__),'../lib')
|
5
|
+
require 'yip'
|
6
|
+
|
7
|
+
class TestYIP < Test::Unit::TestCase
|
8
|
+
|
9
|
+
YML_SERVER = YAML::interpolate(<<EOY)
|
10
|
+
---
|
11
|
+
server:
|
12
|
+
port: 2020
|
13
|
+
host: localhost
|
14
|
+
motd: the host is %server/host%
|
15
|
+
full_motd: the server is %server%
|
16
|
+
port5: %(server/port)05d
|
17
|
+
bad_port5: %(server/port)05d%
|
18
|
+
EOY
|
19
|
+
|
20
|
+
def test_plain
|
21
|
+
assert_equal(
|
22
|
+
YAML::interpolate("---\na: ok\nb: %a%"),
|
23
|
+
{'a'=>'ok','b'=>'ok'} )
|
24
|
+
assert_equal( YML_SERVER['motd'], "the host is localhost" )
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_sprintf
|
28
|
+
assert_equal( YML_SERVER['port5'], '02020',
|
29
|
+
"sprintf-style behavior (w/ digit interpolation) failed")
|
30
|
+
assert_not_equal( YML_SERVER['bad_port5'], '02020',
|
31
|
+
"sprintf-style w/ trailing '%' behavior failed" )
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_sequence
|
35
|
+
assert_equal(YML_SERVER['full_motd'], "the server is \nport: 2020\nhost: localhost",
|
36
|
+
"Interpolation of sequences behavior failed")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.1
|
3
|
+
specification_version: 1
|
4
|
+
name: yip
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.8.2
|
7
|
+
date: 2004-10-02
|
8
|
+
summary: Adds interpolation to YAML; primarily for use in configuration files
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
author: Bruce Williams
|
12
|
+
email: wbruce@gmail.com
|
13
|
+
homepage:
|
14
|
+
rubyforge_project:
|
15
|
+
description:
|
16
|
+
autorequire: yip
|
17
|
+
default_executable:
|
18
|
+
bindir: bin
|
19
|
+
has_rdoc: true
|
20
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
21
|
+
requirements:
|
22
|
+
-
|
23
|
+
- ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 1.8.0
|
26
|
+
version:
|
27
|
+
platform: ruby
|
28
|
+
files:
|
29
|
+
- lib/yip.rb
|
30
|
+
- examples/example1.yml
|
31
|
+
- examples/example2.yml
|
32
|
+
- examples/examples
|
33
|
+
- tests/test_yip.rb
|
34
|
+
- README
|
35
|
+
- CHANGES
|
36
|
+
test_files:
|
37
|
+
- tests/test_yip.rb
|
38
|
+
rdoc_options: []
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README
|
41
|
+
- CHANGES
|
42
|
+
executables: []
|
43
|
+
extensions: []
|
44
|
+
requirements: []
|
45
|
+
dependencies: []
|