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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6f956b529cd67c92c276fe70a2cc7dd52abe762d
4
- data.tar.gz: 02dad341e504dab059a7a5bfd7646cc3360a9a7b
2
+ SHA256:
3
+ metadata.gz: e9347015942aa7d6f803911e9d3d35bcf95f40fe87cbe3305441ffa0361155cf
4
+ data.tar.gz: 7c5e912186ae953bf958d1691dd2f9182fb6ce0207a69720fb940765d615ac62
5
5
  SHA512:
6
- metadata.gz: 4557b26b081a1eeaafce98296ee4ee258c2047dc0cca67c0dfdf93cd5300a0dfd50e0cf670733ff6a6ed74761a8e76becdc6c77bba369912d761efe367d5573d
7
- data.tar.gz: '028906f26c05686f19c16c58ce48317abdc8509a7ad4d44e5926076139ea167b99d41706969cf8a286c049f98ac3d9bd5f80ae165fb546596aa0cecbb4bcb532'
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
- result =
13
- Oj.dump(
14
- deep_transform_hash_keys(
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 = deep_transform_hash_keys(parsed_params, :camel_to_underscore)
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 deep_transform_hash_keys(subject, strategy)
5
- if subject.is_a?(Hash)
6
- subject.inject({}) do |memo, (key, value)|
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
- # 'keyName' -> 'key_name'
22
- def camel_to_underscore(key)
23
- key.gsub(/([A-Z])/) { "_#{$1}" }.downcase
24
- end
9
+ private
25
10
 
26
- # 'key_name' -> 'keyName'
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.dump(
32
- deep_transform_hash_keys(
33
- Oj.load(body_part), :underscore_to_camel))
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.app_middleware.insert_after Rails::Rack::Logger, JsonKeyTransformerMiddleware::IncomingParamsFormatter
8
- config.app_middleware.insert_after Rails::Rack::Logger, JsonKeyTransformerMiddleware::IncomingJsonFormatter
9
- config.app_middleware.use JsonKeyTransformerMiddleware::OutgoingJsonFormatter
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
- Incoming JSON keys are transformed from `camelCase` to `snake_case`. Outgoing JSON keys are transformed from `snake_case` to `camelCase`.
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.2.2
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: 2017-02-06 00:00:00.000000000 Z
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.6.8
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