From 0e774c77d5834772cfbc0fb62f5b24bd13c1b001 Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Thu, 13 Oct 2016 16:51:22 +0100 Subject: [PATCH] Improve category/package regex, validation and add spec tests --- .../provider/entropy_keywords/parsed.rb | 4 +-- lib/puppet/provider/entropy_mask/parsed.rb | 4 +-- .../provider/entropy_splitdebug/parsed.rb | 4 +-- .../entropy_splitdebug_mask/parsed.rb | 4 +-- lib/puppet/provider/entropy_unmask/parsed.rb | 4 +-- lib/puppet/type/entropy_keywords.rb | 6 ++-- lib/puppet/type/entropy_mask.rb | 6 ++-- lib/puppet/type/entropy_splitdebug.rb | 6 ++-- lib/puppet/type/entropy_splitdebug_mask.rb | 6 ++-- lib/puppet/type/entropy_unmask.rb | 6 ++-- spec/unit/type/package_types_spec.rb | 32 ++++++++++++++++--- 11 files changed, 48 insertions(+), 34 deletions(-) diff --git a/lib/puppet/provider/entropy_keywords/parsed.rb b/lib/puppet/provider/entropy_keywords/parsed.rb index 04ff001..5469e34 100644 --- a/lib/puppet/provider/entropy_keywords/parsed.rb +++ b/lib/puppet/provider/entropy_keywords/parsed.rb @@ -18,11 +18,11 @@ Puppet::Type.type(:entropy_keywords).provide(:parsed, :match => /^\s*#/ text_line :unmanaged, - :match => %r{^(\S+)\s+([<>]?=)?(?:([a-zA-Z+\/-]+)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?)?(?:\s*repo=([a-zA-Z0-9\._-]+))?\s*$} + :match => %r{^(\S+)\s+([<>]?=)?(?:((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?)?(?:\s*repo=([a-zA-Z0-9\._-]+))?\s*$} record_line :parsed, :fields => %w{keyword operator package version repo name}, - :match => %r{^(\S+)\s+([<>]?=)?(?:([a-zA-Z+\/-]+)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?)?(?:\s*repo=([a-zA-Z0-9\._-]+))?\s+## Puppet Name: (.*)\s*$}, + :match => %r{^(\S+)\s+([<>]?=)?(?:((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?)?(?:\s*repo=([a-zA-Z0-9\._-]+))?\s+## Puppet Name: (.*)\s*$}, :to_line => proc { |record| line = record[:keyword] + " " line += record[:operator] if record[:operator] diff --git a/lib/puppet/provider/entropy_mask/parsed.rb b/lib/puppet/provider/entropy_mask/parsed.rb index d86f510..6ea649c 100644 --- a/lib/puppet/provider/entropy_mask/parsed.rb +++ b/lib/puppet/provider/entropy_mask/parsed.rb @@ -18,11 +18,11 @@ Puppet::Type.type(:entropy_mask).provide(:parsed, :match => /^\s*#/ text_line :unmanaged, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s*$} + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s*$} record_line :parsed, :fields => %w{operator package version slot use tag repo name}, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s+#+ Puppet Name: (.*)\s*$}, + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s+#+ Puppet Name: (.*)\s*$}, :to_line => proc { |record| line = "" line += record[:operator] if record[:operator] diff --git a/lib/puppet/provider/entropy_splitdebug/parsed.rb b/lib/puppet/provider/entropy_splitdebug/parsed.rb index 0e862c4..1a445fd 100644 --- a/lib/puppet/provider/entropy_splitdebug/parsed.rb +++ b/lib/puppet/provider/entropy_splitdebug/parsed.rb @@ -18,11 +18,11 @@ Puppet::Type.type(:entropy_splitdebug).provide(:parsed, :match => /^\s*#/ text_line :unmanaged, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9\._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s*$} + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9\._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s*$} record_line :parsed, :fields => %w{operator package version slot use tag repo name}, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9\._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s+#+ Puppet Name: (.*)\s*$}, + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9\._-]+))?(?:::([a-zA-Z0-9\._-]+))?\s+#+ Puppet Name: (.*)\s*$}, :to_line => proc { |record| line = "" line += record[:operator] if record[:operator] diff --git a/lib/puppet/provider/entropy_splitdebug_mask/parsed.rb b/lib/puppet/provider/entropy_splitdebug_mask/parsed.rb index b890600..d4f602d 100644 --- a/lib/puppet/provider/entropy_splitdebug_mask/parsed.rb +++ b/lib/puppet/provider/entropy_splitdebug_mask/parsed.rb @@ -18,11 +18,11 @@ Puppet::Type.type(:entropy_splitdebug_mask).provide(:parsed, :match => /^\s*#/ text_line :unmanaged, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s*$} + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9\._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s*$} record_line :parsed, :fields => %w{operator package version slot use tag repo name}, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s+#+ Puppet Name: (.*)\s*$}, + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s+#+ Puppet Name: (.*)\s*$}, :to_line => proc { |record| line = "" line += record[:operator] if record[:operator] diff --git a/lib/puppet/provider/entropy_unmask/parsed.rb b/lib/puppet/provider/entropy_unmask/parsed.rb index 6d4f4e8..2ff7ad3 100644 --- a/lib/puppet/provider/entropy_unmask/parsed.rb +++ b/lib/puppet/provider/entropy_unmask/parsed.rb @@ -18,11 +18,11 @@ Puppet::Type.type(:entropy_unmask).provide(:parsed, :match => /^\s*#/ text_line :unmanaged, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s*$} + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s*$} record_line :parsed, :fields => %w{operator package version slot use tag repo name}, - :match => %r{^([<>]?=)?([a-zA-Z+\/-]*)(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s+#+ Puppet Name: (.*)\s*$}, + :match => %r{^([<>]?=)?((?:[A-Za-z0-9+_.-]+/)?[a-zA-Z0-9+_-]+)?(?:-(\d+(?:\.\d+)*[a-z]*(?:_(?:alpha|beta|pre|p|rc)\d*)?(?:-r\d+)?))?(?::([a-zA-Z0-9._-]+))?(?:\[([^\]]*)\])?(?:#([a-zA-Z0-9._-]+))?(?:::([a-zA-Z0-9._-]+))?\s+#+ Puppet Name: (.*)\s*$}, :to_line => proc { |record| line = "" line += record[:operator] if record[:operator] diff --git a/lib/puppet/type/entropy_keywords.rb b/lib/puppet/type/entropy_keywords.rb index 5ec44ac..87295e2 100644 --- a/lib/puppet/type/entropy_keywords.rb +++ b/lib/puppet/type/entropy_keywords.rb @@ -26,14 +26,12 @@ Puppet::Type.newtype(:entropy_keywords) do newproperty(:package) do desc "Name of the package being keyworded" + newvalues(%r{^(?:[A-Za-z0-9+_.-]+\/)?[a-zA-Z0-9+_-]+$}) end newproperty(:version) do desc "Version of the package" - - validate do |value| - raise(ArgumentError, "") if value !~ /^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$/ - end + newvalues(%r{^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$}) end newproperty(:repo) do diff --git a/lib/puppet/type/entropy_mask.rb b/lib/puppet/type/entropy_mask.rb index c303516..2847a56 100644 --- a/lib/puppet/type/entropy_mask.rb +++ b/lib/puppet/type/entropy_mask.rb @@ -13,14 +13,12 @@ Puppet::Type.newtype(:entropy_mask) do newproperty(:package) do desc "Name of the package being masked" + newvalues(%r{^(?:[A-Za-z0-9+_.-]+\/)?[a-zA-Z0-9+_-]+$}) end newproperty(:version) do desc "Version of the package" - - validate do |value| - raise(ArgumentError, "") if value !~ /^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$/ - end + newvalues(%r{^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$}) end newproperty(:slot) do diff --git a/lib/puppet/type/entropy_splitdebug.rb b/lib/puppet/type/entropy_splitdebug.rb index eedc2ea..bbfdb07 100644 --- a/lib/puppet/type/entropy_splitdebug.rb +++ b/lib/puppet/type/entropy_splitdebug.rb @@ -13,14 +13,12 @@ Puppet::Type.newtype(:entropy_splitdebug) do newproperty(:package) do desc "Name of the package with splitdebug" + newvalues(%r{^(?:[A-Za-z0-9+_.-]+\/)?[a-zA-Z0-9+_-]+$}) end newproperty(:version) do desc "Version of the package" - - validate do |value| - raise(ArgumentError, "") if value !~ /^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$/ - end + newvalues(%r{^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$}) end newproperty(:slot) do diff --git a/lib/puppet/type/entropy_splitdebug_mask.rb b/lib/puppet/type/entropy_splitdebug_mask.rb index db88031..c4b6992 100644 --- a/lib/puppet/type/entropy_splitdebug_mask.rb +++ b/lib/puppet/type/entropy_splitdebug_mask.rb @@ -13,14 +13,12 @@ Puppet::Type.newtype(:entropy_splitdebug_mask) do newproperty(:package) do desc "Name of the package with splitdebug mask" + newvalues(%r{^(?:[A-Za-z0-9+_.-]+\/)?[a-zA-Z0-9+_-]+$}) end newproperty(:version) do desc "Version of the package" - - validate do |value| - raise(ArgumentError, "") if value !~ /^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$/ - end + newvalues(%r{^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$}) end newproperty(:slot) do diff --git a/lib/puppet/type/entropy_unmask.rb b/lib/puppet/type/entropy_unmask.rb index c775e92..a5b740c 100644 --- a/lib/puppet/type/entropy_unmask.rb +++ b/lib/puppet/type/entropy_unmask.rb @@ -13,14 +13,12 @@ Puppet::Type.newtype(:entropy_unmask) do newproperty(:package) do desc "Name of the package being masked" + newvalues(%r{^(?:[A-Za-z0-9+_.-]+\/)?[a-zA-Z0-9+_-]+$}) end newproperty(:version) do desc "Version of the package" - - validate do |value| - raise(ArgumentError, "") if value !~ /^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$/ - end + newvalues(%r{^(\d*(?:\.\d+[a-zA-Z]*)*)(?:_((?:alpha|beta|pre|rc)\d*))?(-r\d+)?$}) end newproperty(:slot) do diff --git a/spec/unit/type/package_types_spec.rb b/spec/unit/type/package_types_spec.rb index 8d29916..c866583 100644 --- a/spec/unit/type/package_types_spec.rb +++ b/spec/unit/type/package_types_spec.rb @@ -54,10 +54,34 @@ types.each do |type_name, type| end describe "when validating required properties" do - it "should raise an error when no required attributes are passed" do - expect { - described_class.new(:name => "test") - }.to raise_error(Puppet::Error, /At least one of (.*) is required/) + packages = [ + 'virtual/package', + 'package', + 'package-with-dash', + 'package_with_underscores', + 'category-123/package2', + 'category.with.dots/package' + ] + packages.each do |package| + it "should accept valid package name #{package}" do + expect { + described_class.new(:name => 'test', :package => package) + }.not_to raise_error + end + end + + packages = [ + 'two/category/package', + 'invalid-package-1.2', + '/no-category-package', + 'no-package-category/', + ] + packages.each do |package| + it "should reject invalid package name #{package}" do + expect { + described_class.new(:name => 'test', :package => package) + }.to raise_error(Puppet::Error) + end end it "should raise an error when a version is passed with no package" do