json_key_transformer_middleware 0.2.2 → 0.3.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/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
|