class ForemanThemeSatellite::CssCompare

Semantically compares two css files. returns hash: rule => prop => value

Attributes

left[R]
right[R]

Public Class Methods

new(left_filename: nil, left_css: nil, right_filename: nil, right_css: nil) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 11
def initialize(left_filename: nil, left_css: nil, right_filename: nil, right_css: nil)
  @left = left_filename ? Sass::Engine.for_file(left_filename, syntax: :scss) : Sass::Engine.new(left_css, syntax: :scss)
  @right = right_filename ? Sass::Engine.for_file(right_filename, syntax: :scss) : Sass::Engine.new(right_css, syntax: :scss)
end

Public Instance Methods

diff() click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 16
def diff
  result_hash = {}

  right_hash = rules_hash(right)

  rules_hash(left).each do |rule, props|
    right_props = right_hash[rule]
    unless props
      result_hash[rule] = props
      next
    end

    diffed_props = props_diff(props_hash(props), props_hash(right_props))

    result_hash[rule] = diffed_props unless diffed_props.empty?
  end

  result_hash
end
to_css(diff) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 36
def to_css(diff)
  diff.map do |rule, props|
    [
      "#{rule} {",
      to_properties_css(props, '  '),
      '}'
    ]
  end.flatten.join("\n")
end

Private Instance Methods

props_diff(left, right) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 71
def props_diff(left, right)
  right.reject { |k, v| left[k] == v }
end
props_hash(props) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 59
def props_hash(props)
  Hash[
    props.reject { |c| c.is_a? Sass::Tree::CommentNode }.map do |prop|
      raise "property has too many names: #{prop.to_sass}" if prop.name.length > 1
      [
        prop.name[0],
        (prop.value[0].is_a? String)? prop.value[0] : prop.value[0].to_sass
      ]
    end
  ]
end
rules_hash(engine) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 48
def rules_hash(engine)
  root = engine.to_tree

  Hash[
    root.children.select { |c| c.is_a? Sass::Tree::RuleNode }.map do |c|
      raise "Rule has too many names: #{c.to_sass}" if c.rule.length > 1
      [c.rule[0], c.children]
    end
  ]
end
to_properties_css(props, indent) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 75
def to_properties_css(props, indent)
  props.map do |prop, val|
    "#{indent}#{to_property_css(prop, val)}"
  end.join("\n")
end
to_property_css(property, value) click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 81
def to_property_css(property, value)
  "#{property}: #{value};"
end