Class: PublicSuffix::Rule::Base Abstract
- Inherits:
-
Object
- Object
- PublicSuffix::Rule::Base
- Defined in:
- lib/public_suffix/rule.rb
Overview
Abstract rule class
This represent the base class for a Rule definition in the Public Suffix List.
This is intended to be an Abstract class and you shouldn’t create a direct instance. The only purpose of this class is to expose a common interface for all the available subclasses.
## Properties
A rule is composed by 4 properties:
value - A normalized version of the rule name.
The normalization process depends on rule tpe.
Here’s an example
PublicSuffix::Rule.factory("*.google.com")
#<PublicSuffix::Rule::Wildcard:0x1015c14b0
@value="google.com"
>
## Rule Creation
The best way to create a new rule is passing the rule name to the PublicSuffix::Rule.factory
method.
PublicSuffix::Rule.factory("com")
# => PublicSuffix::Rule::Normal
PublicSuffix::Rule.factory("*.com")
# => PublicSuffix::Rule::Wildcard
This method will detect the rule type and create an instance from the proper rule class.
## Rule Usage
A rule describes the composition of a domain name and explains how to tokenize the name into tld, sld and trd.
To use a rule, you first need to be sure the name you want to tokenize can be handled by the current rule. You can use the #match?
method.
rule = PublicSuffix::Rule.factory("com")
rule.match?("google.com")
# => true
rule.match?("google.com")
# => false
Rule order is significant. A name can match more than one rule. See the Public Suffix Documentation to learn more about rule priority.
When you have the right rule, you can use it to tokenize the domain name.
rule = PublicSuffix::Rule.factory("com")
rule.decompose("google.com")
# => ["google", "com"]
rule.decompose("www.google.com")
# => ["www.google", "com"]
Instance Attribute Summary collapse
-
#private ⇒ Boolean
readonly
True if the rule is a private domain.
-
#value ⇒ String
readonly
The rule definition.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
(also: #eql?)
Checks whether this rule is equal to
other
. - #decompose ⇒ Array<String, nil> abstract
-
#initialize(value, private: false) ⇒ Base
constructor
Initializes a new rule with name and value.
- #length ⇒ Object abstract
-
#match?(name) ⇒ Boolean
Checks if this rule matches
name
. - #parts ⇒ Object abstract
Constructor Details
#initialize(value, private: false) ⇒ Base
Initializes a new rule with name and value. If value is nil
, name also becomes the value for this rule.
110 111 112 113 |
# File 'lib/public_suffix/rule.rb', line 110 def initialize(value, private: false) @value = value.to_s @private = private end |
Instance Attribute Details
#private ⇒ Boolean (readonly)
Returns true if the rule is a private domain.
103 104 105 |
# File 'lib/public_suffix/rule.rb', line 103 def private @private end |
#value ⇒ String (readonly)
Returns the rule definition.
100 101 102 |
# File 'lib/public_suffix/rule.rb', line 100 def value @value end |
Instance Method Details
#==(other) ⇒ Boolean Also known as: eql?
Checks whether this rule is equal to other
.
121 122 123 |
# File 'lib/public_suffix/rule.rb', line 121 def ==(other) equal?(other) || (self.class == other.class && value == other.value) end |
#decompose ⇒ Array<String, nil>
169 170 171 |
# File 'lib/public_suffix/rule.rb', line 169 def decompose(*) raise NotImplementedError end |
#length ⇒ Object
162 163 164 |
# File 'lib/public_suffix/rule.rb', line 162 def length raise NotImplementedError end |
#match?(name) ⇒ Boolean
Checks if this rule matches name
.
A domain name is said to match a rule if and only if all of the following conditions are met:
-
When the domain and rule are split into corresponding labels, that the domain contains as many or more labels than the rule.
-
Beginning with the right-most labels of both the domain and the rule, and continuing for all labels in the rule, one finds that for every pair, either they are identical, or that the label from the rule is “*”.
147 148 149 150 151 152 153 154 |
# File 'lib/public_suffix/rule.rb', line 147 def match?(name) # Note: it works because of the assumption there are no # rules like foo.*.com. If the assumption is incorrect, # we need to properly walk the input and skip parts according # to wildcard component. diff = name.chomp(value) diff.empty? || diff[-1] == "." end |
#parts ⇒ Object
157 158 159 |
# File 'lib/public_suffix/rule.rb', line 157 def parts raise NotImplementedError end |