danger-todoist 1.2.3 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5a33fddd5d6ffb7debff88c5442cebbde6b43c8
4
- data.tar.gz: 9656c5631440b96e047f2ee8a6cb849a58994601
3
+ metadata.gz: 87a34fb9d9b0148fefa1215d0c4d3fa41349e4db
4
+ data.tar.gz: a53a69753b59d4b53eada001d6bfbdc7ff44e408
5
5
  SHA512:
6
- metadata.gz: 7f773004d5e5af4b71485a829bfdfd61302b1cbcb874e4c1773f2dfe139b2d3fbba6138c5c2065c7b7a28613ea925fcb8b0bbf079c07b6f6b355b6b5d575e076
7
- data.tar.gz: 4818dfaeb0f66de2bbaefded44b78ea26703ae090981c344fe5ccc95bce002582f7dc81e7ffcfcec52a1fa17b137e0733dd3090451627fc6fa317b0797dea1e3
6
+ metadata.gz: fe90da46ae4654bd4d335eac952381ceebfed5bb6b415e42b3c82702f05987b385edfd0d57db0d3827f8b38f7840f95aa812286b983a61df0d370a32db7030cb
7
+ data.tar.gz: 104a01bddd67932185013df9d8d379298c2abf6e29fde20f854385bedba0f0709a1b2a496dc757dc6b528ee8993e1c4277d33b894d38967617d9a27bef1e88cd
data/.gitignore CHANGED
@@ -4,3 +4,5 @@
4
4
  Gemfile.lock
5
5
  coverage/
6
6
  pkg
7
+ vendor/
8
+ *.gem
@@ -4,3 +4,18 @@ Style/StringLiterals:
4
4
 
5
5
  Style/StructInheritance:
6
6
  Enabled: false
7
+
8
+ PercentLiteralDelimiters:
9
+ PreferredDelimiters:
10
+ "%": ()
11
+ "%i": ()
12
+ "%q": ()
13
+ "%Q": ()
14
+ "%r": "{}"
15
+ "%s": ()
16
+ "%w": ()
17
+ "%W": ()
18
+ "%x": ()
19
+
20
+ Layout/IndentHeredoc:
21
+ Enabled: false
@@ -4,10 +4,9 @@ cache:
4
4
  - bundle
5
5
 
6
6
  rvm:
7
- - 2.0
8
- - 2.1.10
9
- - 2.3.3
10
- - 2.4.0
7
+ - 2.3.8
8
+ - 2.4.5
9
+ - 2.5.3
11
10
 
12
11
  before_install:
13
12
  - gem update --system
@@ -1,5 +1,10 @@
1
1
  ## master
2
2
 
3
+ ## 1.3.0
4
+
5
+ * Report line number for each todo - hanneskaeufler
6
+ * Correctly report todo text with apostrophe - hanneskaeufler
7
+
3
8
  ## 1.2.3
4
9
 
5
10
  * Update rubies to run in CI - hanneskaeufler
data/Dangerfile CHANGED
@@ -1,11 +1,17 @@
1
+ is_wip = github.pr_title.include? "[WIP]"
2
+ is_trivial = github.pr_title.include? "[trivial]"
3
+ is_big_pr = git.lines_of_code > 500
4
+ has_insufficient_description = github.pr_body.length < 5
5
+ has_updated_changelog = git.modified_files.include?("CHANGELOG.md")
6
+
1
7
  # Make it more obvious that a PR is a work in progress and shouldn't be merged yet
2
- warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"
8
+ warn("PR is classed as Work in Progress") if is_wip
3
9
 
4
10
  # Warn when there is a big PR
5
- warn("Big PR") if git.lines_of_code > 500
11
+ warn("Wow that's a lot of changes. Can we split this up?") if is_big_pr
6
12
 
7
13
  # Reminder to add changelog entry
8
- unless git.modified_files.include?("CHANGELOG.md")
14
+ if !has_updated_changelog && !is_trivial
9
15
  fail("Please include a CHANGELOG entry.", sticky: false)
10
16
  end
