merge_params 0.2.0 → 0.5.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.
- checksums.yaml +5 -5
- data/Changelog.md +54 -0
- data/License +1 -1
- data/Readme.md +2 -0
- data/lib/facets/hash/recursively_comparing.rb +31 -0
- data/lib/merge_params/helpers.rb +45 -21
- data/lib/merge_params/version.rb +1 -1
- data/merge_params.gemspec +4 -3
- metadata +25 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d43d9cf3df4fb81e7b97db8b9a4881983d93c76fd2a2c62da80afae6209cae95
|
4
|
+
data.tar.gz: b76c110bc2145c68e4f7d7eb33b39c5b2264a84e1dcf96828bb378c6e53d5251
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1630b02c9715804035906a2c29994352f9cdbacfd61c398df1ed2c2afb0672d01fe7f5f442d2a5cda371cd98ae881207dd9126a61aaf0258dd11f93e80e17b2f
|
7
|
+
data.tar.gz: 82c2373090cd74310668114f6ea0b4742d66955d2c329b8c4c4f9377dce402aa377cd608eed8975b0ab2757db744b2ded9b35dc04fa3cc8347d965fb13cdea51
|
data/Changelog.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
|
4
|
+
recommendations of [keepachangelog.com](http://keepachangelog.com/).
|
5
|
+
|
6
|
+
## (Unreleased)
|
7
|
+
|
8
|
+
## 0.5.0 (2020-08-25)
|
9
|
+
- Change the order of arguments for `add_params` to `add_params(url, query_params_to_add)`.
|
10
|
+
This feels more natural, since you are adding the new query params to the _end_ of the given URL.
|
11
|
+
It is also more consistent with the Rails route helpers, like `something_path(query_params_to_add)`.
|
12
|
+
|
13
|
+
## 0.4.2 (2019-02-10)
|
14
|
+
- Fix `merge_url_for` to not pass on reserved options like only_path (which were only intended for
|
15
|
+
consumption by `url_for`) to `add_params`. It was adding it to the end of the URL, like
|
16
|
+
`only_path=true`.
|
17
|
+
|
18
|
+
## 0.4.1 (2019-02-08)
|
19
|
+
- Fix issue with merge_params not merging nested hashes as expected (changed to
|
20
|
+
use `deep_merge` instead of `merge`)
|
21
|
+
|
22
|
+
## 0.4.0 (2019-02-07)
|
23
|
+
|
24
|
+
### Added/Changed
|
25
|
+
- Better support for nested hashes: Using `deep_symbolize_keys` instead of `symbolize_keys`.
|
26
|
+
- Allow keys in nested hashes to be deleted by setting their value to nil
|
27
|
+
- Add `params_from_url(url)` helper
|
28
|
+
- Allow a hash to be passed as an argument to `params_for_url_for`
|
29
|
+
- Add dependency on `facets` gem
|
30
|
+
|
31
|
+
## 0.3.0 (2019-01-24)
|
32
|
+
|
33
|
+
### Fixed
|
34
|
+
- Fix `merge_url_for` to not try to add a param as a query param if it's been recognized as a route
|
35
|
+
param (part of the route path). We don't want the same param to be passed both via the route path
|
36
|
+
*and* the query string.
|
37
|
+
|
38
|
+
### Added
|
39
|
+
- `merge_url_for`: Allow keys that are currently in `query_params` to be deleted by setting their
|
40
|
+
value to `nil`.
|
41
|
+
|
42
|
+
|
43
|
+
## 0.2.0 (2018-12-05)
|
44
|
+
|
45
|
+
### Fixed
|
46
|
+
- Fix `add_params` to not inadvertently add a '?' to the end of the URI if there are no params to add
|
47
|
+
|
48
|
+
### Added
|
49
|
+
- Add `slice_params` helper
|
50
|
+
|
51
|
+
|
52
|
+
## 0.1.0 (2018-11-16)
|
53
|
+
|
54
|
+
Initial release
|
data/License
CHANGED
data/Readme.md
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'facets/hash/recursively'
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
def recursively_comparing(other_enum, path: [], &block)
|
5
|
+
ComparingRecursor.new(self, other_enum, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
class ComparingRecursor < Enumerable::Recursor #:nodoc:
|
9
|
+
def initialize(enum, other_enum, *types, &block)
|
10
|
+
@other_enum = other_enum
|
11
|
+
super(enum, *types, &block)
|
12
|
+
end
|
13
|
+
def method_missing(op, &yld)
|
14
|
+
yld = yld || lambda{ |k,v| [k,v] } # ? to_enum
|
15
|
+
rec = @block || yld #lambda{ |k,v| [k,v] }
|
16
|
+
@enum.__send__(op) do |k,v|
|
17
|
+
other_v = @other_enum.dig(k)
|
18
|
+
#puts %(#{@enum.inspect}: k=#{k.inspect}, v=#{v.inspect}, other_v=#{other_v.inspect})
|
19
|
+
case v
|
20
|
+
when String # b/c of 1.8
|
21
|
+
yld.call(k, v, other_v)
|
22
|
+
when *@types
|
23
|
+
res = v.recursively_comparing(other_v, &@block).__send__(op,&yld)
|
24
|
+
rec.call(k, res, other_v)
|
25
|
+
else
|
26
|
+
yld.call(k, v, other_v)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/merge_params/helpers.rb
CHANGED
@@ -1,25 +1,30 @@
|
|
1
1
|
require 'uri'
|
2
|
+
require 'facets/hash/deep_merge'
|
3
|
+
require 'facets/hash/recurse'
|
4
|
+
require 'facets/hash/recursively_comparing'
|
5
|
+
require 'facets/enumerable/graph'
|
6
|
+
require 'facets/hash/graph'
|
2
7
|
|
3
8
|
module MergeParams::Helpers
|
4
9
|
extend ActiveSupport::Concern
|
5
10
|
|
6
11
|
# request.parameters but with symbolized keys.
|
7
12
|
def request_params
|
8
|
-
request.parameters.
|
13
|
+
request.parameters.deep_symbolize_keys
|
9
14
|
end
|
10
15
|
|
11
16
|
# request.parameters (which also includes POST params) but with only those keys that would
|
12
17
|
# normally be passed in a query string (without :controller, :action, :format) and with symbolized
|
13
18
|
# keys.
|
14
19
|
def query_params_from_request_params
|
15
|
-
request.parameters.
|
16
|
-
except(*request.path_parameters.
|
20
|
+
request.parameters.deep_symbolize_keys.
|
21
|
+
except(*request.path_parameters.deep_symbolize_keys.keys)
|
17
22
|
end
|
18
23
|
|
19
24
|
# Returns a hash of params from the query string (https://en.wikipedia.org/wiki/Query_string),
|
20
25
|
# with symbolized keys.
|
21
26
|
def query_params
|
22
|
-
request.query_parameters.
|
27
|
+
request.query_parameters.deep_symbolize_keys
|
23
28
|
end
|
24
29
|
|
25
30
|
# Params that can safely be passed to url_for to build a route. (Used by merge_url_for.)
|
@@ -40,8 +45,9 @@ module MergeParams::Helpers
|
|
40
45
|
# (And we don't even need to pass the path_parameters on to url_for because url_for already
|
41
46
|
# includes those (from :_recall)
|
42
47
|
#
|
43
|
-
def params_for_url_for
|
44
|
-
params.to_unsafe_h.
|
48
|
+
def params_for_url_for(params = params())
|
49
|
+
params = params.to_unsafe_h if params.respond_to?(:to_unsafe_h)
|
50
|
+
params.deep_symbolize_keys.except(
|
45
51
|
*ActionDispatch::Routing::RouteSet::RESERVED_OPTIONS,
|
46
52
|
:controller,
|
47
53
|
:action,
|
@@ -51,7 +57,8 @@ module MergeParams::Helpers
|
|
51
57
|
|
52
58
|
# Safely merges the given params with the params from the current request
|
53
59
|
def merge_params(new_params = {})
|
54
|
-
params_for_url_for.
|
60
|
+
params_for_url_for.
|
61
|
+
deep_merge(new_params.deep_symbolize_keys)
|
55
62
|
end
|
56
63
|
|
57
64
|
# Easily extract just certain param keys.
|
@@ -79,26 +86,36 @@ module MergeParams::Helpers
|
|
79
86
|
|
80
87
|
# Safely merges the given params with the params from the current request, then generates a route
|
81
88
|
# from the merged params.
|
89
|
+
# You can remove a key by passing nil as the value, for example {key: nil}.
|
82
90
|
def merge_url_for(new_params = {})
|
83
91
|
url = url_for(merge_params(new_params))
|
84
92
|
|
85
|
-
# Now pass along in the *query string* any params that we couldn't pass to url_for because they
|
86
|
-
# were reserved options.
|
87
|
-
query_params_already_added = parse_nested_query(URI(url).query || '')
|
88
|
-
|
89
|
-
|
93
|
+
# # Now pass along in the *query string* any params that we couldn't pass to url_for because they
|
94
|
+
# # were reserved options.
|
95
|
+
# query_params_already_added = parse_nested_query(URI(url).query || '')
|
96
|
+
# # Some params from new_params (like company_id) that we pass in may be recognized by a route and
|
97
|
+
# # therefore no longer be query params. We use recognize_path to find those params that ended up
|
98
|
+
# # as route params instead of query_params but are nonetheless already added to the url.
|
99
|
+
# params_already_added = Rails.application.routes.recognize_path(url).merge(query_params_already_added)
|
100
|
+
params_already_added = params_from_url(url)
|
101
|
+
query_params_to_add = params_for_url_for(new_params).
|
102
|
+
recursively_comparing(params_already_added).graph { |k,v, other|
|
103
|
+
if v.is_a?(Hash) || v.nil? || other.nil?
|
104
|
+
[k, v]
|
105
|
+
end
|
106
|
+
}
|
107
|
+
add_params(url, query_params_to_add)
|
90
108
|
end
|
91
109
|
|
92
110
|
# Adds params to the query string
|
93
111
|
# (Unlike url_for_merge, which tries to generate a route from the params.)
|
94
|
-
|
95
|
-
# UriQueryMerger.new("http://www.google.com?other=1", {jordan: "rules"}).merge
|
96
|
-
# Can we make it work that way when a URL is supplied buth otherwise let the params be the first
|
97
|
-
# and only argument (to optimize for that more common use case)?
|
98
|
-
def add_params(params = {}, url = request.fullpath)
|
112
|
+
def add_params(url = request.fullpath, new_params = {})
|
99
113
|
uri = URI(url)
|
100
|
-
|
101
|
-
|
114
|
+
# Allow keys that are currently in query_params to be deleted by setting their value to nil in
|
115
|
+
# new_params (including in nested hashes).
|
116
|
+
merged_params = parse_nested_query(uri.query || '').
|
117
|
+
deep_merge(new_params).recurse(&:compact)
|
118
|
+
uri.query = Rack::Utils.build_nested_query(merged_params).presence
|
102
119
|
uri.to_s
|
103
120
|
end
|
104
121
|
|
@@ -112,9 +129,16 @@ module MergeParams::Helpers
|
|
112
129
|
) if respond_to?(:helper_method)
|
113
130
|
end
|
114
131
|
|
115
|
-
|
132
|
+
# Parsing helpers
|
133
|
+
def params_from_url(url)
|
134
|
+
query_params = parse_nested_query(URI(url).query || '')
|
135
|
+
route_params = Rails.application.routes.recognize_path(url.to_s)
|
136
|
+
params_for_url_for(
|
137
|
+
route_params.merge(query_params)
|
138
|
+
)
|
139
|
+
end
|
116
140
|
|
117
141
|
def parse_nested_query(query)
|
118
|
-
Rack::Utils.parse_nested_query(query || '').
|
142
|
+
Rack::Utils.parse_nested_query(query || '').deep_symbolize_keys
|
119
143
|
end
|
120
144
|
end
|
data/lib/merge_params/version.rb
CHANGED
data/merge_params.gemspec
CHANGED
@@ -11,11 +11,11 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.summary = %q{Safely merge params for use with url_for or for the query string}
|
13
13
|
spec.description = spec.summary
|
14
|
-
spec.homepage = "
|
14
|
+
spec.homepage = "https://github.com/TylerRick/merge_params"
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
17
|
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
-
spec.metadata["changelog_uri"] = "
|
18
|
+
spec.metadata["changelog_uri"] = "#{spec.metadata["source_code_uri"]}/blob/master/Changelog.md"
|
19
19
|
|
20
20
|
# Specify which files should be added to the gem when it is released.
|
21
21
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -29,8 +29,9 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.required_ruby_version = ">= 2.3.0"
|
30
30
|
spec.add_dependency "activesupport", [">= 4.2", "< 5.3"]
|
31
31
|
spec.add_dependency "actionpack", [">= 4.2", "< 5.3"]
|
32
|
+
spec.add_dependency "facets"
|
32
33
|
|
33
|
-
spec.add_development_dependency "bundler", "~>
|
34
|
+
spec.add_development_dependency "bundler", "~> 2"
|
34
35
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
36
|
spec.add_development_dependency "rspec", "~> 3.0"
|
36
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merge_params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Rick
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -50,20 +50,34 @@ dependencies:
|
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '5.3'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: facets
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
53
67
|
- !ruby/object:Gem::Dependency
|
54
68
|
name: bundler
|
55
69
|
requirement: !ruby/object:Gem::Requirement
|
56
70
|
requirements:
|
57
71
|
- - "~>"
|
58
72
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
73
|
+
version: '2'
|
60
74
|
type: :development
|
61
75
|
prerelease: false
|
62
76
|
version_requirements: !ruby/object:Gem::Requirement
|
63
77
|
requirements:
|
64
78
|
- - "~>"
|
65
79
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
80
|
+
version: '2'
|
67
81
|
- !ruby/object:Gem::Dependency
|
68
82
|
name: rake
|
69
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,23 +116,25 @@ files:
|
|
102
116
|
- ".gitignore"
|
103
117
|
- ".rspec"
|
104
118
|
- ".travis.yml"
|
119
|
+
- Changelog.md
|
105
120
|
- Gemfile
|
106
121
|
- License
|
107
122
|
- Rakefile
|
108
123
|
- Readme.md
|
109
124
|
- bin/console
|
110
125
|
- bin/setup
|
126
|
+
- lib/facets/hash/recursively_comparing.rb
|
111
127
|
- lib/merge_params.rb
|
112
128
|
- lib/merge_params/helpers.rb
|
113
129
|
- lib/merge_params/version.rb
|
114
130
|
- merge_params.gemspec
|
115
|
-
homepage:
|
131
|
+
homepage: https://github.com/TylerRick/merge_params
|
116
132
|
licenses:
|
117
133
|
- MIT
|
118
134
|
metadata:
|
119
|
-
homepage_uri:
|
120
|
-
source_code_uri:
|
121
|
-
changelog_uri:
|
135
|
+
homepage_uri: https://github.com/TylerRick/merge_params
|
136
|
+
source_code_uri: https://github.com/TylerRick/merge_params
|
137
|
+
changelog_uri: https://github.com/TylerRick/merge_params/blob/master/Changelog.md
|
122
138
|
post_install_message:
|
123
139
|
rdoc_options: []
|
124
140
|
require_paths:
|
@@ -134,8 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
150
|
- !ruby/object:Gem::Version
|
135
151
|
version: '0'
|
136
152
|
requirements: []
|
137
|
-
|
138
|
-
rubygems_version: 2.6.14.3
|
153
|
+
rubygems_version: 3.1.2
|
139
154
|
signing_key:
|
140
155
|
specification_version: 4
|
141
156
|
summary: Safely merge params for use with url_for or for the query string
|