furi 0.2.2 → 0.2.3
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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +19 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +7 -0
- data/README.md +30 -25
- data/Rakefile +5 -10
- data/furi.gemspec +13 -14
- data/lib/furi.rb +3 -1
- data/lib/furi/uri.rb +15 -10
- data/lib/furi/version.rb +1 -1
- metadata +17 -75
- data/spec/furi/uri_spec.rb +0 -12
- data/spec/furi_spec.rb +0 -761
- data/spec/spec_helper.rb +0 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 37ea1203ca474e34d99624eb7e7cf43935197a4cec1a0a49e110b8674f5a1cec
|
4
|
+
data.tar.gz: 5ef6f167bd64ac72f6a8b78324c871a88734f06e39faecd4e7aaee1abe5a2f0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db8b15ea5e9d25852df4be4e83a67bf60d8ed85d703fba1fa7a1ee28fbe7d2e547dc4ea182d52ef396316f92ef3634264750b4d76d0016c51c6a9afe78b19e11
|
7
|
+
data.tar.gz: 9617142f8e989e885c8bd17a874fa221b6df1f2bea1398a786e9291f4d87d9d6ae4913f8904c3273902b8c0a1d008b0ec3f0aa8918aef34d9d5538fca93a0861
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
strategy:
|
8
|
+
fail-fast: false
|
9
|
+
matrix:
|
10
|
+
ruby: [2.4, 2.5, 2.6, 2.7, 3.0]
|
11
|
+
name: Ruby ${{ matrix.ruby }}
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v2
|
15
|
+
- uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: ${{ matrix.ruby }}
|
18
|
+
bundler-cache: true
|
19
|
+
- run: bundle exec rake
|
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Furi
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/furi)
|
4
|
+
[](https://github.com/bogdan/furi/actions)
|
5
|
+
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Ffuri?ref=badge_shield)
|
6
|
+
|
3
7
|
Furi is a Friendly URI parsing library.
|
4
8
|
Furi's philosophy is to make any operation possible in ONE LINE OF CODE.
|
5
9
|
|
@@ -9,7 +13,7 @@ If there is an operation that takes more than one line of code to do with Furi,
|
|
9
13
|
|
10
14
|
Add this line to your application's Gemfile:
|
11
15
|
|
12
|
-
```ruby
|
16
|
+
``` ruby
|
13
17
|
gem 'furi'
|
14
18
|
```
|
15
19
|
|
@@ -24,11 +28,10 @@ Or install it yourself as:
|
|
24
28
|
## Usage
|
25
29
|
|
26
30
|
I'll say it again: any operation should take exacly one line of code!
|
27
|
-
Here are basic:
|
31
|
+
Here are basic:
|
28
32
|
|
29
33
|
### Utility Methods
|
30
34
|
|
31
|
-
|
32
35
|
Parsing the URI fragments:
|
33
36
|
|
34
37
|
``` ruby
|
@@ -39,31 +42,29 @@ Furi.port!("http://gusiev.com") # => 80
|
|
39
42
|
|
40
43
|
Updating the URI parts:
|
41
44
|
|
42
|
-
```
|
45
|
+
``` ruby
|
43
46
|
Furi.update("http://gusiev.com", protocol: '') # => "//gusiev.com"
|
44
|
-
Furi.update("http://gusiev.com?source=google", query: {email: "a@b.com"})
|
47
|
+
Furi.update("http://gusiev.com?source=google", query: {email: "a@b.com"})
|
45
48
|
# => "http://gusiev.com?source=google&email=a@b.com"
|
46
|
-
Furi.replace("http://gusiev.com?source=google", query: {email: "a@b.com"})
|
49
|
+
Furi.replace("http://gusiev.com?source=google", query: {email: "a@b.com"})
|
47
50
|
# => "http://gusiev.com?email=a@b.com"
|
48
51
|
|
49
52
|
Furi.defaults("http://gusiev.com", subdomain: 'www') # => "http://www.gusiev.com"
|
50
53
|
Furi.defaults("http://blog.gusiev.com", subdomain: 'www') # => "http://blog.gusiev.com"
|
51
|
-
|
52
54
|
```
|
53
55
|
|
54
56
|
Building an URI from initial parts:
|
55
57
|
|
56
58
|
``` ruby
|
57
|
-
|
58
|
-
Furi.build(protocol: '//', host: 'gusiev.com', path: '/assets/application.js')
|
59
|
+
Furi.build(protocol: '//', host: 'gusiev.com', path: '/assets/application.js')
|
59
60
|
# => "//gusiev.com/assets/application.js"
|
60
61
|
```
|
61
62
|
|
62
63
|
### Working with Object
|
63
64
|
|
64
65
|
``` ruby
|
65
|
-
uri = Furi.parse("gusiev.com")
|
66
|
-
# => #<Furi::Uri "gusiev.com">
|
66
|
+
uri = Furi.parse("gusiev.com")
|
67
|
+
# => #<Furi::Uri "gusiev.com">
|
67
68
|
|
68
69
|
uri.port # => nil
|
69
70
|
uri.port! # => 80
|
@@ -92,12 +93,12 @@ uri.merge_query(person: {email: 'a@b.com'})
|
|
92
93
|
## Reference
|
93
94
|
|
94
95
|
```
|
95
|
-
location resource
|
96
|
-
| ___|___
|
97
|
-
_______|_______ / \
|
98
|
-
/ \ / \
|
99
|
-
/ authority request \
|
100
|
-
/ __________|_________ | \
|
96
|
+
location resource
|
97
|
+
| ___|___
|
98
|
+
_______|_______ / \
|
99
|
+
/ \ / \
|
100
|
+
/ authority request \
|
101
|
+
/ __________|_________ | \
|
101
102
|
/ / \ ______|______ \
|
102
103
|
/ userinfo hostinfo / \ \
|
103
104
|
/ __|___ ___|___ / \ \
|
@@ -109,25 +110,29 @@ uri.merge_query(person: {email: 'a@b.com'})
|
|
109
110
|
\_/ \_/ \___/ \_/ \__________/\ / \_/
|
110
111
|
| | | | | \___/ |
|
111
112
|
protocol subdomain | domainzone directory | extension
|
112
|
-
| | filename |
|
113
|
-
domainname / \_____/
|
114
|
-
\___/ |
|
115
|
-
| file
|
116
|
-
domain
|
113
|
+
| | filename |
|
114
|
+
domainname / \_____/
|
115
|
+
\___/ |
|
116
|
+
| file
|
117
|
+
domain
|
117
118
|
```
|
118
119
|
|
119
|
-
|
120
120
|
Originated from [URI.js](http://medialize.github.io/URI.js/about-uris.html) parsing library.
|
121
121
|
Giving credit...
|
122
122
|
|
123
|
-
|
124
123
|
## TODO
|
125
124
|
|
126
|
-
* Improve URI.join algorithm to match the one used in
|
125
|
+
* Improve URI.join algorithm to match the one used in Addressable library
|
127
126
|
* Implement filename
|
127
|
+
* Encoding/Decoding special characters:
|
128
|
+
* path
|
129
|
+
* query
|
130
|
+
* fragment
|
128
131
|
|
129
132
|
## Contributing
|
130
133
|
|
131
134
|
Contribute in the way you want. Branch names and other bla-bla-bla do not matter.
|
132
135
|
|
136
|
+
## License
|
133
137
|
|
138
|
+
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Ffuri?ref=badge_large)
|
data/Rakefile
CHANGED
@@ -1,13 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
RSpec::Core::RakeTask.new(:spec)
|
7
|
-
rescue LoadError
|
8
|
-
end
|
9
|
-
|
10
|
-
task :default => :spec do
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rspec/core/rake_task"
|
11
5
|
|
12
|
-
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
13
7
|
|
8
|
+
task default: :spec
|
data/furi.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
require 'furi/version'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/furi/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "furi"
|
@@ -9,17 +8,17 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Bogdan Gusiev"]
|
10
9
|
spec.email = ["agresso@gmail.com"]
|
11
10
|
spec.summary = %q{Make URI processing as easy as it should be}
|
12
|
-
spec.description = %q{The
|
13
|
-
spec.homepage = ""
|
11
|
+
spec.description = %q{The philosophy of this gem is to make any URI modification or parsing operation to take only one line of code and never more}
|
12
|
+
spec.homepage = "https://github.com/bogdan/furi"
|
14
13
|
spec.license = "MIT"
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
15
15
|
|
16
|
-
spec.
|
17
|
-
spec.
|
18
|
-
spec.
|
19
|
-
spec.require_paths = ["lib"]
|
16
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
20
19
|
|
21
|
-
spec.
|
22
|
-
|
23
|
-
|
24
|
-
spec.
|
20
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
22
|
+
end
|
23
|
+
spec.require_paths = ["lib"]
|
25
24
|
end
|
data/lib/furi.rb
CHANGED
data/lib/furi/uri.rb
CHANGED
@@ -135,7 +135,7 @@ module Furi
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def hostinfo
|
138
|
-
return host unless
|
138
|
+
return host unless custom_port?
|
139
139
|
if port && !host
|
140
140
|
raise Furi::FormattingError, "can not build URI with port but without host"
|
141
141
|
end
|
@@ -178,7 +178,7 @@ module Furi
|
|
178
178
|
result << "?" << query_string
|
179
179
|
end
|
180
180
|
if anchor
|
181
|
-
result <<
|
181
|
+
result << encoded_anchor
|
182
182
|
end
|
183
183
|
result.join
|
184
184
|
end
|
@@ -420,7 +420,7 @@ module Furi
|
|
420
420
|
|
421
421
|
def resource
|
422
422
|
return nil unless request
|
423
|
-
|
423
|
+
request + encoded_anchor
|
424
424
|
end
|
425
425
|
|
426
426
|
def resource=(value)
|
@@ -483,6 +483,14 @@ module Furi
|
|
483
483
|
authority
|
484
484
|
end
|
485
485
|
|
486
|
+
def custom_port?
|
487
|
+
port && port != default_port
|
488
|
+
end
|
489
|
+
|
490
|
+
def mailto?
|
491
|
+
protocol == "mailto"
|
492
|
+
end
|
493
|
+
|
486
494
|
protected
|
487
495
|
|
488
496
|
def file_tokens
|
@@ -493,10 +501,6 @@ module Furi
|
|
493
501
|
!!@query
|
494
502
|
end
|
495
503
|
|
496
|
-
def explicit_port?
|
497
|
-
port && port != default_port
|
498
|
-
end
|
499
|
-
|
500
504
|
def parse_uri_string(string)
|
501
505
|
if string.empty?
|
502
506
|
raise Furi::FormattingError, "can not be an empty string"
|
@@ -531,7 +535,7 @@ module Furi
|
|
531
535
|
def parse_anchor_and_query(string)
|
532
536
|
string ||= ''
|
533
537
|
string, *anchor = string.split("#")
|
534
|
-
self.anchor = anchor.join("#")
|
538
|
+
self.anchor = ::URI::DEFAULT_PARSER.unescape(anchor.join("#"))
|
535
539
|
if string && string.include?("?")
|
536
540
|
string, query_string = string.split("?", 2)
|
537
541
|
self.query_tokens = query_string
|
@@ -583,8 +587,9 @@ module Furi
|
|
583
587
|
end
|
584
588
|
end
|
585
589
|
|
586
|
-
def
|
587
|
-
|
590
|
+
def encoded_anchor
|
591
|
+
return "" unless anchor
|
592
|
+
"#" + ::URI::DEFAULT_PARSER.escape(anchor)
|
588
593
|
end
|
589
594
|
end
|
590
595
|
end
|
data/lib/furi/version.rb
CHANGED
metadata
CHANGED
@@ -1,72 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: furi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdan Gusiev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.7'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.7'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '10.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '10.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry-byebug
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
description: The phylosophy of this gem is to make any URI modification or parsing
|
11
|
+
date: 2021-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: The philosophy of this gem is to make any URI modification or parsing
|
70
14
|
operation to take only one line of code and never more
|
71
15
|
email:
|
72
16
|
- agresso@gmail.com
|
@@ -74,8 +18,10 @@ executables: []
|
|
74
18
|
extensions: []
|
75
19
|
extra_rdoc_files: []
|
76
20
|
files:
|
21
|
+
- ".github/workflows/ci.yml"
|
77
22
|
- ".gitignore"
|
78
23
|
- ".rspec"
|
24
|
+
- CHANGELOG.md
|
79
25
|
- Gemfile
|
80
26
|
- LICENSE.txt
|
81
27
|
- README.md
|
@@ -86,14 +32,14 @@ files:
|
|
86
32
|
- lib/furi/uri.rb
|
87
33
|
- lib/furi/utils.rb
|
88
34
|
- lib/furi/version.rb
|
89
|
-
|
90
|
-
- spec/furi_spec.rb
|
91
|
-
- spec/spec_helper.rb
|
92
|
-
homepage: ''
|
35
|
+
homepage: https://github.com/bogdan/furi
|
93
36
|
licenses:
|
94
37
|
- MIT
|
95
|
-
metadata:
|
96
|
-
|
38
|
+
metadata:
|
39
|
+
allowed_push_host: https://rubygems.org
|
40
|
+
homepage_uri: https://github.com/bogdan/furi
|
41
|
+
source_code_uri: https://github.com/bogdan/furi
|
42
|
+
post_install_message:
|
97
43
|
rdoc_options: []
|
98
44
|
require_paths:
|
99
45
|
- lib
|
@@ -101,19 +47,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
47
|
requirements:
|
102
48
|
- - ">="
|
103
49
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
50
|
+
version: 2.4.0
|
105
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
52
|
requirements:
|
107
53
|
- - ">="
|
108
54
|
- !ruby/object:Gem::Version
|
109
55
|
version: '0'
|
110
56
|
requirements: []
|
111
|
-
|
112
|
-
|
113
|
-
signing_key:
|
57
|
+
rubygems_version: 3.2.0
|
58
|
+
signing_key:
|
114
59
|
specification_version: 4
|
115
60
|
summary: Make URI processing as easy as it should be
|
116
|
-
test_files:
|
117
|
-
- spec/furi/uri_spec.rb
|
118
|
-
- spec/furi_spec.rb
|
119
|
-
- spec/spec_helper.rb
|
61
|
+
test_files: []
|