From 76a87568aa3b725a50c098385bb3b6ac99506a3f Mon Sep 17 00:00:00 2001 From: Yegor Bugayenko Date: Sun, 7 Dec 2014 18:29:50 +0200 Subject: [PATCH] #25 available-roles rule --- bin/pdd | 38 +++++++++++++++++++--- features/applies_rules.feature | 10 ++++++ lib/pdd.rb | 6 ++-- lib/pdd/rule/duplicates.rb | 2 +- lib/pdd/rule/estimates.rb | 4 +-- lib/pdd/rule/roles.rb | 53 ++++++++++++++++++++++++++++++ lib/pdd/rule/text.rb | 2 +- test/test_roles.rb | 59 ++++++++++++++++++++++++++++++++++ 8 files changed, 163 insertions(+), 11 deletions(-) create mode 100644 lib/pdd/rule/roles.rb create mode 100644 test/test_roles.rb 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