Skip to content

Commit

Permalink
#25 available-roles rule
Browse files Browse the repository at this point in the history
  • Loading branch information
Yegor Bugayenko committed Dec 7, 2014
1 parent 6813f01 commit 76a8756
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 11 deletions.
38 changes: 33 additions & 5 deletions bin/pdd
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
10 changes: 10 additions & 0 deletions features/applies_rules.feature
Original file line number Diff line number Diff line change
Expand Up @@ -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"
6 changes: 4 additions & 2 deletions lib/pdd.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion lib/pdd/rule/duplicates.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions lib/pdd/rule/estimates.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
53 changes: 53 additions & 0 deletions lib/pdd/rule/roles.rb
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion lib/pdd/rule/text.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
59 changes: 59 additions & 0 deletions test/test_roles.rb
Original file line number Diff line number Diff line change
@@ -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 ([email protected])
# 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(
'<puzzles><puzzle><role>D</role></puzzle></puzzles>'
), '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(
'<puzzles><puzzle><role>F</role></puzzle></puzzles>'
), '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(
'<puzzles><puzzle></puzzle></puzzles>'
), 'T,R,L'
)
assert !rule.errors.empty?, 'why it is empty?'
end
end

0 comments on commit 76a8756

Please sign in to comment.