class StoryboardLint::StoryboardScanner

Public Class Methods

new(src_root) click to toggle source
# File lib/storyboardlint.rb, line 11
def initialize(src_root)
  if !File.directory?(src_root)
    raise ArgumentError, "The directory '#{src_root}' does not exist."
  end
  
  @src_root = src_root
  @scan_performed = false    
end

Public Instance Methods

custom_class_names() click to toggle source
# File lib/storyboardlint.rb, line 49
def custom_class_names
  scan_files
  @custom_class_names
end
reuse_ids() click to toggle source
# File lib/storyboardlint.rb, line 44
def reuse_ids
  scan_files
  @reuse_ids
end
segue_ids() click to toggle source
# File lib/storyboardlint.rb, line 34
def segue_ids
  scan_files
  @segue_ids
end
storyboard_files() click to toggle source
# File lib/storyboardlint.rb, line 20
def storyboard_files
  return @sb_files if @sb_files
  
  # find all storyboard files...
  @sb_files = Dir.glob(File.join(@src_root, "**/*.storyboard"))
end
storyboard_ids() click to toggle source
# File lib/storyboardlint.rb, line 39
def storyboard_ids
  scan_files
  @storyboard_ids
end
xib_files() click to toggle source
# File lib/storyboardlint.rb, line 27
def xib_files
  return @xib_files if @xib_files
  
  # find all XIB files...
  @xib_files = Dir.glob(File.join(@src_root, "**/*.xib"))
end

Private Instance Methods

scan_files() click to toggle source
# File lib/storyboardlint.rb, line 56
def scan_files
  if !@scan_performed
    @segue_ids ||= []
    @storyboard_ids ||= []
    @reuse_ids ||= []
    @custom_class_names = []

    storyboard_files.each do |sb_file|
      sb_source = File.open(sb_file)
      doc = Nokogiri::XML(sb_source)
      doc.xpath('//segue').each do |element|
        seg_id = element.attr('identifier')
        @segue_ids << {:file => sb_file, :id => seg_id.to_s} if seg_id
      end

      @storyboard_ids += doc.xpath("//@storyboardIdentifier").to_a.map {|match| {:file => sb_file, :id => match.to_s}}
      @reuse_ids += doc.xpath("//@reuseIdentifier").to_a.map {|match| {:file => sb_file, :id => match.to_s}}
      @custom_class_names += doc.xpath("//@customClass").to_a.map {|match| {:file => sb_file, :class_name => match.to_s}}
    end
    
    xib_files.each do |xib_file|
      xib_source = File.open(xib_file)
      doc = Nokogiri::XML(xib_source)

      @reuse_ids += doc.xpath("//@reuseIdentifier").to_a.map {|match| {:file => xib_file, :id => match.to_s}}
    end
    
    @scan_performed = true
  end
end