inch 0.6.4 → 0.7.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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 97a2e0db4145398867af07819d6657c6473c7cf2
4
- data.tar.gz: 288d4945533cde5327a6479d0c4225d8cdff562b
3
+ metadata.gz: 3f5e51a1fb3956e91d0e804c28cbfb8c21dc1ef9
4
+ data.tar.gz: fb07a2be558122b91bcb674381a3dbac81ab49e2
5
5
  SHA512:
6
- metadata.gz: 0958cf52771d502deeaa704a0c976dc8f3adb758f114fec1a9cb5bd08be81d1a5ced6c7a42f5ce609003d727a79acda12e879fe798cf3cbab97956dab33e7cca
7
- data.tar.gz: aa5badaa8ea8c48db207dfe9830a42c59086471f9bd314478753de0c54659eba7b485fd7a1358a8af4a187e51b13826629d30834e0779e5fd39ad2bacedeb24f
6
+ metadata.gz: c6708035951911b83cecfec2ff1c885e7b9cfd73b148c36e48d827ac63ba520ff6159f4be9c73880e7bdfe7d17079bfbdc10251dc76b7e4b243abbb7fc3c644b
7
+ data.tar.gz: 4c22485a4a3afa60aacaccc3be699737e34329c9ec168715547457131e29fc9fba881f99105bbe9db24f748f16cdd8319a13d3524615075009776d8a7454ecd1
@@ -1 +1 @@
1
- ruby-2.1.3
1
+ ruby-2.1.6
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.0
4
+
5
+ BREAKING CHANGE:
6
+
7
+ - CLI: Uses an exit status different from zero in case of suggestions. This might break workflows based on `&&` (e.g. `rake && inch && ...`).
8
+
9
+ Improvements:
10
+
11
+ - Elixir: Skip analysis for function parameters starting with '_'
12
+ - JavaScript: Add support for @ignore and istanbul ignore comments
13
+ - JavaScript: Add support for @also (multiple signatures)
14
+
3
15
  ## 0.6.4
4
16
 
5
17
  - Ruby: Skip analysis for method parameters named '_'
@@ -8,7 +20,7 @@
8
20
  ## 0.6.3
9
21
 
10
22
  - Elixir: Recognize callbacks and macros
11
- - NodeJS: Improve param type detection
23
+ - JavaScript: Improve param type detection
12
24
 
13
25
  ## 0.6.2
14
26
 
data/README.md CHANGED
@@ -260,7 +260,8 @@ It comes with four sub-commands: `suggest`, `stats`, `show`, and `list`
260
260
 
261
261
  ### inch suggest
262
262
 
263
- Suggests places where a codebase suffers a lack of documentation.
263
+ Suggests places where a codebase suffers a lack of documentation. The command
264
+ line exit status will be above zero when suggestions are found.
264
265
 
265
266
  $ inch suggest
266
267
 
data/bin/inch CHANGED
@@ -20,4 +20,5 @@ $LOAD_PATH.unshift(find_lib_path)
20
20
  require 'inch'
21
21
  require 'inch/cli'
22
22
 
23
- Inch::CLI::CommandParser.run(*ARGV)
23
+ command = Inch::CLI::CommandParser.run(*ARGV)
24
+ exit(command.exit_status)
@@ -36,6 +36,8 @@ module Inch
36
36
  # @note This was adapted from YARD
37
37
  # https://github.com/lsegal/yard/blob/master/lib/yard/cli/command.rb
38
38
  class Base
39
+ EXIT_STATUS_SUCCESS = 0
40
+
39
41
  include TraceHelper
40
42
 
41
43
  attr_reader :codebase # @return [Codebase::Proxy]
@@ -72,6 +74,14 @@ module Inch
72
74
  ''
73
75
  end
74
76
 
