Guest User

Untitled

a guest
Jul 16th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1.  
  2. class RPMSpec
  3. attr_reader :spec
  4. def initialize(spec)
  5. @tags = Hash.new {|h,k| h[k] = []}
  6. @defines = {}
  7. @spec = spec
  8. @sections = Hash.new {|h,k| h[k] = []}
  9. #@rpm_build_dir = rpm_build_dir
  10.  
  11. parse
  12. end
  13.  
  14. def tags(name)
  15. if @tags.include? name.to_s.downcase
  16. @tags[name.to_s.downcase]
  17. else
  18. nil
  19. end
  20. end
  21.  
  22. def tag(name)
  23. t = tags(name)
  24. t && t.first
  25. end
  26.  
  27.  
  28. def sources
  29. @tags.map do |k,v|
  30. if k =~ /source[0-9]+/
  31. v
  32. else
  33. nil
  34. end
  35. end.compact.flatten
  36. end
  37.  
  38. private
  39.  
  40. def parse
  41. lines = spec.scan(/^(.*?[^\\])\n+/m).flatten.reject do |l|
  42. l =~ /^#/ || l.size == 0
  43. end.map do |l|
  44. l.gsub(/\\$/, '')
  45. end
  46.  
  47. parse_lines(lines)
  48. end
  49.  
  50. def parse_lines(lines, cur_section=nil)
  51. while !lines.empty?
  52. l = lines.shift
  53.  
  54. case l
  55. when /^%define\s+(.*)$/m
  56. parse_define($1)
  57. when /^(.*?):\s*(.*)$/m # is it a tag def
  58. @tags[$1.downcase] << process_val($2)
  59. when /^%([a-z]*)\s*$/m
  60. section = $1
  61. parse_lines(lines, section)
  62. else
  63. @sections[cur_section] << process_val(l)
  64. end
  65. end
  66. end
  67.  
  68. def parse_define(rest)
  69. key, val = rest.split(/\s+/m, 2)
  70. @defines[key] = process_val(val)
  71. end
  72.  
  73. def process_val(str)
  74. str.gsub(/%\{(.*?)\}/) do |match|
  75. d = @defines[$1] || tag($1)
  76. if d
  77. d
  78. else
  79. match
  80. end
  81. end
  82. end
  83.  
  84. end
Add Comment
Please, Sign In to add comment