diff_parser 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTQwOTNiZThmMzU2M2Q1MTIyM2IzMDIyZDIxOGU4N2M5ODVkZWQzNA==
5
+ data.tar.gz: !binary |-
6
+ ZmQwY2VkZmNmYTYxZWJkZTY1MDBjZGIxMDQ5MzJmZDEwZjU4MmUzOQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NzQ5ODU5MGZlY2E0Y2U1NzRiOWQ4MDNiMjEzY2ViOGZkZDhkYzgzODUxNjI3
10
+ NjEyNGY3NGNlZjMxOWI1NDJiNjMwYTBhOTg0YmZiYzY1NzQ1MzYyYjJiNGU2
11
+ ZjgzMWZmZDdhYjQ1MDdkODIzM2ExZmViYzRlNWNjMjQ1NGRiN2Q=
12
+ data.tar.gz: !binary |-
13
+ OTRjYmE3ODBiZWZhNTE5MTlkZjA5ZDY5OGVhMjIwMzJhYjllN2ViZDBmM2E2
14
+ NGVlNzYwNDk0MWNiYTE2MTQ3NDg5OGQ3OTc5ZjQ5NDdhYzU1YjZlZmU5MGQ3
15
+ ZDhlM2NkZTgzZmFmYTFlMWRhNjMyZTY5NDU0ODE3MWFjNDA5MTE=
@@ -0,0 +1,76 @@
1
+ class DiffParser::InlineDiff
2
+ class << self
3
+
4
+ START = "#!idiff-start!#"
5
+ FINISH = "#!idiff-finish!#"
6
+
7
+ def processing diff_arr
8
+ indexes = _indexes_of_changed_lines diff_arr
9
+
10
+ indexes.each do |index|
11
+ first_line = diff_arr[index+1]
12
+ second_line = diff_arr[index+2]
13
+ max_length = [first_line.size, second_line.size].max
14
+
15
+ # Skip inline diff if empty line was replaced with content
16
+ next if first_line == "-\n"
17
+
18
+ first_the_same_symbols = 0
19
+ (0..max_length + 1).each do |i|
20
+ first_the_same_symbols = i - 1
21
+ if first_line[i] != second_line[i] && i > 0
22
+ break
23
+ end
24
+ end
25
+
26
+ first_token = first_line[0..first_the_same_symbols][1..-1]
27
+ start = first_token + START
28
+
29
+ if first_token.empty?
30
+ # In case if we remove string of spaces in commit
31
+ diff_arr[index+1].sub!("-", "-" => "-#{START}")
32
+ diff_arr[index+2].sub!("+", "+" => "+#{START}")
33
+ else
34
+ diff_arr[index+1].sub!(first_token, first_token => start)
35
+ diff_arr[index+2].sub!(first_token, first_token => start)
36
+ end
37
+
38
+ last_the_same_symbols = 0
39
+ (1..max_length + 1).each do |i|
40
+ last_the_same_symbols = -i
41
+ shortest_line = second_line.size > first_line.size ? first_line : second_line
42
+ if (first_line[-i] != second_line[-i]) || "#{first_token}#{START}".size == shortest_line[1..-i].size
43
+ break
44
+ end
45
+ end
46
+ last_the_same_symbols += 1
47
+ last_token = first_line[last_the_same_symbols..-1]
48
+ diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token)
49
+ diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token)
50
+ end
51
+ diff_arr
52
+ end
53
+
54
+ def _indexes_of_changed_lines diff_arr
55
+ chain_of_first_symbols = ""
56
+ diff_arr.each_with_index do |line, i|
57
+ chain_of_first_symbols += line[0]
58
+ end
59
+ chain_of_first_symbols.gsub!(/[^\-\+]/, "#")
60
+
61
+ offset = 0
62
+ indexes = []
63
+ while index = chain_of_first_symbols.index("#-+#", offset)
64
+ indexes << index
65
+ offset = index + 1
66
+ end
67
+ indexes
68
+ end
69
+
70
+ def replace_markers line
71
+ line.gsub!(START, "<span class='idiff'>")
72
+ line.gsub!(FINISH, "</span>")
73
+ line
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,101 @@
1
+ class DiffParser::Parser
2
+ include Enumerable
3
+
4
+ GIT_NEW_FILE = "new file"
5
+ GIT_DELETED_FILE = "deleted file"
6
+ GIT_DIFF_START = "+#!idiff-start!#++"
7
+ GIT_DIFF_FINISH = "-#!idiff-start!#--"
8
+ GIT_INDEX = "index "
9
+ GIT_DIFF = "diff --git "
10
+ GIT_WARN_NEW_LINE = " No newline at end of file"
11
+ GIT_CODE_ADDED = "+"
12
+ GIT_CODE_REMOVED = "-"
13
+
14
+ attr_reader :lines, :new_path
15
+
16
+ def initialize(diff)
17
+ @commit_id = diff.commit_id
18
+ @lines = diff.lines.to_a
19
+ @new_path = ""
20
+ #@new_path = diff.new_path
21
+ end
22
+
23
+ def each
24
+ line_old = 1
25
+ line_new = 1
26
+
27
+ lines_arr = DiffParser::InlineDiff.processing lines
28
+ lines_arr.each_with_index do |line, idx|
29
+ raw_line = line.dup
30
+
31
+ next if line.match(/^\-\-\- \/dev\/null/)
32
+ next if line.match(/^\+\+\+ \/dev\/null/)
33
+ next if line.match(/^\-\-\- a/)
34
+ next if line.match(/^\+\+\+ b/)
35
+
36
+ full_line = html_escape(line.gsub(/\n/, ''))
37
+ full_line = DiffParser::InlineDiff.replace_markers full_line
38
+
39
+ if line.match(/^@@ -/)
40
+ type = "match"
41
+
42
+ line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
43
+ line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
44
+
45
+ yield(full_line, type, nil, nil, nil)
46
+ next
47
+ else
48
+ type = identification_type(line)
49
+ line_code = generate_line_code(new_path, line_new, line_old, type, idx)
50
+ next if ["index"].include? type
51
+ yield(full_line, type, line_code, line_new, line_old, raw_line)
52
+ end
53
+
54
+
55
+ if line[0] == "+"
56
+ line_new += 1
57
+ elsif line[0] == "-"
58
+ line_old += 1
59
+ else
60
+ line_new += 1
61
+ line_old += 1
62
+ end
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ def identification_type(line)
69
+ line = line.strip
70
+ if line.start_with? GIT_NEW_FILE
71
+ "file_created"
72
+ elsif line.start_with? GIT_DELETED_FILE
73
+ "file_removed"
74
+ elsif line.start_with? GIT_DIFF_START
75
+ "file_update_created"
76
+ elsif line.start_with? GIT_DIFF_FINISH
77
+ "file_update_removed"
78
+ elsif line.start_with? GIT_INDEX
79
+ "index"
80
+ elsif line.start_with? GIT_DIFF
81
+ "info"
82
+ elsif line.start_with? GIT_WARN_NEW_LINE
83
+ "warning"
84
+ elsif line.start_with? GIT_CODE_ADDED
85
+ "new"
86
+ elsif line.start_with? GIT_CODE_REMOVED
87
+ "old"
88
+ else
89
+ "default"
90
+ end
91
+ end
92
+
93
+ def generate_line_code(path, line_new, line_old, type, idx)
94
+ "#{@commit_id}_#{line_old}_#{line_new}_#{type}_#{idx}"
95
+ end
96
+
97
+ def html_escape str
98
+ replacements = {'&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;', "'" => '&#39;'}
99
+ str.gsub(/[&"'><]/, replacements)
100
+ end
101
+ end
@@ -0,0 +1,48 @@
1
+ module DiffParser::Regex
2
+ extend self
3
+
4
+ def username_regex
5
+ default_regex
6
+ end
7
+
8
+ def project_name_regex
9
+ /\A[a-zA-Z0-9][a-zA-Z0-9_\-\. ]*\z/
10
+ end
11
+
12
+ def name_regex
13
+ /\A[a-zA-Z0-9_\-\. ]*\z/
14
+ end
15
+
16
+ def path_regex
17
+ default_regex
18
+ end
19
+
20
+ def git_reference_regex
21
+ # Valid git ref regex, see:
22
+ # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
23
+
24
+ %r{
25
+ (?!
26
+ # doesn't begins with
27
+ \/| # (rule #6)
28
+ # doesn't contain
29
+ .*(?:
30
+ [\/.]\.| # (rule #1,3)
31
+ \/\/| # (rule #6)
32
+ @\{| # (rule #8)
33
+ \\ # (rule #9)
34
+ )
35
+ )
36
+ [^\000-\040\177~^:?*\[]+ # (rule #4-5)
37
+ # doesn't end with
38
+ (?<!\.lock) # (rule #1)
39
+ (?<![\/.]) # (rule #6-7)
40
+ }x
41
+ end
42
+
43
+ protected
44
+
45
+ def default_regex
46
+ /\A[a-zA-Z0-9][a-zA-Z0-9_\-\.]*(?<!\.git)\z/
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module DiffParser
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,3 @@
1
+ require 'diff_parser/inline_diff'
2
+ require 'diff_parser/regex'
3
+ require 'diff_parser/parser'
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: diff_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - stevo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Allows parsing diffs for presentation purposes - extracted from marvelous
14
+ GitLab project
15
+ email:
16
+ - blazejek@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/diff_parser.rb
22
+ - lib/diff_parser/inline_diff.rb
23
+ - lib/diff_parser/parser.rb
24
+ - lib/diff_parser/regex.rb
25
+ - lib/diff_parser/version.rb
26
+ homepage: https://github.com/Selleo/diff_parser
27
+ licenses: []
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project: ! '[none]'
45
+ rubygems_version: 2.1.10
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: GitLab Diff Parser
49
+ test_files: []