77
+ # Returns the exit status of the running command.
78
+ # This can be overridden to customize exit statusses.
79
+ #
80
+ # @return [Fixnum] zero (by default)
81
+ def exit_status
82
+ EXIT_STATUS_SUCCESS
83
+ end
84
+
75
85
  # Returns the name of the command by which it is referenced
76
86
  # in the command list
77
87
  #
@@ -7,6 +7,8 @@ module Inch
7
7
  class Suggest < List
8
8
  register_command_as :suggest, true
9
9
 
10
+ EXIT_CODE_PENDING_SUGGESTIONS = 10
11
+
10
12
  def description
11
13
  'Suggests some objects to be documented (better)'
12
14
  end
@@ -23,13 +25,19 @@ module Inch
23
25
  def run(*args)
24
26
  prepare_codebase(*args)
25
27
  context = API::Suggest.new(codebase, @options)
28
+ self.objects = context.objects
26
29
  if @options.format == Options::Suggest::FORMAT_TEXT
27
- Output::Suggest.new(@options, context.all_objects, context.objects,
30
+ Output::Suggest.new(@options, context.all_objects, objects,
28
31
  context.grade_lists, context.files)
29
32
  else
30
33
  Output::Stats.new(@options, context.all_objects, context.grade_lists)
31
34
  end
32
35
  end
36
+
37
+ # @return [Fixnum] 10 if suggestions were found, zero otherwise
38
+ def exit_status
39
+ objects.empty? ? super : EXIT_CODE_PENDING_SUGGESTIONS
40
+ end
33
41
  end
34
42
  end
35
43
  end
@@ -77,6 +77,7 @@ module Inch
77
77
  command = commands[command_name].new
78
78
  ui.trace format(' %-8s %s', command_name, command.description)
79
79
  end
80
+ exit 0
80
81
  end
81
82
 
82
83
  # Runs the {Command} object matching the command name of the first
@@ -12,6 +12,7 @@ module Inch
12
12
  @attributes[key]
13
13
  end
14
14
 
15
+ IGNORE_NAME_PREFIX = "_"
15
16
  BAD_NAME_EXCEPTIONS = %w(id)
16
17
  BAD_NAME_THRESHOLD = 3
17
18
 
@@ -29,12 +30,12 @@ module Inch
29
30
 
30
31
  # @return [Boolean] +true+ if an additional description given?
31
32
  def described?
32
- self[:described?]
33
+ self[:described?] || ignore?
33
34
  end
34
35
 
35
36
  # @return [Boolean] +true+ if the parameter is mentioned in the docs
36
37
  def mentioned?
37
- self[:mentioned?]
38
+ self[:mentioned?] || ignore?
38
39
  end
39
40
 
40
41
  def name
@@ -49,7 +50,7 @@ module Inch
49
50
 
50
51
  # @return [Boolean] +true+ if the type of the parameter is defined
51
52
  def typed?
52
- self[:typed?]
53
+ self[:typed?] || ignore?
53
54
  end
54
55
 
55
56
  def unnamed?
@@ -61,6 +62,12 @@ module Inch
61
62
  def wrongly_mentioned?
62
63
  self[:wrongly_mentioned?]
63
64
  end
65
+
66
+ private
67
+
68
+ def ignore?
69
+ name.start_with?(IGNORE_NAME_PREFIX)
70
+ end
64
71
  end
65
72
  end
66
73
  end
@@ -23,11 +23,11 @@ module Inch
23
23
  # @return [Provider::JSDoc::Object]
24
24
  def for(jsdoc_object)
25
25
  @cache ||= {}
26
- if (proxy_object = @cache[cache_key(jsdoc_object)])
26
+ key = cache_key(jsdoc_object)
27
+ if proxy_object = @cache[key]
27
28
  proxy_object
28
29
  else
29
- @cache[cache_key(jsdoc_object)] =
30
- class_for(jsdoc_object).new(jsdoc_object)
30
+ @cache[key] = class_for(jsdoc_object).new(jsdoc_object)
31
31
  end
32
32
  end
33
33
 
@@ -116,7 +116,9 @@ module Inch
116
116
  end
117
117
 
118
118
  def nodoc?
119
- @hash['comment'] == false
119
+ @hash['comment'] == false ||
120
+ docstring.tag?(:ignore) ||
121
+ docstring.to_s.strip.start_with?("istanbul ignore")
120
122
  end
121
123
 
122
124
  def namespace?
@@ -39,7 +39,7 @@ module Inch
39
39
  def objects
40
40
  @objects ||= parsed_objects.map do |o|
41
41
  JSDoc::Object.for(o) unless IGNORE_TYPES.include?(o['kind'])
42
- end.compact
42
+ end.compact.uniq
43
43
  end
44
44
 
45
45
  private
@@ -1,3 +1,3 @@
1
1
  module Inch
2
- VERSION = '0.6.4'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -2,7 +2,7 @@
2
2
  "args": [],
3
3
  "branch_name": "master",
4
4
  "client_name": "inchjs",
5
- "client_version": "0.1.4",
5
+ "client_version": "0.4.0",
6
6
  "git_repo_url": "git@github.com:inch-ci/Hello-World-NodeJS.git",
7
7
  "language": "javascript",
8
8
  "objects": [
@@ -74,11 +74,11 @@
74
74
  "value": "function"
75
75
  },
76
76
  "filename": "inch_test.js",
77
- "lineno": 13,
77
+ "lineno": 14,
78
78
  "path": "/src",
79
79
  "range": [
80
- 165,
81
- 236
80
+ 166,
81
+ 235
82
82
  ]
83
83
  },
