ping 0.0.7 → 0.0.8

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: a7c038c318b349ab0bd683828072e3bad0e5a3d0
4
- data.tar.gz: fd32e55dcb21b9c7123ecc8b6f898149a361a0f8
3
+ metadata.gz: 53bcca036a31b4ffcaeab4ea6ac4c1a645dba51b
4
+ data.tar.gz: ae2324d2655747a23f261fa733f91a79651f9611
5
5
  SHA512:
6
- metadata.gz: 2c7cb7f3cff59f1b61ce8df1b265125262d05af247d9ab2474bc4cd66cbf22049975353430db3d532a2ac962db716e0efc87b51f868a0b251c6e79dac1157b03
7
- data.tar.gz: 5daf030d94134663161813db7da958b15ee2d45ac4f751ecf76526a7920aad9ced3f8df300bad619efef86aee34755ead52fe78143a009be581e401f1ab61849
6
+ metadata.gz: c20cdfbb8bc258e14d51213f0fedb1bdf357e72b4ae3f36a44d8efadc8d26bb1957c42c7f00e825971529906767e4101e7f27978ce781e25954459e64a509217
7
+ data.tar.gz: 05464ba9e01249d5c89d90360c7f2413f369a7bd8f4a5b4483d7f11e63fbeb125d6f0c26cd16eb0a39347230da6b02916f681a0417174da23dcc1e3522aa8522
@@ -0,0 +1,4 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Style/RegexpLiteral:
4
+ AllowInnerSlashes: true
@@ -0,0 +1,29 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-08-01 15:11:49 -0700 using RuboCop version 0.32.1.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ # Offense count: 1
9
+ # Configuration parameters: CountComments.
10
+ Metrics/ClassLength:
11
+ Max: 335
12
+
13
+ # Offense count: 7
14
+ # Configuration parameters: AllowURI, URISchemes.
15
+ Metrics/LineLength:
16
+ Max: 93
17
+
18
+ # Offense count: 4
19
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
20
+ Style/ClassAndModuleChildren:
21
+ Enabled: false
22
+
23
+ # Offense count: 9
24
+ Style/Documentation:
25
+ Enabled: false
26
+
27
+ # Offense count: 1
28
+ Style/OpMethod:
29
+ Enabled: false
data/Rakefile CHANGED
@@ -1,12 +1,20 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
3
- require "rake/testtask"
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
4
 
5
5
  Rake::TestTask.new do |t|
6
- t.libs << "lib"
7
- t.pattern = "test/**/*_test.rb"
6
+ t.libs << 'lib'
7
+ t.pattern = 'test/**/*_test.rb'
8
8
  t.verbose = true
9
9
  end
10
10
 
11
- desc "Run tests"
12
- task :default => :test
11
+ desc 'Run tests'
12
+ task default: :test
13
+
14
+ # append to the default rake task
15
+ require 'rubocop/rake_task'
16
+ RuboCop::RakeTask.new
17
+
18
+ task :default do
19
+ Rake::Task['rubocop'].invoke
20
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ override:
3
+ - bundle exec rake
@@ -1,2 +1,2 @@
1
- require "ping/version"
2
- require "ping/parser"
1
+ require 'ping/version'
2
+ require 'ping/parser'
@@ -2,17 +2,26 @@ module Ping
2
2
  class IssueReference
3
3
  attr_accessor :qualifier, :repository, :number
4
4
 
5
- Qualifiers = /
5
+ QUALIFIERS = /
6
6
  close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved|
7
7
  need|needs|needed|require|requires|required
8
8
  /ix
9
9
 
10
- RepositoryName = /[a-z0-9][a-z0-9\-]*\/[a-z0-9][a-z0-9\-_]*/ix
10
+ REPOSITORY_NAME = /[a-z0-9][a-z0-9\-]*\/[a-z0-9][a-z0-9\-_]*/ix
11
11
 
12
- Pattern = /
12
+ # Match references of the form:
13
+ #
14
+ # - #123
15
+ # - codetree/feedback#123
16
+ # - GH-123
17
+ # - needs #123
18
+ # - etc...
19
+ #
20
+ # See http://rubular.com/r/evB7RlvUfI
21
+ SHORT_PATTERN = /
13
22
  (?:^|\W) # beginning of string or non-word char
