earl 0.2.0 → 0.3.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/lib/earl.rb +13 -8
- data/lib/earl/email_assembler.rb +11 -0
- data/lib/earl/email_entity.rb +27 -0
- data/lib/earl/email_parser.tt +58 -0
- data/lib/earl/entity_base.rb +37 -0
- data/lib/earl/hash_inquirer.rb +1 -1
- data/lib/earl/url_assembler.rb +2 -3
- data/lib/earl/url_entity.rb +23 -0
- data/lib/earl/url_parser.tt +1 -1
- data/lib/earl/version.rb +1 -1
- data/spec/earl/earl_spec.rb +17 -0
- data/spec/earl/email_entity_spec.rb +31 -0
- data/spec/earl/email_parser_spec.rb +29 -0
- data/spec/earl/entity_base_spec.rb +39 -0
- data/spec/earl/hash_inquirer_spec.rb +1 -1
- data/spec/earl/string_inquirer_spec.rb +0 -8
- data/spec/earl/url_entity_spec.rb +45 -0
- data/spec/earl/url_parser_spec.rb +2 -2
- data/spec/spec_helper.rb +25 -0
- metadata +32 -14
- data/lib/earl/url.rb +0 -35
- data/spec/earl/parse_spec.rb +0 -10
- data/spec/earl/parts_spec.rb +0 -90
- data/spec/earl/url_spec.rb +0 -49
data/lib/earl.rb
CHANGED
@@ -1,19 +1,24 @@
|
|
1
|
-
require 'treetop'
|
2
1
|
require 'earl/version'
|
3
|
-
require 'earl/url_parser'
|
4
2
|
|
5
3
|
module Earl
|
6
|
-
autoload :
|
7
|
-
autoload :
|
8
|
-
autoload :
|
4
|
+
autoload :EntityBase, 'earl/entity_base'
|
5
|
+
autoload :URLEntity, 'earl/url_entity'
|
6
|
+
autoload :URLAssembler, 'earl/url_assembler'
|
7
|
+
autoload :EmailEntity, 'earl/email_entity'
|
8
|
+
autoload :EmailAssembler, 'earl/email_assembler'
|
9
|
+
autoload :HashInquirer, 'earl/hash_inquirer'
|
9
10
|
autoload :StringInquirer, 'earl/string_inquirer'
|
10
11
|
|
11
12
|
class << self
|
12
|
-
def
|
13
|
-
Earl::
|
13
|
+
def URL( source )
|
14
|
+
Earl::URLEntity.new source
|
15
|
+
end
|
16
|
+
def Email( source )
|
17
|
+
Earl::EmailEntity.new source
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
17
|
-
class EarlError
|
21
|
+
class EarlError < StandardError; end
|
18
22
|
class InvalidURLError < EarlError; end
|
23
|
+
class SubclassError < EarlError; end
|
19
24
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'treetop'
|
2
|
+
require 'earl/email_parser'
|
3
|
+
|
4
|
+
module Earl
|
5
|
+
class EmailEntity < EntityBase
|
6
|
+
|
7
|
+
part_accessor :contact
|
8
|
+
|
9
|
+
part_accessor :username do |value|
|
10
|
+
raise InvalidURLError if value.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
part_accessor :domain do |value|
|
14
|
+
raise InvalidURLError if value.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def parser
|
20
|
+
@parser ||= EmailParser.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def assembler
|
24
|
+
@assembler ||= EmailAssembler.new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Earl
|
2
|
+
grammar Email
|
3
|
+
|
4
|
+
rule program
|
5
|
+
whitespace v:( email ) whitespace {
|
6
|
+
def resolve
|
7
|
+
{ }.merge v.resolve
|
8
|
+
end
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
rule whitespace
|
13
|
+
[\s]*
|
14
|
+
end
|
15
|
+
|
16
|
+
rule email
|
17
|
+
username '@' domain whitespace contact {
|
18
|
+
def resolve
|
19
|
+
username.resolve.merge domain.resolve.merge contact.resolve
|
20
|
+
end
|
21
|
+
}
|
22
|
+
/
|
23
|
+
username '@' domain {
|
24
|
+
def resolve
|
25
|
+
username.resolve.merge domain.resolve
|
26
|
+
end
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
rule username
|
31
|
+
[^@\s]+ {
|
32
|
+
def resolve
|
33
|
+
{ :username => text_value }
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule domain
|
39
|
+
characters '.' characters {
|
40
|
+
def resolve
|
41
|
+
{ :domain => text_value }
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
rule contact
|
47
|
+
'<' [^>]+ '>' {
|
48
|
+
def resolve
|
49
|
+
{ :contact => elements[ 1 ].text_value }
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
rule characters
|
55
|
+
[a-zA-Z0-9]+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Earl
|
2
|
+
class EntityBase < HashInquirer
|
3
|
+
def initialize( source )
|
4
|
+
super parser.parse( source ).resolve rescue raise InvalidURLError
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_s
|
8
|
+
assembler.assemble self
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.part_accessor( *parts, &block )
|
12
|
+
parts.each do |part|
|
13
|
+
define_method part do
|
14
|
+
if self[ part ].is_a? String
|
15
|
+
StringInquirer.new self[ part ]
|
16
|
+
else
|
17
|
+
self[ part ]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
define_method :"#{part}=" do |value|
|
21
|
+
self[ part ] = value
|
22
|
+
yield value if block_given?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def parser
|
30
|
+
raise SubclassError
|
31
|
+
end
|
32
|
+
|
33
|
+
def assembler
|
34
|
+
raise SubclassError
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/earl/hash_inquirer.rb
CHANGED
data/lib/earl/url_assembler.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
module Earl
|
2
|
-
class
|
2
|
+
class URLAssembler
|
3
3
|
|
4
4
|
def assemble( parts={} )
|
5
5
|
''.tap do |url|
|
6
6
|
url << ( parts[ :scheme ] + '://' ) if parts[ :scheme ]
|
7
7
|
url << ( parts[ :subdomain ] + '.' ) if parts[ :subdomain ]
|
8
8
|
url << ( parts[ :host ] ) if parts[ :host ]
|
9
|
-
url << ( ':' + parts[ :port ]
|
9
|
+
url << ( ':' + parts[ :port ].to_s ) if parts[ :port ]
|
10
10
|
url << ( '/' + parts[ :path ] ) if parts[ :path ]
|
11
11
|
url << ( '?' + parts[ :search ] ) if parts[ :search ]
|
12
|
-
url
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'treetop'
|
2
|
+
require 'earl/url_parser'
|
3
|
+
|
4
|
+
module Earl
|
5
|
+
class URLEntity < EntityBase
|
6
|
+
|
7
|
+
part_accessor :scheme, :subdomain, :port, :path, :search
|
8
|
+
|
9
|
+
part_accessor :host do |value|
|
10
|
+
raise InvalidURLError if value.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def parser
|
16
|
+
@parser ||= URLParser.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def assembler
|
20
|
+
@assembler ||= URLAssembler.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/earl/url_parser.tt
CHANGED
data/lib/earl/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Earl do
|
4
|
+
subject { Earl }
|
5
|
+
|
6
|
+
it { should respond_to( :URL ) }
|
7
|
+
describe '#URL' do
|
8
|
+
subject { Earl::URL( 'http://foo.com' ) }
|
9
|
+
it { should be_kind_of( Earl::URLEntity ) }
|
10
|
+
end
|
11
|
+
|
12
|
+
it { should respond_to( :Email ) }
|
13
|
+
describe '#Email' do
|
14
|
+
subject { Earl::Email( 'foo@bar.com' ) }
|
15
|
+
it { should be_kind_of( Earl::EmailEntity ) }
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Earl::EmailEntity do
|
4
|
+
subject { Earl::EmailEntity }
|
5
|
+
|
6
|
+
# username
|
7
|
+
|
8
|
+
it { should produce( 'foo@bar.com' ).from( 'baz@bar.com' ).when_given( :username => 'foo' ) }
|
9
|
+
it 'must have a username when parsing an email' do
|
10
|
+
expect { Earl::Email( '@bar.com' ) }.to raise_error( Earl::InvalidURLError )
|
11
|
+
end
|
12
|
+
it 'wont let you set the username to nil' do
|
13
|
+
expect { Earl::Email( 'foo@bar.com' ).username = nil }.to raise_error( Earl::InvalidURLError )
|
14
|
+
end
|
15
|
+
|
16
|
+
# domain
|
17
|
+
|
18
|
+
it { should produce( 'foo@bar.com' ).from( 'foo@baz.com' ).when_given( :domain => 'bar.com' ) }
|
19
|
+
it 'must have a domain when parsing an email' do
|
20
|
+
expect { Earl::Email( 'foo@' ) }.to raise_error( Earl::InvalidURLError )
|
21
|
+
end
|
22
|
+
it 'wont let you set the domain to nil' do
|
23
|
+
expect { Earl::Email( 'foo@bar.com' ).domain = nil }.to raise_error( Earl::InvalidURLError )
|
24
|
+
end
|
25
|
+
|
26
|
+
# contact
|
27
|
+
|
28
|
+
it { should produce( 'foo@bar.com <Woot!>' ).from( 'foo@bar.com <Foo Bar>' ).when_given( :contact => 'Woot!' ) }
|
29
|
+
it { should produce( 'foo@bar.com <Woot!>' ).from( 'foo@bar.com' ).when_given( :contact => 'Woot!' ) }
|
30
|
+
it { should produce( 'foo@bar.com' ).from( 'foo@bar.com <Woot!>' ).when_given( :contact => nil ) }
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Earl do
|
4
|
+
let( :parser ){ Earl::EmailParser.new }
|
5
|
+
let( :assembler ){ Earl::EmailAssembler.new }
|
6
|
+
|
7
|
+
[
|
8
|
+
[ 'foo@bar.com', {
|
9
|
+
:username => 'foo',
|
10
|
+
:domain => 'bar.com'
|
11
|
+
} ],
|
12
|
+
[ 'foo.bar@baz.com', {
|
13
|
+
:username => 'foo.bar',
|
14
|
+
:domain => 'baz.com'
|
15
|
+
} ],
|
16
|
+
[ 'foo.bar@baz.com <Foo Bar>', {
|
17
|
+
:username => 'foo.bar',
|
18
|
+
:domain => 'baz.com',
|
19
|
+
:contact => 'Foo Bar'
|
20
|
+
} ]
|
21
|
+
].each do |string, parts|
|
22
|
+
it "should correctly parse the email parts for #{string}" do
|
23
|
+
parser.parse( string ).resolve.should eql( parts )
|
24
|
+
end
|
25
|
+
it "should correctly assemble the email parts to #{string}" do
|
26
|
+
assembler.assemble( parts ).should eql( string )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Earl::EntityBase do
|
4
|
+
|
5
|
+
describe 'the entity dsl' do
|
6
|
+
subject { Class.new( Earl::EntityBase ) do
|
7
|
+
def initialize; end # so we don't invoke our parser
|
8
|
+
|
9
|
+
part_accessor :foo, :bar
|
10
|
+
|
11
|
+
part_accessor :baz do |value|
|
12
|
+
raise EarlError if value == 'woot!'
|
13
|
+
end
|
14
|
+
end.new }
|
15
|
+
|
16
|
+
it { should be_kind_of( Earl::HashInquirer ) }
|
17
|
+
|
18
|
+
[ :foo, :foo=, :bar, :bar=, :baz, :baz= ].each do |method|
|
19
|
+
it { should respond_to( method ) }
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should define setters/getters' do
|
23
|
+
subject.foo = 'foo!'
|
24
|
+
subject.foo.should eq( 'foo!' )
|
25
|
+
subject[ :foo ].should eq( 'foo!' )
|
26
|
+
subject.foo?.should eq( true )
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should call the block if given' do
|
30
|
+
expect { subject.baz = 'baz!' }.not_to raise_error
|
31
|
+
expect { subject.baz = 'woot!' }.to raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should return a string inquirer for string attributes' do
|
35
|
+
subject.foo = 'sup'
|
36
|
+
subject.foo.kind_of?( Earl::StringInquirer ).should == true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -7,11 +7,3 @@ describe Earl::StringInquirer do
|
|
7
7
|
its( :foo? ){ should be_true }
|
8
8
|
its( :bar? ){ should be_false }
|
9
9
|
end
|
10
|
-
|
11
|
-
describe Earl::URL do
|
12
|
-
subject { Earl::URL.new 'http://www.foo.com' }
|
13
|
-
|
14
|
-
its( :scheme ){ should be_a( Earl::StringInquirer ) }
|
15
|
-
its( :subdomain ){ should be_a( Earl::StringInquirer ) }
|
16
|
-
its( :host ){ should be_a( Earl::StringInquirer ) }
|
17
|
-
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Earl::URLEntity do
|
4
|
+
subject { Earl::URLEntity }
|
5
|
+
|
6
|
+
# scheme
|
7
|
+
|
8
|
+
it { should produce( 'https://foo.com' ).from( 'http://foo.com' ).when_given( :scheme => 'https' ) }
|
9
|
+
it { should produce( 'http://foo.com' ).from( 'foo.com' ).when_given( :scheme => 'http' ) }
|
10
|
+
it { should produce( 'foo.com' ).from( 'http://foo.com' ).when_given( :scheme => nil ) }
|
11
|
+
|
12
|
+
# subdomain
|
13
|
+
|
14
|
+
it { should produce( 'baz.bar.com' ).from( 'foo.bar.com' ).when_given( :subdomain => 'baz' ) }
|
15
|
+
it { should produce( 'bar.foo.com' ).from( 'foo.com' ).when_given( :subdomain => 'bar' ) }
|
16
|
+
it { should produce( 'bar.com' ).from( 'foo.bar.com' ).when_given( :subdomain => nil ) }
|
17
|
+
|
18
|
+
# port
|
19
|
+
|
20
|
+
it { should produce( 'foo.com:4567' ).from( 'foo.com:80' ).when_given( :port => 4567 ) }
|
21
|
+
it { should produce( 'foo.com:4567' ).from( 'foo.com' ).when_given( :port => 4567 ) }
|
22
|
+
it { should produce( 'foo.com' ).from( 'foo.com:4567' ).when_given( :port => nil ) }
|
23
|
+
|
24
|
+
# path
|
25
|
+
|
26
|
+
it { should produce( 'foo.com/bar' ).from( 'foo.com/baz' ).when_given( :path => 'bar' ) }
|
27
|
+
it { should produce( 'foo.com/bar' ).from( 'foo.com' ).when_given( :path => 'bar' ) }
|
28
|
+
it { should produce( 'foo.com' ).from( 'foo.com/bar' ).when_given( :path => nil ) }
|
29
|
+
|
30
|
+
# search
|
31
|
+
|
32
|
+
it { should produce( 'foo.com?bar=asdf' ).from( 'foo.com?bar=baz' ).when_given( :search => 'bar=asdf' ) }
|
33
|
+
it { should produce( 'foo.com?bar=asdf' ).from( 'foo.com' ).when_given( :search => 'bar=asdf' ) }
|
34
|
+
it { should produce( 'foo.com' ).from( 'foo.com?bar=asdf' ).when_given( :search => nil ) }
|
35
|
+
|
36
|
+
# host
|
37
|
+
|
38
|
+
it { should produce( 'www.foo.edu' ).from( 'www.foo.com' ).when_given( :host => 'foo.edu' ) }
|
39
|
+
it 'must have a host when parsing a url' do
|
40
|
+
expect { Earl::URL( 'http://' ) }.to raise_error( Earl::InvalidURLError )
|
41
|
+
end
|
42
|
+
it 'wont let you set the host to nil' do
|
43
|
+
expect { Earl::URL( 'www.foo.com' ).host = nil }.to raise_error( Earl::InvalidURLError )
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,3 +7,28 @@ RSpec.configure do |config|
|
|
7
7
|
# Change the formatter
|
8
8
|
config.formatter = :documentation
|
9
9
|
end
|
10
|
+
|
11
|
+
# Custom entity manipulation matcher
|
12
|
+
RSpec::Matchers.define :produce do |expected|
|
13
|
+
|
14
|
+
match do |entity_class|
|
15
|
+
entity = entity_class.new @start
|
16
|
+
@changes.each do |key, value|
|
17
|
+
entity.send :"#{key}=", value
|
18
|
+
end
|
19
|
+
@actual = entity.to_s
|
20
|
+
@actual == expected
|
21
|
+
end
|
22
|
+
|
23
|
+
failure_message_for_should do |entity|
|
24
|
+
%Q{expected that "#{@start}" would become "#{expected}" when given #{@changes}, but was "#{@actual}"}
|
25
|
+
end
|
26
|
+
|
27
|
+
chain :from do |start|
|
28
|
+
@start = start
|
29
|
+
end
|
30
|
+
|
31
|
+
chain :when_given do |changes|
|
32
|
+
@changes = changes
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: earl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: treetop
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 1.4.10
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.4.10
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,7 +37,12 @@ dependencies:
|
|
32
37
|
version: 2.9.0
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.9.0
|
36
46
|
description: What URI wishes it could look like
|
37
47
|
email:
|
38
48
|
- jeremy.ruppel@gmail.com
|
@@ -48,18 +58,24 @@ files:
|
|
48
58
|
- Rakefile
|
49
59
|
- earl.gemspec
|
50
60
|
- lib/earl.rb
|
61
|
+
- lib/earl/email_assembler.rb
|
62
|
+
- lib/earl/email_entity.rb
|
63
|
+
- lib/earl/email_parser.tt
|
64
|
+
- lib/earl/entity_base.rb
|
51
65
|
- lib/earl/hash_inquirer.rb
|
52
66
|
- lib/earl/string_inquirer.rb
|
53
|
-
- lib/earl/url.rb
|
54
67
|
- lib/earl/url_assembler.rb
|
68
|
+
- lib/earl/url_entity.rb
|
55
69
|
- lib/earl/url_parser.tt
|
56
70
|
- lib/earl/version.rb
|
71
|
+
- spec/earl/earl_spec.rb
|
72
|
+
- spec/earl/email_entity_spec.rb
|
73
|
+
- spec/earl/email_parser_spec.rb
|
74
|
+
- spec/earl/entity_base_spec.rb
|
57
75
|
- spec/earl/hash_inquirer_spec.rb
|
58
|
-
- spec/earl/parse_spec.rb
|
59
|
-
- spec/earl/parts_spec.rb
|
60
76
|
- spec/earl/string_inquirer_spec.rb
|
77
|
+
- spec/earl/url_entity_spec.rb
|
61
78
|
- spec/earl/url_parser_spec.rb
|
62
|
-
- spec/earl/url_spec.rb
|
63
79
|
- spec/spec_helper.rb
|
64
80
|
homepage: https://github.com/remind101/earl
|
65
81
|
licenses: []
|
@@ -81,15 +97,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
97
|
version: '0'
|
82
98
|
requirements: []
|
83
99
|
rubyforge_project:
|
84
|
-
rubygems_version: 1.8.
|
100
|
+
rubygems_version: 1.8.19
|
85
101
|
signing_key:
|
86
102
|
specification_version: 3
|
87
103
|
summary: What URI wishes it could look like
|
88
104
|
test_files:
|
105
|
+
- spec/earl/earl_spec.rb
|
106
|
+
- spec/earl/email_entity_spec.rb
|
107
|
+
- spec/earl/email_parser_spec.rb
|
108
|
+
- spec/earl/entity_base_spec.rb
|
89
109
|
- spec/earl/hash_inquirer_spec.rb
|
90
|
-
- spec/earl/parse_spec.rb
|
91
|
-
- spec/earl/parts_spec.rb
|
92
110
|
- spec/earl/string_inquirer_spec.rb
|
111
|
+
- spec/earl/url_entity_spec.rb
|
93
112
|
- spec/earl/url_parser_spec.rb
|
94
|
-
- spec/earl/url_spec.rb
|
95
113
|
- spec/spec_helper.rb
|
data/lib/earl/url.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Earl
|
2
|
-
class URL < HashInquirer
|
3
|
-
def initialize( source )
|
4
|
-
super parser.parse( source ).resolve rescue raise InvalidURLError
|
5
|
-
end
|
6
|
-
|
7
|
-
%w| scheme subdomain host port path search |.each do |part|
|
8
|
-
define_method :"#{part}" do
|
9
|
-
if self[ part.to_sym ].is_a? String
|
10
|
-
StringInquirer.new self[ part.to_sym ]
|
11
|
-
else
|
12
|
-
self[ part.to_sym ]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
define_method :"#{part}=" do |value|
|
16
|
-
raise InvalidURLError if part.to_sym == :host && value == nil
|
17
|
-
self[ part.to_sym ] = value
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
assembler.assemble self
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def parser
|
28
|
-
@parser ||= UrlParser.new
|
29
|
-
end
|
30
|
-
|
31
|
-
def assembler
|
32
|
-
@assembler ||= UrlAssembler.new
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/spec/earl/parse_spec.rb
DELETED
data/spec/earl/parts_spec.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Earl::URL do
|
4
|
-
|
5
|
-
describe '#scheme' do
|
6
|
-
context 'when provided' do
|
7
|
-
subject { Earl::URL.new 'http://www.foo.com' }
|
8
|
-
its( :scheme ){ should eq( 'http' ) }
|
9
|
-
its( :scheme? ){ should be_true }
|
10
|
-
|
11
|
-
it 'should be settable' do
|
12
|
-
subject.scheme = 'https'
|
13
|
-
subject.scheme.should eq( 'https' )
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when not provided' do
|
18
|
-
subject { Earl::URL.new 'www.foo.com' }
|
19
|
-
its( :scheme ){ should eq( nil ) }
|
20
|
-
its( :scheme? ){ should be_false }
|
21
|
-
|
22
|
-
it 'should be settable' do
|
23
|
-
subject.scheme = 'https'
|
24
|
-
subject.scheme.should eq( 'https' )
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#domain' do
|
30
|
-
pending
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#subdomain' do
|
34
|
-
context 'when provided' do
|
35
|
-
subject { Earl::URL.new 'http://www.foo.com' }
|
36
|
-
its( :subdomain ){ should eq( 'www' ) }
|
37
|
-
its( :subdomain? ){ should be_true }
|
38
|
-
|
39
|
-
it 'should be settable' do
|
40
|
-
subject.subdomain = 'secure'
|
41
|
-
subject.subdomain.should eq( 'secure' )
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'when not provided' do
|
46
|
-
subject { Earl::URL.new 'foo.com' }
|
47
|
-
its( :subdomain ){ should eq( nil ) }
|
48
|
-
its( :subdomain? ){ should be_false }
|
49
|
-
|
50
|
-
it 'should be settable' do
|
51
|
-
subject.subdomain = 'secure'
|
52
|
-
subject.subdomain.should eq( 'secure' )
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe '#host' do
|
58
|
-
context 'when provided' do
|
59
|
-
subject { Earl::URL.new 'http://www.foo.com' }
|
60
|
-
its( :host ){ should eq( 'foo.com' ) }
|
61
|
-
its( :host? ){ should be_true }
|
62
|
-
|
63
|
-
it 'should be settable' do
|
64
|
-
subject.host = 'bar.com'
|
65
|
-
subject.host.should eq( 'bar.com' )
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'when not provided' do
|
70
|
-
it 'should raise an error' do
|
71
|
-
expect { Earl::URL.new( 'http://' ).host }.to raise_error( Earl::InvalidURLError )
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe '#path' do
|
77
|
-
context 'when provided' do
|
78
|
-
subject { Earl::URL.new 'http://www.foo.com/bar' }
|
79
|
-
its( :path ){ should eq( 'bar' ) }
|
80
|
-
its( :path? ){ should be_true }
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'when not provided' do
|
84
|
-
subject { Earl::URL.new 'http://www.foo.com' }
|
85
|
-
|
86
|
-
its( :path ){ should eq( nil ) }
|
87
|
-
its( :path? ){ should be_false }
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
data/spec/earl/url_spec.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Earl::URL do
|
4
|
-
|
5
|
-
it 'should be able to change the scheme' do
|
6
|
-
url = Earl::URL.new 'http://foo.com'
|
7
|
-
url.scheme = 'https'
|
8
|
-
url.to_s.should eq( 'https://foo.com' )
|
9
|
-
end
|
10
|
-
it 'should be able to add a scheme' do
|
11
|
-
url = Earl::URL.new 'foo.com'
|
12
|
-
url.scheme = 'http'
|
13
|
-
url.to_s.should eq( 'http://foo.com' )
|
14
|
-
end
|
15
|
-
it 'should be able to remove the scheme' do
|
16
|
-
url = Earl::URL.new 'http://foo.com'
|
17
|
-
url.scheme = nil
|
18
|
-
url.to_s.should eq( 'foo.com' )
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should be able to change the subdomain' do
|
22
|
-
url = Earl::URL.new 'foo.bar.com'
|
23
|
-
url.subdomain = 'baz'
|
24
|
-
url.to_s.should eq( 'baz.bar.com' )
|
25
|
-
end
|
26
|
-
it 'should be able to add a subdomain' do
|
27
|
-
url = Earl::URL.new 'foo.com'
|
28
|
-
url.subdomain = 'bar'
|
29
|
-
url.to_s.should eq( 'bar.foo.com' )
|
30
|
-
end
|
31
|
-
it 'should be able to remove the subdomain' do
|
32
|
-
url = Earl::URL.new 'foo.bar.com'
|
33
|
-
url.subdomain = nil
|
34
|
-
url.to_s.should eq( 'bar.com' )
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should be able to change the host' do
|
38
|
-
url = Earl::URL.new 'www.foo.com'
|
39
|
-
url.host = 'foo.edu'
|
40
|
-
url.to_s.should eq( 'www.foo.edu' )
|
41
|
-
end
|
42
|
-
it 'should not be able to add a host' do
|
43
|
-
expect { url = Earl::URL.new 'http://' }.to raise_error( Earl::InvalidURLError )
|
44
|
-
end
|
45
|
-
it 'should not be able to remove a host' do
|
46
|
-
url = Earl::URL.new 'http://foo.com'
|
47
|
-
expect { url.host = nil }.to raise_error( Earl::InvalidURLError )
|
48
|
-
end
|
49
|
-
end
|