11
17
 
@@ -16,6 +22,6 @@ todoist.print_todos_table
16
22
 
17
23
  # Mainly to encourage writing up some reasoning about the PR, rather than
18
24
  # just leaving a title
19
- if github.pr_body.length < 5
25
+ if has_insufficient_description
20
26
  fail "Please provide a summary in the Pull Request description"
21
27
  end
data/README.md CHANGED
@@ -65,4 +65,7 @@ todoist.todos.each { |todo| puts todo.text }</pre>
65
65
  4. Use `bundle exec guard` to automatically have tests run as you make changes.
66
66
  5. Make your changes.
67
67
 
68
+ ## Licence
68
69
 
70
+ This project is MIT licenced. Parts of the code (see class `Patch`) are heavily
71
+ inspired by [ruby-git_diff_parser](https://github.com/packsaddle/ruby-git_diff_parser).
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "todoist/gem_version.rb"
@@ -26,13 +25,13 @@ Gem::Specification.new do |spec|
26
25
  spec.add_development_dependency "rake", "~> 10.0"
27
26
 
28
27
  # Testing support
28
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0"
29
29
  spec.add_development_dependency "rspec", "~> 3.4"
30
30
  spec.add_development_dependency "simplecov", "~> 0.12"
31
- spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0"
32
31
 
33
32
  # Linting code and docs
34
- spec.add_development_dependency "rubocop", "~> 0.41"
35
- spec.add_development_dependency "yard", "~> 0.8"
33
+ spec.add_development_dependency "rubocop", "0.50"
34
+ spec.add_development_dependency "yard", "~> 0.9.12"
36
35
 
37
36
  # Makes testing easy via `bundle exec guard`
38
37
  spec.add_development_dependency "guard", "~> 2.14"
@@ -1,3 +1,4 @@
1
1
  require "todoist/plugin"
2
2
  require "todoist/diff_todo_finder"
3
+ require "todoist/diff_inline_todo_finder"
3
4
  require "todoist/todo"
@@ -0,0 +1,22 @@
1
+ module Danger
2
+ # Identify inline todos in a set of diffs
3
+ class DiffInlineTodoFinder
4
+ def initialize(keywords)
5
+ @keywords = keywords
6
+ end
7
+
8
+ def call(diffs)
9
+ diffs.map do |diff|
10
+ diff.patch.scan(/\+ .{3,}(#{keywords})[\s:]{1}(.+)$/).map do |match|
11
+ Todo.new(diff.path, match[1].strip)
12
+ end
13
+ end.flatten
14
+ end
15
+
16
+ private
17
+
18
+ def keywords
19
+ @keywords.join("|")
20
+ end
21
+ end
22
+ end
@@ -2,45 +2,110 @@ module Danger
2
2
  # Identify todos in a set of diffs
3
3
  class DiffTodoFinder
4
4
  def initialize(keywords)
5
- @keywords = keywords
5
+ @regexp = todo_regexp(keywords)
6
6
  end
7
7
 
8
- def find_diffs_containing_todos(diffs)
9
- todos = []
10
- regexp = todo_regexp
11
- diffs.each do |diff|
12
- matches = diff.patch.scan(regexp)
13
- next if matches.empty?
14
-
15
- matches.each do |match|
16
- todos << Danger::Todo.new(diff.path, clean_todo_text(match))
17
- end
18
- end
19
- todos
8
+ def call(diffs)
9
+ diffs
10
+ .map { |diff| MatchesInDiff.new(diff, diff.patch.scan(@regexp)) }
11
+ .select(&:todo_matches?)
12
+ .map(&:all_todos)
13
+ .flatten
20
14
  end
21
15
 
22
16
  private
23
17
 
24
- def clean_todo_text(match)
25
- comment_indicator, _, entire_todo = match
26
- entire_todo.gsub(comment_indicator, "")
27
- .delete("\n")
28
- .strip
29
- end
30
-
31
18
  # this is quite a mess now ... I knew it would haunt me.
32
19
  # to aid debugging, this online regexr can be
33
20
  # used: http://rubular.com/r/DPkoE2ztpn
34
21
  # the regexp uses backreferences to match the comment indicator multiple
35
22
  # times if possible
36
- def todo_regexp
23
+ def todo_regexp(keywords)
37
24
  /
38
25
  (?<comment_indicator>^\+\s*[^a-z0-9\+\s]+)
39
26
  (\n\+)?\s+
40
- (?<todo_indicator>#{@keywords.join("|")})[\s:]{1}
27
+ (?<todo_indicator>#{keywords.join("|")})[\s:]{1}
41
28
  (?<entire_text>(?<text>[^\n]*)
42
- (?<rest>\n\k<comment_indicator>\s*[\w .]*)*)
29
+ (?<rest>\n\k<comment_indicator>\s*[\w .']*)*)
43
30
  /ixm
44
31
  end
45
32
  end
33
+
34
+ # Identify todos in a single diff
35
+ class MatchesInDiff < Struct.new(:diff, :matches)
36
+ def todo_matches?
37
+ !matches.empty?
38
+ end
39
+
40
+ def all_todos
41
+ matches.map { |match| build_todo(diff.path, match) }
42
+ end
43
+
44
+ private
45
+
46
+ def line_number(match)
47
+ _, _, _, first_text = match
48
+ Patch.new(diff.patch).changed_lines.each do |line|
49
+ return line.number if line.content.include? first_text
50
+ end
51
+ raise TextNotFoundInPatchError
52
+ end
53
+
54
+ def build_todo(path, match)
55
+ Danger::Todo.new(path, cleaned_todo_text(match), line_number(match))
56
+ end
57
+
58
+ def cleaned_todo_text(match)
59
+ comment_indicator, _, entire_todo = match
60
+ entire_todo.gsub(comment_indicator, "")
61
+ .delete("\n")
62
+ .strip
63
+ end
64
+
65
+ # Parsed patch
66
+ class Patch
67
+ RANGE_INFORMATION_LINE = /^@@ .+\+(?<line_number>\d+),/
68
+ MODIFIED_LINE = /^\+(?!\+|\+)/
69
+ REMOVED_LINE = /^[-]/
70
+ NOT_REMOVED_LINE = /^[^-]/
71
+
72
+ def initialize(body)
73
+ @body = body
74
+ end
75
+
76
+ # rubocop:disable Metrics/MethodLength
77
+ def changed_lines
78
+ line_number = 0
79
+
80
+ lines_with_index
81
+ .each_with_object([]) do |(content, patch_position), lines|
82
+ case content
83
+ when RANGE_INFORMATION_LINE
84
+ line_number = Regexp.last_match[:line_number].to_i
85
+ when MODIFIED_LINE
86
+ lines << Line.new(content, line_number, patch_position)
87
+ line_number += 1
88
+ when NOT_REMOVED_LINE
89
+ line_number += 1
90
+ end
91
+ end
92
+ end
93
+ # rubocop:enable Metrics/MethodLength
94
+
95
+ def lines
96
+ @body.lines
97
+ end
98
+
99
+ def lines_with_index
100
+ lines.each_with_index
101
+ end
102
+ end
103
+
104
+ # Parsed line
105
+ class Line < Struct.new(:content, :number, :patch_position)
106
+ end
107
+ end
108
+
109
+ class TextNotFoundInPatchError < RuntimeError
110
+ end
46
111
  end
@@ -1,3 +1,3 @@
1
1
  module Todoist
2
- VERSION = "1.2.3".freeze
2
+ VERSION = "1.3.0".freeze
3
3
  end
@@ -96,7 +96,7 @@ module Danger
96
96
  markdown("- #{file}")
97
97
  todos
98
98
  .select(&:text)
99
- .each { |todo| markdown(" - #{todo.text}") }
99
+ .each { |todo| markdown(" - Line #{todo.line_number}: #{todo.text}") }
100
100
  end
101
101
 
102
102
  def call_method_for_todos(method)
@@ -108,8 +108,10 @@ module Danger
108
108
  @todos = []
109
109
  return if files_of_interest.empty?
110
110
 
111
- @todos = DiffTodoFinder.new(keywords)
112
- .find_diffs_containing_todos(diffs_of_interest)
111
+ @todos = finders
112
+ .map { |finder_class| finder_class.new(keywords) }
113
+ .map { |finder| finder.call(diffs_of_interest) }
114
+ .flatten
113
115
  end
114
116
 
115
117
  def keywords
@@ -132,7 +134,7 @@ module Danger
132
134
  diff = EmptyDiff.new
133
135
  begin
134
136
  diff = git.diff_for_file(file)
135
- rescue
137
+ rescue NoMethodError
136
138
  log_unable_to_find_diff(file.inspect)
137
139
  end
138
140
  diff
@@ -142,6 +144,10 @@ module Danger
142
144
  def log_unable_to_find_diff(file)
143
145
  markdown("* danger-todoist was unable to determine diff for \"#{file}\".")
144
146
  end
147
+
148
+ def finders
149
+ [DiffTodoFinder]
150
+ end
145
151
  end
146
152
 
147
153
  # Null object incase a diff cannot be determined
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- class Todo < Struct.new(:file, :text)
2
+ class Todo < Struct.new(:file, :text, :line_number)
3
3
  end
4
4
  end
@@ -0,0 +1,35 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ module Danger
4
+ describe Danger::DiffInlineTodoFinder do
5
+ let(:subject) { Danger::DiffInlineTodoFinder.new(%w(TODO FIXME)) }
6
+
7
+ describe "#call" do
8
+ it "finds todos inline after code" do
9
+ patch = <<PATCH
10
+ + function bla() {}; // TODO: fix this
11
+ PATCH
12
+
13
+ diff = sample_diff(patch)
14
+
15
+ todos = subject.call([diff])
16
+
17
+ expect(todos.first.text).to eq("fix this")
18
+ end
19
+
20
+ it "doesn't find floating todos" do
21
+ patch = <<PATCH
22
+ + # TODO: practice you must
23
+ + def practice
24
+ + return false
25
+ + end
26
+ + # FIXME: with you the force is
27
+ PATCH
28
+
29
+ todos = subject.call([sample_diff(patch)])
30
+
31
+ expect(todos).to be_empty
32
+ end
33
+ end
34
+ end
35
+ end
@@ -8,12 +8,12 @@ module Danger
8
8
  Danger::DiffTodoFinder.new(%w(TODO FIXME))
9
9
  end
10
10
 
11
- describe "#find_diffs_containing_todos" do
11
+ describe "#call" do
12
12
  %w(TODO TODO: todo todo: FIXME fixme FIXME: fixme).each do |marker|
13
13
  it "identifies a new '#{marker}' as a todo" do
14
14
  diff = sample_diff("+ # #{marker} some todo")
15
15
 
16
- todos = subject.find_diffs_containing_todos([diff])
16
+ todos = subject.call([diff])
17
17
 
18
18
  expect(todos).to_not be_empty
19
19
  end
@@ -23,16 +23,17 @@ module Danger
23
23
  diff = sample_diff("+ # BUG some todo")
24
24
 
25
25
  subject = described_class.new(["BUG"])
26
- todos = subject.find_diffs_containing_todos([diff])
26
+ todos = subject.call([diff])
27
27
 
28
28
  expect(todos).to_not be_empty
29
+ expect(todos.first.line_number).to be 0
29
30
  end
30
31
 
31
32
  it "doesnt crash but also doesnt find anything with empty keywords" do
32
33
  diff = sample_diff("+ # BUG some todo")
33
34
 
34
35
  subject = described_class.new([])
35
- todos = subject.find_diffs_containing_todos([diff])
36
+ todos = subject.call([diff])
36
37
 
37
38
  expect(todos).to be_empty
38
39
  end
@@ -42,7 +43,7 @@ module Danger
42
43
  it "identifies todos in languages with '#{comment}' as comments" do
43
44
  diff = sample_diff("+ #{comment} TODO: some todo")
44
45
 
45
- todos = subject.find_diffs_containing_todos([diff])
46
+ todos = subject.call([diff])
46
47
 
47
48
  expect(todos).to_not be_empty
48
49
  end
@@ -51,7 +52,7 @@ module Danger
51
52
  it "does not identify removed todos as a todo" do
52
53
  diff = sample_diff("- TODO: some todo")
53
54
 
54
- todos = subject.find_diffs_containing_todos([diff])
55
+ todos = subject.call([diff])
55
56
 
56
57
  expect(todos).to be_empty
57
58
  end
@@ -63,7 +64,7 @@ module Danger
63
64
  "+ def todo foo",
64
65
  "+ * this looks like a todo but isnt",
65
66
  "+ TODO_REGEXP = /",
66
- "+ todos = subject.find_diffs_containing_todos(diffs)",
67
+ "+ todos = subject.call(diffs)",
67
68
  "++ # FIXME: with you the force is",
68
69
  "+ TODO: foo",
69
70
  "+ TODO",
@@ -72,7 +73,7 @@ module Danger
72
73
  it "does not identify occurences in '#{patch}'" do
73
74
  diff = sample_diff("some/file.rb")
74
75
 
75
- todos = subject.find_diffs_containing_todos([diff])
76
+ todos = subject.call([diff])
76
77
 
77
78
  expect(todos).to be_empty
78
79
  end
@@ -81,7 +82,7 @@ module Danger
81
82
  it "identifies the todo text as well" do
82
83
  diff = sample_diff("+ # TODO: practice you must")
83
84
 
84
- todos = subject.find_diffs_containing_todos([diff])
85
+ todos = subject.call([diff])
85
86
 
86
87
  expect(todos.first.text).to eql("practice you must")
87
88
  end
@@ -95,7 +96,7 @@ module Danger
95
96
  + # FIXME: with you the force is
96
97
  PATCH
97
98
 
98
- todos = subject.find_diffs_containing_todos([sample_diff(patch)])
99
+ todos = subject.call([sample_diff(patch)])
99
100
 
100
101
  expect(todos.map(&:text))
101
102
  .to eql(["practice you must", "with you the force is"])
@@ -112,7 +113,7 @@ PATCH
112
113
  + */
113
114
  PATCH
114
115
 
115
- todos = subject.find_diffs_containing_todos([sample_diff(patch)])
116
+ todos = subject.call([sample_diff(patch)])
116
117
 
117
118
  expect(todos.map(&:text)).to eql(%w(something another))
118
119
  end
@@ -126,14 +127,21 @@ PATCH
126
127
  + # TODO: this is a
127
128
  + # multiline comment as well
128
129
  + function bla() {};
130
+ + # TODO: I'd rather not have this here ...
131
+ + # because it's probably just a bit of code that we can reimplement
132
+ + # or steal
129
133
  PATCH
130
134
 
131
- todos = subject.find_diffs_containing_todos([sample_diff(patch)])
135
+ todos = subject.call([sample_diff(patch)])
132
136
 
133
137
  expect(todos.map(&:text))
134
138
  .to eql(["this should be parsed as a single item.",
135
- "this is a multiline comment as well"])
139
+ "this is a multiline comment as well",
140
+ "I'd rather not have this here ... because it's probably "\
141
+ "just a bit of code that we can reimplement or steal"])
136
142
  end
137
143
  end
138
144
  end
145
+ # rubocop:enable Metrics/BlockLength
139
146
  end
147
+ # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,14 @@
1
+ diff --git a/danger-todoist.gemspec b/danger-todoist.gemspec
2
+ index f5b474f..4c75b45 100644
3
+ --- a/danger-todoist.gemspec
4
+ +++ b/danger-todoist.gemspec
5
+ @@ -19,6 +19,9 @@ Gem::Specification.new do |spec|
6
+ spec.required_ruby_version = ">= 2.0.0"
7
+
8
+ spec.add_runtime_dependency "danger-plugin-api", "~> 1.0"
9
+ + # TODO: I'd rather not have this here ...
10
+ + # because it's probably just a bit of code that we can reimplement
11
+ + # or steal
12
+ spec.add_runtime_dependency "git_diff_parser", "~> 3.1.0"
13
+
14
+ # General ruby development
@@ -0,0 +1,36 @@
1
+ diff --git a/lib/todoist/diff_todo_finder.rb b/lib/todoist/diff_todo_finder.rb
2
+ index b58809b..1ecc4f0 100644
3
+ --- a/lib/todoist/diff_todo_finder.rb
4
+ +++ b/lib/todoist/diff_todo_finder.rb
5
+ @@ -9,7 +9,6 @@ def initialize(keywords)
6
+
7
+ def call(diffs)
8
+ diffs
9
+ - .each { |diff| debug(diff) }
10
+ .map { |diff| MatchesInDiff.new(diff, diff.patch.scan(@regexp)) }
11
+ .select(&:todo_matches?)
12
+ .map(&:all_todos)
13
+ @@ -18,12 +17,6 @@ def call(diffs)
14
+
15
+ private
16
+
17
+ - def debug(diff)
18
+ - # GitDiffParser::Patches.new(diff.patch).each do |p|
19
+ - # puts p.changed_lines.inspect
20
+ - # end
21
+ - end
22
+ -
23
+ # this is quite a mess now ... I knew it would haunt me.
24
+ # to aid debugging, this online regexr can be
25
+ # used: http://rubular.com/r/DPkoE2ztpn
26
+ @@ -54,9 +47,11 @@ def all_todos
27
+
28
+ def line_number(match)
29
+ _, todo_indicator = match
30
+ + # TODO: What if there are multiple matching lines?
31
+ GitDiffParser::Patch.new(diff.patch).changed_lines.each do |line|
32
+ return line.number if line.content =~ /#{todo_indicator}/
33
+ end
34
+ + # TODO: thats not gonna fly
35
+ -1
36
+ end
@@ -0,0 +1,76 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ module Danger
4
+ # rubocop:disable Metrics/BlockLength
5
+ describe Danger::MatchesInDiff do
6
+ describe "#todo_matches?" do
7
+ it "is false for no matches" do
8
+ expect(described_class.new("", []).todo_matches?).to be false
9
+ end
10
+
11
+ it "is true for some matches" do
12
+ expect(described_class.new("", [["hey"]]).todo_matches?).to be true
13
+ end
14
+ end
15
+
16
+ describe "#all_todos" do
17
+ it "returns the correct line number for the first todo" do
18
+ diff = sample_diff_fixture("sample_patch.diff")
19
+ subject = described_class.new(
20
+ diff,
21
+ [[
22
+ "+ #",
23
+ "TODO",
24
+ "What if there are multiple matching lines?",
25
+ "What if there are multiple matching lines?"
26
+ ]]
27
+ )
28
+ expect(subject.all_todos.first.line_number).to eq 50
29
+ end
30
+
31
+ it "returns the correct line number for the second todo" do
32
+ diff = sample_diff_fixture("sample_patch.diff")
33
+ subject = described_class.new(
34
+ diff,
35
+ [[
36
+ "+ #",
37
+ "TODO",
38
+ "thats not gonna fly",
39
+ "thats not gonna fly"
40
+ ]]
41
+ )
42
+ expect(subject.all_todos.first.line_number).to eq 54
43
+ end
44
+
45
+ it "returns the correct line number for a multiline todo" do
46
+ diff = sample_diff_fixture("multiline_todo_patch.diff")
47
+ subject = described_class.new(
48
+ diff,
49
+ [[
50
+ "+ #",
51
+ "TODO",
52
+ " I'd rather not have this here ...\n+ # because it's probably "\
53
+ "just a bit of code that we can reimplement\n+ # or steal",
54
+ " I'd rather not have this here ...", "\n+ # or steal"
55
+ ]]
56
+ )
57
+ expect(subject.all_todos.first.line_number).to eq 22
58
+ end
59
+
60
+ it "raises when the todo string was not found in the patch" do
61
+ diff = sample_diff_fixture("sample_patch.diff")
62
+ subject = described_class.new(
63
+ diff,
64
+ [[
65
+ "+ #",
66
+ "TODO",
67
+ "",
68
+ "definately not contained in the patch"
69
+ ]]
70
+ )
71
+ expect { subject.all_todos }.to raise_error(TextNotFoundInPatchError)
72
+ end
73
+ end
74
+ end
75
+ # rubocop:enable Metrics/BlockLength
76
+ end
@@ -80,7 +80,13 @@ end
80
80
  def sample_diff(patch)
81
81
  Git::Diff::DiffFile.new(
82
82
  "base",
83
+ src: "src",
84
+ dst: "dst",
83
85
  path: "some/file.rb",
84
86
  patch: patch
85
87
  )
86
88
  end
89
+
90
+ def sample_diff_fixture(filename)
91
+ sample_diff(File.read(File.expand_path("./fixtures/#{filename}", __dir__)))
92
+ end
@@ -79,10 +79,10 @@ PATCH
79
79
  [
80
80
  "#### Todos left in files",
81
81
  "- some/file.rb",
82
- " - some todo",
83
- " - more todo in same file",
82
+ " - Line 0: some todo",
83
+ " - Line 3: more todo in same file",
84
84
  "- another/stuff.rb",
85
- " - another todo"
85
+ " - Line 0: another todo"
86
86
  ]
87
87
  )
88
88
  end
@@ -149,4 +149,6 @@ PATCH
149
149
  end
150
150
  end
151
151
  end
152
+ # rubocop:enable Metrics/BlockLength
152
153
  end
154
+ # rubocop:enable Metrics/ModuleLength
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-todoist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannes Käufler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-08 00:00:00.000000000 Z
11
+ date: 2018-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -53,75 +53,75 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: codeclimate-test-reporter
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.4'
61
+ version: '1.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.4'
68
+ version: '1.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: simplecov
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.12'
75
+ version: '3.4'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.12'
82
+ version: '3.4'
83
83
  - !ruby/object:Gem::Dependency
84
- name: codeclimate-test-reporter
84
+ name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.0'
89
+ version: '0.12'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.0'
96
+ version: '0.12'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: '0.41'
103
+ version: '0.50'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: '0.41'
110
+ version: '0.50'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: yard
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0.8'
117
+ version: 0.9.12
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0.8'
124
+ version: 0.9.12
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: guard
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -199,11 +199,16 @@ files:
199
199
  - danger-todoist.gemspec
200
200
  - lib/danger_plugin.rb
201
201
  - lib/danger_todoist.rb
202
+ - lib/todoist/diff_inline_todo_finder.rb
202
203
  - lib/todoist/diff_todo_finder.rb
203
204
  - lib/todoist/gem_version.rb
204
205
  - lib/todoist/plugin.rb
205
206
  - lib/todoist/todo.rb
207
+ - spec/diff_inline_todo_finder_spec.rb
206
208
  - spec/diff_todo_finder_spec.rb
209
+ - spec/fixtures/multiline_todo_patch.diff
210
+ - spec/fixtures/sample_patch.diff
211
+ - spec/matches_in_diff_spec.rb
207
212
  - spec/spec_helper.rb
208
213
  - spec/todoist_spec.rb
209
214
  homepage: https://github.com/hanneskaeufler/danger-todoist
@@ -232,6 +237,10 @@ specification_version: 4
232
237
  summary: Marking something with a todo is very common during implementing a new feature.
233
238
  Often those todos will get missed in code review.
234
239
  test_files:
240
+ - spec/diff_inline_todo_finder_spec.rb
235
241
  - spec/diff_todo_finder_spec.rb
242
+ - spec/fixtures/multiline_todo_patch.diff
243
+ - spec/fixtures/sample_patch.diff
244
+ - spec/matches_in_diff_spec.rb
236
245
  - spec/spec_helper.rb
237
246
  - spec/todoist_spec.rb