diff --git a/bin/pdd b/bin/pdd
index 9415e5f..1bc090e 100755
--- a/bin/pdd
+++ b/bin/pdd
@@ -33,11 +33,39 @@ opts = Slop.parse(ARGV, strict: true, help: true) do
banner "Usage (#{PDD::VERSION}): pdd [options]"
on 'v', 'verbose', 'Enable verbose mode'
on 'version', 'Show current version'
- on 's', 'source', 'Source directory to parse', argument: :required
- on 'f', 'file', 'File to save XML into', argument: :required
- on 'e', 'exclude', 'Glob pattern to exclude', as: Array, argument: :required
- on 't', 'format', 'Format to use (xml|html)', argument: :required
- on 'r', 'rule', 'Format to use (xml|html)', argument: :required, as: Array
+ on(
+ 's',
+ 'source',
+ 'Source directory to parse',
+ argument: :required
+ )
+ on(
+ 'f',
+ 'file',
+ 'File to save XML into',
+ argument: :required
+ )
+ on(
+ 'e',
+ 'exclude',
+ 'Glob pattern to exclude',
+ as: Array,
+ argument: :required
+ )
+ on(
+ 't',
+ 'format',
+ 'Format to use (xml|html)',
+ argument: :required
+ )
+ on(
+ 'r',
+ 'rule',
+ 'Format to use (xml|html)',
+ argument: :required,
+ as: Array,
+ limit: 1
+ )
end
fail '-f is mandatory when using -v' if opts.verbose? && !opts.file?
diff --git a/features/applies_rules.feature b/features/applies_rules.feature
index 0d06918..83cf8a0 100644
--- a/features/applies_rules.feature
+++ b/features/applies_rules.feature
@@ -29,3 +29,13 @@ Feature: Applies Post-Parsing Rules
When I run bin/pdd with ""
Then Exit code is not zero
Then Stdout contains "there are 2 duplicate"
+
+ Scenario: Throwing exception on duplicates
+ Given I have a "Sample.java" file with content:
+ """
+ @todo #13/DEV:15min Some text first
+ @todo #13/TEST:15min The text second
+ """
+ When I run bin/pdd with "--rule=available-roles:DEV,IMP"
+ Then Exit code is not zero
+ Then Stdout contains "defines role TEST"
diff --git a/lib/pdd.rb b/lib/pdd.rb
index 55ab862..f550cf4 100644
--- a/lib/pdd.rb
+++ b/lib/pdd.rb
@@ -26,6 +26,7 @@
require 'pdd/rule/estimates'
require 'pdd/rule/text'
require 'pdd/rule/duplicates'
+require 'pdd/rule/roles'
require 'nokogiri'
require 'logger'
require 'time'
@@ -47,7 +48,8 @@ class SchemaError < Error
'min-estimate' => PDD::Rule::Estimate::Min,
'max-estimate' => PDD::Rule::Estimate::Max,
'min-words' => PDD::Rule::Text::MinWords,
- 'max-duplicates' => PDD::Rule::MaxDuplicates
+ 'max-duplicates' => PDD::Rule::MaxDuplicates,
+ 'available-roles' => PDD::Rule::Roles::Available
}
# Get logger.
@@ -139,7 +141,7 @@ def rules(xml)
name, value = r.split(':')
rule = RULES[name]
fail "rule '#{name}' doesn't exist" if rule.nil?
- rule.new(doc, value.to_i).errors.each do |e|
+ rule.new(doc, value).errors.each do |e|
PDD.log.error e
total += 1
end
diff --git a/lib/pdd/rule/duplicates.rb b/lib/pdd/rule/duplicates.rb
index 6de51c9..0eb6a07 100644
--- a/lib/pdd/rule/duplicates.rb
+++ b/lib/pdd/rule/duplicates.rb
@@ -29,7 +29,7 @@ class MaxDuplicates
# +xml+:: XML with puzzles
def initialize(xml, max)
@xml = xml
- @max = max
+ @max = max.to_i
end
def errors
diff --git a/lib/pdd/rule/estimates.rb b/lib/pdd/rule/estimates.rb
index dcb5058..dfa968f 100644
--- a/lib/pdd/rule/estimates.rb
+++ b/lib/pdd/rule/estimates.rb
@@ -30,7 +30,7 @@ class Min
# +xml+:: XML with puzzles
def initialize(xml, min)
@xml = xml
- @min = min
+ @min = min.to_i
end
def errors
@@ -48,7 +48,7 @@ class Max
# +xml+:: XML with puzzles
def initialize(xml, min)
@xml = xml
- @min = min
+ @min = min.to_i
end
def errors
diff --git a/lib/pdd/rule/roles.rb b/lib/pdd/rule/roles.rb
new file mode 100644
index 0000000..30d943b
--- /dev/null
+++ b/lib/pdd/rule/roles.rb
@@ -0,0 +1,53 @@
+# encoding: utf-8
+#
+# Copyright (c) 2014 TechnoPark Corp.
+# Copyright (c) 2014 Yegor Bugayenko
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the 'Software'), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+module PDD
+ module Rule
+ module Roles
+ # Rule for available roles checking.
+ class Available
+ # Ctor.
+ # +xml+:: XML with puzzles
+ def initialize(xml, roles)
+ @xml = xml
+ @roles = roles.split(',')
+ end
+
+ def errors
+ @xml.xpath('//puzzle').map do |p|
+ role = p.xpath('role/text()').to_s
+ next nil if @roles.include?(role)
+ "puzzle #{p.xpath('file/text()')}:#{p.xpath('lines/text()')}" +
+ if role.empty?
+ " doesn't define any role"\
+ ", while one of these roles is required: #{@roles}"
+ else
+ " defines role #{role}"\
+ ", while only these roles are allowed: #{@roles}"
+ end
+ end.compact
+ end
+ end
+ end
+ end
+end
diff --git a/lib/pdd/rule/text.rb b/lib/pdd/rule/text.rb
index b3c9399..601cf3b 100644
--- a/lib/pdd/rule/text.rb
+++ b/lib/pdd/rule/text.rb
@@ -30,7 +30,7 @@ class MinWords
# +xml+:: XML with puzzles
def initialize(xml, min)
@xml = xml
- @min = min
+ @min = min.to_i
end
def errors
diff --git a/test/test_roles.rb b/test/test_roles.rb
new file mode 100644
index 0000000..3d0e1ab
--- /dev/null
+++ b/test/test_roles.rb
@@ -0,0 +1,59 @@
+# encoding: utf-8
+#
+# Copyright (c) 2014 TechnoPark Corp.
+# Copyright (c) 2014 Yegor Bugayenko
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the 'Software'), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+require 'minitest/autorun'
+require 'nokogiri'
+require 'pdd/rule/roles'
+
+# PDD::Rule::Role module tests.
+# Author:: Yegor Bugayenko (yegor@teamed.io)
+# Copyright:: Copyright (c) 2014 Yegor Bugayenko
+# License:: MIT
+class TestRoles < Minitest::Test
+ def test_incorrect_role
+ rule = PDD::Rule::Roles::Available.new(
+ Nokogiri::XML::Document.parse(
+ 'D'
+ ), 'A,B,C'
+ )
+ assert !rule.errors.empty?, 'why it is empty?'
+ end
+
+ def test_correct_role
+ rule = PDD::Rule::Roles::Available.new(
+ Nokogiri::XML::Document.parse(
+ 'F'
+ ), 'F,E,G'
+ )
+ assert rule.errors.empty?, 'why it is not empty?'
+ end
+
+ def test_empty_role
+ rule = PDD::Rule::Roles::Available.new(
+ Nokogiri::XML::Document.parse(
+ ''
+ ), 'T,R,L'
+ )
+ assert !rule.errors.empty?, 'why it is empty?'
+ end
+end