gtdlint 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/CONFIGURE.md +52 -0
  3. data/README.md +111 -0
  4. data/bin/gtdlint +161 -0
  5. data/lib/gtdlint.rb +118 -0
  6. data/lib/version.rb +6 -0
  7. metadata +259 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3fbc233bec15bdb84f7e239addc236f4b2d0c650
4
+ data.tar.gz: 655b4888df40991b13c6dc8d9c167a60ea81cfa7
5
+ SHA512:
6
+ metadata.gz: 9ca071200dbd35abeba32ce17e6782ab261120d1e4054829e32d9b7e0afc81212c544c067e3d0146bfc32c7652b30bd84d843ebb3924add872e3b676ec50a3ec
7
+ data.tar.gz: 1b4868f8db94818b0dbc73c4dde2a7a028b093d03d2d6dbd03e74d8e5efa9d697db62680402b49b489bb88b37b06fdcea4cc9a62eed28695376517fedbc2946a
@@ -0,0 +1,52 @@
1
+ # Configuration
2
+
3
+ Gtdlint offers multiple ways to resolve preferences:
4
+
5
+ 1. Command-line flags (`gtdlint -i`, `gtdlint -p`)
6
+ 2. Dotfiles (`.gtdlintignore`, `.gtdlintrc.yml`)
7
+ 3. Built-in defaults (`DEFAULT_IGNORES`, `DEFAULT_GTD_PATTERN`)
8
+
9
+ Any command-line flags that are present override the same settings in dotfiles and built-in defaults.
10
+
11
+ # Command-line flags
12
+
13
+ Run `gtdlint -h` or `gtdlint --help` for a full list, or refer to the source code for `bin/gtdlint`.
14
+
15
+ ```
16
+ $ bin/gtdlint -h
17
+ Usage: gtdlint [options] [<files>|-]
18
+ -i, --ignore pattern Ignore file names matching Ruby regex pattern
19
+ -p, --gtd-pattern pattern Custom GTD pattern
20
+ -h, --help Print usage info
21
+ -v, --version Print version info
22
+ ```
23
+
24
+ # Dotfiles
25
+
26
+ Gtdlint automatically applies any `.gtdlintignore` and/or `.gtdlintrc.yml` configuration files in the same directory as a file being scanned, or a parent directory (`../.gtdlintignore`, `../.gtdlintrc.yml`), up to `$HOME/.gtdlintignore`, `$HOME/.gtdlintrc.yml`, if any such files exist.
27
+
28
+ ## `.gtdlintignore`
29
+
30
+ Samples:
31
+
32
+ * [examples/.gtdlintignore](https://github.com/mcandre/gtdlint/blob/master/examples/.gtdlintignore)
33
+
34
+ A `.gtdlintignore` may contain Ruby regex patterns of files and/or folders to exclude from scanning, one pattern per line.
35
+
36
+ ## `.gtdlintrc.yml`
37
+
38
+ Samples:
39
+
40
+ * [spanish/.gtdlintrc.yml](https://github.com/mcandre/gtdlint/blob/master/examples/spanish/.gtdlintrc.yml)
41
+
42
+ `.gtdlintrc.yml` may contain a number of keys:
43
+
44
+ * `gtd_pattern` is a shell-quoted string for a `grep` pattern.
45
+ * `before_lines` is an optional integer for showing n lines before each matching line.
46
+ * `after_lines` is an optional integer for showing n lines after each matching line.
47
+
48
+ # Built-in defaults
49
+
50
+ * `gtd_pattern`: `"\'todo\\|to do\\|to-do\\|hack\'"`.
51
+ * `before_lines`: `0`
52
+ * `after_lines`: `0`
@@ -0,0 +1,111 @@
1
+ # gtdlint - search for TO-DO items to complete in large projects
2
+
3
+ # HOMEPAGE
4
+
5
+ https://github.com/mcandre/gtdlint
6
+
7
+ # RUBYGEMS
8
+
9
+ https://rubygems.org/gems/gtdlint
10
+
11
+ # ABOUT
12
+
13
+ Gtdlint is a command line program for finding TODO tasks in a project, such as `// TODO` code comments. By default, gtdlint is case-insensitve, and looks for:
14
+
15
+ * `todo`
16
+ * `to do`
17
+ * `to-do`
18
+ * `TODO`
19
+ * `TO DO`
20
+ * `TO-DO`
21
+ * `ToDo`
22
+ * `To Do`
23
+ * `To-Do`
24
+ * `hack`
25
+ * `Hack`
26
+ * `HACK`
27
+ * ...
28
+
29
+ gtdlint can be customized with a `-p` command line flag and/or a `.gtdlintrc.yml` configuration file. For example, gtdlint can be configured to look for `pte`/`hack` in Spanish projects.
30
+
31
+ gtdlint is a shell wrapper around the traditional GNU [grep](http://www.gnu.org/software/grep/) backend, presenting a frontend similar to modern linters like [Reek](https://github.com/troessner/reek/wiki) and [JSHint](http://jshint.com/).
32
+
33
+ * Recursive file search by default
34
+ * Optional ignore patterns
35
+ * Configuration via per-project and per-user [dotfiles](https://github.com/mcandre/gtdlint/blob/master/CONFIGURE.md#dotfiles)
36
+ * Install via a standard programming language package manager
37
+
38
+ # EXAMPLES
39
+
40
+ ```
41
+ $ gtdlint examples/
42
+ examples/hello.c:1:// TODO: Add copyright
43
+ examples/hello.c:6: // TODO: Add proper line ending
44
+ examples/hello.c:9: putc(10, stdout); // hack
45
+ examples/spanish/phrases.txt:1:PTE: Agregar más frases.
46
+
47
+ $ cat examples/hello.c | bin/gtdlint
48
+ stdin:1:// TODO: Add copyright
49
+ stdin:6: // TODO: Add proper line ending
50
+ stdin:9: putc(10, stdout); // hack
51
+
52
+ $ gtdlint -i .c examples/
53
+ examples/spanish/phrases.txt:1:PTE: Agregar más frases.
54
+
55
+ $ gtdlint -p pte examples/spanish/
56
+ examples/spanish/phrases.txt:1:PTE: Agregar más frases.
57
+
58
+ $ gtdlint -h
59
+ Usage: gtdlint [options] [<files>|-]
60
+ -i, --ignore pattern Ignore file names matching Ruby regex pattern
61
+ -p, --gtd-pattern pattern Custom GTD pattern
62
+ -B, --lines-before n Also show n lines before matching line
63
+ -A, --lines-after n Also show n lines after matching line
64
+ -h, --help Print usage info
65
+ -v, --version Print version info
66
+ ```
67
+
68
+ # REQUIREMENTS
69
+
70
+ * [Ruby](https://www.ruby-lang.org/) 2+
71
+ * [grep](http://www.gnu.org/software/grep/) (often built-in, or provided by [git](http://git-scm.com/))
72
+
73
+ E.g., Windows users can `chocolatey install git`.
74
+
75
+ # INSTALL
76
+
77
+ Install via [RubyGems](http://rubygems.org/):
78
+
79
+ ```
80
+ $ gem install gtdlint
81
+ ```
82
+
83
+ # CONFIGURE
84
+
85
+ See [CONFIGURE.md](https://github.com/mcandre/gtdlint/blob/master/CONFIGURE.md) for details.
86
+
87
+ # LICENSE
88
+
89
+ FreeBSD
90
+
91
+ # DEVELOPMENT
92
+
93
+ ## Testing
94
+
95
+ Keep the interface working:
96
+
97
+ ```
98
+ $ cucumber
99
+ ```
100
+
101
+ ## Linting
102
+
103
+ Keep the code tidy:
104
+
105
+ ```
106
+ $ rake lint
107
+ ```
108
+
109
+ ## Git Hooks
110
+
111
+ See `hooks/`.
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'find'
5
+ require 'optparse'
6
+ require 'yaml'
7
+ require 'gtdlint'
8
+
9
+ IGNORE_FILENAME = '.gtdlintignore'
10
+ CONFIGURATION_FILENAME = '.gtdlintrc.yml'
11
+
12
+ def main
13
+ ignores = DEFAULT_IGNORES
14
+
15
+ filenames = ['-']
16
+
17
+ configuration_flags = {}
18
+
19
+ option = OptionParser.new do |option|
20
+ option.banner = "Usage: gtdlint [options] [<files>|-]"
21
+
22
+ option.on('-i', '--ignore pattern', 'Ignore file names matching Ruby regex pattern') do |pattern|
23
+ ignores << pattern
24
+ end
25
+
26
+ option.on('-p', '--gtd-pattern pattern', 'Custom GTD pattern') do |pattern|
27
+ configuration_flags["gtd_pattern"] = pattern
28
+ end
29
+
30
+ option.on('-B', '--lines-before n', 'Also show n lines before matching line') do |n|
31
+ configuration_flags["lines_before"] = n.to_i
32
+ end
33
+
34
+ option.on('-A', '--lines-after n', 'Also show n lines after matching line') do |n|
35
+ configuration_flags["lines_after"] = n.to_i
36
+ end
37
+
38
+ option.on('-h', '--help', 'Print usage info') do
39
+ puts option
40
+ exit
41
+ end
42
+
43
+ option.on('-v', '--version', 'Print version info') do
44
+ puts "gtdlint #{GTDLint::VERSION}"
45
+ exit
46
+ end
47
+ end
48
+
49
+ option.parse!
50
+
51
+ filenames = ARGV unless ARGV.empty?
52
+
53
+ if filenames.empty? || filenames == ['-'] then
54
+ configuration_dotfile = DEFAULT_CONFIGURATION
55
+
56
+ pwd = Dir.pwd
57
+
58
+ dir = pwd
59
+
60
+ parent_of_home = File.expand_path("..", ENV["HOME"])
61
+
62
+ while dir != parent_of_home
63
+ ignore_file = dir + File::SEPARATOR + IGNORE_FILENAME
64
+
65
+ if File.exist?(ignore_file) then
66
+ ignores.concat(open(ignore_file).read.split("\n"))
67
+ end
68
+
69
+ dir = File.expand_path("..", dir)
70
+ end
71
+
72
+ if ignores.none? { |ignore| pwd =~ %r(#{ignore}) } then
73
+ dir = Dir.pwd
74
+
75
+ parent_of_home = File.expand_path("..", ENV["HOME"])
76
+
77
+ while dir != parent_of_home
78
+ config_file = dir + File::SEPARATOR + CONFIGURATION_FILENAME
79
+
80
+ if File.exist?(config_file) then
81
+ configuration_dotfile = DEFAULT_CONFIGURATION.merge(YAML.load_file(config_file))
82
+ break
83
+ else
84
+ dir = File.expand_path("..", dir)
85
+ end
86
+ end
87
+
88
+ # Command line flags override dotfile settings
89
+ configuration = configuration_dotfile.merge(configuration_flags)
90
+
91
+ check_stdin(configuration)
92
+ end
93
+ else
94
+ recursive_filenames = []
95
+
96
+ filenames.each do |f|
97
+ if File.directory? f
98
+ recursive_filenames = recursive_filenames.concat(recursive_list(f, ignores))
99
+ else
100
+ recursive_filenames << f
101
+ end
102
+ end
103
+
104
+ configuration_dotfile = DEFAULT_CONFIGURATION
105
+
106
+ recursive_filenames.each do |f|
107
+ dir = File.expand_path("..", f)
108
+
109
+ parent_of_home = File.expand_path("..", ENV["HOME"])
110
+
111
+ while dir != parent_of_home
112
+ ignore_file = dir + File::SEPARATOR + IGNORE_FILENAME
113
+
114
+ if File.exist?(ignore_file) then
115
+ ignores.concat(open(ignore_file).read.split("\n"))
116
+ end
117
+
118
+ dir = File.expand_path("..", dir)
119
+ end
120
+
121
+ if ignores.none? { |ignore| f =~ %r(#{ignore}) } then
122
+ dir = File.expand_path("..", f)
123
+
124
+ parent_of_home = File.expand_path("..", ENV["HOME"])
125
+
126
+ while dir != parent_of_home
127
+ config_file = dir + File::SEPARATOR + CONFIGURATION_FILENAME
128
+
129
+ if File.exist?(config_file) then
130
+ configuration_dotfile = DEFAULT_CONFIGURATION.merge(YAML.load_file(config_file))
131
+ break
132
+ else
133
+ dir = File.expand_path("..", dir)
134
+ end
135
+ end
136
+
137
+ # Hack to Reset configuration when changing directories
138
+ configuration_dotfile = DEFAULT_CONFIGURATION unless File.exist?(dir + File::SEPARATOR + CONFIGURATION_FILENAME)
139
+
140
+ # Command line flags override dotfile settings
141
+ configuration = configuration_dotfile.merge(configuration_flags)
142
+
143
+ check(f, configuration)
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ begin
150
+ main
151
+ # User may quit before completion.
152
+ rescue Interrupt
153
+ nil
154
+ # Bad regex
155
+ rescue RegexpError => e
156
+ puts e
157
+ # This program may be piped to another program (e.g. `less`),
158
+ # which is quit before this program completes.
159
+ rescue Errno::EPIPE, Errno::EMFILE
160
+ nil
161
+ end
@@ -0,0 +1,118 @@
1
+ require 'rubygems'
2
+ require 'ptools'
3
+ require 'tempfile'
4
+
5
+ $stdout.sync = true
6
+
7
+ require 'version'
8
+
9
+ DEFAULT_IGNORES = %w(
10
+ .hg/
11
+ .svn/
12
+ .git/
13
+ .git
14
+ .gtdlintignore
15
+ .gtdlintrc.yml
16
+ node_modules/
17
+ .vagrant/
18
+ Gemfile.lock
19
+ .exe
20
+ .bin
21
+ .png
22
+ .jpg
23
+ .jpeg
24
+ .svg
25
+ .min.js
26
+ -min.js
27
+ )
28
+
29
+ # Grep format, case insensitive
30
+ DEFAULT_GTD_PATTERN = "\'todo\\|to do\\|to-do\\|hack\'"
31
+
32
+ DEFAULT_LINES_BEFORE = 0
33
+ DEFAULT_LINES_AFTER = 0
34
+
35
+ DEFAULT_CONFIGURATION = {
36
+ "gtd_pattern" => DEFAULT_GTD_PATTERN,
37
+ "lines_before" => DEFAULT_LINES_BEFORE,
38
+ "lines_after" => DEFAULT_LINES_AFTER
39
+ }
40
+
41
+ #
42
+ # Parse, model, and print a line too wide for its own good
43
+ #
44
+ class GTDThing
45
+ attr_accessor :filename, :line_number, :line
46
+
47
+ def self.parse(filename, grep_line)
48
+ if grep_line.match(/^--$/) then
49
+ grep_line
50
+ else
51
+ match = grep_line.match(/^([0-9]+)(\:|-)(.*)$/)
52
+
53
+ line_number = match[1]
54
+ line = match[3]
55
+
56
+ GTDThing.new(filename, line_number, line)
57
+ end
58
+ end
59
+
60
+ def initialize(filename, line_number, line)
61
+ @filename = filename
62
+ @line_number = line_number
63
+ @line = line
64
+ end
65
+
66
+ def to_s
67
+ "#{filename}:#{line_number}:#{line}"
68
+ end
69
+ end
70
+
71
+ def self.recursive_list(directory, ignores = DEFAULT_IGNORES)
72
+ Find.find(directory).reject do |f|
73
+ File.directory?(f) ||
74
+ ignores.any? { |ignore| f =~ %r(#{ignore}) } ||
75
+
76
+ begin
77
+ File.binary?(f)
78
+ rescue Errno::ENOENT
79
+ true
80
+ end
81
+ end
82
+ end
83
+
84
+ def self.check_stdin(configuration = DEFAULT_CONFIGURATION)
85
+ gtd_pattern = configuration["gtd_pattern"]
86
+ lines_before = configuration["lines_before"]
87
+ lines_after = configuration["lines_after"]
88
+
89
+ contents = $stdin.read
90
+
91
+ t = Tempfile.new('aspelllint')
92
+ t.write(contents)
93
+ t.close
94
+
95
+ filename = t.path
96
+
97
+ output = `grep -B #{lines_before} -A #{lines_after} -n -i #{gtd_pattern} \"#{filename}\"`
98
+
99
+ lines = output.split("\n")
100
+
101
+ gtd_things = lines.map { |line| GTDThing.parse('stdin', line) }
102
+
103
+ gtd_things.each { |m| puts m }
104
+ end
105
+
106
+ def self.check(filename, configuration = DEFAULT_CONFIGURATION)
107
+ gtd_pattern = configuration["gtd_pattern"]
108
+ lines_before = configuration["lines_before"]
109
+ lines_after = configuration["lines_after"]
110
+
111
+ output = `grep -B #{lines_before} -A #{lines_after} -n -i #{gtd_pattern} \"#{filename}\"`
112
+
113
+ lines = output.split("\n")
114
+
115
+ gtd_things = lines.map { |line| GTDThing.parse(filename, line) }
116
+
117
+ gtd_things.each { |m| puts m }
118
+ end
@@ -0,0 +1,6 @@
1
+ #
2
+ # GTDLint
3
+ #
4
+ module GTDLint
5
+ VERSION = '0.1'
6
+ end
metadata ADDED
@@ -0,0 +1,259 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gtdlint
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Pennebaker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ptools
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: reek
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: flay
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: flog
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '4.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '4.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: roodi
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '4.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '4.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: churn
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: cane
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '2.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '2.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: excellent
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '2.1'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '2.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: '0.24'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: '0.24'
153
+ - !ruby/object:Gem::Dependency
154
+ name: tailor
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ~>
158
+ - !ruby/object:Gem::Version
159
+ version: '1.4'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ~>
165
+ - !ruby/object:Gem::Version
166
+ version: '1.4'
167
+ - !ruby/object:Gem::Dependency
168
+ name: guard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '2.6'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ~>
179
+ - !ruby/object:Gem::Version
180
+ version: '2.6'
181
+ - !ruby/object:Gem::Dependency
182
+ name: guard-shell
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ~>
186
+ - !ruby/object:Gem::Version
187
+ version: '0.6'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ~>
193
+ - !ruby/object:Gem::Version
194
+ version: '0.6'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rspec
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ~>
200
+ - !ruby/object:Gem::Version
201
+ version: '3.0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ~>
207
+ - !ruby/object:Gem::Version
208
+ version: '3.0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: cucumber
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ~>
214
+ - !ruby/object:Gem::Version
215
+ version: '1.3'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ~>
221
+ - !ruby/object:Gem::Version
222
+ version: '1.3'
223
+ description: See README.md for example usage
224
+ email: andrew.pennebaker@gmail.com
225
+ executables:
226
+ - gtdlint
227
+ extensions: []
228
+ extra_rdoc_files: []
229
+ files:
230
+ - CONFIGURE.md
231
+ - README.md
232
+ - bin/gtdlint
233
+ - lib/gtdlint.rb
234
+ - lib/version.rb
235
+ homepage: https://github.com/mcandre/gtdlint
236
+ licenses:
237
+ - FreeBSD
238
+ metadata: {}
239
+ post_install_message:
240
+ rdoc_options: []
241
+ require_paths:
242
+ - lib
243
+ required_ruby_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - '>='
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ required_rubygems_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - '>='
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ requirements: []
254
+ rubyforge_project:
255
+ rubygems_version: 2.2.2
256
+ signing_key:
257
+ specification_version: 4
258
+ summary: search for TO-DO items to complete in large projects
259
+ test_files: []