84
84
  "name": "generate_docs",
@@ -108,6 +108,54 @@
108
108
  "scope": "static",
109
109
  "undocumented": true
110
110
  },
111
+ {
112
+ "comment": "/*\n* @ignore\n*/",
113
+ "kind": "function",
114
+ "longname": "InchTest.Docs.Formatter.nodoc_ignore",
115
+ "memberof": "InchTest.Docs.Formatter",
116
+ "meta": {
117
+ "code": {
118
+ "id": "astnode100000050",
119
+ "name": "nodoc_ignore",
120
+ "type": "FunctionExpression",
121
+ "value": "function"
122
+ },
123
+ "filename": "inch_test.js",
124
+ "lineno": 25,
125
+ "path": "/src",
126
+ "range": [
127
+ 434,
128
+ 463
129
+ ]
130
+ },
131
+ "name": "nodoc_ignore",
132
+ "scope": "static",
133
+ "undocumented": true
134
+ },
135
+ {
136
+ "comment": "/* istanbul ignore next */",
137
+ "kind": "function",
138
+ "longname": "InchTest.Docs.Formatter.nodoc_istanbul",
139
+ "memberof": "InchTest.Docs.Formatter",
140
+ "meta": {
141
+ "code": {
142
+ "id": "astnode100000053",
143
+ "name": "nodoc_istanbul",
144
+ "type": "FunctionExpression",
145
+ "value": "function"
146
+ },
147
+ "filename": "inch_test.js",
148
+ "lineno": 27,
149
+ "path": "/src",
150
+ "range": [
151
+ 500,
152
+ 531
153
+ ]
154
+ },
155
+ "name": "nodoc_istanbul",
156
+ "scope": "static",
157
+ "undocumented": true
158
+ },
111
159
  {
112
160
  "comment": "/**\n*\n* This function takes `param1` and `param2` as arguments.\n*\n* @param {Number} param1 A number from 0 to 26 that will result in a letter a-z\n* @param {String} param2 A text\n* @return {String} A character from a-z based on the input number n\n*\n* Examples:\n*\n* > InchTest.Naming.resource_name(MyApp.User)\n* \"user\"\n* > InchTest.Naming.resource_name(MyApp.UserView, \"View\")\n* \"user\"\n*/",
113
161
  "description": "This function takes `param1` and `param2` as arguments.",
@@ -116,7 +164,7 @@
116
164
  "memberof": "InchTest.Functions",
117
165
  "meta": {
118
166
  "code": {
119
- "id": "astnode100000057",
167
+ "id": "astnode100000063",
120
168
  "name": "InchTest.Functions.full_doc",
121
169
  "paramnames": [
122
170
  "param1",
@@ -126,11 +174,11 @@
126
174
  "value": "function"
127
175
  },
128
176
  "filename": "inch_test.js",
129
- "lineno": 41,
177
+ "lineno": 47,
130
178
  "path": "/src",
131
179
  "range": [
132
- 841,
133
- 914
180
+ 974,
181
+ 1047
134
182
  ]
135
183
  },
136
184
  "name": "full_doc",
@@ -174,7 +222,7 @@
174
222
  "memberof": "InchTest.Functions",
175
223
  "meta": {
176
224
  "code": {
177
- "id": "astnode100000070",
225
+ "id": "astnode100000076",
178
226
  "name": "InchTest.Functions.full_doc_second_parameter_unnamed",
179
227
  "paramnames": [
180
228
  "param1",
@@ -184,16 +232,146 @@
184
232
  "value": "function"
185
233
  },
186
234
  "filename": "inch_test.js",
187
- "lineno": 57,
235
+ "lineno": 63,
188
236
  "path": "/src",
189
237
  "range": [
190
- 1271,
191
- 1364
238
+ 1404,
239
+ 1497
192
240
  ]
193
241
  },
194
242
  "name": "full_doc_second_parameter_unnamed",
195
243
  "scope": "static"
196
244
  },
245
+ {
246
+ "access": "public",
247
+ "comment": "/**\n* Creates and returns a new MultiRedisClient instance.\n*\n* @function\n* @memberof! MultiRedisClient\n* @public\n* @param {redis|Array} clients - The redis client/s\n* @returns {MultiRedisClient} The multiple redis client instance\n* @example\n* ```js\n* //create multiple redis clients\n* var redis = require('redis');\n* var client1 = redis.createClient(...);\n* var client2 = redis.createClient(...);\n*\n* //create the wrapper client\n* var MultipleRedis = require('multiple-redis');\n* var multiClient = MultipleRedis.createClient([client1, client2]);\n*\n* //run any command on the multi client instead of the original clients\n* multiClient.set('string key', 'string val', callback);\n* ```\n*\n*",
248
+ "description": "Creates and returns a new MultiRedisClient instance.",
249
+ "examples": [
250
+ "```js\n//create multiple redis clients\nvar redis = require('redis');\nvar client1 = redis.createClient(...);\nvar client2 = redis.createClient(...);\n\n//create the wrapper client\nvar MultipleRedis = require('multiple-redis');\nvar multiClient = MultipleRedis.createClient([client1, client2]);\n\n//run any command on the multi client instead of the original clients\nmultiClient.set('string key', 'string val', callback);\n```"
251
+ ],
252
+ "forceMemberof": true,
253
+ "kind": "function",
254
+ "longname": "MultiRedisClient.InchTest.Functions.multiple_signatures",
255
+ "memberof": "MultiRedisClient",
256
+ "meta": {
257
+ "code": {
258
+ "id": "astnode100000089",
259
+ "name": "InchTest.Functions.multiple_signatures",
260
+ "paramnames": [],
261
+ "type": "FunctionExpression",
262
+ "value": "function"
263
+ },
264
+ "filename": "inch_test.js",
265
+ "lineno": 115,
266
+ "path": "/src",
267
+ "range": [
268
+ 3015,
269
+ 3082
270
+ ]
271
+ },
272
+ "name": "InchTest.Functions.multiple_signatures",
273
+ "params": [
274
+ {
275
+ "description": "The redis client/s",
276
+ "name": "clients",
277
+ "type": {
278
+ "names": [
279
+ "redis",
280
+ "Array"
281
+ ]
282
+ }
283
+ }
284
+ ],
285
+ "returns": [
286
+ {
287
+ "description": "The multiple redis client instance",
288
+ "type": {
289
+ "names": [
290
+ "MultiRedisClient"
291
+ ]
292
+ }
293
+ }
294
+ ],
295
+ "scope": "static"
296
+ },
297
+ {
298
+ "access": "public",
299
+ "comment": "\n*\n* @function\n* @memberof! MultiRedisClient\n* @public\n* @param {Array} connectionInfo - The redis client/s connection info\n* @param {string} connectionInfo.host - The redis host\n* @param {number} connectionInfo.post - The redis port\n* @param {Array} [options] - Used when this client creates the redis clients\n* @returns {MultiRedisClient} The multiple redis client instance\n* @example\n* ```js\n* //create the wrapper client with connection info\n* var MultipleRedis = require('multiple-redis');\n* var multiClient = MultipleRedis.createClient([{\n* host: 'host1',\n* port: 6379\n* }, {\n* host: 'host2',\n* port: 6379\n* }], options);\n*\n* //run any command on the multi client instead of the original clients\n* multiClient.set('string key', 'string val', callback);\n* ```\n*/",
300
+ "examples": [
301
+ "```js\n//create the wrapper client with connection info\nvar MultipleRedis = require('multiple-redis');\nvar multiClient = MultipleRedis.createClient([{\n host: 'host1',\n port: 6379\n}, {\n host: 'host2',\n port: 6379\n}], options);\n\n//run any command on the multi client instead of the original clients\nmultiClient.set('string key', 'string val', callback);\n```"
302
+ ],
303
+ "forceMemberof": true,
304
+ "kind": "function",
305
+ "longname": "MultiRedisClient.InchTest.Functions.multiple_signatures",
306
+ "memberof": "MultiRedisClient",
307
+ "meta": {
308
+ "code": {
309
+ "id": "astnode100000089",
310
+ "name": "InchTest.Functions.multiple_signatures",
311
+ "paramnames": [],
312
+ "type": "FunctionExpression",
313
+ "value": "function"
314
+ },
315
+ "filename": "inch_test.js",
316
+ "lineno": 115,
317
+ "path": "/src",
318
+ "range": [
319
+ 3015,
320
+ 3082
321
+ ]
322
+ },
323
+ "name": "InchTest.Functions.multiple_signatures",
324
+ "params": [
325
+ {
326
+ "description": "The redis client/s connection info",
327
+ "name": "connectionInfo",
328
+ "type": {
329
+ "names": [
330
+ "Array"
331
+ ]
332
+ }
333
+ },
334
+ {
335
+ "description": "The redis host",
336
+ "name": "connectionInfo.host",
337
+ "type": {
338
+ "names": [
339
+ "string"
340
+ ]
341
+ }
342
+ },
343
+ {
344
+ "description": "The redis port",
345
+ "name": "connectionInfo.post",
346
+ "type": {
347
+ "names": [
348
+ "number"
349
+ ]
350
+ }
351
+ },
352
+ {
353
+ "description": "Used when this client creates the redis clients",
354
+ "name": "options",
355
+ "optional": true,
356
+ "type": {
357
+ "names": [
358
+ "Array"
359
+ ]
360
+ }
361
+ }
362
+ ],
363
+ "returns": [
364
+ {
365
+ "description": "The multiple redis client instance",
366
+ "type": {
367
+ "names": [
368
+ "MultiRedisClient"
369
+ ]
370
+ }
371
+ }
372
+ ],
373
+ "scope": "static"
374
+ },
197
375
  {
198
376
  "comment": "/**\n*\n* This function takes no arguments.\n*\n* Examples:\n*\n* > InchTest.Naming.resource_name(MyApp.User)\n* \"user\"\n* > InchTest.Naming.resource_name(MyApp.UserView, \"View\")\n* \"user\"\n*/",
199
377
  "description": "This function takes no arguments.\n\nExamples:\n\n > InchTest.Naming.resource_name(MyApp.User)\n \"user\"\n > InchTest.Naming.resource_name(MyApp.UserView, \"View\")\n \"user\"",
@@ -202,17 +380,17 @@
202
380
  "memberof": "InchTest.CodeExamples",
203
381
  "meta": {
204
382
  "code": {
205
- "id": "astnode100000088",
383
+ "id": "astnode100000104",
206
384
  "name": "single_code_example",
207
385
  "type": "FunctionExpression",
208
386
  "value": "function"
209
387
  },
210
388
  "filename": "inch_test.js",
211
- "lineno": 74,
389
+ "lineno": 129,
212
390
  "path": "/src",
213
391
  "range": [
214
- 1609,
215
- 1665
392
+ 3325,
393
+ 3381
216
394
  ]
217
395
  },
218
396
  "name": "single_code_example",
@@ -226,28 +404,21 @@
226
404
  "memberof": "InchTest.CodeExamples",
227
405
  "meta": {
228
406
  "code": {
229
- "id": "astnode100000093",
407
+ "id": "astnode100000109",
230
408
  "name": "multiple_code_examples",
231
409
  "type": "FunctionExpression",
232
410
  "value": "function"
233
411
  },
234
412
  "filename": "inch_test.js",
235
- "lineno": 95,
413
+ "lineno": 150,
236
414
  "path": "/src",
237
415
  "range": [
238
- 2094,
239
- 2153
416
+ 3810,
417
+ 3869
240
418
  ]
241
419
  },
242
420
  "name": "multiple_code_examples",
243
421
  "scope": "static"
244
- },
245
- {
246
- "files": [
247
- "/home/rf/devel/Hello-World-NodeJS/src/inch_test.js"
248
- ],
249
- "kind": "package",
250
- "longname": "package:undefined"
251
422
  }
252
423
  ]
253
424
  }
