wright 0.4.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +10 -3
- data/NEWS.md +8 -0
- data/README.md +9 -16
- data/lib/wright/cli.rb +25 -24
- data/lib/wright/config.rb +5 -3
- data/lib/wright/dsl.rb +52 -9
- data/lib/wright/logger.rb +1 -1
- data/lib/wright/provider.rb +8 -5
- data/lib/wright/provider/directory.rb +2 -2
- data/lib/wright/provider/file.rb +4 -4
- data/lib/wright/provider/group.rb +4 -4
- data/lib/wright/provider/package.rb +3 -3
- data/lib/wright/provider/package/apt.rb +1 -1
- data/lib/wright/provider/package/yum.rb +1 -1
- data/lib/wright/provider/symlink.rb +2 -2
- data/lib/wright/provider/user.rb +8 -8
- data/lib/wright/resource.rb +21 -19
- data/lib/wright/resource/directory.rb +21 -10
- data/lib/wright/resource/file.rb +25 -14
- data/lib/wright/resource/group.rb +16 -9
- data/lib/wright/resource/package.rb +14 -9
- data/lib/wright/resource/symlink.rb +10 -8
- data/lib/wright/resource/user.rb +30 -9
- data/lib/wright/util.rb +14 -2
- data/lib/wright/util/erb_renderer.rb +29 -0
- data/lib/wright/util/file.rb +1 -1
- data/lib/wright/util/file_owner.rb +8 -3
- data/lib/wright/util/file_permissions.rb +14 -12
- data/lib/wright/util/file_renderer.rb +50 -0
- data/lib/wright/util/mustache_renderer.rb +41 -0
- data/lib/wright/util/pencil_mustache.rb +58 -0
- data/lib/wright/version.rb +1 -1
- data/man/wright.1 +10 -11
- data/spec/dsl_spec.rb +72 -7
- data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.return → apt-get_-qy_--purge_remove_abcde.return} +0 -0
- data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stderr → apt-get_-qy_--purge_remove_abcde.stderr} +0 -0
- data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stdout → apt-get_-qy_--purge_remove_abcde.stdout} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.return → apt-get_-qy_install_abcde=2.5.4-1.return} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stderr → apt-get_-qy_install_abcde=2.5.4-1.stderr} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stdout → apt-get_-qy_install_abcde=2.5.4-1.stdout} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_htop.return → apt-get_-qy_install_htop.return} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_htop.stderr → apt-get_-qy_install_htop.stderr} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_htop.stdout → apt-get_-qy_install_htop.stdout} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.return → apt-get_-qy_install_not-a-real-package.return} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stderr → apt-get_-qy_install_not-a-real-package.stderr} +0 -0
- data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stdout → apt-get_-qy_install_not-a-real-package.stdout} +0 -0
- data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.return → apt-get_-qy_remove_abcde.return} +0 -0
- data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stderr → apt-get_-qy_remove_abcde.stderr} +0 -0
- data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stdout → apt-get_-qy_remove_abcde.stdout} +0 -0
- data/spec/provider/package/apt_spec.rb +2 -2
- data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.return → yum_-y_install_mc-4.8.7-8.el7.return} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stderr → yum_-y_install_mc-4.8.7-8.el7.stderr} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stdout → yum_-y_install_mc-4.8.7-8.el7.stdout} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_nano.return → yum_-y_install_nano.return} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_nano.stderr → yum_-y_install_nano.stderr} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_nano.stdout → yum_-y_install_nano.stdout} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.return → yum_-y_install_not-a-real-package.return} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stderr → yum_-y_install_not-a-real-package.stderr} +0 -0
- data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stdout → yum_-y_install_not-a-real-package.stdout} +0 -0
- data/spec/provider/package/yum/{yum_remove_-y_screen.return → yum_-y_remove_screen.return} +0 -0
- data/spec/provider/package/yum/{yum_remove_-y_screen.stderr → yum_-y_remove_screen.stderr} +0 -0
- data/spec/provider/package/yum/{yum_remove_-y_screen.stdout → yum_-y_remove_screen.stdout} +0 -0
- data/spec/provider/package/yum_spec.rb +1 -1
- data/spec/resource/directory_spec.rb +15 -0
- data/spec/resource/file_spec.rb +17 -0
- data/spec/resource/group_spec.rb +15 -0
- data/spec/resource/package_spec.rb +13 -0
- data/spec/resource/symlink_spec.rb +11 -0
- data/spec/resource/user_spec.rb +32 -0
- data/spec/resource_spec.rb +18 -10
- data/spec/spec_helper.rb +1 -0
- data/spec/spec_helpers/fake_capture3.rb +1 -1
- data/spec/util/erb_renderer_spec.rb +23 -0
- data/spec/util/file_owner_spec.rb +19 -0
- data/spec/util/file_renderer_spec.rb +28 -0
- data/spec/util/mustache_renderer_spec.rb +57 -0
- data/spec/util/pencil_mustache_spec.rb +15 -0
- data/spec/util_spec.rb +17 -3
- metadata +90 -64
@@ -6,17 +6,19 @@ module Wright
|
|
6
6
|
# Symlink resource, represents a symlink.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
-
# link = Wright::Resource::Symlink.new('/tmp/fstab')
|
10
|
-
# link.to = '/etc/fstab'
|
9
|
+
# link = Wright::Resource::Symlink.new('/tmp/fstab', to: '/etc/fstab')
|
11
10
|
# link.create
|
12
11
|
class Symlink < Wright::Resource
|
13
12
|
# Initializes a Symlink.
|
14
13
|
#
|
15
14
|
# @param name [String] the symlink's name
|
16
|
-
|
15
|
+
# @param args [Hash] the arguments
|
16
|
+
# @option args [Symbol] :action (:create) the action
|
17
|
+
# @option args [String] :to the symlink's target
|
18
|
+
def initialize(name, args = {})
|
17
19
|
super
|
18
|
-
@
|
19
|
-
@
|
20
|
+
@action = args.fetch(:action, :create)
|
21
|
+
@to = args.fetch(:to, nil)
|
20
22
|
end
|
21
23
|
|
22
24
|
# @return [String] the symlink's intended target
|
@@ -27,9 +29,9 @@ module Wright
|
|
27
29
|
# @return [Bool] true if the symlink was updated and false
|
28
30
|
# otherwise
|
29
31
|
def create
|
30
|
-
fail ArgumentError, 'Symlink target undefined' unless
|
32
|
+
fail ArgumentError, 'Symlink target undefined' unless to
|
31
33
|
might_update_resource do
|
32
|
-
|
34
|
+
provider.create
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
@@ -39,7 +41,7 @@ module Wright
|
|
39
41
|
# otherwise
|
40
42
|
def remove
|
41
43
|
might_update_resource do
|
42
|
-
|
44
|
+
provider.remove
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
data/lib/wright/resource/user.rb
CHANGED
@@ -6,8 +6,7 @@ module Wright
|
|
6
6
|
# User resource, represents a user.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
-
# johndoe = Wright::Resource::User.new('johndoe')
|
10
|
-
# johndoe.home = '/home/johndoe'
|
9
|
+
# johndoe = Wright::Resource::User.new('johndoe', home: '/home/johndoe')
|
11
10
|
# johndoe.create
|
12
11
|
class User < Wright::Resource
|
13
12
|
# @return [Integer] the user's intended user id
|
@@ -37,10 +36,26 @@ module Wright
|
|
37
36
|
# Initializes a user.
|
38
37
|
#
|
39
38
|
# @param name [String] the user's name
|
40
|
-
|
39
|
+
# @param args [Hash] the arguments
|
40
|
+
# @option args [Symbol] :action (:create) the action
|
41
|
+
# @option args [Integer] :uid the user's uid
|
42
|
+
# @option args [String] :full_name the user's full name
|
43
|
+
# @option args [Array<String>] :groups the user's groups
|
44
|
+
# @option args [String] :shell the user's shell
|
45
|
+
# @option args [String] :home the user's home directory
|
46
|
+
# @option args [String] :primary_group the user's primary group
|
47
|
+
# @option args [Bool] :system (false) denotes whether the user
|
48
|
+
# should be a system user or not
|
49
|
+
def initialize(name, args = {})
|
41
50
|
super
|
42
|
-
@action
|
43
|
-
@
|
51
|
+
@action = args.fetch(:action, :create)
|
52
|
+
@uid = args.fetch(:uid, nil)
|
53
|
+
@full_name = args.fetch(:full_name, nil)
|
54
|
+
@groups = args.fetch(:groups, nil)
|
55
|
+
@shell = args.fetch(:shell, nil)
|
56
|
+
@home = fetch_last(args, [:home, :homedir], nil)
|
57
|
+
@primary_group = fetch_last(args, [:primary_group, :login_group], nil)
|
58
|
+
@system = args.fetch(:system, false)
|
44
59
|
end
|
45
60
|
|
46
61
|
# Creates or updates the user.
|
@@ -49,7 +64,7 @@ module Wright
|
|
49
64
|
# otherwise
|
50
65
|
def create
|
51
66
|
might_update_resource do
|
52
|
-
|
67
|
+
provider.create
|
53
68
|
end
|
54
69
|
end
|
55
70
|
|
@@ -59,9 +74,15 @@ module Wright
|
|
59
74
|
# otherwise
|
60
75
|
def remove
|
61
76
|
might_update_resource do
|
62
|
-
|
77
|
+
provider.remove
|
63
78
|
end
|
64
79
|
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def fetch_last(hash, candidate_keys, default = nil)
|
84
|
+
Wright::Util.fetch_last(hash, candidate_keys, default)
|
85
|
+
end
|
65
86
|
end
|
66
87
|
end
|
67
88
|
end
|
@@ -70,9 +91,9 @@ Wright::DSL.register_resource(Wright::Resource::User)
|
|
70
91
|
|
71
92
|
user_providers = {
|
72
93
|
'debian' => 'Wright::Provider::User::GnuPasswd',
|
73
|
-
'rhel' => 'Wright::Provider::User::GnuPasswd',
|
74
94
|
'fedora' => 'Wright::Provider::User::GnuPasswd',
|
75
|
-
'
|
95
|
+
'rhel' => 'Wright::Provider::User::GnuPasswd',
|
96
|
+
'osx' => 'Wright::Provider::User::DarwinDirectoryService'
|
76
97
|
}
|
77
98
|
Wright::Config[:resources][:user] ||= {}
|
78
99
|
Wright::Config[:resources][:user][:provider] ||=
|
data/lib/wright/util.rb
CHANGED
@@ -56,7 +56,7 @@ module Wright
|
|
56
56
|
# # => "debian"
|
57
57
|
# @example
|
58
58
|
# Wright::Util.os_family
|
59
|
-
# # => "
|
59
|
+
# # => "osx"
|
60
60
|
#
|
61
61
|
# @return [String] the system's OS family (base distribution for
|
62
62
|
# GNU/Linux systems) or 'other' for unknown operating systems
|
@@ -64,7 +64,7 @@ module Wright
|
|
64
64
|
system_arch = RbConfig::CONFIG['target_os']
|
65
65
|
case system_arch
|
66
66
|
when /darwin/
|
67
|
-
'
|
67
|
+
'osx'
|
68
68
|
when /linux/
|
69
69
|
distro
|
70
70
|
else
|
@@ -85,5 +85,17 @@ module Wright
|
|
85
85
|
yield
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
# Fetches the value of the candidate key that occurs last in a hash.
|
90
|
+
#
|
91
|
+
# @param hash [Hash] the hash
|
92
|
+
# @param candidate_keys [Array<Object>] the candidate keys
|
93
|
+
# @param default [Object] the default value
|
94
|
+
# @return [Object] the value of the candidate key that occurs last in
|
95
|
+
# the hash or +default+ if none of the candidate keys can be found
|
96
|
+
def self.fetch_last(hash, candidate_keys, default = nil)
|
97
|
+
candidates = hash.select { |k, _v| candidate_keys.include?(k) }
|
98
|
+
candidates.empty? ? default : candidates.values.last
|
99
|
+
end
|
88
100
|
end
|
89
101
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Wright
|
4
|
+
module Util
|
5
|
+
# ERB renderer.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# template = "foo is <%= foo %>."
|
9
|
+
# hash = { foo: :bar }
|
10
|
+
# Wright::Util::ErbRenderer.new(hash).render(template)
|
11
|
+
# # => "foo is bar."
|
12
|
+
class ErbRenderer
|
13
|
+
def initialize(hash)
|
14
|
+
hash.each do |k, v|
|
15
|
+
instance_var = "@#{k}"
|
16
|
+
instance_variable_set(instance_var, v)
|
17
|
+
define_singleton_method(k) { instance_variable_get(instance_var) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Renders an ERB template.
|
22
|
+
# @param template [String] the template
|
23
|
+
# @return [String] the rendered template
|
24
|
+
def render(template)
|
25
|
+
ERB.new(template).result(binding)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/wright/util/file.rb
CHANGED
@@ -54,7 +54,7 @@ module Wright
|
|
54
54
|
private_constant :MODE_MAP
|
55
55
|
|
56
56
|
def self.mode_mask(mode, is_directory)
|
57
|
-
mode.
|
57
|
+
mode.tr!('X', 'x') if is_directory
|
58
58
|
mode.chars.reduce(0) { |a, e| a | MODE_MAP[e].to_i }
|
59
59
|
end
|
60
60
|
private_class_method :mode_mask
|
@@ -9,9 +9,14 @@ module Wright
|
|
9
9
|
# @return [String, Integer] the group's name or gid
|
10
10
|
attr_accessor :group
|
11
11
|
|
12
|
+
def initialize(user_and_group = nil, group = nil)
|
13
|
+
self.user_and_group = user_and_group
|
14
|
+
self.group = group if group
|
15
|
+
end
|
16
|
+
|
12
17
|
# Sets user and group simultaneously.
|
13
18
|
#
|
14
|
-
# @param [String, Integer]
|
19
|
+
# @param user_and_group [String, Integer] a user in +user:group+
|
15
20
|
# notation or a uid
|
16
21
|
#
|
17
22
|
# @example
|
@@ -38,8 +43,8 @@ module Wright
|
|
38
43
|
# one colon
|
39
44
|
def user_and_group=(user_and_group)
|
40
45
|
user, group = split_user_and_group(user_and_group)
|
41
|
-
|
42
|
-
|
46
|
+
self.user = user
|
47
|
+
self.group = group if group
|
43
48
|
end
|
44
49
|
|
45
50
|
private
|
@@ -60,8 +60,8 @@ module Wright
|
|
60
60
|
|
61
61
|
mode_i = File.numeric_mode_to_i(mode)
|
62
62
|
unless mode_i
|
63
|
-
base_mode_i = ::File.exist?(
|
64
|
-
mode_i = File.symbolic_mode_to_i(mode, base_mode_i,
|
63
|
+
base_mode_i = ::File.exist?(filename) ? current_mode : default_mode
|
64
|
+
mode_i = File.symbolic_mode_to_i(mode, base_mode_i, filetype)
|
65
65
|
end
|
66
66
|
@mode = mode_i
|
67
67
|
end
|
@@ -70,7 +70,7 @@ module Wright
|
|
70
70
|
# @return [Bool] +true+ if the file is up to date, +false+
|
71
71
|
# otherwise
|
72
72
|
def uptodate?
|
73
|
-
if ::File.exist?(
|
73
|
+
if ::File.exist?(filename)
|
74
74
|
uid_uptodate? && gid_uptodate? && mode_uptodate?
|
75
75
|
else
|
76
76
|
false
|
@@ -81,41 +81,43 @@ module Wright
|
|
81
81
|
#
|
82
82
|
# @return [void]
|
83
83
|
def update
|
84
|
-
::File.chmod(
|
85
|
-
::File.chown(
|
84
|
+
::File.chmod(mode, filename) if mode
|
85
|
+
::File.chown(uid, gid, filename) if uid || gid
|
86
86
|
end
|
87
87
|
|
88
88
|
# @return [Integer] the file's current mode
|
89
89
|
def current_mode
|
90
|
-
Wright::Util::File.file_mode(
|
90
|
+
Wright::Util::File.file_mode(filename)
|
91
91
|
end
|
92
92
|
|
93
93
|
# @return [Integer] the file's current owner's uid
|
94
94
|
def current_uid
|
95
|
-
Wright::Util::File.file_owner(
|
95
|
+
Wright::Util::File.file_owner(filename)
|
96
96
|
end
|
97
97
|
|
98
98
|
# @return [Integer] the file's current group's gid
|
99
99
|
def current_gid
|
100
|
-
Wright::Util::File.file_group(
|
100
|
+
Wright::Util::File.file_group(filename)
|
101
101
|
end
|
102
102
|
|
103
103
|
private
|
104
104
|
|
105
|
+
attr_reader :filetype
|
106
|
+
|
105
107
|
def uid_uptodate?
|
106
|
-
|
108
|
+
uid.nil? || current_uid == uid
|
107
109
|
end
|
108
110
|
|
109
111
|
def gid_uptodate?
|
110
|
-
|
112
|
+
gid.nil? || current_gid == gid
|
111
113
|
end
|
112
114
|
|
113
115
|
def mode_uptodate?
|
114
|
-
|
116
|
+
mode.nil? || current_mode == mode
|
115
117
|
end
|
116
118
|
|
117
119
|
def default_mode
|
118
|
-
case
|
120
|
+
case filetype
|
119
121
|
when :file
|
120
122
|
~::File.umask & 0666
|
121
123
|
when :directory
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'wright/util/erb_renderer'
|
2
|
+
require 'wright/util/mustache_renderer'
|
3
|
+
|
4
|
+
module Wright
|
5
|
+
module Util
|
6
|
+
# File renderer.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# filename = 'template.erb'
|
10
|
+
# template = "foo is <%= foo %>."
|
11
|
+
# hash = { foo: :bar }
|
12
|
+
# File.write(filename, template)
|
13
|
+
# renderer = Wright::Util::FileRenderer.new(hash)
|
14
|
+
# renderer.render(filename)
|
15
|
+
# # => "foo is bar."
|
16
|
+
class FileRenderer
|
17
|
+
# Initializes a FileTemplate.
|
18
|
+
# @param hash [Hash] the attribute hash of the template
|
19
|
+
def initialize(hash)
|
20
|
+
@hash = hash
|
21
|
+
end
|
22
|
+
|
23
|
+
# Renders a template file.
|
24
|
+
# @param filename [String] the filename of the template
|
25
|
+
# @raise [ArgumentError] if the given file type is not supported
|
26
|
+
def render(filename)
|
27
|
+
renderer = renderer_for_file(filename)
|
28
|
+
template = ::File.read(::File.expand_path(filename))
|
29
|
+
renderer.render(template)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :hash
|
35
|
+
|
36
|
+
FILE_RENDERERS = {
|
37
|
+
'.erb' => ErbRenderer,
|
38
|
+
'.mustache' => MustacheRenderer
|
39
|
+
}
|
40
|
+
|
41
|
+
def renderer_for_file(filename)
|
42
|
+
file_extension = ::File.extname(filename)
|
43
|
+
rendering_class = FILE_RENDERERS[file_extension]
|
44
|
+
unknown_template_type = "unknown template type '#{file_extension}'"
|
45
|
+
fail ArgumentError, unknown_template_type unless rendering_class
|
46
|
+
rendering_class.new(hash)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
begin
|
2
|
+
require 'mustache'
|
3
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'wright/util/pencil_mustache'
|
7
|
+
|
8
|
+
module Wright
|
9
|
+
module Util
|
10
|
+
# Mustache renderer.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# template = "foo is {{foo}}."
|
14
|
+
# hash = { foo: :bar }
|
15
|
+
# Wright::Util::MustacheRenderer.new(hash).render(template)
|
16
|
+
# # => "foo is bar."
|
17
|
+
class MustacheRenderer
|
18
|
+
def initialize(hash)
|
19
|
+
@hash = hash
|
20
|
+
@mustache = select_mustache
|
21
|
+
end
|
22
|
+
|
23
|
+
# Renders a Mustache template.
|
24
|
+
# @param template [String] the template
|
25
|
+
# @return [String] the rendered template
|
26
|
+
def render(template)
|
27
|
+
@mustache.render(template, @hash)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def select_mustache
|
33
|
+
return PencilMustache.new unless defined?(Mustache)
|
34
|
+
|
35
|
+
mustache = Mustache.new
|
36
|
+
mustache.raise_on_context_miss = true
|
37
|
+
mustache
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# The code in this file is largely copied from PencilMustache by
|
2
|
+
# Benjamin Oakes. The original code can be found at
|
3
|
+
# https://github.com/benjaminoakes/pencil_mustache.
|
4
|
+
#
|
5
|
+
# The following is a verbatim copy of the original license (MIT):
|
6
|
+
#
|
7
|
+
# Copyright (c) 2012 Benjamin Oakes
|
8
|
+
#
|
9
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
10
|
+
# a copy of this software and associated documentation files (the
|
11
|
+
# "Software"), to deal in the Software without restriction, including
|
12
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
13
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
14
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
15
|
+
# the following conditions:
|
16
|
+
#
|
17
|
+
# The above copyright notice and this permission notice shall be
|
18
|
+
# included in all copies or substantial portions of the Software.
|
19
|
+
#
|
20
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
21
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
23
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
24
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
25
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
26
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27
|
+
|
28
|
+
module Wright
|
29
|
+
module Util
|
30
|
+
# PencilMustache class.
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# pencil_mustache = Wright::Util::PencilMustache.new
|
34
|
+
# template = "foo is {{foo}}."
|
35
|
+
# hash = { foo: :bar }
|
36
|
+
# pencil_mustache.render(template, hash)
|
37
|
+
# # => "foo is bar."
|
38
|
+
class PencilMustache
|
39
|
+
# Renders a Mustache template using the supplied hash.
|
40
|
+
# @param template [String] the template
|
41
|
+
# @param hash [Hash] the hash
|
42
|
+
# @return [String] the rendered template
|
43
|
+
# @todo Raise NameError if necessary.
|
44
|
+
# @todo Add support for triple whiskers.
|
45
|
+
def render(template, hash)
|
46
|
+
template.gsub(/{{.*?}}/, add_whiskers(hash))
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def add_whiskers(doc)
|
52
|
+
with_whiskers = {}
|
53
|
+
doc.keys.each { |k| with_whiskers["{{#{k}}}"] = doc[k] }
|
54
|
+
with_whiskers
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|