zooplankton 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +12 -1
- data/Appraisals +7 -0
- data/CHANGES.md +5 -0
- data/Gemfile +2 -0
- data/README.md +14 -0
- data/Rakefile +2 -0
- data/gemfiles/rails4.gemfile +8 -0
- data/gemfiles/rails5.gemfile +8 -0
- data/lib/zooplankton.rb +6 -79
- data/lib/zooplankton/parser.rb +83 -0
- data/lib/zooplankton/resolver.rb +39 -0
- data/lib/zooplankton/version.rb +1 -1
- data/spec/zooplankton_spec.rb +8 -0
- data/zooplankton.gemspec +1 -1
- metadata +16 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41a78b4848286bffd070b3dfa475cc20a46315df
|
4
|
+
data.tar.gz: 6ce1b3626fa6f4a0cd21d0c260947fa7ef023e46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f3a722e1590fbb1c536e91523d7811ce24ef3cbb3efe2784371db35890160d648ac02bd6c58a0ce9c4ecb8810aed349bfe1239d5485d6f7cb3077a2198d5dca
|
7
|
+
data.tar.gz: 2df979c72e073df641945139a5ca12e4b777e1344c56b6dc4afe640f7cf4873c6ac92cc1972c7931608d262295e59cc09289821837024da1bb96e4cac02556de
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- 2.0.0
|
4
|
-
- 2.
|
4
|
+
- 2.2.2
|
5
|
+
gemfile:
|
6
|
+
- gemfiles/rails4.gemfile
|
7
|
+
- gemfiles/rails5.gemfile
|
8
|
+
matrix:
|
9
|
+
fast_finish: true
|
10
|
+
exclude:
|
11
|
+
- gemfile: gemfiles/rails4.gemfile
|
12
|
+
rvm: 2.2.2
|
13
|
+
- gemfile: gemfiles/rails5.gemfile
|
14
|
+
rvm: 2.0.0
|
15
|
+
cache: bundler
|
data/Appraisals
ADDED
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -126,6 +126,20 @@ like `"name?middle=dale{?first,last}"` which would end up as
|
|
126
126
|
`"name?middle=dale&first=ben&last=hamill"`. Zooplankton will use this when it's
|
127
127
|
appropriate for building query strings.
|
128
128
|
|
129
|
+
## Testing
|
130
|
+
|
131
|
+
```
|
132
|
+
rake spec
|
133
|
+
```
|
134
|
+
|
135
|
+
This library uses the [Appraisal](https://github.com/thoughtbot/appraisal) gem to test against multiple versions of Rails. You can run them individually with
|
136
|
+
|
137
|
+
```
|
138
|
+
appraisal rails4 rake spec
|
139
|
+
appraisal rails5 rake spec
|
140
|
+
```
|
141
|
+
|
142
|
+
Look in `./Appraisals` for available Rails versions.
|
129
143
|
|
130
144
|
## Contributing
|
131
145
|
|
data/Rakefile
CHANGED
data/lib/zooplankton.rb
CHANGED
@@ -1,89 +1,16 @@
|
|
1
|
-
require "rails"
|
2
|
-
|
3
1
|
require "zooplankton/version"
|
2
|
+
require "zooplankton/parser"
|
4
3
|
|
5
4
|
module Zooplankton
|
6
5
|
class << self
|
7
|
-
|
8
|
-
build_template(:path, helper_name, *parse_params(query_params, supplied_params))
|
9
|
-
end
|
10
|
-
|
11
|
-
def url_template_for(helper_name, query_params={}, supplied_params=nil)
|
12
|
-
build_template(:url, helper_name, *parse_params(query_params, supplied_params))
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def parse_params(*args)
|
18
|
-
if args.first.respond_to?(:to_h) && !args.first.is_a?(Array)
|
19
|
-
query_params = []
|
20
|
-
supplied_params = args.first.to_h
|
21
|
-
else
|
22
|
-
query_params = Array(args.shift)
|
23
|
-
supplied_params = args.first || {}
|
24
|
-
end
|
25
|
-
|
26
|
-
[query_params, supplied_params]
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_template(type, helper_name, query_params, supplied_params)
|
30
|
-
return unless named_routes.names.include?(helper_name)
|
31
|
-
|
32
|
-
escaped_template_without_query_params = expand_helper(helper_name, type, supplied_params)
|
33
|
-
escaped_template = append_query_params(escaped_template_without_query_params, query_params, supplied_params)
|
34
|
-
|
35
|
-
unescape_template(escaped_template)
|
36
|
-
end
|
37
|
-
|
38
|
-
def append_query_params(template, query_params, supplied_params)
|
39
|
-
return template unless query_params.any?
|
40
|
-
|
41
|
-
supplied_query_params = query_params & supplied_params.keys
|
42
|
-
supplied_query_string = ''
|
43
|
-
|
44
|
-
if supplied_query_params.any?
|
45
|
-
continuation_or_expansion = '&'
|
46
|
-
|
47
|
-
supplied_query_string << '?'
|
48
|
-
|
49
|
-
supplied_query_string << supplied_query_params.map do |key|
|
50
|
-
"#{key.to_s}=#{URI.encode(supplied_params[key].to_s)}"
|
51
|
-
end.join('&')
|
52
|
-
|
53
|
-
query_params = query_params - supplied_query_params
|
54
|
-
else
|
55
|
-
continuation_or_expansion = '?'
|
56
|
-
end
|
57
|
-
|
58
|
-
"#{template}#{supplied_query_string}{#{continuation_or_expansion}#{query_params.join(',')}}"
|
59
|
-
end
|
60
|
-
|
61
|
-
def expand_helper(helper_name, path_or_url, params)
|
62
|
-
helper_method = "#{helper_name}_#{path_or_url}"
|
63
|
-
|
64
|
-
url_helpers.send(helper_method, *templated_supplied_params_for(helper_name, params))
|
65
|
-
end
|
66
|
-
|
67
|
-
def named_routes
|
68
|
-
Rails.application.routes.named_routes
|
69
|
-
end
|
70
|
-
|
71
|
-
def route_object_for(helper_name)
|
72
|
-
named_routes.routes[helper_name]
|
73
|
-
end
|
74
|
-
|
75
|
-
def templated_supplied_params_for(helper_name, params)
|
76
|
-
route_object_for(helper_name).required_parts.map do |required_part|
|
77
|
-
params.fetch(required_part) { "{#{required_part}}" }
|
78
|
-
end
|
79
|
-
end
|
6
|
+
@@parser = Parser.new
|
80
7
|
|
81
|
-
def
|
82
|
-
|
8
|
+
def path_template_for(helper_name, query_params = {}, supplied_params = nil)
|
9
|
+
@@parser.path_template_for(helper_name, query_params, supplied_params)
|
83
10
|
end
|
84
11
|
|
85
|
-
def
|
86
|
-
|
12
|
+
def url_template_for(helper_name, query_params = {}, supplied_params = nil)
|
13
|
+
@@parser.url_template_for(helper_name, query_params, supplied_params)
|
87
14
|
end
|
88
15
|
end
|
89
16
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "zooplankton/resolver"
|
3
|
+
|
4
|
+
module Zooplankton
|
5
|
+
class Parser
|
6
|
+
AMPERSAND = '&'.freeze
|
7
|
+
QUESTION_MARK = '?'.freeze
|
8
|
+
|
9
|
+
def path_template_for(helper_name, query_params={}, supplied_params=nil)
|
10
|
+
build_template(:path, helper_name, *parse_params(query_params, supplied_params))
|
11
|
+
end
|
12
|
+
|
13
|
+
def url_template_for(helper_name, query_params={}, supplied_params=nil)
|
14
|
+
build_template(:url, helper_name, *parse_params(query_params, supplied_params))
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse_params(*args)
|
20
|
+
if args.first.respond_to?(:to_h) && !args.first.is_a?(Array)
|
21
|
+
query_params = []
|
22
|
+
supplied_params = args.first.to_h
|
23
|
+
else
|
24
|
+
query_params = Array(args.shift)
|
25
|
+
supplied_params = args.first || {}
|
26
|
+
end
|
27
|
+
|
28
|
+
[query_params, supplied_params]
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_template(type, helper_name, query_params, supplied_params)
|
32
|
+
return unless resolver.has_route?(helper_name)
|
33
|
+
|
34
|
+
escaped_template_without_query_params = expand_helper(helper_name, type, supplied_params)
|
35
|
+
escaped_template = append_query_params(escaped_template_without_query_params, query_params, supplied_params)
|
36
|
+
|
37
|
+
unescape_template(escaped_template)
|
38
|
+
end
|
39
|
+
|
40
|
+
def append_query_params(template, defined_keys, supplied_params)
|
41
|
+
return template unless defined_keys.any?
|
42
|
+
|
43
|
+
supplied_keys = defined_keys & supplied_params.keys
|
44
|
+
not_supplied_keys = defined_keys - supplied_params.keys
|
45
|
+
|
46
|
+
segments = []
|
47
|
+
init_symbol = QUESTION_MARK
|
48
|
+
|
49
|
+
if supplied_keys.any?
|
50
|
+
segments << supplied_keys.map{|k| escaped_pair(k, supplied_params[k]) }.join(AMPERSAND)
|
51
|
+
end
|
52
|
+
|
53
|
+
if not_supplied_keys.any?
|
54
|
+
init_symbol, sep = if segments.size > 0
|
55
|
+
[QUESTION_MARK, AMPERSAND]
|
56
|
+
else
|
57
|
+
['', QUESTION_MARK]
|
58
|
+
end
|
59
|
+
segments << "{#{sep}#{not_supplied_keys.join(",")}}"
|
60
|
+
end
|
61
|
+
|
62
|
+
"#{template}#{init_symbol}#{segments.join}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def expand_helper(helper_name, path_or_url, params)
|
66
|
+
helper_method = "#{helper_name}_#{path_or_url}"
|
67
|
+
|
68
|
+
resolver.generate(helper_method, helper_name, params)
|
69
|
+
end
|
70
|
+
|
71
|
+
def resolver
|
72
|
+
@resolver ||= Resolver.instance
|
73
|
+
end
|
74
|
+
|
75
|
+
def escaped_pair(key, value)
|
76
|
+
[key, URI.encode(value.to_s)].join('=')
|
77
|
+
end
|
78
|
+
|
79
|
+
def unescape_template(template)
|
80
|
+
CGI.unescape(template)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'action_controller/metal/strong_parameters'
|
2
|
+
|
3
|
+
module Zooplankton
|
4
|
+
class Resolver
|
5
|
+
def self.instance
|
6
|
+
new(Rails.application.routes)
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(routes)
|
10
|
+
@routes = routes
|
11
|
+
end
|
12
|
+
|
13
|
+
def has_route?(name)
|
14
|
+
names.include?(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate(helper_method, helper_name, params = {})
|
18
|
+
route = named_routes[helper_name]
|
19
|
+
routes.url_helpers.public_send(helper_method, *tokenized_params_for(route, params))
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
attr_reader :routes
|
24
|
+
|
25
|
+
def tokenized_params_for(route, params)
|
26
|
+
route.required_parts.map do |required_part|
|
27
|
+
params.fetch(required_part) { "{#{required_part}}" }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def names
|
32
|
+
named_routes.names
|
33
|
+
end
|
34
|
+
|
35
|
+
def named_routes
|
36
|
+
routes.named_routes
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/zooplankton/version.rb
CHANGED
data/spec/zooplankton_spec.rb
CHANGED
@@ -39,6 +39,14 @@ describe Zooplankton do
|
|
39
39
|
expect(subject).to eq('/{?q,f}')
|
40
40
|
end
|
41
41
|
end
|
42
|
+
|
43
|
+
context "with all query parameters" do
|
44
|
+
subject { Zooplankton.path_template_for(:root, %w(s q aa), "s" => "foo", "q" => "bar", "aa" => "hello", "ignore" => "me") }
|
45
|
+
|
46
|
+
it "templateizes all query params with the right separators" do
|
47
|
+
expect(subject).to eq('/?s=foo&q=bar&aa=hello')
|
48
|
+
end
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
context "for a route with one required param" do
|
data/zooplankton.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zooplankton
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Hamill
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,16 +70,22 @@ dependencies:
|
|
70
70
|
name: rails
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '4.0'
|
76
|
+
- - "<"
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '6.0'
|
76
79
|
type: :runtime
|
77
80
|
prerelease: false
|
78
81
|
version_requirements: !ruby/object:Gem::Requirement
|
79
82
|
requirements:
|
80
|
-
- - "
|
83
|
+
- - ">="
|
81
84
|
- !ruby/object:Gem::Version
|
82
85
|
version: '4.0'
|
86
|
+
- - "<"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '6.0'
|
83
89
|
description: A library for turning Rails routes into URI Templates, like maybe for
|
84
90
|
HAL.
|
85
91
|
email:
|
@@ -91,12 +97,17 @@ files:
|
|
91
97
|
- ".gitignore"
|
92
98
|
- ".rspec"
|
93
99
|
- ".travis.yml"
|
100
|
+
- Appraisals
|
94
101
|
- CHANGES.md
|
95
102
|
- Gemfile
|
96
103
|
- LICENSE.txt
|
97
104
|
- README.md
|
98
105
|
- Rakefile
|
106
|
+
- gemfiles/rails4.gemfile
|
107
|
+
- gemfiles/rails5.gemfile
|
99
108
|
- lib/zooplankton.rb
|
109
|
+
- lib/zooplankton/parser.rb
|
110
|
+
- lib/zooplankton/resolver.rb
|
100
111
|
- lib/zooplankton/version.rb
|
101
112
|
- spec/spec_helper.rb
|
102
113
|
- spec/zooplankton_spec.rb
|
@@ -121,11 +132,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
132
|
version: '0'
|
122
133
|
requirements: []
|
123
134
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
135
|
+
rubygems_version: 2.5.1
|
125
136
|
signing_key:
|
126
137
|
specification_version: 4
|
127
138
|
summary: A library for turning Rails routes into URI Templates.
|
128
139
|
test_files:
|
129
140
|
- spec/spec_helper.rb
|
130
141
|
- spec/zooplankton_spec.rb
|
131
|
-
has_rdoc:
|