diff_parser 0.1.0 → 1.0.0

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDdjZTY3MTBhOGIzNDdiMzc2MjI4YzdiOTQ3ZmFkMjEwMGI3ZWIxOQ==
4
+ ZjkxM2Q3NjAzODMyYmEwYzI2MGVhZTBjZmY1MTc1YTViN2E0ZGE0Yw==
5
5
  data.tar.gz: !binary |-
6
- MDI0MDUxNDhmMDBmN2U1YjE1OTcxMzJhZTJkNWE4NzQ5MTlhZWFkZg==
6
+ N2VhNzliYzNkYmFkZThlNGM4ZDQ2OWE1ODdlNjZmZTliNGIxMDI5NA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODVlM2Y3NDMwNWRmODMxNjM4MTJmNGZlNjE3MGVmODhmMGU1N2EwYzBhMzNk
10
- YTlmYTFmODJjMTViYWQ0YmU5NmRmM2JhYTg0N2FjNzQwYWRhYjlhMjU2MjQ2
11
- N2YxMmEwMjAzNWExZDE4MThlMTk2Yzg5NTA1ZTNiMjI4N2Y2OGQ=
9
+ NWFkMjQzNTU1NTJkMTEwYjE2MjU4OGZlNzk2ZWNiMjk0MjdkODVlMzBkMTFh
10
+ YzE2YmFlNGU3ZDY3MWMxMDZiNzRlZDk0Y2I0YTdkNTlhN2E0NDY4Y2I3ODNi
11
+ MjhiNmU3NzAzNTRjZjUwNmU0ZmZjZmMwNWMyYmIwODkzMmE2ZTU=
12
12
  data.tar.gz: !binary |-
13
- YjkyMTBlNjI0NmE3Yzk0NDgxMjI2YTljMTU2Nzg1YzAyNWUyMjFmNWQ0NTM4
14
- YTQ2MjBmYzEwMTRhMGVkODE5NWE1YjUwYjQ3NDFmZmE5YmFmNDRlYmRlMGE4
15
- MThkNTE3YmJhYzM4N2UyYTVmMjBlMWM5NzZjMTljNTc2Njg1MGI=
13
+ MmIxMTdmNDRiMmZkMzgwNTQ2NTA0NTllZDRlMmM0NDc3MzMzYzRkYzNlZDQ4
14
+ ODM5M2Y5N2NmYjNiYjQzYjI5YTc0NjFhNTU4MzM3NTdjNzhkYzU0YmJhYmM3
15
+ NzhhOTI5ZWYwMzVhMjVhMTAwOWUzYTJmODIzMWMyYTkxZTllNjY=
@@ -0,0 +1,25 @@
1
+ module DiffParser
2
+ class Commit
3
+ attr_reader :github, :repo, :sha
4
+
5
+ def initialize(github, repo, sha)
6
+ @github = github
7
+ @repo = repo
8
+ @sha = sha
9
+ end
10
+
11
+ def diff
12
+ DiffParser::Diff.new(raw, info)
13
+ end
14
+
15
+ private
16
+
17
+ def info
18
+ @info ||= github.commit(repo, sha)
19
+ end
20
+
21
+ def raw
22
+ @raw ||= github.commit(repo, sha, accept: 'application/vnd.github.VERSION.diff')
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ module DiffParser
2
+ class Diff
3
+ attr_reader :raw_diff, :diff_info
4
+
5
+ def initialize(raw_diff, diff_info)
6
+ @raw_diff = raw_diff
7
+ @diff_info = diff_info
8
+ end
9
+
10
+ def files
11
+ DiffParser::DiffFilesCollection.new(raw_diff, diff_info)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ module DiffParser
2
+ class DiffFilesCollection
3
+ include Enumerable
4
+
5
+ attr_reader :raw_diff, :diff_info
6
+
7
+ def initialize(raw_diff, diff_info)
8
+ @raw_diff = raw_diff
9
+ @diff_info = diff_info
10
+ end
11
+
12
+ def raw_lines
13
+ preprocessed_lines = DiffParser::InlineDiff.processing(raw_diff.lines)
14
+ preprocessed_lines.map { |line| RawLine.new(line) }
15
+ end
16
+
17
+ def each
18
+ current_file = nil
19
+
20
+ raw_lines.each_with_index do |raw_line, idx|
21
+ next if raw_line.skip_line?
22
+
23
+ if raw_line.info?
24
+ yield current_file if current_file
25
+ current_file = DiffParser::File.new(raw_line.full_line, diff_info)
26
+ else
27
+ current_file.push_line(raw_line, idx)
28
+ end
29
+ end
30
+
31
+ yield current_file
32
+ end
33
+ end
34
+ end
@@ -2,29 +2,23 @@ module DiffParser
2
2
  class DiffLine
