has_url 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Pickabee
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ = HasUrl
2
+
3
+ Adds validations on URL attributes for ActiveRecord models.
4
+ URL scheme will be checked and added before updating the database if necessary.
5
+ A raw_#{attribute} method will also be added to display the url without HTTP(S) scheme or trailing slash.
6
+
7
+ == Usage
8
+
9
+ In your AR model:
10
+ has_url :attribute, options
11
+
12
+ Options :
13
+ * valid_schemes : Array of schemes or single scheme accepted for the attribute. Default ['http', 'https']
14
+ * default_scheme : Scheme appended to the attribute if none found (supply the scheme string without '://'). Default 'http'
15
+ * message : Provide a error string or symbol (which will be translated, see ActiveRecord::Errors#generate_message). Default :invalid
16
+
17
+ == Example
18
+
19
+ class Person < ActiveRecord::Base
20
+ has_url :blog_link
21
+ end
22
+
23
+ person.blog_link = 'example.com'
24
+ person.save
25
+ person.blog_link #=> 'http://example.com/'
26
+ person.raw_blog_link #=> 'example.com'
27
+
28
+ class Person < ActiveRecord::Base
29
+ has_url [:blog_link, :website_url], :default_scheme => 'https', :valid_schemes => ['http', 'https', 'ftp']
30
+ end
31
+
32
+ == Requirements
33
+
34
+ * Addressable for URI parsing
35
+
36
+ == TODO
37
+
38
+ * Refactor using ActiveModel::Validator
39
+ * More tests
40
+ * Improve the raw_ method stripping, and have it accept an option to specify which schemes to strip (schemes array or boolean to strip all valid schemes)
41
+ * Add a shoulda macro (should_have_url)
42
+ * Check existence of the given attributes ?
43
+ * Optionally test the url validity with an HTTP request ?
44
+
45
+ == Notes and Copyright
46
+
47
+ This plugin was inspired by the {url_validation}[link:https://github.com/RISCfuture/url_validation] and {validates_url_of}[link:https://github.com/ihower/validates_url_of] plugins.
48
+
49
+ Copyright (c) 2012 Pickabee. Released under the MIT licence, see LICENSE for details.
@@ -0,0 +1,24 @@
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ task :default => :test
6
+
7
+ require 'rdoc/task'
8
+ Rake::RDocTask.new do |rdoc|
9
+ rdoc.rdoc_dir = 'rdoc'
10
+ rdoc.title = "HasUrl"
11
+ rdoc.main = 'README.rdoc'
12
+ rdoc.rdoc_files.include('README*', 'LICENSE')
13
+ rdoc.rdoc_files.include('lib/**/*.rb')
14
+ rdoc.options << '--line-numbers'
15
+ rdoc.options << '--charset=UTF-8'
16
+ end
17
+
18
+ desc 'Test the paperclip plugin.'
19
+ Rake::TestTask.new(:test) do |t|
20
+ t.libs << 'lib'
21
+ t.libs << 'test'
22
+ t.pattern = 'test/**/*_test.rb'
23
+ t.verbose = true
24
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "has_url/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "has_url"
7
+ s.version = HasUrl::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Pickabee"]
10
+ s.email = [""]
11
+ s.homepage = "https://github.com/skateinmars/has_url"
12
+ s.summary = %q{Validation on URL attributes for ActiveRecord models}
13
+ s.description = <<-EOL
14
+ Adds validations on URL attributes for ActiveRecord models.
15
+ URL scheme will be checked and added before updating the database if necessary.
16
+ A raw_attribute method will also be added to display the url without HTTP(S) scheme or trailing slash.
17
+ EOL
18
+
19
+ s.add_dependency "activerecord", '>= 3.0.0'
20
+ s.add_dependency "addressable", '>= 2.2.0'
21
+
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "sqlite3"
24
+ s.add_development_dependency "shoulda", '>= 3.0.0'
25
+
26
+ s.files = Dir["LICENSE", "README.rdoc", "Gemfile", "Rakefile", "has_url.gemspec", "{lib}/**/*.rb"]
27
+ s.test_files = Dir["{spec}/**/*.rb"]
28
+ s.rdoc_options = ["--line-numbers", "--charset=UTF-8", "--title", "HasUrl", "--main", "README.rdoc"]
29
+ s.extra_rdoc_files = %w[LICENSE]
30
+ s.require_paths = ["lib"]
31
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require 'has_url/railtie' if defined?(Rails)
@@ -0,0 +1,10 @@
1
+ module HasUrl
2
+ class Hooks # :nodoc:
3
+ def self.init
4
+ if defined?(ActiveRecord)
5
+ require 'has_url/validations'
6
+ ActiveRecord::Base.send(:extend, HasUrl::Validations)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module HasUrl
2
+ require 'rails'
3
+
4
+ class Railtie < Rails::Railtie # :nodoc:
5
+ railtie_name :has_url
6
+
7
+ initializer 'has_url.insert_into_active_record' do |app|
8
+ ActiveSupport.on_load :active_record do
9
+ require 'has_url/hooks'
10
+ HasUrl::Hooks.init
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,93 @@
1
+ require 'addressable/uri'
2
+
3
+ module HasUrl # :nodoc:
4
+ module Validations
5
+
6
+ # This allows you to specify attributes you want to define as containing
7
+ # a url. This will validate the URI and prepend a http scheme if needed.
8
+ # Provide this with a required attributes array (or a single attribute symbol) and an options hash.
9
+ #
10
+ # ==== Examples
11
+ #
12
+ # class Person < ActiveRecord::Base
13
+ # has_url :blog_link
14
+ # end
15
+ #
16
+ # class Person < ActiveRecord::Base
17
+ # has_url [:blog_link, :website_url]
18
+ # end
19
+ #
20
+ # ===== Using options
21
+ #
22
+ # class Person < ActiveRecord::Base
23
+ # has_url :blog_link, {:valid_schemes => ['http', 'https', 'ftp'], :default_scheme => 'http', :message => 'does not look like a valid url'}
24
+ # end
25
+ #
26
+ def has_url(attributes, options = {})
27
+ attributes = [attributes].flatten
28
+
29
+ options.reverse_merge!({:valid_schemes => ['http', 'https'], :default_scheme => 'http' })
30
+
31
+ raise ArgumentError, "default scheme does not match a valid scheme" unless options[:valid_schemes].include?(options[:default_scheme])
32
+
33
+ attributes.each do |attribute|
34
+ #Doesnt work, raises ActiveRecord::ConnectionNotEstablished
35
+ #raise ArgumentError, "attribute #{attribute} does not exist" if self.columns.select{|c| c.name == attribute }.empty?
36
+
37
+ default_scheme_accessor = "#{attribute}_default_scheme".to_sym
38
+ valid_schemes_accessor = "#{attribute}_valid_schemes".to_sym
39
+ cattr_accessor default_scheme_accessor
40
+ self.send("#{default_scheme_accessor}=", options[:default_scheme])
41
+ cattr_accessor valid_schemes_accessor
42
+ self.send("#{valid_schemes_accessor}=", options[:valid_schemes])
43
+
44
+ define_method( "fix_#{attribute}_url") do
45
+ value = read_attribute(attribute)
46
+ if value.blank?
47
+ value = nil
48
+ else
49
+ begin
50
+ default_scheme = self.class.send("#{attribute}_default_scheme".to_sym)
51
+ uri = Addressable::URI.heuristic_parse(value, {:scheme => default_scheme}).normalize
52
+ value = uri.to_s
53
+ rescue Addressable::URI::InvalidURIError
54
+ end
55
+ end
56
+ write_attribute( attribute, value )
57
+ end
58
+
59
+ define_method( "raw_#{attribute}") do
60
+ value = read_attribute(attribute)
61
+ if value.blank?
62
+ return nil
63
+ else
64
+ return value.sub('http://', '').sub('https://', '').sub(/\/$/, '')
65
+ end
66
+ end
67
+
68
+ before_validation "fix_#{attribute}_url".to_sym
69
+ end
70
+
71
+ validates_each attributes do |record, attr, value|
72
+ if !value.nil?
73
+ if defined?(I18n)
74
+ message = options[:message] ? options[:message] : :invalid
75
+ error_args = [attr, message, {:value => value}]
76
+ else
77
+ error_args = [attr]
78
+ error_args << options[:message] if options[:message]
79
+ end
80
+
81
+ begin
82
+ uri = Addressable::URI.heuristic_parse(value).normalize
83
+ scheme_is_valid = self.send("#{attr}_valid_schemes".to_sym).include?(uri.scheme)
84
+ record.errors.add(*error_args) unless scheme_is_valid
85
+ rescue Addressable::URI::InvalidURIError
86
+ record.errors.add(*error_args)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ end
93
+ end
@@ -0,0 +1,3 @@
1
+ module HasUrl
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_url
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pickabee
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: addressable
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.2.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: sqlite3
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: shoulda
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 3.0.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 3.0.0
94
+ description: ! " Adds validations on URL attributes for ActiveRecord models.\n URL
95
+ scheme will be checked and added before updating the database if necessary.\n A
96
+ raw_attribute method will also be added to display the url without HTTP(S) scheme
97
+ or trailing slash.\n"
98
+ email:
99
+ - ''
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files:
103
+ - LICENSE
104
+ files:
105
+ - LICENSE
106
+ - README.rdoc
107
+ - Gemfile
108
+ - Rakefile
109
+ - has_url.gemspec
110
+ - lib/has_url/validations.rb
111
+ - lib/has_url/railtie.rb
112
+ - lib/has_url/hooks.rb
113
+ - lib/has_url/version.rb
114
+ - lib/has_url.rb
115
+ homepage: https://github.com/skateinmars/has_url
116
+ licenses: []
117
+ post_install_message:
118
+ rdoc_options:
119
+ - --line-numbers
120
+ - --charset=UTF-8
121
+ - --title
122
+ - HasUrl
123
+ - --main
124
+ - README.rdoc
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 1.8.24
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Validation on URL attributes for ActiveRecord models
145
+ test_files: []