validates-format-of-uri 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ pkg
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.2-p290@mirroring_house_validates_format_of_uri --create
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ validates-format-of-uri (0.0.1)
5
+ activemodel (~> 3.1.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ activemodel (3.1.0)
11
+ activesupport (= 3.1.0)
12
+ bcrypt-ruby (~> 3.0.0)
13
+ builder (~> 3.0.0)
14
+ i18n (~> 0.6)
15
+ activesupport (3.1.0)
16
+ multi_json (~> 1.0)
17
+ bcrypt-ruby (3.0.0)
18
+ builder (3.0.0)
19
+ i18n (0.6.0)
20
+ multi_json (1.0.3)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ validates-format-of-uri!
@@ -0,0 +1,25 @@
1
+ Copyright 2011 3Crowd Technologies, Inc. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are
4
+ permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this list of
7
+ conditions and the following disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list
10
+ of conditions and the following disclaimer in the documentation and/or other materials
11
+ provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY 3Crowd Technologies, Inc. ''AS IS'' AND ANY EXPRESS OR IMPLIED
14
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
15
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 3Crowd Technologies, Inc. OR
16
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
19
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
21
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ The views and conclusions contained in the software and documentation are those of the
24
+ authors and should not be interpreted as representing official policies, either expressed
25
+ or implied, of 3Crowd Technologies, Inc..
@@ -0,0 +1,19 @@
1
+ Validates format of URI
2
+ =======================
3
+ An ActiveModel field validator using the URI parsing library included with ruby
4
+ to validate that a given field matches the format of a URI as given by RFC 2396.
5
+ See URI#parse for more information.
6
+
7
+ Installation
8
+ ------------
9
+ Add the following to your Gemfile:
10
+ gem 'validates-format-of-uri', '~> 0.0.1', :require => 'mirroring_house/validations/validates_format_of_uri'
11
+
12
+ Restrictions
13
+ ------------
14
+ * Does not validate existance of domain
15
+ * Does not validate that the domain is actually registered
16
+
17
+ Credits
18
+ -------
19
+ Many thanks to the inspiration provided by https://gist.github.com/102138
@@ -0,0 +1,20 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ t.test_files = Dir.glob("#{dir}/test/cases/**/*_test.rb").sort
8
+ t.warning = true
9
+ end
10
+
11
+ task :default => [:clobber, :test, :package]
12
+
13
+ require 'rake/packagetask'
14
+ require 'rubygems/package_task'
15
+
16
+ spec = eval(File.read("#{dir}/validates-format-of-uri.gemspec"))
17
+
18
+ Gem::PackageTask.new(spec) do |p|
19
+ p.gem_spec = spec
20
+ end
@@ -0,0 +1,70 @@
1
+ require 'uri'
2
+ require 'active_model'
3
+
4
+ module MirroringHouse
5
+ module Validations
6
+
7
+ module ValidatesFormatOfURI
8
+ extend ActiveSupport::Concern
9
+
10
+ module InstanceMethods
11
+
12
+ class URIFormatValidator < ActiveModel::EachValidator
13
+
14
+ MESSAGES = { :scheme => :invalid_scheme, :host_blank => :host_cannot_be_blank, :general_error => :unable_to_parse }.freeze
15
+ SCHEMES = [ :http, :https ].freeze
16
+ ALLOW_BLANK_HOST = false.freeze
17
+
18
+ RESERVED_OPTIONS = []
19
+
20
+ def initialize(options)
21
+ raise ArgumentError, ":schemes must be an Array of Symbols describing allowed schemes" unless options[:schemes].nil? || (options[:schemes].is_a?(Array) && options[:schemes].all?{|a| a.is_a?(Symbol)})
22
+ options[:schemes] ||= SCHEMES
23
+ options[:allow_blank_host] ||= ALLOW_BLANK_HOST
24
+ super
25
+ end
26
+
27
+ def validate_each(record, attribute, value)
28
+
29
+ errors_options = options.except(*RESERVED_OPTIONS)
30
+
31
+ begin
32
+
33
+ uri = URI.parse(value)
34
+
35
+ record.errors.add(attribute, MESSAGES[:host_blank], errors_options) if uri.host.blank? && !options[:allow_blank_host]
36
+ record.errors.add(attribute, MESSAGES[:scheme_invalid], errors_options) unless options[:schemes].map{|scheme| scheme.to_s}.include?(uri.scheme)
37
+
38
+ rescue URI::InvalidURIError => e
39
+
40
+ record.errors.add(attribute, MESSAGES[:general_error], errors_options)
41
+
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ module ClassMethods
50
+
51
+ # Validates that the specified attribute parses correctly as a URI, and matches the restrictions specified.
52
+ #
53
+ # class Person < ActiveRecord::Base
54
+ # validates_format_of_uri :website
55
+ # end
56
+ #
57
+ # Configuration options:
58
+ # * <tt>:schemes</tt> - An Array of Symbols describing allowed URI schemes (e.g. [ :http, :https ], to allow https:// and http:// URIs)
59
+ #
60
+ def validates_format_of_uri(*attr_names)
61
+ validates_with InstanceMethods::URIFormatValidator, _merge_attributes(attr_names)
62
+ end
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+ end
69
+
70
+ ActiveModel::Validations.send(:include, MirroringHouse::Validations::ValidatesFormatOfURI)
@@ -0,0 +1,22 @@
1
+ require 'uri/http'
2
+
3
+ module MirroringHouse
4
+ module Validations
5
+
6
+ module ValidatesFormatOfURI
7
+
8
+ module Version
9
+ MAJOR = '0'
10
+ MINOR = '0'
11
+ PATCH = '1'
12
+
13
+ def self.to_standard_version_s
14
+ [MAJOR, MINOR, PATCH].join('.')
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1 @@
1
+ require 'mirroring_house/validations/validates_format_of_uri'
@@ -0,0 +1,9 @@
1
+ require 'config'
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'active_model'
7
+ require 'mirroring_house/validations/validates_format_of_uri'
8
+
9
+ require 'test/unit'
@@ -0,0 +1,64 @@
1
+ require 'cases/helper'
2
+
3
+ require 'models/website'
4
+
5
+ class URIFormatValidationTest < ActiveModel::TestCase
6
+
7
+ def teardown
8
+ Website.reset_callbacks(:validate)
9
+ end
10
+
11
+ def test_validation_of_uri_outside_of_given_scheme_set_fails_when_scheme_not_in_given_schemes
12
+ Website.validates_format_of_uri :uri, :schemes => [ :http ]
13
+ site = Website.new(:uri => "https://example.com")
14
+ assert site.invalid?, "https scheme was not invalid when only http was specified as the only valid scheme. Site validations: #{site.errors.inspect} "
15
+ end
16
+
17
+ def test_validation_of_uri_within_given_scheme_set_succeeds_when_scheme_in_given_schemes
18
+ Website.validates_format_of_uri :uri, :schemes => [ :http ]
19
+ site = Website.new(:uri => "http://example.com")
20
+ assert site.valid?, "http was not a valid scheme when http was specified as a valid scheme. Site validations: #{site.errors.inspect}"
21
+ end
22
+
23
+ def test_validation_of_uri_succeeds_when_scheme_is_in_default_scheme_set
24
+ uri = URI.parse("http://example.com")
25
+ Website.validates_format_of_uri :uri
26
+ site = Website.new(:uri => uri.to_s)
27
+ assert MirroringHouse::Validations::ValidatesFormatOfURI::InstanceMethods::URIFormatValidator::SCHEMES.include?(uri.scheme.to_sym), "Test URI scheme was not in validator default schemes"
28
+ assert site.valid?, "http was not validated as a default valid scheme. Site validations: #{site.errors.inspect}"
29
+ end
30
+
31
+ def test_validation_of_uri_fails_when_scheme_is_not_in_default_scheme_set
32
+ uri = URI.parse("telnet://example.com")
33
+ Website.validates_format_of_uri :uri
34
+ site = Website.new(:uri => uri.to_s)
35
+ refute MirroringHouse::Validations::ValidatesFormatOfURI::InstanceMethods::URIFormatValidator::SCHEMES.include?(uri.scheme.to_sym), "Test URI scheme was included in validator default schemes"
36
+ refute site.valid?, "telnet was not invalidated as a default invalid scheme. Site validations: #{site.errors.inspect}"
37
+ end
38
+
39
+ def test_validation_of_uri_fails_when_host_is_blank_if_allow_blank_host_is_not_set
40
+ uri = URI.parse("http:///")
41
+ Website.validates_format_of_uri :uri, :allow_blank_host => false
42
+ site = Website.new(:uri => uri.to_s)
43
+ assert MirroringHouse::Validations::ValidatesFormatOfURI::InstanceMethods::URIFormatValidator::SCHEMES.include?(uri.scheme.to_sym), "Test URI scheme was not in validator default schemes"
44
+ refute site.valid?, "blank host was not flagged as invalid"
45
+ end
46
+
47
+ def test_validation_of_uri_succeeds_when_host_is_blank_if_allow_blank_host_is_set
48
+ uri = URI.parse("http:///")
49
+ Website.validates_format_of_uri :uri, :allow_blank_host => true
50
+ site = Website.new(:uri => uri.to_s)
51
+ assert MirroringHouse::Validations::ValidatesFormatOfURI::InstanceMethods::URIFormatValidator::SCHEMES.include?(uri.scheme.to_sym), "Test URI scheme was not in validator default schemes"
52
+ assert site.valid?, "blank host was not accepted even though allow_blank_host option was true"
53
+ end
54
+
55
+ def test_validation_of_uri_fails_when_host_is_blank_if_allow_blank_host_is_unspecified
56
+ uri = URI.parse("http:///")
57
+ Website.validates_format_of_uri :uri
58
+ site = Website.new(:uri => uri.to_s)
59
+ assert MirroringHouse::Validations::ValidatesFormatOfURI::InstanceMethods::URIFormatValidator::SCHEMES.include?(uri.scheme.to_sym), "Test URI scheme was not in validator default schemes"
60
+ refute site.valid?, "blank host was not flagged as invalid"
61
+ end
62
+
63
+
64
+ end
@@ -0,0 +1,3 @@
1
+ TEST_ROOT = File.expand_path(File.dirname(__FILE__))
2
+ FIXTURES_ROOT = TEST_ROOT + '/fixtures'
3
+ SCHEMA_FILE = TEST_ROOT + '/schema.rb'
@@ -0,0 +1,12 @@
1
+ class Website
2
+ include ActiveModel::Validations
3
+
4
+ attr_accessor :uri
5
+
6
+ def initialize(attributes = {})
7
+ attributes.each do |key, value|
8
+ send "#{key}=", value
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('./lib/mirroring_house/validations/validates_format_of_uri/version.rb')
3
+
4
+ Gem::Specification.new do |gem|
5
+
6
+ gem.name = 'validates-format-of-uri'
7
+ gem.version = MirroringHouse::Validations::ValidatesFormatOfURI::Version.to_standard_version_s
8
+
9
+ gem.authors = ["Justin Lynn", "3Crowd Technologies, Inc. (Sponsor)"]
10
+ gem.email = ["eng@3crowd.com"]
11
+
12
+ gem.summary = %q{An ActiveModel wrapper for URI#parse}
13
+ gem.description = %q{An ActiveModel validator utilizing the built in URI parse methods to provide a rich semantic API for URI validation}
14
+
15
+ gem.homepage = 'https://github.com/mirroring-house/validates_format_of_uri'
16
+
17
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename f }
18
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ gem.files = `git ls-files`.split("\n")
20
+
21
+ gem.require_paths = ['lib']
22
+
23
+ gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
24
+
25
+ gem.add_dependency 'activemodel', '~> 3.1.0'
26
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: validates-format-of-uri
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Justin Lynn
9
+ - 3Crowd Technologies, Inc. (Sponsor)
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-09-12 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activemodel
17
+ requirement: &8091000 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 3.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *8091000
26
+ description: An ActiveModel validator utilizing the built in URI parse methods to
27
+ provide a rich semantic API for URI validation
28
+ email:
29
+ - eng@3crowd.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - .rvmrc
36
+ - Gemfile
37
+ - Gemfile.lock
38
+ - LICENSE.md
39
+ - README.md
40
+ - Rakefile
41
+ - lib/mirroring_house/validations/validates_format_of_uri.rb
42
+ - lib/mirroring_house/validations/validates_format_of_uri/version.rb
43
+ - rails/init.rb
44
+ - test/cases/helper.rb
45
+ - test/cases/validations/validates_format_of_uri_test.rb
46
+ - test/config.rb
47
+ - test/models/website.rb
48
+ - validates-format-of-uri.gemspec
49
+ homepage: https://github.com/mirroring-house/validates_format_of_uri
50
+ licenses: []
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: 1.3.6
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 1.8.6
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: An ActiveModel wrapper for URI#parse
73
+ test_files: []