gtdlint 0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []