addressabler 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ## 0.0.3
1
+ ## 0.0.5
2
+ * Restored nested hash support **if Rack is installed**
3
+
4
+ ## 0.0.4
2
5
  * Updated to the latest TLD list from [Paul Dix](https://github.com/pauldix), thanks to [this unbelievably helpful user](https://github.com/flipsasser/addressabler/issues/1)
3
6
  * Updated to latest Addressable spec
4
- *
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # Addressabler
2
+
3
+ **Addressabler** extends the [Addressable::URI](https://github.com/sporkmonger/addressable) class by adding TLD parsing, domain and subdomain parsing, query modification, and restoring setting of nested hashes to query strings.
4
+
5
+ ## Install
6
+
7
+ Install using Rubygems:
8
+
9
+ gem install addressabler
10
+
11
+ Then:
12
+
13
+ require 'rubygems'
14
+ require 'addressabler'
15
+
16
+ Addressabler will automatically require `addressable/uri`.
17
+
18
+ ## Usage
19
+
20
+ ### Domain, TLD, and subdomain parsing
21
+
22
+ Use `Addressable::URI` like you normally would:
23
+
24
+ ```
25
+ @uri = Addressable::URI.parse("http://www.google.com/")
26
+ @uri.host #=> "www.google.com"
27
+ ```
28
+
29
+ Addressabler will add the following properties:
30
+
31
+ ```
32
+ @uri.tld #=> "com"
33
+ @uri.domain #=> "google"
34
+ @uri.subdomain #=> "www"
35
+ ```
36
+
37
+ You can set these values, as well:
38
+
39
+ ```
40
+ @uri.tld = "org"
41
+ @uri.host #=> "www.google.org"
42
+ @uri.domain = "amazon"
43
+ @uri.host #=> "www.amazon.org"
44
+ @uri.subdomain = "developers"
45
+ @uri.host #=> "developers.amazon.org"
46
+ ```
47
+
48
+ #### Complex TLD support (thanks to Paul Dix!)
49
+ Addressabler copies some of Paul Dix's [Domaintrix](https://github.com/pauldix/domainatrix) TLD code to support fancy TLDs, as well:
50
+
51
+ ```
52
+ @uri.host = "www.google.co.uk"
53
+ @uri.tld #=> "co.uk"
54
+ ```
55
+
56
+ ### Query interface
57
+
58
+ Addressabler adds a `query_hash` method to `Addressable::URI`s. This makes editing query strings a lot simpler, using a familiar Hash syntax:
59
+
60
+ ```
61
+ @uri.query_hash[:foo] = :bar
62
+ @uri.to_s #=> "http://www.google.co.uk/?foo=bar"
63
+ ```
64
+
65
+ #### Nested hashes in query strings
66
+
67
+ The current maintainer of Addressable, [Bob Aman](https://github.com/sporkmonger), feels rather strongly that [Rails got it wrong](https://github.com/sporkmonger/addressable/issues/77) in supporting nested hashes in query strings.
68
+
69
+ Frankly, I don't disagree with anything he has to say on the issue, but it is a problem many people have experienced.
70
+
71
+ *As such,* since Rack already supports building nested hashes "the Rails Way" (shudder), I added support for assigning nested hashes to `URI`s **only if Rack is available.** Addressabler will attempt to load `Rack::Utils` and, if it finds it, you can assign a nested hash in the `query_hash=` method like so:
72
+
73
+ ```
74
+ @uri.query_hash = {:foo => {:bar => :baz}}
75
+ @uri.to_s #=> "http://www.google.co.uk/?foo[bar]=baz"
76
+ ```
77
+
78
+ **HANDLE WITH CARE!** As [Bob explains in the discussion](https://github.com/sporkmonger/addressable/issues/77#issuecomment-8534480), there's a better alternative to nested hashes in query strings, so try that before you install this library.
79
+
80
+ That's it. Enjoy.
81
+
82
+ #### Copyright © 2013 Flip Sasser
@@ -1,5 +1,17 @@
1
1
  module Addressabler
2
2
  class Query < ::Hash
3
+ class << self
4
+ def nested_hash_support?
5
+ return @nested_hash_support if defined?(@nested_hash_support)
6
+ begin
7
+ require 'rack/utils'
8
+ @nested_hash_support = true
9
+ rescue LoadError
10
+ @nested_hash_support = false
11
+ end
12
+ end
13
+ end
14
+
3
15
  def delete(value)
4
16
  super
5
17
  update_uri
@@ -17,7 +29,38 @@ module Addressabler
17
29
 
18
30
  private
19
31
  def update_uri
20
- @uri.query_values = empty? ? nil : to_hash
32
+ if self.class.nested_hash_support?
33
+ @uri.query = Rack::Utils.build_nested_query(hash_with_string_values(self))
34
+ else
35
+ @uri.query_values = empty? ? nil : dup
36
+ end
37
+ end
38
+
39
+ def array_with_string_values(array)
40
+ array.map do |value|
41
+ case value
42
+ when Array
43
+ array_with_string_values(value)
44
+ when Hash
45
+ hash_with_string_values(Hash)
46
+ else
47
+ value.to_s
48
+ end
49
+ end
50
+ end
51
+
52
+ def hash_with_string_values(hash)
53
+ string_values = hash.map do |key, value|
54
+ case value
55
+ when Array
56
+ [key, array_with_string_values(value)]
57
+ when Hash
58
+ [key, hash_with_string_values(value)]
59
+ else
60
+ [key, value.to_s]
61
+ end
62
+ end
63
+ Hash[*string_values.flatten(1)]
21
64
  end
22
65
  end
23
66
  end
@@ -35,17 +35,11 @@ describe Addressabler do
35
35
  uri.to_s.should == "http://www.foo.bar.baz.co.uk/gjadgsg?adg=f&foo=bar"
36
36
  end
37
37
 
38
- # TODO: This breaks due to a deprection in Addressable. This test
39
- # was probably inappropriate to begin with, as it was testing something
40
- # Addressable does, and not something Addressable*r* does.
41
- #
42
- # This would be a nice feature to have anyway, but alas ... some other
43
- # time.
44
- #it "should support adding nested values to the query" do
45
- #uri = Addressable::URI.parse("http://www.amazon.ca")
46
- #uri.query_hash[:foo] = {:bar => :baz}
47
- #uri.to_s.should == "http://www.amazon.ca?foo[bar]=baz"
48
- #end
38
+ it "should support adding nested values to the query" do
39
+ uri = Addressable::URI.parse("http://www.amazon.ca")
40
+ uri.query_hash[:foo] = {:bar => "baz", :sommat => [:else, 1, true, false]}
41
+ uri.to_s.should == "http://www.amazon.ca?foo[bar]=baz&foo[sommat][]=else&foo[sommat][]=1&foo[sommat][]=true&foo[sommat][]=false"
42
+ end
49
43
 
50
44
  it "should support subdomains" do
51
45
  uri = Addressable::URI.heuristic_parse("i.am.a.subdomain.co.uk")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: addressabler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -68,14 +68,14 @@ executables: []
68
68
  extensions: []
69
69
  extra_rdoc_files:
70
70
  - LICENSE
71
- - README.markdown
71
+ - README.md
72
72
  files:
73
73
  - CHANGELOG.md
74
74
  - LICENSE
75
- - README.markdown
76
75
  - lib/addressabler.rb
77
76
  - lib/addressabler/query.rb
78
77
  - lib/tlds
78
+ - README.md
79
79
  - spec/addressabler_spec.rb
80
80
  - spec/spec_helper.rb
81
81
  - spec/uri_spec.rb
data/README.markdown DELETED
@@ -1,53 +0,0 @@
1
- Addressabler
2
- =
3
-
4
- **Addressabler** extends the Addressable::URI class by adding TLD parsing, domain and subdomain parsing, and query modification.
5
-
6
- Install
7
- ==
8
-
9
- Install using Rubygems:
10
-
11
- gem install addressabler
12
-
13
- Then:
14
-
15
- require 'rubygems'
16
- require 'addressabler'
17
-
18
- Addressabler will automatically require `addressable/uri`.
19
-
20
- Usage
21
- ==
22
-
23
- Use Addressable::URI like you normally would:
24
-
25
- @uri = Addressable::URI.parse("http://www.google.com/")
26
- @uri.host #=> "www.google.com"
27
-
28
- Addressabler will add the following properties:
29
-
30
- @uri.tld #=> "com"
31
- @uri.domain #=> "google"
32
- @uri.subdomain #=> "www"
33
-
34
- You can set these values, as well:
35
-
36
- @uri.tld = "org"
37
- @uri.host #=> "www.google.org"
38
- @uri.domain = "amazon"
39
- @uri.host #=> "www.amazon.org"
40
- @uri.subdomain = "developers"
41
- @uri.host #=> "developers.amazon.org"
42
-
43
- Addressabler copies some of Paul Dix's [Domaintrix](https://github.com/pauldix/domainatrix) TLD code to support fancy TLDs, as well:
44
-
45
- @uri.host = "www.google.co.uk"
46
- @uri.tld #=> "co.uk"
47
-
48
- Addressabler also makes editing queries a little bit easier:
49
-
50
- @uri.query_hash[:foo] = :bar
51
- @uri.to_s #=> "http://www.google.co.uk/?foo=bar"
52
-
53
- That's it. Enjoy.