Class: Mvp::PuppetfileParser
- Inherits:
-
Object
- Object
- Mvp::PuppetfileParser
- Defined in:
- lib/mvp/puppetfile_parser.rb
Instance Method Summary collapse
- #add_module(name, args) ⇒ Object
- #canonical_git_repo(repo) ⇒ Object
- #canonical_name(name, repo) ⇒ Object
-
#initialize(options = {}) ⇒ PuppetfileParser
constructor
A new instance of PuppetfileParser.
- #parse(repo) ⇒ Object
- #parse_args(name, args) ⇒ Object
- #sources=(modules) ⇒ Object
- #stringify(row) ⇒ Object
- #suitable? ⇒ Boolean
- #test ⇒ Object
- #traverse(node) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ PuppetfileParser
Returns a new instance of PuppetfileParser.
3 4 5 6 7 |
# File 'lib/mvp/puppetfile_parser.rb', line 3 def initialize( = {}) @sources = {} @modules = [] @repo = nil end |
Instance Method Details
#add_module(name, args) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/mvp/puppetfile_parser.rb', line 68 def add_module(name, args) unless name.is_a? String $logger.warn "Non string module name in #{@repo[:repo_name]}/Puppetfile" return nil end name.gsub!('/', '-') case args when String, Symbol, NilClass @modules << { :module => name, :type => :forge, :source => :forge, :version => args, } when Hash @modules << parse_args(name, args) else $logger.warn "#{@repo[:repo_name]}/Puppetfile: Unknown format: mod('#{name}', #{args.inspect})" end end |
#canonical_git_repo(repo) ⇒ Object
60 61 62 63 64 65 66 |
# File 'lib/mvp/puppetfile_parser.rb', line 60 def canonical_git_repo(repo) return unless repo return unless repo.is_a? String repo.sub(/^[email protected]\:/, 'github.com/') .sub(/^(git|https?)\:\/\//, '') .sub(/\.git$/, '') end |
#canonical_name(name, repo) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/mvp/puppetfile_parser.rb', line 52 def canonical_name(name, repo) return name if name.include?('-') repo = canonical_git_repo(repo) return @sources[repo] if @sources.include?(repo) name end |
#parse(repo) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/mvp/puppetfile_parser.rb', line 22 def parse(repo) # This only works on Ruby 2.6+ return unless suitable? begin root = RubyVM::AbstractSyntaxTree.parse(repo[:content]) rescue SyntaxError => e $logger.warn "Syntax error in #{repo[:repo_name]}/Puppetfile" $logger.warn e. end @repo = repo @modules = [] traverse(root) @modules.compact.map do |row| row[:repo_name] = repo[:repo_name] row[:md5] = repo[:md5] row[:module] = canonical_name(row[:module], row[:source]) stringify(row) end end |
#parse_args(name, args) ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/mvp/puppetfile_parser.rb', line 89 def parse_args(name, args) data = {:module => name} if args.include? :git data[:type] = :git data[:source] = args[:git] data[:version] = args[:ref] || args[:tag] || args[:commit] || args[:branch] || :latest elsif args.include? :svn data[:type] = :svn data[:source] = args[:svn] data[:version] = args[:rev] || args[:revision] || :latest elsif args.include? :boxen data[:type] = :boxen data[:source] = args[:repo] data[:version] = args[:version] || :latest else $logger.warn "#{@repo[:repo_name]}/Puppetfile: Unknown args format: mod('#{name}', #{args.inspect})" return nil end data end |
#sources=(modules) ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/mvp/puppetfile_parser.rb', line 13 def sources=(modules) modules.each do |row| next unless row[:source] next if row[:source] == 'UNKNOWN' @sources[canonical_git_repo(row[:source])] = row[:slug] end end |
#stringify(row) ⇒ Object
44 45 46 47 48 49 50 |
# File 'lib/mvp/puppetfile_parser.rb', line 44 def stringify(row) row.each do |key, value| if value.is_a? RubyVM::AbstractSyntaxTree::Node row[key] = :'#<programmatically generated via ruby code>' end end end |
#suitable? ⇒ Boolean
9 10 11 |
# File 'lib/mvp/puppetfile_parser.rb', line 9 def suitable? defined?(RubyVM::AbstractSyntaxTree) end |
#test ⇒ Object
166 167 168 169 |
# File 'lib/mvp/puppetfile_parser.rb', line 166 def test() require 'pry' binding.pry end |
#traverse(node) ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/mvp/puppetfile_parser.rb', line 112 def traverse(node) begin if node.type == :FCALL name = node.children.first args = node.children.last.children.map do |item| next if item.nil? case item.type when :HASH Hash[*item.children.first.children.compact.map {|n| n.children.first }] else item.children.first end end.compact case name when :mod add_module(args.shift, args.shift) when :forge # noop when :moduledir # noop when :github # oh boxen, you so silly. # The order of the unpacking below *is* important. modname = args.shift version = args.shift data = args.shift || {} # this is gross but I'm not sure I actually care right now. if (modname.is_a? String and [String, NilClass].include? version.class and data.is_a? Hash) data[:boxen] = :boxen data[:version] = version add_module(modname, data) else $logger.warn "#{@repo[:repo_name]}/Puppetfile: malformed boxen" end else # Should we record unexpected Ruby code or just log it to stdout? args = args.map {|a| a.is_a?(String) ? "'#{a}'" : a}.join(', ') $logger.warn "#{@repo[:repo_name]}/Puppetfile: Unexpected invocation of #{name}(#{args})" end end node.children.each do |n| next unless n.is_a? RubyVM::AbstractSyntaxTree::Node traverse(n) end rescue => e puts e. end end |