3
3
  CODE_TYPES = %w(old new default match)
4
4
 
5
- attr_reader :raw_line, :type, :line_code, :line_new, :line_old
5
+ attr_reader :raw_line, :type, :line_new, :line_old, :idx
6
6
 
7
- def initialize(raw_line, type, line_code, line_new, line_old)
8
- @raw_line = if type.to_s == 'info'
9
- raw_line.split(' ').last.tap do |_raw_line|
10
- _raw_line[0] = ''
11
- end
12
- else
13
- raw_line
14
- end
15
-
16
- @type = if type == 'old' and raw_line[0] != '-'
17
- 'default'
18
- else
19
- type
20
- end
21
- @line_code = line_code
7
+ def initialize(raw_line, type, line_new, line_old, idx, sha)
8
+ @raw_line = raw_line
22
9
  @line_new = line_new
23
10
  @line_old = line_old
11
+ @idx = idx
12
+ @sha = sha
13
+ @type = type
24
14
  end
25
15
 
26
16
  def line_of_code?
27
17
  CODE_TYPES.include?(type)
28
18
  end
19
+
20
+ def line_code
21
+ "#{sha}_#{line_old}_#{line_new}_#{type}_#{idx}"
22
+ end
29
23
  end
30
24
  end
@@ -0,0 +1,54 @@
1
+ module DiffParser
2
+ class File
3
+ attr_accessor :line_old, :line_new
4
+ attr_reader :lines, :sha, :path, :file_info
5
+ delegate :additions, :deletions, to: :file_info
6
+
7
+ def initialize(path, diff_info)
8
+ @path = preprocess_path(path)
9
+ @lines = []
10
+ @line_old = 1
11
+ @line_new = 1
12
+ @sha = diff_info.sha
13
+ @file_info = retrieve_file_info(diff_info)
14
+ end
15
+
16
+ def push_line(raw_line, idx)
17
+ if raw_line.type == 'match'
18
+ self.line_old = raw_line.line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
19
+ self.line_new = raw_line.line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
20
+
21
+ lines << DiffLine.new(raw_line.full_line, raw_line.type, nil, nil, idx, sha)
22
+ else
23
+ unless raw_line.index?
24
+ lines << DiffLine.new(raw_line.full_line, raw_line.type, line_new, line_old, idx, sha)
25
+
26
+ if raw_line.addition?
27
+ self.line_new += 1
28
+ elsif raw_line.deletion?
29
+ self.line_old += 1
30
+ else
31
+ self.line_new += 1
32
+ self.line_old += 1
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def each_line
39
+ lines.each do |line|
40
+ yield line
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def preprocess_path(path)
47
+ path.split(' ').last[2..-1]
48
+ end
49
+
50
+ def retrieve_file_info(diff_info)
51
+ diff_info.files.find { |f| f.filename == path }
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,91 @@
1
+ module DiffParser
2
+ class RawLine
3
+ GIT_NEW_FILE = "new file"
4
+ GIT_DELETED_FILE = "deleted file"
5
+ GIT_DIFF_START = "+#!idiff-start!#++"
6
+ GIT_DIFF_FINISH = "-#!idiff-start!#--"
7
+ GIT_INDEX = "index "
8
+ GIT_DIFF = "diff --git "
9
+ GIT_WARN_NEW_LINE = " No newline at end of file"
10
+ GIT_CODE_ADDED = "+"
11
+ GIT_CODE_REMOVED = "-"
12
+
13
+ SUMMARY_REGEXES = [/^\-\-\- \/dev\/null/,
14
+ /^\+\+\+ \/dev\/null/,
15
+ /^\-\-\- a/,
16
+ /^\+\+\+ b/]
17
+
18
+ attr_reader :line
19
+
20
+ def initialize(line)
21
+ @line = line
22
+ end
23
+
24
+ def full_line
25
+ @full_line ||= DiffParser::InlineDiff.replace_markers(html_escape(line.gsub(/\n/, '')))
26
+ end
27
+
28
+ def summary?
29
+ SUMMARY_REGEXES.any? do |regex|
30
+ line.match(regex)
31
+ end
32
+ end
33
+
34
+ def info?
35
+ type == 'info'
36
+ end
37
+
38
+ def index?
39
+ type == 'index'
40
+ end
41
+
42
+ def addition?
43
+ line[0] == '+'
44
+ end
45
+
46
+ def deletion?
47
+ line[0] == '-'
48
+ end
49
+
50
+ def skip_line?
51
+ summary? or %w(file_update_removed file_update_created).include?(type)
52
+ end
53
+
54
+ def type
55
+ if stripped_line.match(/^@@ -/)
56
+ "match"
57
+ elsif stripped_line.start_with? GIT_NEW_FILE
58
+ "file_created"
59
+ elsif stripped_line.start_with? GIT_DELETED_FILE
60
+ "file_removed"
61
+ elsif stripped_line.start_with? GIT_DIFF_START
62
+ "file_update_created"
63
+ elsif stripped_line.start_with? GIT_DIFF_FINISH
64
+ "file_update_removed"
65
+ elsif stripped_line.start_with? GIT_INDEX
66
+ "index"
67
+ elsif stripped_line.start_with? GIT_DIFF
68
+ "info"
69
+ elsif stripped_line.start_with? GIT_WARN_NEW_LINE
70
+ "warning"
71
+ elsif stripped_line.start_with? GIT_CODE_ADDED
72
+ "new"
73
+ elsif stripped_line[0] == GIT_CODE_REMOVED
74
+ "old"
75
+ else
76
+ "default"
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def html_escape str
83
+ replacements = {'&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;', "'" => '&#39;'}
84
+ str.gsub(/[&"'><]/, replacements)
85
+ end
86
+
87
+ def stripped_line
88
+ @stripped_line ||= line.strip
89
+ end
90
+ end
91
+ end
@@ -1,3 +1,3 @@
1
1
  module DiffParser
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/diff_parser.rb CHANGED
@@ -1,4 +1,7 @@
1
+ require 'diff_parser/diff'
2
+ require 'diff_parser/commit'
3
+ require 'diff_parser/file'
4
+ require 'diff_parser/diff_files_collection'
5
+ require 'diff_parser/raw_line'
1
6
  require 'diff_parser/diff_line'
2
7
  require 'diff_parser/inline_diff'
3
- require 'diff_parser/regex'
4
- require 'diff_parser/parser'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diff_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - stevo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-12 00:00:00.000000000 Z
11
+ date: 2014-01-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Allows parsing diffs for presentation purposes - extracted from marvelous
14
14
  GitLab project
@@ -19,10 +19,13 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - lib/diff_parser.rb
22
+ - lib/diff_parser/commit.rb
23
+ - lib/diff_parser/diff.rb
24
+ - lib/diff_parser/diff_files_collection.rb
22
25
  - lib/diff_parser/diff_line.rb
26
+ - lib/diff_parser/file.rb
23
27
  - lib/diff_parser/inline_diff.rb
24
- - lib/diff_parser/parser.rb
25
- - lib/diff_parser/regex.rb
28
+ - lib/diff_parser/raw_line.rb
26
29
  - lib/diff_parser/version.rb
27
30
  homepage: https://github.com/Selleo/diff_parser
28
31
  licenses: []
@@ -1,104 +0,0 @@
1
- module DiffParser
2
- class Parser
3
- include Enumerable
4
-
5
- GIT_NEW_FILE = "new file"
6
- GIT_DELETED_FILE = "deleted file"
7
- GIT_DIFF_START = "+#!idiff-start!#++"
8
- GIT_DIFF_FINISH = "-#!idiff-start!#--"
9
- GIT_INDEX = "index "
10
- GIT_DIFF = "diff --git "
11
- GIT_WARN_NEW_LINE = " No newline at end of file"
12
- GIT_CODE_ADDED = "+"
13
- GIT_CODE_REMOVED = "-"
14
-
15
- attr_reader :lines, :new_path
16
-
17
- def initialize(diff)
18
- @commit_id = diff.commit_id
19
- @lines = diff.lines.to_a
20
- @new_path = ""
21
- #@new_path = diff.new_path
22
- end
23
-
24
- def each
25
- line_old = 1
26
- line_new = 1
27
-
28
- lines_arr = DiffParser::InlineDiff.processing lines
29
- lines_arr.each_with_index do |line, idx|
30
- raw_line = line.dup
31
-
32
- next if line.match(/^\-\-\- \/dev\/null/)
33
- next if line.match(/^\+\+\+ \/dev\/null/)
34
- next if line.match(/^\-\-\- a/)
35
- next if line.match(/^\+\+\+ b/)
36
-
37
- full_line = html_escape(line.gsub(/\n/, ''))
38
- full_line = DiffParser::InlineDiff.replace_markers full_line
39
-
40
- if line.match(/^@@ -/)
41
- type = "match"
42
-
43
- line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
44
- line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
45
-
46
- yield(DiffLine.new(full_line, type, nil, nil, nil))
47
- next
48
- else
49
- type = identification_type(line)
50
- line_code = generate_line_code(new_path, line_new, line_old, type, idx)
51
- next if ["index"].include? type
52
-
53
- yield(DiffLine.new(full_line, type, line_code, line_new, line_old))
54
- end
55
-
56
-
57
- if line[0] == "+"
58
- line_new += 1
59
- elsif line[0] == "-"
60
- line_old += 1
61
- else
62
- line_new += 1
63
- line_old += 1
64
- end
65
- end
66
- end
67
-
68
- private
69
-
70
- def identification_type(line)
71
- line = line.strip
72
- if line.start_with? GIT_NEW_FILE
73
- "file_created"
74
- elsif line.start_with? GIT_DELETED_FILE
75
- "file_removed"
76
- elsif line.start_with? GIT_DIFF_START
77
- "file_update_created"
78
- elsif line.start_with? GIT_DIFF_FINISH
79
- "file_update_removed"
80
- elsif line.start_with? GIT_INDEX
81
- "index"
82
- elsif line.start_with? GIT_DIFF
83
- "info"
84
- elsif line.start_with? GIT_WARN_NEW_LINE
85
- "warning"
86
- elsif line.start_with? GIT_CODE_ADDED
87
- "new"
88
- elsif line.start_with? GIT_CODE_REMOVED
89
- "old"
90
- else
91
- "default"
92
- end
93
- end
94
-
95
- def generate_line_code(path, line_new, line_old, type, idx)
96
- "#{@commit_id}_#{line_old}_#{line_new}_#{type}_#{idx}"
97
- end
98
-
99
- def html_escape str
100
- replacements = {'&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;', "'" => '&#39;'}
101
- str.gsub(/[&"'><]/, replacements)
102
- end
103
- end
104
- end
@@ -1,50 +0,0 @@
1
- module DiffParser
2
- module Regex
3
- extend self
4
-
5
- def username_regex
6
- default_regex
7
- end
8
-
9
- def project_name_regex
10
- /\A[a-zA-Z0-9][a-zA-Z0-9_\-\. ]*\z/
11
- end
12
-
13
- def name_regex
14
- /\A[a-zA-Z0-9_\-\. ]*\z/
15
- end
16
-
17
- def path_regex
18
- default_regex
19
- end
20
-
21
- def git_reference_regex
22
- # Valid git ref regex, see:
23
- # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
24
-
25
- %r{
26
- (?!
27
- # doesn't begins with
28
- \/| # (rule #6)
29
- # doesn't contain
30
- .*(?:
31
- [\/.]\.| # (rule #1,3)
32
- \/\/| # (rule #6)
33
- @\{| # (rule #8)
34
- \\ # (rule #9)
35
- )
36
- )
37
- [^\000-\040\177~^:?*\[]+ # (rule #4-5)
38
- # doesn't end with
39
- (?<!\.lock) # (rule #1)
40
- (?<![\/.]) # (rule #6-7)
41
- }x
42
- end
43
-
44
- protected
45
-
46
- def default_regex
47
- /\A[a-zA-Z0-9][a-zA-Z0-9_\-\.]*(?<!\.git)\z/
48
- end
49
- end
50
- end