Class: Xlint
- Inherits:
-
Object
- Object
- Xlint
- Defined in:
- lib/xlint.rb,
lib/xlint/version.rb
Constant Summary collapse
- VERSION =
'0.0.6'.freeze
Class Attribute Summary collapse
-
.comments ⇒ Object
Returns the value of attribute comments.
-
.diff_file ⇒ Object
Returns the value of attribute diff_file.
-
.draft ⇒ Object
Returns the value of attribute draft.
Class Method Summary collapse
- .build_draft ⇒ Object
- .build_label ⇒ Object
- .check_args ⇒ Object
- .check_deployment_target(change) ⇒ Object
- .check_env ⇒ Object
- .clear ⇒ Object
-
.find_offenses(changes) ⇒ Object
only checks for deployment target changes, we can add more rules in the future here.
- .parse_git(diff) ⇒ Object
- .patch_body_changes(body, file) ⇒ Object
- .publish ⇒ Object
- .publish_draft ⇒ Object
- .save_draft ⇒ Object
-
.starting_line_number(header) ⇒ Object
expects git header in the form of: @@ -215,13 +215,7 @@.
- .valid_git_header?(line) ⇒ Boolean
Class Attribute Details
.comments ⇒ Object
Returns the value of attribute comments.
10 11 12 |
# File 'lib/xlint.rb', line 10 def comments @comments end |
.diff_file ⇒ Object
Returns the value of attribute diff_file.
10 11 12 |
# File 'lib/xlint.rb', line 10 def diff_file @diff_file end |
.draft ⇒ Object
Returns the value of attribute draft.
10 11 12 |
# File 'lib/xlint.rb', line 10 def draft @draft end |
Class Method Details
.build_draft ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/xlint.rb', line 30 def build_draft @comments = [] # GitDiffParser::Patches.parse(cp932 text) raises ArgumentError: invalid byte sequence in UTF-8 # https://github.com/packsaddle/ruby-git_diff_parser/issues/91 diff_data = File.read(diff_file) diff_data.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') diff = Xlint.parse_git(diff_data) diff.files.each do |file| patch = diff.find_patch_by_file(file) changes = Xlint.patch_body_changes(patch.body, file) @comments.concat(Xlint.find_offenses(changes)) end end |
.build_label ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/xlint.rb', line 51 def build_label return unless ENV['GERGICH_REVIEW_LABEL'] score = comments.empty? ? 1 : -1 = comments.empty? ? 'Xlint didn\'t find anything to complain about' : 'Xlint is worried about your commit' draft.() draft.add_label(ENV['GERGICH_REVIEW_LABEL'], score) end |
.check_args ⇒ Object
18 19 20 21 22 23 |
# File 'lib/xlint.rb', line 18 def check_args # reads git diff from file, file name in ARGV[0] raise ArgumentError, 'usage: xlint path/to/some.diff' unless ARGV.size == 1 @diff_file = ARGV.first raise "File does not exist: #{diff_file}" unless File.exist?(diff_file) end |
.check_deployment_target(change) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/xlint.rb', line 109 def check_deployment_target(change) offenses = [] if change[:file] =~ /(.pbxproj)/ && change[:line] =~ /(DEPLOYMENT_TARGET =)/ offense = { path: change[:file], position: change[:line_number], message: 'Deployment target changes should be approved by the team lead.', severity: 'error' } offenses.push(offense) end offenses end |
.check_env ⇒ Object
25 26 27 28 |
# File 'lib/xlint.rb', line 25 def check_env raise 'ENV[GERGICH_KEY] not defined' unless ENV['GERGICH_KEY'] raise 'ENV[GERRIT_PROJECT] not defined' unless ENV['GERRIT_PROJECT'] end |
.clear ⇒ Object
12 13 14 15 16 |
# File 'lib/xlint.rb', line 12 def clear @diff_file = nil @draft.reset! if draft @comments = [] end |
.find_offenses(changes) ⇒ Object
only checks for deployment target changes, we can add more rules in the future here
100 101 102 103 104 105 106 107 |
# File 'lib/xlint.rb', line 100 def find_offenses(changes) offenses = [] changes.each do |change| warnings = check_deployment_target(change) offenses.concat(warnings) unless warnings.empty? end offenses end |
.parse_git(diff) ⇒ Object
72 73 74 |
# File 'lib/xlint.rb', line 72 def parse_git(diff) GitDiffParser::Patches.parse(diff) end |
.patch_body_changes(body, file) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/xlint.rb', line 76 def patch_body_changes(body, file) result = [] line_number = 0 body.split("\n").each do |line| if valid_git_header?(line) line_number = starting_line_number(line) next end next if line.start_with?('-') result.push(file: file, line: line, line_number: line_number) if line.start_with?('+') line_number += 1 end result end |
.publish ⇒ Object
63 64 65 66 67 68 69 70 |
# File 'lib/xlint.rb', line 63 def publish check_args check_env build_draft save_draft build_label publish_draft end |
.publish_draft ⇒ Object
59 60 61 |
# File 'lib/xlint.rb', line 59 def publish_draft Gergich::Review.new.publish! end |
.save_draft ⇒ Object
44 45 46 47 48 49 |
# File 'lib/xlint.rb', line 44 def save_draft @draft = Gergich::Draft.new comments.each do |comment| draft.add_comment(comment[:path], comment[:position], comment[:message], comment[:severity]) end end |
.starting_line_number(header) ⇒ Object
expects git header in the form of: @@ -215,13 +215,7 @@
92 93 94 95 96 |
# File 'lib/xlint.rb', line 92 def starting_line_number(header) str = header.split(' ')[2].split(',')[0] str.slice!('-') str.to_i end |
.valid_git_header?(line) ⇒ Boolean
123 124 125 |
# File 'lib/xlint.rb', line 123 def valid_git_header?(line) line =~ /^(@{2})\s([-]{1}[0-9]*(,[0-9]*)?)\s([+][0-9]*(,[0-9]*)?)\s(@{2})$/ end |