@@ -12,6 +12,12 @@ describe ::Inch::CLI::Command::Console do
12
12
  @command = ::Inch::CLI::Command::Console
13
13
  end
14
14
 
15
+ it 'should run with exit status' do
16
+ _out, _err = capture_io do
17
+ assert_equal @command.run.exit_status, @command::EXIT_STATUS_SUCCESS
18
+ end
19
+ end
20
+
15
21
  it 'should output info when run with --help' do
16
22
  out, err = capture_io do
17
23
  assert_raises(SystemExit) { @command.run('--help') }
@@ -23,6 +23,12 @@ describe ::Inch::CLI::Command::Diff do
23
23
  FileUtils.rm_rf @tmp_dir
24
24
  end
25
25
 
26
+ it 'should run with exit status' do
27
+ _out, _err = capture_io do
28
+ assert_equal @command.run.exit_status, @command::EXIT_STATUS_SUCCESS
29
+ end
30
+ end
31
+
26
32
  it 'should not show any changes' do
27
33
  # this runs `inch diff` on a freshly cloned repo
28
34
  # should not show any changes
@@ -6,6 +6,13 @@ describe ::Inch::CLI::Command::Inspect do
6
6
  @command = ::Inch::CLI::Command::Inspect
7
7
  end
8
8
 
