aboutsummaryrefslogtreecommitdiff
path: root/lib/puppet/provider
diff options
context:
space:
mode:
authorJacob Helwig <jacob@technosorcery.net>2018-07-16 09:09:30 -0700
committerJacob Helwig <jacob@technosorcery.net>2018-07-16 09:09:30 -0700
commitbe1d15019ddd7b51965fa204f6e837f83297e7c6 (patch)
tree09e4d10797933b2b5affbdb7ff5cde78f4af8c56 /lib/puppet/provider
parenteec1c193d9043622bf27e162dfb8ffb248ae0caa (diff)
downloadpuppet-augeas_core-be1d15019ddd7b51965fa204f6e837f83297e7c6.tar.gz
puppet-augeas_core-be1d15019ddd7b51965fa204f6e837f83297e7c6.tar.bz2
(maint) Move array parser logic into a util module
Diffstat (limited to 'lib/puppet/provider')
-rw-r--r--lib/puppet/provider/augeas/augeas.rb192
1 files changed, 6 insertions, 186 deletions
diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
index b64b0b3..ee52ee6 100644
--- a/lib/puppet/provider/augeas/augeas.rb
+++ b/lib/puppet/provider/augeas/augeas.rb
@@ -18,11 +18,13 @@ require 'strscan'
require 'puppet/util'
require 'puppet/util/diff'
require 'puppet/util/package'
+require 'puppet_x/augeas/util/parser'
Puppet::Type.type(:augeas).provide(:augeas) do
include Puppet::Util
include Puppet::Util::Diff
include Puppet::Util::Package
+ include PuppetX::Augeas::Util::Parser
confine feature: :augeas
@@ -280,7 +282,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
when '=='
begin
arg = clause_array.shift
- new_array = to_array(arg)
+ new_array = parse_to_array(arg)
return_value = (values == new_array)
rescue
fail(_('Invalid array in command: %{cmd}') % { cmd: cmd_array.join(' ') })
@@ -288,7 +290,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
when '!='
begin
arg = clause_array.shift
- new_array = to_array(arg)
+ new_array = parse_to_array(arg)
return_value = (values != new_array)
rescue
fail(_('Invalid array in command: %{cmd}') % { cmd: cmd_array.join(' ') })
@@ -336,7 +338,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
when '=='
begin
arg = clause_array.shift
- new_array = to_array(arg)
+ new_array = parse_to_array(arg)
return_value = (result == new_array)
rescue
fail(_('Invalid array in command: %{cmd}') % { cmd: cmd_array.join(' ') })
@@ -344,7 +346,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
when '!='
begin
arg = clause_array.shift
- new_array = to_array(arg)
+ new_array = parse_to_array(arg)
return_value = (result != new_array)
rescue
fail(_('Invalid array in command: %{cmd}') % { cmd: cmd_array.join(' ') })
@@ -571,186 +573,4 @@ Puppet::Type.type(:augeas).provide(:augeas) do
end
end
# rubocop:enable Style/GuardClause
-
- def to_array(string)
- s = StringScanner.new(string)
- match = array_open(s)
- raise "Unable to parse array. Unexpected character at: #{s.rest}" if match.nil?
-
- array_content = array_values(s)
-
- match = array_close(s)
- raise "Unable to parse array. Unexpected character at: #{s.rest}" if match.nil?
-
- array_content
- end
- private :to_array
-
- def array_open(scanner)
- scanner.scan(%r{\s*\[\s*})
- end
- private :array_open
-
- def array_close(scanner)
- scanner.scan(%r{\s*\]\s*})
- end
- private :array_close
-
- def array_separator(scanner)
- scanner.scan(%r{\s*,\s*})
- end
- private :array_separator
-
- def single_quote_unescaped_char(scanner)
- scanner.scan(%r{[^'\\]})
- end
- private :single_quote_unescaped_char
-
- def single_quote_escaped_char(scanner)
- scanner.scan(%r{\\(['\\])}) && scanner[1]
- end
- private :single_quote_escaped_char
-
- def single_quote_char(scanner)
- single_quote_escaped_char(scanner) || single_quote_unescaped_char(scanner)
- end
- private :single_quote_char
-
- def double_quote_unescaped_char(scanner)
- scanner.scan(%r{[^"\\]})
- end
- private :double_quote_unescaped_char
-
- # This handles the possible Ruby escape sequences in double-quoted strings,
- # except for \M-x, \M-\C-x, \M-\cx, \c\M-x, \c?, and \C-?. The full list of
- # escape sequences, and their meanings is taken from:
- # https://github.com/ruby/ruby/blob/90fdfec11a4a42653722e2ce2a672d6e87a57b8e/doc/syntax/literals.rdoc#strings
- def double_quote_escaped_char(scanner)
- match = scanner.scan(%r{\\(["\\abtnvfres0-7xu])})
- return nil if match.nil?
-
- case scanner[1]
- when '\\' then return '\\'
- when '"' then return '"'
- when 'a' then return "\a"
- when 'b' then return "\b"
- when 't' then return "\t"
- when 'n' then return "\n"
- when 'v' then return "\v"
- when 'f' then return "\f"
- when 'r' then return "\r"
- when 'e' then return "\e"
- when 's' then return "\s"
- when %r{[0-7]}
- octal_character = scanner[1]
- other_digits = scanner.scan(%r{[0-7]{1,2}})
- octal_character << other_digits unless other_digits.nil?
-
- return octal_character.to_i(8).chr
- when 'x'
- hex_character = scanner.scan(%r{[0-9a-fA-F]{1,2}})
- return nil if hex_character.nil?
-
- hex_character.to_i(16).chr
- when 'u'
- return unicode_short_hex_character(scanner) || unicode_long_hex_characters(scanner)
- else
- # Not a valid escape sequence as far as we're concerned.
- return nil
- end
- end
- private :double_quote_escaped_char
-
- def unicode_short_hex_character(scanner)
- unicode_character = scanner.scan(%r{[0-9a-fA-F]{4}})
- return nil if unicode_character.nil?
-
- [unicode_character.hex].pack 'U'
- end
- private :unicode_short_hex_character
-
- def unicode_long_hex_characters(scanner)
- unicode_string = ''
- return nil unless scanner.scan(%r|{|)
-
- loop do
- char = scanner.scan(%r{[0-9a-fA-F]{1,6}})
- break if char.nil?
- unicode_string << [char.hex].pack('U')
-
- separator = scanner.scan(%r{\s})
- break if separator.nil?
- end
-
- return nil if scanner.scan(%r|}|).nil? || unicode_string.empty?
-
- unicode_string
- end
- private :unicode_long_hex_characters
-
- def single_quoted_string(scanner)
- quoted_string = ''
-
- match = scanner.scan(%r{'})
- return nil if match.nil?
-
- loop do
- match = single_quote_char(scanner)
- break if match.nil?
-
- quoted_string << match
- end
-
- match = scanner.scan(%r{'})
- return quoted_string if match
-
- nil
- end
- private :single_quoted_string
-
- def double_quote_char(scanner)
- double_quote_escaped_char(scanner) || double_quote_unescaped_char(scanner)
- end
- private :double_quote_char
-
- def double_quoted_string(scanner)
- quoted_string = ''
-
- match = scanner.scan(%r{"})
- return nil if match.nil?
-
- loop do
- match = double_quote_char(scanner)
- break if match.nil?
-
- quoted_string << match
- end
-
- match = scanner.scan(%r{"})
- return quoted_string if match
-
- nil
- end
- private :double_quoted_string
-
- def quoted_string(scanner)
- single_quoted_string(scanner) || double_quoted_string(scanner)
- end
- private :quoted_string
-
- def array_values(scanner)
- values = []
-
- loop do
- match = quoted_string(scanner)
- break if match.nil?
- values << match
-
- match = array_separator(scanner)
- break if match.nil?
- end
-
- values
- end
- private :array_values
end