json_key_transformer_middleware 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/json_key_transformer_middleware/incoming_json_formatter.rb +4 -8
- data/lib/json_key_transformer_middleware/incoming_params_formatter.rb +2 -5
- data/lib/json_key_transformer_middleware/middleware.rb +5 -23
- data/lib/json_key_transformer_middleware/outgoing_json_formatter.rb +4 -7
- data/lib/json_key_transformer_middleware/railtie.rb +9 -3
- data/readme.md +21 -2
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e9347015942aa7d6f803911e9d3d35bcf95f40fe87cbe3305441ffa0361155cf
|
4
|
+
data.tar.gz: 7c5e912186ae953bf958d1691dd2f9182fb6ce0207a69720fb940765d615ac62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2f14b7d151446e9b00cc6fdce2f908a141b127b20f1dab65ac19007650e1485705122c246fa036fc277e10db9549e17a939c9b8696b2e9fa53be4f2dfbe5334
|
7
|
+
data.tar.gz: 0bee3a4767f9fd059920af4f2e63312795b1579e6c548bd2155a8278940cb256c138c91d1dfb05f68fe150e291de7c5d040bf228c0c0a08b6dd2f3ad21cce5ad
|
@@ -1,18 +1,14 @@
|
|
1
|
+
require 'hash_key_transformer'
|
1
2
|
require 'oj'
|
2
3
|
|
3
4
|
module JsonKeyTransformerMiddleware
|
4
5
|
|
5
6
|
class IncomingJsonFormatter < Middleware
|
6
7
|
|
7
|
-
def initialize(app)
|
8
|
-
@app = app
|
9
|
-
end
|
10
|
-
|
11
8
|
def call(env)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
Oj.load(env['rack.input'].read), :camel_to_underscore))
|
9
|
+
object = Oj.load(env['rack.input'].read)
|
10
|
+
transformed_object = HashKeyTransformer.send(middleware_config.incoming_strategy, object, middleware_config.incoming_strategy_options)
|
11
|
+
result = Oj.dump(transformed_object, mode: :compat)
|
16
12
|
|
17
13
|
env['rack.input'] = StringIO.new(result)
|
18
14
|
# Rails uses this elsewhere to parse 'rack.input', it must be updated to avoid truncation
|
@@ -1,16 +1,13 @@
|
|
1
|
+
require 'hash_key_transformer'
|
1
2
|
require 'oj'
|
2
3
|
|
3
4
|
module JsonKeyTransformerMiddleware
|
4
5
|
|
5
6
|
class IncomingParamsFormatter < Middleware
|
6
7
|
|
7
|
-
def initialize(app)
|
8
|
-
@app = app
|
9
|
-
end
|
10
|
-
|
11
8
|
def call(env)
|
12
9
|
parsed_params = Rack::Utils.parse_nested_query(env['QUERY_STRING'])
|
13
|
-
transformed_params =
|
10
|
+
transformed_params = HashKeyTransformer.send(middleware_config.incoming_strategy, parsed_params, middleware_config.incoming_strategy_options)
|
14
11
|
env['QUERY_STRING'] = Rack::Utils.build_nested_query(transformed_params)
|
15
12
|
|
16
13
|
@app.call(env)
|
@@ -1,32 +1,14 @@
|
|
1
1
|
module JsonKeyTransformerMiddleware
|
2
2
|
|
3
3
|
class Middleware
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
new_key = send(strategy, key)
|
8
|
-
memo[new_key] = deep_transform_hash_keys(value, strategy)
|
9
|
-
memo
|
10
|
-
end
|
11
|
-
elsif subject.is_a?(Array)
|
12
|
-
subject.inject([]) do |memo, item|
|
13
|
-
memo << deep_transform_hash_keys(item, strategy)
|
14
|
-
memo
|
15
|
-
end
|
16
|
-
else
|
17
|
-
subject
|
18
|
-
end
|
4
|
+
def initialize(app, middleware_config)
|
5
|
+
@app = app
|
6
|
+
@middleware_config = middleware_config
|
19
7
|
end
|
20
8
|
|
21
|
-
|
22
|
-
def camel_to_underscore(key)
|
23
|
-
key.gsub(/([A-Z])/) { "_#{$1}" }.downcase
|
24
|
-
end
|
9
|
+
private
|
25
10
|
|
26
|
-
|
27
|
-
def underscore_to_camel(key)
|
28
|
-
key.gsub(/_([a-z0-9])/) { $1.upcase }
|
29
|
-
end
|
11
|
+
attr_reader :app, :middleware_config
|
30
12
|
end
|
31
13
|
|
32
14
|
end
|
@@ -1,13 +1,10 @@
|
|
1
|
+
require 'hash_key_transformer'
|
1
2
|
require 'oj'
|
2
3
|
|
3
4
|
module JsonKeyTransformerMiddleware
|
4
5
|
|
5
6
|
class OutgoingJsonFormatter < Middleware
|
6
7
|
|
7
|
-
def initialize(app)
|
8
|
-
@app = app
|
9
|
-
end
|
10
|
-
|
11
8
|
def call(env)
|
12
9
|
status, headers, body = @app.call(env)
|
13
10
|
|
@@ -28,9 +25,9 @@ module JsonKeyTransformerMiddleware
|
|
28
25
|
|
29
26
|
def transform_outgoing_body_part(body_part)
|
30
27
|
begin
|
31
|
-
Oj.
|
32
|
-
|
33
|
-
|
28
|
+
object = Oj.load(body_part)
|
29
|
+
transformed_object = HashKeyTransformer.send(middleware_config.outgoing_strategy, object, middleware_config.outgoing_strategy_options)
|
30
|
+
Oj.dump(transformed_object, mode: :compat)
|
34
31
|
rescue
|
35
32
|
body_part
|
36
33
|
end
|
@@ -4,9 +4,15 @@ module JsonKeyTransformerMiddleware
|
|
4
4
|
|
5
5
|
class Railtie < Rails::Railtie
|
6
6
|
|
7
|
-
config.
|
8
|
-
config.
|
9
|
-
config.
|
7
|
+
config.json_key_transformer_middleware = ActiveSupport::OrderedOptions.new
|
8
|
+
config.json_key_transformer_middleware.incoming_strategy = :transform_camel_to_underscore
|
9
|
+
config.json_key_transformer_middleware.incoming_strategy_options = ActiveSupport::OrderedOptions.new
|
10
|
+
config.json_key_transformer_middleware.outgoing_strategy = :transform_underscore_to_camel
|
11
|
+
config.json_key_transformer_middleware.outgoing_strategy_options = ActiveSupport::OrderedOptions.new
|
12
|
+
|
13
|
+
config.app_middleware.insert_after(Rails::Rack::Logger, JsonKeyTransformerMiddleware::IncomingParamsFormatter, config.json_key_transformer_middleware)
|
14
|
+
config.app_middleware.insert_after(Rails::Rack::Logger, JsonKeyTransformerMiddleware::IncomingJsonFormatter, config.json_key_transformer_middleware)
|
15
|
+
config.app_middleware.use(JsonKeyTransformerMiddleware::OutgoingJsonFormatter, config.json_key_transformer_middleware)
|
10
16
|
|
11
17
|
end
|
12
18
|
|
data/readme.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Rack middleware which transforms incoming and outgoing JSON keys to support the development of Rails JSON-based APIs.
|
4
4
|
|
5
|
-
|
5
|
+
By default, incoming JSON keys are transformed from `camelCase` to `snake_case` and outgoing JSON keys are transformed from `snake_case` to `camelCase`.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -22,7 +22,7 @@ Or, install it directly:
|
|
22
22
|
|
23
23
|
Simply including the gem in the Gemfile for a Rails application will initialize the rack middleware which transforms incoming and outgoing JSON keys.
|
24
24
|
|
25
|
-
The purpose of this gem is to:
|
25
|
+
The primary purpose of this gem is to:
|
26
26
|
|
27
27
|
1. Transform incoming parameter names from JSON-style `camelCase` to Ruby-style `snake_case`. Clients send `camelCase` parameters, you work with `snake_case` params in your Rails controllers.
|
28
28
|
1. Transform outgoing parameter names from Ruby-style `snake_case` to JSON-style `camelCase`. When rendering a JSON response, you send a `snake_case` hash response, the client will receive a `camelCase` response.
|
@@ -57,6 +57,25 @@ To (JSON):
|
|
57
57
|
{"paramName": "value", "paramName2": [{"paramName3": "value"}]}
|
58
58
|
```
|
59
59
|
|
60
|
+
## Configuration
|
61
|
+
|
62
|
+
This middleware uses the `hash_key_transformer` gem to perform deep transformation of hash keys. You can configure incoming and outgoing hash transformations. Use any of the available transformations and transformation options provided by `hash_key_transformer`.
|
63
|
+
|
64
|
+
The Railtie provides these configuration options:
|
65
|
+
|
66
|
+
* `incoming_strategy` - default value of `:transform_camel_to_underscore`.
|
67
|
+
* `incoming_strategy_options` - no options set by default.
|
68
|
+
* `outgoing_strategy` - default value of `:transform_underscore_to_camel`.
|
69
|
+
* `outgoing_strategy_options` - no options set by default.
|
70
|
+
|
71
|
+
Here is an example Rails initializer which turns on the `outgoing_strategy_options.keep_lead_underscore` option:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# initializers/json_key_transformer_middleware.rb
|
75
|
+
|
76
|
+
Rails.application.config.json_key_transformer_middleware.outgoing_strategy_options.keep_lead_underscore = true
|
77
|
+
```
|
78
|
+
|
60
79
|
## Notes
|
61
80
|
|
62
81
|
This gem serves a very specific purpose. As such, it only targets a specific version of Rails. Over time more versions of Rails may be supported.
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_key_transformer_middleware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hash_key_transformer
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.3
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: oj
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
101
|
version: '0'
|
88
102
|
requirements: []
|
89
103
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
104
|
+
rubygems_version: 2.7.3
|
91
105
|
signing_key:
|
92
106
|
specification_version: 4
|
93
107
|
summary: Rack middleware which transforms incoming and outgoing JSON keys to support
|