9
+ it 'should run with exit status' do
10
+ _out, _err = capture_io do
11
+ cmd = @command.run('Foo::Bar#', '--no-color')
12
+ assert_equal cmd.exit_status, @command::EXIT_STATUS_SUCCESS
13
+ end
14
+ end
15
+
9
16
  it 'should warn and exit when run without args' do
10
17
  out, err = capture_io do
11
18
  assert_raises(SystemExit) { @command.run }
@@ -9,6 +9,12 @@ describe ::Inch::CLI::Command::List do
9
9
 
10
10
  include Shared::BaseList
11
11
 
12
+ it 'should run with exit status' do
13
+ _out, _err = capture_io do
14
+ assert_equal @command.run.exit_status, @command::EXIT_STATUS_SUCCESS
15
+ end
16
+ end
17
+
12
18
  it 'should run without args' do
13
19
  out, err = capture_io do
14
20
  @command.run
@@ -6,6 +6,13 @@ describe ::Inch::CLI::Command::Show do
6
6
  @command = ::Inch::CLI::Command::Show
7
7
  end
8
8
 
9
+ it 'should run with exit status' do
10
+ _out, _err = capture_io do
11
+ cmd = @command.run('Foo::Bar#', '--no-color')
12
+ assert_equal cmd.exit_status, @command::EXIT_STATUS_SUCCESS
13
+ end
14
+ end
15
+
9
16
  it 'should warn and exit when run without args' do
10
17
  out, err = capture_io do
11
18
  assert_raises(SystemExit) { @command.run }
@@ -6,6 +6,12 @@ describe ::Inch::CLI::Command::Stats do
6
6
  @command = ::Inch::CLI::Command::Stats
7
7
  end
8
8
 
9
+ it 'should run with exit status' do
10
+ _out, _err = capture_io do
11
+ assert_equal @command.run.exit_status, @command::EXIT_STATUS_SUCCESS
12
+ end
13
+ end
14
+
9
15
  it 'should run without args' do
10
16
  out, err = capture_io do
11
17
  @command.run
@@ -7,6 +7,12 @@ describe ::Inch::CLI::Command::Suggest do
7
7
  @command = ::Inch::CLI::Command::Suggest
8
8
  end
9
9
 
10
+ it 'should run with exit status' do
11
+ _out, _err = capture_io do
12
+ assert_equal @command.run.exit_status, @command::EXIT_CODE_PENDING_SUGGESTIONS
13
+ end
14
+ end
15
+
10
16
  it 'should run without args' do
11
17
  out, err = capture_io do
12
18
  @command.run
@@ -93,6 +99,13 @@ describe ::Inch::CLI::Command::Suggest do
93
99
 
94
100
  # Edge case: Really good codebase
95
101
 
