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 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