pdd 0.18 → 0.18.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.
- checksums.yaml +4 -4
- data/.gitattributes +4 -0
- data/.rultor.yml +0 -2
- data/README.md +30 -9
- data/bin/pdd +7 -1
- data/features/cli.feature +20 -0
- data/features/step_definitions/steps.rb +5 -1
- data/lib/pdd/source.rb +14 -8
- data/lib/pdd/version.rb +1 -1
- data/pdd.gemspec +3 -3
- data/test/test_source.rb +17 -1
- metadata +8 -10
- data/.coveralls.yml +0 -2
- data/TEAM.md +0 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1a7bf56d2eab1e277c1c717c7c3a9741a085aa1c
|
|
4
|
+
data.tar.gz: 2c0e8a6c70b10a1166ccc01cc2a9723aa888a330
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ddc3c2b798ae5f3b1173deaa010de1ae0c9d09abddec69f632cc130b29fe9377cd2007ba01f23186cfb26bfd2b75372b325575714f010f7fc41794e149ba3e69
|
|
7
|
+
data.tar.gz: e7724224e1651202321fbc76eec17fa79ce1fdc964198f4f10376695611d1c7a6321c58b6048f439f19dcbf9bd67923ca61464e331b06a7e78c25c23c1e1d798
|
data/.gitattributes
CHANGED
data/.rultor.yml
CHANGED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<img src="https://avatars2.githubusercontent.com/u/24456188" width="64px" height="64px"/>
|
|
2
2
|
|
|
3
|
-
[](http://www.0crat.com/p/C3T46CUJJ)
|
|
4
4
|
[](http://www.rultor.com/p/yegor256/pdd)
|
|
5
5
|
[](https://www.jetbrains.com/ruby/)
|
|
6
6
|
|
|
@@ -62,17 +62,38 @@ void sendEmail() {
|
|
|
62
62
|
}
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
If you use it in combination with [0pdd](http://www.0pdd.com),
|
|
66
|
+
after processing this text, the issue titled
|
|
67
|
+
"File.java:10-13: This is something to do later in one of ..." will be created.
|
|
68
|
+
The specified markers will be included in the issues body
|
|
69
|
+
along with some predefined text. If your comment is longer
|
|
70
|
+
than 40 characters, it will be truncated in the title.
|
|
71
|
+
|
|
72
|
+
It starts with `@todo`, followed by a space and a mandatory puzzle **marker**.
|
|
73
|
+
Possible formats of puzzle markers (it doesn't matter what the
|
|
74
|
+
line starts with and where it is located,
|
|
75
|
+
as long as you have that `@todo` right in front
|
|
76
|
+
of the mandatory marker):
|
|
67
77
|
|
|
68
78
|
```
|
|
69
|
-
#224
|
|
70
|
-
#TEST-13
|
|
71
|
-
#55:45min
|
|
72
|
-
#67/DES
|
|
73
|
-
#678:40m/DEV
|
|
79
|
+
// @todo #224
|
|
80
|
+
/* @todo #TEST-13 */
|
|
81
|
+
# @todo #55:45min
|
|
82
|
+
@todo #67/DES
|
|
83
|
+
;; @todo #678:40m/DEV
|
|
74
84
|
```
|
|
75
85
|
|
|
86
|
+
Here `DES` and `DEV` are the roles of people who must fix that puzzles;
|
|
87
|
+
`45min` and `40m` is the amount of time the puzzle should take;
|
|
88
|
+
`224`, `TEST-13`, `55`, `67`, and `678` are the IDs of the tickets these
|
|
89
|
+
puzzles are coming from.
|
|
90
|
+
|
|
91
|
+
Markers are absolutely necessary for all puzzles, because they allow
|
|
92
|
+
us to build a hierarchical dependency tree of all puzzles, like
|
|
93
|
+
[this one](http://www.0pdd.com/p?name=yegor256/takes),
|
|
94
|
+
for example. Technically, of course, you can abuse the system
|
|
95
|
+
and put a dummy `#1` marker everywhere.
|
|
96
|
+
|
|
76
97
|
## How to Configure Rules?
|
|
77
98
|
|
|
78
99
|
You can specify post-parsing rules for your puzzles, in command line,
|
|
@@ -111,7 +132,7 @@ See, how it is done in [yegor256/0pdd](https://github.com/yegor256/0pdd/blob/mas
|
|
|
111
132
|
|
|
112
133
|
Just submit a pull request. Make sure `rake` passes.
|
|
113
134
|
|
|
114
|
-
This is how you run
|
|
135
|
+
This is how you run the tool locally to test how it works:
|
|
115
136
|
|
|
116
137
|
```bash
|
|
117
138
|
$ ./bin/pdd --help
|
data/bin/pdd
CHANGED
|
@@ -44,13 +44,15 @@ begin
|
|
|
44
44
|
o.bool '-h', '--help', 'Show these instructions'
|
|
45
45
|
o.bool '-v', '--verbose', 'Enable verbose mode (a lot of logging)'
|
|
46
46
|
o.bool '-q', '--quiet', 'Enable quiet mode (almost no logging)'
|
|
47
|
+
o.bool '--skip-gitignore', 'Don\'t look into .gitignore for excludes'
|
|
47
48
|
o.bool '-i', '--version', 'Show current version' do
|
|
48
49
|
puts PDD::VERSION
|
|
49
50
|
exit
|
|
50
51
|
end
|
|
51
52
|
o.string '-s', '--source', 'Source directory to parse ("." by default)'
|
|
52
53
|
o.string '-f', '--file', 'File to save XML into'
|
|
53
|
-
o.array '-e', '--exclude', 'Glob pattern to exclude, e.g. "**/*.jpg"'
|
|
54
|
+
o.array '-e', '--exclude', 'Glob pattern to exclude, e.g. "**/*.jpg"',
|
|
55
|
+
default: []
|
|
54
56
|
o.string '-t', '--format', 'Format of the report (xml|html)'
|
|
55
57
|
o.array(
|
|
56
58
|
'-r', '--rule', 'Rule to apply (can be used many times)',
|
|
@@ -72,6 +74,10 @@ https://github.com/yegor256/pdd/blob/master/README.md"
|
|
|
72
74
|
raise '-f is mandatory when using -v, try --help for more information'
|
|
73
75
|
end
|
|
74
76
|
|
|
77
|
+
if opts['skip-gitignore']
|
|
78
|
+
raise 'For --skip-gitignore see https://github.com/yegor256/pdd/issues/80'
|
|
79
|
+
end
|
|
80
|
+
|
|
75
81
|
Encoding.default_external = Encoding::UTF_8
|
|
76
82
|
Encoding.default_internal = Encoding::UTF_8
|
|
77
83
|
file = opts.file? ? File.new(opts[:file], 'w') : STDOUT
|
data/features/cli.feature
CHANGED
|
@@ -63,6 +63,26 @@ Feature: Command Line Processing
|
|
|
63
63
|
Then Exit code is zero
|
|
64
64
|
And XML file "out.xml" matches "/puzzles[count(puzzle)=0]"
|
|
65
65
|
|
|
66
|
+
Scenario: Excluding unnecessary files from gitignore
|
|
67
|
+
Given this step says to skip
|
|
68
|
+
And I have a "a/b/c/test.txt" file with content:
|
|
69
|
+
"""
|
|
70
|
+
~~ @todo #44 some puzzle to be excluded
|
|
71
|
+
"""
|
|
72
|
+
And I have a "f/g/h/hello.md" file with content:
|
|
73
|
+
"""
|
|
74
|
+
~~ @todo #44 some puzzle to be excluded as well
|
|
75
|
+
"""
|
|
76
|
+
And I have a ".gitignore" file with content:
|
|
77
|
+
"""
|
|
78
|
+
# This is the list of patterns
|
|
79
|
+
a/**/*
|
|
80
|
+
!/f
|
|
81
|
+
"""
|
|
82
|
+
When I run bin/pdd with "> out.xml"
|
|
83
|
+
Then Exit code is zero
|
|
84
|
+
And XML file "out.xml" matches "/puzzles[count(puzzle)=1]"
|
|
85
|
+
|
|
66
86
|
Scenario: Rejects unknown options
|
|
67
87
|
Given I have a "test.txt" file with content:
|
|
68
88
|
"""
|
|
@@ -41,9 +41,13 @@ After do
|
|
|
41
41
|
FileUtils.rm_rf(@dir) if File.exist?(@dir)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
Given(/skip/) do
|
|
45
|
+
skip_this_scenario
|
|
46
|
+
end
|
|
47
|
+
|
|
44
48
|
Given(/^I have a "([^"]*)" file with content:$/) do |file, text|
|
|
45
49
|
FileUtils.mkdir_p(File.dirname(file)) unless File.exist?(file)
|
|
46
|
-
File.open(file, 'w') do |f|
|
|
50
|
+
File.open(file, 'w:ASCII-8BIT') do |f|
|
|
47
51
|
f.write(text.gsub(/\\xFF/, 0xFF.chr))
|
|
48
52
|
end
|
|
49
53
|
end
|
data/lib/pdd/source.rb
CHANGED
|
@@ -36,24 +36,26 @@ module PDD
|
|
|
36
36
|
# Fetch all puzzles.
|
|
37
37
|
def puzzles
|
|
38
38
|
PDD.log.info "Reading #{@path}..."
|
|
39
|
-
re = %r{(.*(?:^|\s))@todo\s+#([\w\-\.:/]+)\s+(.+)}
|
|
40
39
|
puzzles = []
|
|
41
40
|
lines = File.readlines(@file)
|
|
42
41
|
lines.each_with_index do |line, idx|
|
|
43
42
|
begin
|
|
44
|
-
|
|
43
|
+
/[^\s]@todo/.match(line) do |_|
|
|
44
|
+
raise Error, '@todo must have a leading space to become a puzzle,
|
|
45
|
+
as this page explains: https://github.com/yegor256/pdd#how-to-format'
|
|
46
|
+
end
|
|
47
|
+
/@todo(?!\s+#)/.match(line) do |_|
|
|
48
|
+
raise Error, "@todo found, but puzzle can't be parsed, \
|
|
49
|
+
most probably because @todo is not followed by a puzzle marker, as this page \
|
|
50
|
+
explains: https://github.com/yegor256/pdd#how-to-format"
|
|
51
|
+
end
|
|
52
|
+
%r{(.*(?:^|\s))@todo\s+#([\w\-\.:/]+)\s+(.+)}.match(line) do |match|
|
|
45
53
|
puzzles << puzzle(lines.drop(idx + 1), match, idx)
|
|
46
54
|
end
|
|
47
55
|
rescue Error, ArgumentError => ex
|
|
48
56
|
raise Error, "puzzle at line ##{idx + 1}; #{ex.message}"
|
|
49
57
|
end
|
|
50
58
|
end
|
|
51
|
-
lines.each_with_index do |line, idx|
|
|
52
|
-
next unless line =~ /.*(^|\s)@todo\s+[^#]/
|
|
53
|
-
raise Error, "@todo found, but puzzle can't be parsed in line ##{idx}, \
|
|
54
|
-
most probably because TODO is not followed by a puzzle marker, as this page \
|
|
55
|
-
explains: https://github.com/yegor256/pdd#how-to-format"
|
|
56
|
-
end
|
|
57
59
|
puzzles
|
|
58
60
|
end
|
|
59
61
|
|
|
@@ -117,6 +119,10 @@ at position ##{prefix.length + 1}."
|
|
|
117
119
|
.map { |t| t[1, t.length] }
|
|
118
120
|
end
|
|
119
121
|
|
|
122
|
+
# @todo #75:30min Let's make it possible to fetch Subversion data
|
|
123
|
+
# in a similar way as we are doing with Git. We should also just
|
|
124
|
+
# skip it if it's not SVN.
|
|
125
|
+
|
|
120
126
|
# Git information at the line
|
|
121
127
|
def git(pos)
|
|
122
128
|
dir = Shellwords.escape(File.dirname(@file))
|
data/lib/pdd/version.rb
CHANGED
data/pdd.gemspec
CHANGED
|
@@ -44,13 +44,13 @@ Gem::Specification.new do |s|
|
|
|
44
44
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
|
45
45
|
s.rdoc_options = ['--charset=UTF-8']
|
|
46
46
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
|
47
|
-
s.add_runtime_dependency 'nokogiri', '~>1.
|
|
48
|
-
s.add_runtime_dependency 'slop', '~>4.
|
|
47
|
+
s.add_runtime_dependency 'nokogiri', '~>1.8'
|
|
48
|
+
s.add_runtime_dependency 'slop', '~>4.6'
|
|
49
49
|
s.add_runtime_dependency 'rainbow', '~>2.2'
|
|
50
50
|
s.add_development_dependency 'rake', '12.0.0'
|
|
51
51
|
s.add_development_dependency 'codecov', '0.1.10'
|
|
52
52
|
s.add_development_dependency 'rdoc', '4.2.0'
|
|
53
|
-
s.add_development_dependency 'cucumber', '1.
|
|
53
|
+
s.add_development_dependency 'cucumber', '3.1.0'
|
|
54
54
|
s.add_development_dependency 'minitest', '5.5.0'
|
|
55
55
|
s.add_development_dependency 'rubocop', '0.48.1'
|
|
56
56
|
s.add_development_dependency 'rubocop-rspec', '1.15.1'
|
data/test/test_source.rb
CHANGED
|
@@ -83,7 +83,7 @@ class TestSource < Minitest::Test
|
|
|
83
83
|
error = assert_raises PDD::Error do
|
|
84
84
|
PDD::VerboseSource.new(file, PDD::Source.new(file, 'ff')).puzzles
|
|
85
85
|
end
|
|
86
|
-
assert !error.to_s.index('
|
|
86
|
+
assert !error.to_s.index('@todo is not followed by a puzzle marker').nil?
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
|
|
@@ -115,6 +115,22 @@ class TestSource < Minitest::Test
|
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
+
def test_failing_on_puzzle_without_leading_space
|
|
119
|
+
Dir.mktmpdir 'test' do |dir|
|
|
120
|
+
file = File.join(dir, 'hey.txt')
|
|
121
|
+
File.write(
|
|
122
|
+
file,
|
|
123
|
+
'
|
|
124
|
+
*@todo #999 this is an incorrectly formatted puzzle!
|
|
125
|
+
'
|
|
126
|
+
)
|
|
127
|
+
error = assert_raises PDD::Error do
|
|
128
|
+
PDD::VerboseSource.new(file, PDD::Source.new(file, 'x')).puzzles
|
|
129
|
+
end
|
|
130
|
+
assert !error.message.index('@todo must have a leading space').nil?
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
118
134
|
def test_reads_git_author
|
|
119
135
|
skip if Gem.win_platform?
|
|
120
136
|
Dir.mktmpdir 'test' do |dir|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pdd
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 0.18.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yegor Bugayenko
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-12-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: nokogiri
|
|
@@ -16,28 +16,28 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.
|
|
19
|
+
version: '1.8'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.
|
|
26
|
+
version: '1.8'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: slop
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '4.
|
|
33
|
+
version: '4.6'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '4.
|
|
40
|
+
version: '4.6'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rainbow
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -100,14 +100,14 @@ dependencies:
|
|
|
100
100
|
requirements:
|
|
101
101
|
- - '='
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 1.
|
|
103
|
+
version: 3.1.0
|
|
104
104
|
type: :development
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
108
|
- - '='
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.
|
|
110
|
+
version: 3.1.0
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: minitest
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -188,7 +188,6 @@ extra_rdoc_files:
|
|
|
188
188
|
- LICENSE.txt
|
|
189
189
|
files:
|
|
190
190
|
- ".0pdd.yml"
|
|
191
|
-
- ".coveralls.yml"
|
|
192
191
|
- ".gitattributes"
|
|
193
192
|
- ".gitignore"
|
|
194
193
|
- ".pdd"
|
|
@@ -200,7 +199,6 @@ files:
|
|
|
200
199
|
- LICENSE.txt
|
|
201
200
|
- README.md
|
|
202
201
|
- Rakefile
|
|
203
|
-
- TEAM.md
|
|
204
202
|
- appveyor.yml
|
|
205
203
|
- assets/puzzles.xsd
|
|
206
204
|
- assets/puzzles.xsl
|
data/.coveralls.yml
DELETED