Class: Appium::Lint

Inherits:
Object
  • Object
show all
Defined in:
lib/appium_doc_lint/lint.rb,
lib/appium_doc_lint/version.rb,
lib/appium_doc_lint/lint/base.rb,
lib/appium_doc_lint/lint/h2_invalid.rb,
lib/appium_doc_lint/lint/h2_missing.rb,
lib/appium_doc_lint/lint/ext_missing.rb,
lib/appium_doc_lint/lint/h2_multiple.rb,
lib/appium_doc_lint/lint/h156_invalid.rb,
lib/appium_doc_lint/lint/line_break_invalid.rb

Defined Under Namespace

Classes: Base, ExtMissing, H156Invalid, H2Invalid, H2Missing, H2Multiple, LineBreakInvalid

Constant Summary collapse

VERSION =
'0.0.11'
DATE =
'2014-07-03'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLint

Returns a new instance of Lint.



16
17
18
# File 'lib/appium_doc_lint/lint.rb', line 16

def initialize
  @rules = [ExtMissing, H2Missing, H2Multiple, H2Invalid, H156Invalid, LineBreakInvalid]
end

Instance Attribute Details

#inputObject (readonly)

OpenStruct.new data: ”, lines: ”, file: ”



14
15
16
# File 'lib/appium_doc_lint/lint.rb', line 14

def input
  @input
end

Class Method Details

.init_data(opts = {}, input) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/appium_doc_lint/lint.rb', line 20

def self.init_data opts={}, input
  raise 'Input must exist' unless input
  data = opts[:data]
  if data
    input.data  = data.freeze
    input.lines = data.split(/\r?\n/).freeze
    input.file  = nil
  else
    file = opts[:file]
    raise 'File path must be provided' unless file
    raise "File must exist and be readable #{file}" unless File.exist?(file) && File.readable?(file)
    raise 'File must not be a dir' if File.directory?(file)
    file = File.expand_path(file)

    input.data  = File.read(file).freeze
    input.lines = input.data.split(/\r?\n/).freeze
    input.file  = file.freeze
  end

  input
end

.new_input(opts) ⇒ Object



42
43
44
45
# File 'lib/appium_doc_lint/lint.rb', line 42

def self.new_input opts
  input = OpenStruct.new(data: '', lines: '', file: '')
  self.init_data opts, input
end

Instance Method Details

#call(opts = {}) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/appium_doc_lint/lint.rb', line 47

def call opts={}
  @input = self.class.new_input opts

  all_warnings = {}
  @rules.each do |rule|
    warnings = rule.new(@input).call
    unless warnings.empty?
      all_warnings.merge!(warnings) do |key, old_val, new_val|
        # flatten to prevent { :a => [[1, 2], 2]}
        [old_val, new_val].flatten
      end
    end
  end

  return {} if all_warnings.empty?

  # sort by line number
  all_warnings = all_warnings.sort.to_h

  # wrap with file path if available
  input.file ? { input.file => all_warnings } : all_warnings
end

#glob(dir_glob) ⇒ Object



70
71
72
73
74
75
76
77
78
79
# File 'lib/appium_doc_lint/lint.rb', line 70

def glob dir_glob
  results = {}
  Dir.glob dir_glob do |markdown|
    next if File.directory?(markdown)
    markdown = File.expand_path markdown
    results.merge!(self.call(file: markdown))
  end
  # glob order is system dependent so sort the results.
  results.sort.to_h
end

#report(data) ⇒ Object

Format data into a report



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/appium_doc_lint/lint.rb', line 82

def report data
  return nil if data.nil? || data.empty?
  result = ''
  data.each do |file_name, analysis|
    rel_path = File.join('.', File.expand_path(file_name).sub(Dir.pwd, ''))
    result += "\n#{rel_path}\n"
    analysis.each do |line_number, warning|
      result += "  #{line_number}: #{warning.join(',')}\n"
    end
  end
  result.strip!

  result.empty? ? nil : result
end