14
- (?:(#{Qualifiers})(?:\s))? # qualifier (optional)
15
- (?:(#{RepositoryName})? # repository name (optional)
23
+ (?:(#{QUALIFIERS})(?:\s))? # qualifier (optional)
24
+ (?:(#{REPOSITORY_NAME})? # repository name (optional)
16
25
  \#|(?:GH\-))(\d+) # issue number
17
26
  (?=
18
27
  \.+[ \t\W]| # dots followed by space or non-word character
@@ -22,7 +31,26 @@ module Ping
22
31
  )
23
32
  /ix
24
33
 
25
- # See http://rubular.com/r/bb7Ks0JK9l now http://rubular.com/r/evB7RlvUfI
34
+ # Match references of the form:
35
+ #
36
+ # - https://github.com/codetree/feedback/issues/123
37
+ # - https://github.com/codetree/feedback/pulls/123
38
+ # - needs https://github.com/codetree/feedback/issues/123
39
+ # - etc...
40
+ URL_PATTERN = /
41
+ (?:^|\W) # beginning of string or non-word char
42
+ (?:(#{QUALIFIERS})(?:\s))? # qualifier (optional)
43
+ https:\/\/github.com\/
44
+ (#{REPOSITORY_NAME}) # repository name
45
+ \/(?:issues|pulls)\/
46
+ (\d+) # issue number
47
+ (?=
48
+ \.+[ \t\W]| # dots followed by space or non-word character
49
+ \.+$| # dots at end of line
50
+ [^0-9a-zA-Z_.]| # non-word character except dot
51
+ $ # end of line
52
+ )
53
+ /ix
26
54
 
27
55
  def initialize(qualifier, repository, number)
28
56
  @qualifier = qualifier
@@ -31,24 +59,35 @@ module Ping
31
59
  end
32
60
 
33
61
  def self.extract(text)
34
- text.scan(Pattern).map do |match|
35
- self.new(*match)
62
+ [SHORT_PATTERN, URL_PATTERN].inject([]) do |memo, pattern|
63
+ memo.tap do |m|
64
+ text.scan(pattern).each do |match|
65
+ m << new(*match)
66
+ end
67
+ end
36
68
  end
37
69
  end
38
70
 
39
71
  def self.replace(text, &block)
40
- text.gsub(Pattern) do |phrase|
41
- replacement = yield(phrase, self.new(*phrase.scan(Pattern).first))
42
-
43
- if replacement.is_a?(IssueReference)
44
- new_phrase = phrase[0] == " " ? " " : "" # fix leading space
45
- new_phrase << replacement.qualifier + " " if replacement.qualifier
46
- new_phrase << replacement.repository.to_s
47
- new_phrase << "#" + replacement.number.to_s
48
- else
49
- replacement
72
+ [SHORT_PATTERN, URL_PATTERN].each do |pattern|
73
+ text = text.gsub(pattern) do |match|
74
+ ref = new(*match.scan(pattern).first)
75
+ replace_match(match, ref, &block)
50
76
  end
51
77
  end
78
+
79
+ text
80
+ end
81
+
82
+ def self.replace_match(match, ref, &_block)
83
+ replacement = yield(match, ref)
84
+ return replacement unless replacement.is_a?(IssueReference)
85
+
86
+ # Reformat the given issue reference replacement to match
87
+ new_phrase = match[0] == ' ' ? ' ' : '' # fix leading space
88
+ new_phrase << replacement.qualifier + ' ' if replacement.qualifier
89
+ new_phrase << replacement.repository.to_s
90
+ new_phrase << '#' + replacement.number.to_s
52
91
  end
53
92
 
54
93
  def ==(other)
@@ -2,7 +2,7 @@ module Ping
2
2
  class Mention
3
3
  attr_accessor :username
4
4
 
5
- Pattern = /
5
+ PATTERN = /
6
6
  (?:^|\W) # beginning of string or non-word char
7
7
  @((?>[a-z0-9][a-z0-9-]*)) # @username
8
8
  (?!\/) # without a trailing slash
@@ -19,9 +19,9 @@ module Ping
19
19
  end
20
20
 
21
21
  def self.extract(text)
22
- text.scan(Pattern).flatten.
23
- map(&:downcase).uniq.map do |username|
24
- self.new(username)
22
+ text.scan(PATTERN).flatten
23
+ .map(&:downcase).uniq.map do |username|
24
+ new(username)
25
25
  end
26
26
  end
27
27
 
@@ -1,6 +1,5 @@
1
- require "ping/mention"
2
- require "ping/issue_reference"
3
- require "ping/size"
1
+ require 'ping/mention'
2
+ require 'ping/issue_reference'
4
3
 
5
4
  module Ping
6
5
  class Parser
@@ -21,9 +20,5 @@ module Ping
21
20
  def replace_issue_references(&block)
22
21
  Ping::IssueReference.replace(text, &block)
23
22
  end
24
-
25
- def size
26
- Ping::Size.extract(text)
27
- end
28
23
  end
29
24
  end
@@ -1,3 +1,3 @@
1
1
  module Ping
2
- VERSION = "0.0.7"
2
+ VERSION = '0.0.8'
3
3
  end
@@ -4,23 +4,24 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'ping/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "ping"
7
+ spec.name = 'ping'
8
8
  spec.version = Ping::VERSION
9
- spec.authors = ["Derrick Reimer"]
10
- spec.email = ["derrickreimer@gmail.com"]
11
- spec.summary = %q{Parse @mentions and issue references}
12
- spec.description = %q{A little library for parsing GitHub @mentions and issue references}
13
- spec.homepage = "https://github.com/codetree/ping"
14
- spec.license = "MIT"
9
+ spec.authors = ['Derrick Reimer']
10
+ spec.email = ['derrickreimer@gmail.com']
11
+ spec.summary = 'Parse @mentions and issue references'
12
+ spec.description = 'A little library for parsing GitHub @mentions and issue references'
13
+ spec.homepage = 'https://github.com/codetree/ping'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.6"
22
- spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "minitest", "~> 5.0"
24
- spec.add_development_dependency "shoulda-context", "~> 1.2"
25
- spec.add_development_dependency "mocha", "~> 1.0"
21
+ spec.add_development_dependency 'bundler', '~> 1.6'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'minitest', '~> 5.0'
24
+ spec.add_development_dependency 'shoulda-context', '~> 1.2'
25
+ spec.add_development_dependency 'mocha', '~> 1.0'
26
+ spec.add_development_dependency 'rubocop'
26
27
  end
@@ -1,33 +1,426 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper.rb'
2
2
 
3
3
  class Ping::IssueReferenceTest < MiniTest::Test
4
- context "#==" do
5
- should "compare with integers" do
6
- issue = Ping::IssueReference.new("fixes", "codetree/codetree", "123")
4
+ def extract(text)
5
+ Ping::IssueReference.extract(text)
6
+ end
7
+
8
+ def extract_first(text)
9
+ Ping::IssueReference.extract(text).first
10
+ end
11
+
12
+ context '.extract with standard syntax' do
13
+ should 'extract single issue references' do
14
+ text = 'See #43'
15
+ issue = extract_first(text)
16
+
17
+ assert_equal nil, issue.qualifier
18
+ assert_equal nil, issue.repository
19
+ assert_equal '43', issue.number
20
+ end
21
+
22
+ should 'extract single issue references followed by a period' do
23
+ text = 'See #43.'
24
+ issue = extract_first(text)
25
+
26
+ assert_equal nil, issue.qualifier
27
+ assert_equal nil, issue.repository
28
+ assert_equal '43', issue.number
29
+ end
30
+
31
+ should 'extract close qualifiers' do
32
+ %w(fix fixes fixed close closes closed resolve resolves resolved).each do |q|
33
+ text = "#{q} #55"
34
+ issue = extract_first(text)
35
+
36
+ assert_equal q, issue.qualifier
37
+ assert_equal nil, issue.repository
38
+ assert_equal '55', issue.number
39
+ end
40
+ end
41
+
42
+ should 'extract dependency qualifiers' do
43
+ %w(need needs needed require requires required).each do |q|
44
+ text = "#{q} #123"
45
+ issue = extract_first(text)
46
+
47
+ assert_equal q, issue.qualifier
48
+ assert_equal nil, issue.repository
49
+ assert_equal '123', issue.number
50
+ end
51
+ end
52
+
53
+ should 'extract repository' do
54
+ text = 'codetree/codetree#43'
55
+ issue = extract_first(text)
56
+
57
+ assert_equal nil, issue.qualifier
58
+ assert_equal 'codetree/codetree', issue.repository
59
+ assert_equal '43', issue.number
60
+ end
61
+
62
+ should 'extract repository with qualifier' do
63
+ text = 'Fixes codetree/codetree#43'
64
+ issue = extract_first(text)
65
+
66
+ assert_equal 'Fixes', issue.qualifier
67
+ assert_equal 'codetree/codetree', issue.repository
68
+ assert_equal '43', issue.number
69
+ end
70
+
71
+ should 'handle odd repository names' do
72
+ text = 'giant-sequoia-123/scaling_octokitten#43'
73
+ issue = extract_first(text)
74
+
75
+ assert_equal 'giant-sequoia-123/scaling_octokitten', issue.repository
76
+ assert_equal '43', issue.number
77
+ end
78
+
79
+ should 'extract multiple references' do
80
+ text = 'You should look at #2 and #4 because #5 fixes codetree/codetree#6'
81
+ refs = extract(text)
82
+
83
+ assert refs.include?(2)
84
+ assert refs.include?(4)
85
+ assert refs.include?(5)
86
+ assert refs.include?(6)
87
+ end
88
+
89
+ should 'not extract similar non-qualifiers' do
90
+ text = 'afixes #43'
91
+ issue = extract_first(text)
92
+
93
+ assert_equal nil, issue.qualifier
94
+ assert_equal nil, issue.repository
95
+ assert_equal '43', issue.number
96
+ end
97
+
98
+ should 'not choke on case' do
99
+ text = 'FIxEs #43'
100
+ issue = extract_first(text)
101
+
102
+ assert_equal 'FIxEs', issue.qualifier
103
+ assert_equal nil, issue.repository
104
+ assert_equal '43', issue.number
105
+ end
106
+
107
+ should 'require one space between qualifier and issue' do
108
+ text = 'fixes #43'
109
+ issue = extract_first(text)
110
+
111
+ assert_equal nil, issue.qualifier
112
+ assert_equal nil, issue.repository
113
+ assert_equal '43', issue.number
114
+ end
115
+
116
+ should 'handle variable casing in repo names' do
117
+ text = 'needs Liquid-Labs/rf-app-admin-web-app#2'
118
+ issue = extract_first(text)
119
+
120
+ assert_equal 'needs', issue.qualifier
121
+ assert_equal 'Liquid-Labs/rf-app-admin-web-app', issue.repository
122
+ assert_equal '2', issue.number
123
+ end
124
+ end
125
+
126
+ context '.extract with GH-XXX syntax' do
127
+ should 'extract single issue references' do
128
+ text = 'See GH-43'
129
+ issue = extract_first(text)
130
+
131
+ assert_equal nil, issue.qualifier
132
+ assert_equal nil, issue.repository
133
+ assert_equal '43', issue.number
134
+ end
135
+
136
+ should 'extract lower case issue references' do
137
+ text = 'See gh-43'
138
+ issue = extract_first(text)
139
+
140
+ assert_equal nil, issue.qualifier
141
+ assert_equal nil, issue.repository
142
+ assert_equal '43', issue.number
143
+ end
144
+
145
+ should 'extract single issue references followed by a period' do
146
+ text = 'See GH-43.'
147
+ issue = extract_first(text)
148
+
149
+ assert_equal nil, issue.qualifier
150
+ assert_equal nil, issue.repository
151
+ assert_equal '43', issue.number
152
+ end
153
+
154
+ should 'extract close qualifiers' do
155
+ %w(fix fixes fixed close closes closed resolve resolves resolved).each do |q|
156
+ text = "#{q} GH-55"
157
+ issue = extract_first(text)
158
+
159
+ assert_equal q, issue.qualifier
160
+ assert_equal nil, issue.repository
161
+ assert_equal '55', issue.number
162
+ end
163
+ end
164
+
165
+ should 'extract dependency qualifiers' do
166
+ %w(need needs needed require requires required).each do |q|
167
+ text = "#{q} GH-123"
168
+ issue = extract_first(text)
169
+
170
+ assert_equal q, issue.qualifier
171
+ assert_equal nil, issue.repository
172
+ assert_equal '123', issue.number
173
+ end
174
+ end
175
+
176
+ should 'extract multiple references' do
177
+ text = 'You should look at GH-2 and GH-4 because GH-5 fixes codetree/codetree#6'
178
+ refs = extract(text)
179
+
180
+ assert refs.include?(2)
181
+ assert refs.include?(4)
182
+ assert refs.include?(5)
183
+ assert refs.include?(6)
184
+ end
185
+
186
+ should 'not extract similar non-qualifiers' do
187
+ text = 'afixes GH-43'
188
+ issue = extract_first(text)
189
+
190
+ assert_equal nil, issue.qualifier
191
+ assert_equal nil, issue.repository
192
+ assert_equal '43', issue.number
193
+ end
194
+
195
+ should 'not choke on case' do
196
+ text = 'FIxEs GH-43'
197
+ issue = extract_first(text)
198
+
199
+ assert_equal 'FIxEs', issue.qualifier
200
+ assert_equal nil, issue.repository
201
+ assert_equal '43', issue.number
202
+ end
203
+
204
+ should 'require only one space between qualifier and issue' do
205
+ text = 'fixes GH-43'
206
+ issue = extract_first(text)
207
+
208
+ assert_equal nil, issue.qualifier
209
+ assert_equal nil, issue.repository
210
+ assert_equal '43', issue.number
211
+ end
212
+
213
+ should 'require at least one space before GH' do
214
+ text = 'fixes codetree/codetreeGH-99 and fixes GH-43'
215
+ issue = extract_first(text)
216
+
217
+ assert_equal 'fixes', issue.qualifier
218
+ assert_equal nil, issue.repository
219
+ assert_equal '43', issue.number
220
+ end
221
+ end
222
+
223
+ context '#issue_references with URL syntax' do
224
+ should 'extract single issue references' do
225
+ text = 'See https://github.com/codetree/feedback/issues/43'
226
+ issue = extract_first(text)
227
+
228
+ assert_equal nil, issue.qualifier
229
+ assert_equal 'codetree/feedback', issue.repository
230
+ assert_equal '43', issue.number
231
+ end
232
+
233
+ should 'extract single pull requests references' do
234
+ text = 'See https://github.com/codetree/feedback/pulls/43'
235
+ issue = extract_first(text)
236
+
237
+ assert_equal nil, issue.qualifier
238
+ assert_equal 'codetree/feedback', issue.repository
239
+ assert_equal '43', issue.number
240
+ end
241
+
242
+ should 'extract single issue references followed by a period' do
243
+ text = 'See https://github.com/codetree/feedback/issues/43.'
244
+ issue = extract_first(text)
245
+
246
+ assert_equal nil, issue.qualifier
247
+ assert_equal 'codetree/feedback', issue.repository
248
+ assert_equal '43', issue.number
249
+ end
250
+
251
+ should 'extract close qualifiers' do
252
+ %w(fix fixes fixed close closes closed resolve resolves resolved).each do |q|
253
+ text = "#{q} https://github.com/codetree/feedback/issues/55"
254
+ issue = extract_first(text)
255
+
256
+ assert_equal q, issue.qualifier
257
+ assert_equal 'codetree/feedback', issue.repository
258
+ assert_equal '55', issue.number
259
+ end
260
+ end
261
+
262
+ should 'extract dependency qualifiers' do
263
+ %w(need needs needed require requires required).each do |q|
264
+ text = "#{q} https://github.com/codetree/feedback/issues/123"
265
+ issue = extract_first(text)
266
+
267
+ assert_equal q, issue.qualifier
268
+ assert_equal 'codetree/feedback', issue.repository
269
+ assert_equal '123', issue.number
270
+ end
271
+ end
272
+
273
+ should 'extract multiple references' do
274
+ text = 'You should look at https://github.com/codetree/feedback/issues/2 ' \
275
+ 'and https://github.com/codetree/feedback/issues/4 because ' \
276
+ 'https://github.com/codetree/feedback/issues/5 fixes codetree/codetree#6'
277
+
278
+ refs = extract(text)
279
+
280
+ assert refs.include?(2)
281
+ assert refs.include?(4)
282
+ assert refs.include?(5)
283
+ assert refs.include?(6)
284
+ end
285
+
286
+ should 'not extract similar non-qualifiers' do
287
+ text = 'afixes https://github.com/codetree/feedback/issues/43'
288
+ issue = extract_first(text)
289
+
290
+ assert_equal nil, issue.qualifier
291
+ assert_equal 'codetree/feedback', issue.repository
292
+ assert_equal '43', issue.number
293
+ end
294
+
295
+ should 'not choke on case' do
296
+ text = 'FIxEs https://github.com/codetree/feedback/issues/43'
297
+ issue = extract_first(text)
298
+
299
+ assert_equal 'FIxEs', issue.qualifier
300
+ assert_equal 'codetree/feedback', issue.repository
301
+ assert_equal '43', issue.number
302
+ end
303
+
304
+ should 'require only one space between qualifier and issue' do
305
+ text = 'fixes https://github.com/codetree/feedback/issues/43'
306
+ issue = extract_first(text)
307
+
308
+ assert_equal nil, issue.qualifier
309
+ assert_equal 'codetree/feedback', issue.repository
310
+ assert_equal '43', issue.number
311
+ end
312
+ end
313
+
314
+ context '.replace' do
315
+ should 'yield the phrase and parsed reference' do
316
+ text = 'Fixes codetree/codetree#123 needs codetree/feedback#456'
317
+
318
+ expected = [
319
+ 'Fixes codetree/codetree#123',
320
+ ' needs codetree/feedback#456'
321
+ ]
322
+
323
+ Ping::IssueReference.replace(text) do |phrase, reference|
324
+ expected_phrase = expected.shift
325
+ expected_reference = Ping::IssueReference.extract(expected_phrase).first
326
+
327
+ assert_equal expected_phrase, phrase
328
+ assert_equal expected_reference, reference
329
+ end
330
+ end
331
+
332
+ context 'given a IssueReference replacement' do
333
+ should 'handle qualifier + repo + number' do
334
+ text = 'Fixes a/b#123 fixes #456'
335
+
336
+ result = Ping::IssueReference.replace(text) do |_phrase, reference|
337
+ reference.tap do |r|
338
+ r.repository = 'codetree/feedback' unless r.repository
339
+ end
340
+ end
341
+
342
+ assert_equal 'Fixes a/b#123 fixes codetree/feedback#456', result
343
+ end
344
+
345
+ should 'handle qualifier + number' do
346
+ text = 'Fixes #123 fixes #456'
347
+
348
+ result = Ping::IssueReference.replace(text) do |_phrase, reference|
349
+ reference.tap do |r|
350
+ r.qualifier = 'needs'
351
+ r.repository = 'a/b'
352
+ end
353
+ end
354
+
355
+ assert_equal 'needs a/b#123 needs a/b#456', result
356
+ end
357
+
358
+ should 'handle repo + number' do
359
+ text = 'a/b#123 b/c#456'
360
+
361
+ result = Ping::IssueReference.replace(text) do |_phrase, reference|
362
+ reference.tap do |r|
363
+ r.qualifier = 'needs'
364
+ r.repository = 'd/e'
365
+ end
366
+ end
367
+
368
+ assert_equal 'needs d/e#123 needs d/e#456', result
369
+ end
370
+
371
+ should 'handle number only' do
372
+ text = '#123 #456'
373
+
374
+ result = Ping::IssueReference.replace(text) do |_phrase, reference|
375
+ reference.tap do |r|
376
+ r.repository = 'd/e'
377
+ end
378
+ end
379
+
380
+ assert_equal 'd/e#123 d/e#456', result
381
+ end
382
+ end
383
+
384
+ context 'given a string replacement' do
385
+ should 'replace references' do
386
+ text = 'Fixes a/b#123 fixes #456'
387
+
388
+ result = Ping::IssueReference.replace(text) do |phrase, _reference|
389
+ phrase + ' bar'
390
+ end
391
+
392
+ assert_equal 'Fixes a/b#123 bar fixes #456 bar', result
393
+ end
394
+ end
395
+ end
396
+
397
+ context '#==' do
398
+ should 'compare with integers' do
399
+ issue = Ping::IssueReference.new('fixes', 'codetree/codetree', '123')
7
400
  assert issue == 123
8
401
  end
9
402
 
10
- should "compare with strings" do
11
- issue = Ping::IssueReference.new("fixes", "codetree/codetree", "123")
12
- assert issue == "123"
403
+ should 'compare with strings' do
404
+ issue = Ping::IssueReference.new('fixes', 'codetree/codetree', '123')
405
+ assert issue == '123'
13
406
  end
14
407
 
15
- should "compare with issues" do
16
- issue = Ping::IssueReference.new("fixes", "codetree/codetree", "123")
17
- assert issue == Ping::IssueReference.new(nil, "codetree/codetree", "123")
408
+ should 'compare with issues' do
409
+ issue = Ping::IssueReference.new('fixes', 'codetree/codetree', '123')
410
+ assert issue == Ping::IssueReference.new(nil, 'codetree/codetree', '123')
18
411
  end
19
412
  end
20
413
 
21
- context "#to_s" do
22
- should "return the issue number" do
23
- issue = Ping::IssueReference.new("Fixes", "codetree/codetree", "123")
24
- assert_equal "123", issue.to_s
414
+ context '#to_s' do
415
+ should 'return the issue number' do
416
+ issue = Ping::IssueReference.new('Fixes', 'codetree/codetree', '123')
417
+ assert_equal '123', issue.to_s
25
418
  end
26
419
  end
27
420
 
28
- context "#to_i" do
29
- should "return the integer issue number" do
30
- issue = Ping::IssueReference.new("Fixes", "codetree/codetree", "123")
421
+ context '#to_i' do
422
+ should 'return the integer issue number' do
423
+ issue = Ping::IssueReference.new('Fixes', 'codetree/codetree', '123')
31
424
  assert_equal 123, issue.to_i
32
425
  end
33
426
  end
@@ -1,22 +1,45 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper.rb'
2
2
 
3
3
  class Ping::MentionTest < MiniTest::Test
4
- context "#==" do
5
- should "compare with strings" do
6
- mention = Ping::Mention.new("djreimer")
7
- assert mention == "djreimer"
4
+ def extract(text)
5
+ Ping::Mention.extract(text)
6
+ end
7
+
8
+ def extract_first(text)
9
+ Ping::Mention.extract(text).first
10
+ end
11
+
12
+ context '.extract' do
13
+ should 'extract @mentions' do
14
+ text = "Hey there, @djreimer. How's @defunkt?"
15
+ result = extract(text)
16
+ assert result.include?('djreimer')
17
+ assert result.include?('defunkt')
18
+ end
19
+
20
+ should 'de-dup mentions' do
21
+ text = "Hey there, @djreimer. How's @djreimer?"
22
+ result = extract(text)
23
+ assert_equal 1, result.length
24
+ end
25
+ end
26
+
27
+ context '#==' do
28
+ should 'compare with strings' do
29
+ mention = Ping::Mention.new('djreimer')
30
+ assert mention == 'djreimer'
8
31
  end
9
32
 
10
- should "compare with mentions" do
11
- mention = Ping::Mention.new("djreimer")
12
- assert mention == Ping::Mention.new("djreimer")
33
+ should 'compare with mentions' do
34
+ mention = Ping::Mention.new('djreimer')
35
+ assert mention == Ping::Mention.new('djreimer')
13
36
  end
14
37
  end
15
38
 
16
- context "#to_s" do
17
- should "return the username" do
18
- mention = Ping::Mention.new("djreimer")
19
- assert_equal "djreimer", mention.to_s
39
+ context '#to_s' do
40
+ should 'return the username' do
41
+ mention = Ping::Mention.new('djreimer')
42
+ assert_equal 'djreimer', mention.to_s
20
43
  end
21
44
  end
22
45
  end
@@ -1,358 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper.rb'
2
2
 
3
3
  class Ping::ParserTest < MiniTest::Test
4
- context "#mentions" do
5
- should "extract @mentions" do
6
- text = "Hey there, @djreimer. How's @defunkt?"
7
- parser = Ping::Parser.new(text)
8
- assert parser.mentions.include?("djreimer")
9
- assert parser.mentions.include?("defunkt")
10
- end
11
-
12
- should "de-dup mentions" do
13
- text = "Hey there, @djreimer. How's @djreimer?"
14
- parser = Ping::Parser.new(text)
15
- assert_equal 1, parser.mentions.length
16
- end
17
- end
18
-
19
- context "#issue_references with standard syntax" do
20
- should "extract single issue references" do
21
- text = "See #43"
22
- parser = Ping::Parser.new(text)
23
- issue = parser.issue_references.first
24
-
25
- assert_equal nil, issue.qualifier
26
- assert_equal nil, issue.repository
27
- assert_equal "43", issue.number
28
- end
29
-
30
- should "extract single issue references followed by a period" do
31
- text = "See #43."
32
- parser = Ping::Parser.new(text)
33
- issue = parser.issue_references.first
34
-
35
- assert_equal nil, issue.qualifier
36
- assert_equal nil, issue.repository
37
- assert_equal "43", issue.number
38
- end
39
-
40
- should "extract close qualifiers" do
41
- %w{fix fixes fixed close closes closed resolve resolves resolved}.each do |q|
42
- text = "#{q} #55"
43
- parser = Ping::Parser.new(text)
44
- issue = parser.issue_references.first
45
-
46
- assert_equal q, issue.qualifier
47
- assert_equal nil, issue.repository
48
- assert_equal "55", issue.number
49
- end
50
- end
51
-
52
- should "extract dependency qualifiers" do
53
- %w{need needs needed require requires required}.each do |q|
54
- text = "#{q} #123"
55
- parser = Ping::Parser.new(text)
56
- issue = parser.issue_references.first
57
-
58
- assert_equal q, issue.qualifier
59
- assert_equal nil, issue.repository
60
- assert_equal "123", issue.number
61
- end
62
- end
63
-
64
- should "extract repository" do
65
- text = "codetree/codetree#43"
66
- parser = Ping::Parser.new(text)
67
- issue = parser.issue_references.first
68
-
69
- assert_equal nil, issue.qualifier
70
- assert_equal "codetree/codetree", issue.repository
71
- assert_equal "43", issue.number
72
- end
73
-
74
- should "extract repository with qualifier" do
75
- text = "Fixes codetree/codetree#43"
76
- parser = Ping::Parser.new(text)
77
- issue = parser.issue_references.first
78
-
79
- assert_equal "Fixes", issue.qualifier
80
- assert_equal "codetree/codetree", issue.repository
81
- assert_equal "43", issue.number
82
- end
83
-
84
- should "handle odd repository names" do
85
- text = "giant-sequoia-123/scaling_octokitten#43"
86
- parser = Ping::Parser.new(text)
87
- issue = parser.issue_references.first
88
-
89
- assert_equal "giant-sequoia-123/scaling_octokitten", issue.repository
90
- assert_equal "43", issue.number
91
- end
92
-
93
- should "extract multiple references" do
94
- text = "You should look at #2 and #4 because #5 fixes codetree/codetree#6"
95
- parser = Ping::Parser.new(text)
96
-
97
- assert parser.issue_references.include?(2)
98
- assert parser.issue_references.include?(4)
99
- assert parser.issue_references.include?(5)
100
- assert parser.issue_references.include?(6)
101
- end
102
-
103
- should "not extract similar non-qualifiers" do
104
- text = "afixes #43"
105
- parser = Ping::Parser.new(text)
106
- issue = parser.issue_references.first
107
-
108
- assert_equal nil, issue.qualifier
109
- assert_equal nil, issue.repository
110
- assert_equal "43", issue.number
111
- end
112
-
113
- should "not choke on case" do
114
- text = "FIxEs #43"
115
- parser = Ping::Parser.new(text)
116
- issue = parser.issue_references.first
117
-
118
- assert_equal "FIxEs", issue.qualifier
119
- assert_equal nil, issue.repository
120
- assert_equal "43", issue.number
121
- end
122
-
123
- should "require one space between qualifier and issue" do
124
- text = "fixes #43"
125
- parser = Ping::Parser.new(text)
126
- issue = parser.issue_references.first
127
-
128
- assert_equal nil, issue.qualifier
129
- assert_equal nil, issue.repository
130
- assert_equal "43", issue.number
131
- end
132
-
133
- should "handle variable casing in repo names" do
134
- text = "needs Liquid-Labs/rf-app-admin-web-app#2"
135
- parser = Ping::Parser.new(text)
136
- issue = parser.issue_references.first
137
-
138
- assert_equal "needs", issue.qualifier
139
- assert_equal "Liquid-Labs/rf-app-admin-web-app", issue.repository
140
- assert_equal "2", issue.number
141
- end
142
- end
143
-
144
- context "#issue_references with GH-XXX syntax" do
145
- should "extract single issue references" do
146
- text = "See GH-43"
147
- parser = Ping::Parser.new(text)
148
- issue = parser.issue_references.first
149
-
150
- assert_equal nil, issue.qualifier
151
- assert_equal nil, issue.repository
152
- assert_equal "43", issue.number
153
- end
154
-
155
- should "extract lower case issue references" do
156
- text = "See gh-43"
157
- parser = Ping::Parser.new(text)
158
- issue = parser.issue_references.first
159
-
160
- assert_equal nil, issue.qualifier
161
- assert_equal nil, issue.repository
162
- assert_equal "43", issue.number
163
- end
164
-
165
- should "extract single issue references followed by a period" do
166
- text = "See GH-43."
167
- parser = Ping::Parser.new(text)
168
- issue = parser.issue_references.first
169
-
170
- assert_equal nil, issue.qualifier
171
- assert_equal nil, issue.repository
172
- assert_equal "43", issue.number
173
- end
174
-
175
- should "extract close qualifiers" do
176
- %w{fix fixes fixed close closes closed resolve resolves resolved}.each do |q|
177
- text = "#{q} GH-55"
178
- parser = Ping::Parser.new(text)
179
- issue = parser.issue_references.first
180
-
181
- assert_equal q, issue.qualifier
182
- assert_equal nil, issue.repository
183
- assert_equal "55", issue.number
184
- end
185
- end
186
-
187
- should "extract dependency qualifiers" do
188
- %w{need needs needed require requires required}.each do |q|
189
- text = "#{q} GH-123"
190
- parser = Ping::Parser.new(text)
191
- issue = parser.issue_references.first
192
-
193
- assert_equal q, issue.qualifier
194
- assert_equal nil, issue.repository
195
- assert_equal "123", issue.number
196
- end
197
- end
198
-
199
- should "extract multiple references" do
200
- text = "You should look at GH-2 and GH-4 because GH-5 fixes codetree/codetree#6"
201
- parser = Ping::Parser.new(text)
202
-
203
- assert parser.issue_references.include?(2)
204
- assert parser.issue_references.include?(4)
205
- assert parser.issue_references.include?(5)
206
- assert parser.issue_references.include?(6)
207
- end
208
-
209
- should "not extract similar non-qualifiers" do
210
- text = "afixes GH-43"
211
- parser = Ping::Parser.new(text)
212
- issue = parser.issue_references.first
213
-
214
- assert_equal nil, issue.qualifier
215
- assert_equal nil, issue.repository
216
- assert_equal "43", issue.number
217
- end
218
-
219
- should "not choke on case" do
220
- text = "FIxEs GH-43"
221
- parser = Ping::Parser.new(text)
222
- issue = parser.issue_references.first
223
-
224
- assert_equal "FIxEs", issue.qualifier
225
- assert_equal nil, issue.repository
226
- assert_equal "43", issue.number
227
- end
228
-
229
- should "require only one space between qualifier and issue" do
230
- text = "fixes GH-43"
231
- parser = Ping::Parser.new(text)
232
- issue = parser.issue_references.first
233
-
234
- assert_equal nil, issue.qualifier
235
- assert_equal nil, issue.repository
236
- assert_equal "43", issue.number
237
- end
238
-
239
- should "require at least one space before GH" do
240
- text = "fixes codetree/codetreeGH-99 and fixes GH-43"
241
- parser = Ping::Parser.new(text)
242
- issue = parser.issue_references.first
243
-
244
- assert_equal "fixes", issue.qualifier
245
- assert_equal nil, issue.repository
246
- assert_equal "43", issue.number
247
- end
248
- end
249
-
250
- context "#replace_issue_references" do
251
- should "yield the phrase and parsed reference" do
252
- text = "Fixes codetree/codetree#123 needs codetree/feedback#456"
253
- parser = Ping::Parser.new(text)
254
-
255
- expected = [
256
- "Fixes codetree/codetree#123",
257
- " needs codetree/feedback#456"
258
- ]
259
-
260
- parser.replace_issue_references do |phrase, reference|
261
- expected_phrase = expected.shift
262
- expected_reference = Ping::Parser.new(expected_phrase).issue_references.first
263
-
264
- assert_equal expected_phrase, phrase
265
- assert_equal expected_reference, reference
266
- end
267
- end
268
-
269
- context "given a IssueReference replacement" do
270
- should "handle qualifier + repo + number" do
271
- text = "Fixes a/b#123 fixes #456"
272
- parser = Ping::Parser.new(text)
273
-
274
- result = parser.replace_issue_references do |phrase, reference|
275
- reference.tap do |r|
276
- r.repository = "codetree/feedback" unless r.repository
277
- end
278
- end
279
-
280
- assert_equal "Fixes a/b#123 fixes codetree/feedback#456", result
281
- end
282
-
283
- should "handle qualifier + number" do
284
- text = "Fixes #123 fixes #456"
285
- parser = Ping::Parser.new(text)
286
-
287
- result = parser.replace_issue_references do |phrase, reference|
288
- reference.tap do |r|
289
- r.qualifier = "needs"
290
- r.repository = "a/b"
291
- end
292
- end
293
-
294
- assert_equal "needs a/b#123 needs a/b#456", result
295
- end
296
-
297
- should "handle repo + number" do
298
- text = "a/b#123 b/c#456"
299
- parser = Ping::Parser.new(text)
300
-
301
- result = parser.replace_issue_references do |phrase, reference|
302
- reference.tap do |r|
303
- r.qualifier = "needs"
304
- r.repository = "d/e"
305
- end
306
- end
307
-
308
- assert_equal "needs d/e#123 needs d/e#456", result
309
- end
310
-
311
- should "handle number only" do
312
- text = "#123 #456"
313
- parser = Ping::Parser.new(text)
314
-
315
- result = parser.replace_issue_references do |phrase, reference|
316
- reference.tap do |r|
317
- r.repository = "d/e"
318
- end
319
- end
320
-
321
- assert_equal "d/e#123 d/e#456", result
322
- end
323
- end
324
-
325
- context "given a string replacement" do
326
- should "replace references" do
327
- text = "Fixes a/b#123 fixes #456"
328
- parser = Ping::Parser.new(text)
329
-
330
- result = parser.replace_issue_references do |phrase, reference|
331
- phrase + " bar"
332
- end
333
-
334
- assert_equal "Fixes a/b#123 bar fixes #456 bar", result
335
- end
336
- end
337
- end
338
-
339
- context "#size" do
340
- should "extract the last point value" do
341
- text = "Is this size:12 or size:14?"
342
- parser = Ping::Parser.new(text)
343
- assert_equal 14, parser.size.points
344
- end
345
-
346
- should "be indifferent to keyword casing" do
347
- text = "SiZe:12"
348
- parser = Ping::Parser.new(text)
349
- assert_equal 12, parser.size.points
350
- end
351
-
352
- should "return nil if there is no size" do
353
- text = "No size here"
354
- parser = Ping::Parser.new(text)
355
- assert_nil parser.size.points
356
- end
357
- end
358
4
  end
@@ -1,6 +1,6 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
 
3
- require "ping"
4
- require "minitest/autorun"
5
- require "shoulda-context"
6
- require "mocha/setup"
3
+ require 'ping'
4
+ require 'minitest/autorun'
5
+ require 'shoulda-context'
6
+ require 'mocha/setup'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ping
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derrick Reimer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-14 00:00:00.000000000 Z
11
+ date: 2015-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: A little library for parsing GitHub @mentions and issue references
84
98
  email:
85
99
  - derrickreimer@gmail.com
@@ -88,21 +102,22 @@ extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
104
  - .gitignore
105
+ - .rubocop.yml
106
+ - .rubocop_todo.yml
91
107
  - Gemfile
92
108
  - LICENSE.txt
93
109
  - README.md
94
110
  - Rakefile
111
+ - circle.yml
95
112
  - lib/ping.rb
96
113
  - lib/ping/issue_reference.rb
97
114
  - lib/ping/mention.rb
98
115
  - lib/ping/parser.rb
99
- - lib/ping/size.rb
100
116
  - lib/ping/version.rb
101
117
  - ping.gemspec
102
118
  - test/ping/issue_reference_test.rb
103
119
  - test/ping/mention_test.rb
104
120
  - test/ping/parser_test.rb
105
- - test/ping/size_test.rb
106
121
  - test/test_helper.rb
107
122
  homepage: https://github.com/codetree/ping
108
123
  licenses:
@@ -132,6 +147,5 @@ test_files:
132
147
  - test/ping/issue_reference_test.rb
133
148
  - test/ping/mention_test.rb
134
149
  - test/ping/parser_test.rb
135
- - test/ping/size_test.rb
136
150
  - test/test_helper.rb
137
151
  has_rdoc:
@@ -1,40 +0,0 @@
1
- module Ping
2
- class Size
3
- attr_accessor :points
4
-
5
- Pattern = /
6
- (?:^|\W) # beginning of string or non-word char
7
- (?:size|points): # keyword
8
- (\d+) # point value
9
- (?=
10
- \.+[ \t\W]| # dots followed by space or non-word character
11
- \.+$| # dots at end of line
12
- [^0-9a-zA-Z_.]| # non-word character except dot
13
- $ # end of line
14
- )
15
- /ix
16
-
17
- # See http://rubular.com/r/7u67dIwXuk
18
-
19
- def self.extract(text)
20
- matches = text.scan(Pattern)
21
- matches.any? ? self.new(matches.last.first.to_i) : self.new(nil)
22
- end
23
-
24
- def initialize(points)
25
- @points = points
26
- end
27
-
28
- def ==(other)
29
- other.to_i == to_i
30
- end
31
-
32
- def to_i
33
- points.to_i
34
- end
35
-
36
- def to_s
37
- points.to_s
38
- end
39
- end
40
- end
@@ -1,41 +0,0 @@
1
- require File.dirname(__FILE__) + '/../test_helper.rb'
2
-
3
- class Ping::SizeTest < MiniTest::Test
4
- context "#==" do
5
- should "compare with integers" do
6
- size = Ping::Size.new(10)
7
- assert size == 10
8
- end
9
-
10
- should "compare with nil" do
11
- size = Ping::Size.new(10)
12
- assert !(size == nil)
13
-
14
- size = Ping::Size.new(0)
15
- assert size == nil
16
-
17
- size = Ping::Size.new(nil)
18
- assert size == nil
19
- end
20
-
21
- should "compare with other sizes" do
22
- size = Ping::Size.new(10)
23
- assert Ping::Size.new(10) == size
24
- assert !(Ping::Size.new(11) == size)
25
- end
26
- end
27
-
28
- context "#to_s" do
29
- should "return the points as a string" do
30
- size = Ping::Size.new(10)
31
- assert_equal "10", size.to_s
32
- end
33
- end
34
-
35
- context "#to_i" do
36
- should "return the integer points" do
37
- size = Ping::Size.new(10)
38
- assert_equal 10, size.to_i
39
- end
40
- end
41
- end