102
+ it 'should return EXIT_STATUS_SUCCESS when no suggestions' do
103
+ Dir.chdir fixture_path(:ruby, :really_good)
104
+ _out, _err = capture_io do
105
+ assert_equal @command.run.exit_status, @command::EXIT_STATUS_SUCCESS
106
+ end
107
+ end
108
+
96
109
  it 'should run without args on really good fixture' do
97
110
  out, err = capture_io do
98
111
  Dir.chdir fixture_path(:ruby, :really_good)
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../../test_helper')
2
2
 
3
- describe ::Inch::Language::Elixir::CodeObject::FunctionObject do
3
+ describe ::Inch::Language::JavaScript::CodeObject::FunctionObject do
4
4
  before do
5
5
  @codebase = fresh_codebase(:javascript, :inch_test, 'all.json')
6
6
  @objects = @codebase.objects
@@ -56,4 +56,17 @@ describe ::Inch::Language::Elixir::CodeObject::FunctionObject do
56
56
  assert m.has_code_example?
57
57
  assert m.has_multiple_code_examples?
58
58
  end
59
+
60
+ it 'should recognize nodoc' do
61
+ m = @objects.find('InchTest.Docs.Formatter.nodoc_ignore')
62
+ assert m.nodoc?
63
+
64
+ m = @objects.find('InchTest.Docs.Formatter.nodoc_istanbul')
65
+ assert m.nodoc?
66
+ end
67
+
68
+ it 'should recognize @also' do
69
+ list = @objects.to_a.map(&:fullname)
70
+ assert list.size == list.uniq.size, "There should be no duplicate fullnames."
71
+ end
59
72
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - René Föhring
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-06 00:00:00.000000000 Z
11
+ date: 2015-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler