mini_api 0.1.2 → 0.1.3

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
2
  SHA256:
3
- metadata.gz: c6068dbc415de617d267b2e42d438eb85f36fdbbf0d083cf63efe86042130f96
4
- data.tar.gz: 31f694de691b4c4d271d0d38273a5df7476aa6bb2118ecceadeca639ca7883f9
3
+ metadata.gz: d964fdc02d20eb94726fd7ce97316402f97369aa0639f6ae8f4c4761d1359ed4
4
+ data.tar.gz: 76c2ac644e655cec1b23199c843c56008b23730e671d40499dac66c305f34f6f
5
5
  SHA512:
6
- metadata.gz: 287a2711d205b18d07fb6295e36bf132ef64953aa6d91a2f2f8699fdecaf82cc5fe0cd3a2292235f523ecf36ce6983c40b6d99a3a5d89418fe295ef4c834275c
7
- data.tar.gz: 8045d230ca7765a976b34ec73b5fe9020bdf7b40f662de12a1e1b5a0e72cd2c446c3d859f91e0921467c179eb6a6b0aa2fdc2af39dc3ba169586937775934d2f
6
+ metadata.gz: a84f16e06ce682471041e1a6c03cc9d991f482db377854cd0c6a533b570867654bf77cea9e7074a8a5ee2f7f219ae3fb22d192dc8ad3d8ac4bdc0b4b0cc57fe2
7
+ data.tar.gz: 85d339e62fa8195be1d02289e6fb00759b1a401cc428029a2cae6deb39403d24cf34f487bc21f493eed3d67c8f904f1ffbeb139f8191946490c7065ae53821f7
data/README.md CHANGED
@@ -9,6 +9,7 @@ A gem to standardize json responses in Rails applications, highly inspired on [R
9
9
  - [Usage](#usage)
10
10
  - [Respondering json](#respondering-json)
11
11
  - [Success and failure actions](#success-and-failure-actions)
12
+ - [Transform keys](#transform-keys)
12
13
  - [Overriding response](#overriding-response)
13
14
  - [Pagination](#pagination)
14
15
  - [Contributing](#contributing)
@@ -141,6 +142,20 @@ The `message` key is different based on actions on informed model: create, updat
141
142
 
142
143
  You can respond any type of data, but ActiveRecord/ActiveModel::Model and ActiveRecord::Relation has a special treatment as shown above
143
144
 
145
+ ### Transform keys
146
+
147
+ It is possible to transform the keys of request and response. By default, will transform to `snake_case`, but the possible values are `snake_case`, `camel_lower` and `camel_case`
148
+
149
+ To change the transform operation, simply adds a initializer on initilizations folder with content:
150
+ ```ruby
151
+ MiniApi::Config.configure do |config|
152
+ config.transform_params_keys_to = :snake_case
153
+ config.transform_response_keys_to = :camel_lower
154
+ end
155
+ ```
156
+ The option `transform_params_keys_to` will transform request params.
157
+ The option `transform_response_keys_to` will transform responses.
158
+
144
159
  ## Overriding response
145
160
 
146
161
  You can override the `status`, `message` and `sucess` keys simply informing values to `render_json`. Example:
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mini_api/config'
4
+ require 'mini_api/exceptions/case_transform_option_invalid'
5
+
6
+ module MiniApi
7
+ module CaseTransform
8
+ module_function
9
+
10
+ def transform(object, transform_to = :snake_case)
11
+ object.deep_transform_keys do |key|
12
+ case transform_to
13
+ when :camel_case
14
+ key.to_s.camelize
15
+ when :camel_lower
16
+ key.to_s.camelize(:lower)
17
+ when :snake_case
18
+ key.to_s.underscore
19
+ else
20
+ raise CaseTransformOptionInvalid, "option #{transform_to} is not supported."
21
+ end
22
+ end
23
+ end
24
+
25
+ def request_params_keys(params)
26
+ transform(params, Config.transform_params_keys_to)
27
+ end
28
+
29
+ def response_keys(response)
30
+ transform(response, Config.transform_response_keys_to)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MiniApi
4
+ class Config
5
+ include ActiveSupport::Configurable
6
+
7
+ # permitted values are: [:camel_case, :camel_lower, snake_case]
8
+ config_accessor :transform_params_keys_to, instance_accessor: false, default: :snake_case
9
+ config_accessor :transform_response_keys_to, instance_accessor: false, default: :snake_case
10
+ end
11
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'mini_api/case_transform'
4
+
3
5
  module MiniApi
4
6
  class DefaultResponder
5
7
  def initialize(controller, resource, options = {})
@@ -11,14 +13,32 @@ module MiniApi
11
13
  def respond
12
14
  success = @options[:success] != false
13
15
 
16
+ data = transform_keys
17
+
14
18
  @controller.render(
15
19
  json: {
16
20
  success: success,
17
- data: @resource,
21
+ data: data,
18
22
  message: @options[:message] || nil
19
23
  },
20
24
  status: @options[:status] || :ok
21
25
  )
22
26
  end
27
+
28
+ private
29
+
30
+ def transform_keys
31
+ return CaseTransform.response_keys(@resource) if @resource.is_a?(Hash)
32
+
33
+ return @resource unless @resource.is_a?(Array)
34
+
35
+ @resource.map do |item|
36
+ if item.is_a?(Hash)
37
+ CaseTransform.response_keys(item)
38
+ else
39
+ item
40
+ end
41
+ end
42
+ end
23
43
  end
24
44
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MiniApi
4
+ class CaseTransformOptionInvalid < StandardError; end
5
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'mini_api/serialization'
4
+ require 'mini_api/case_transform'
4
5
 
5
6
  module MiniApi
6
7
  # class to handle json render of ActiveRecord::Base instances and ActiveModel::Model's
@@ -30,6 +31,8 @@ module MiniApi
30
31
  # attribute when resource is an ActiveModel instance
31
32
  body[:data] = body[:data].except('errors') if body[:data]&.key?('errors')
32
33
 
34
+ body = CaseTransform.response_keys(body)
35
+
33
36
  @controller.render json: body, status: status_code
34
37
  end
35
38
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'mini_api/exceptions/kaminari_not_installed'
4
4
  require 'mini_api/serialization'
5
+ require 'mini_api/case_transform'
5
6
 
6
7
  module MiniApi
7
8
  class RelationResponder
@@ -16,6 +17,10 @@ module MiniApi
16
17
  def respond
17
18
  meta, collection = extract_meta_and_collection
18
19
 
20
+ meta = CaseTransform.response_keys(meta)
21
+
22
+ collection = transform_case(collection.as_json)
23
+
19
24
  @controller.render json: {
20
25
  success: @options[:success] || true,
21
26
  data: collection,
@@ -40,6 +45,10 @@ module MiniApi
40
45
  ]
41
46
  end
42
47
 
48
+ def transform_case(collection)
49
+ collection.map { |item| CaseTransform.response_keys(item) }
50
+ end
51
+
43
52
  def transform_resource_to_collection
44
53
  unless defined?(Kaminari)
45
54
  raise KaminariNotInstalled, 'The Kaminari gem is not installed. Install to perform pagination operations'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniApi
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
data/lib/mini_api.rb CHANGED
@@ -2,9 +2,23 @@
2
2
 
3
3
  require 'mini_api/railtie'
4
4
  require 'mini_api/responder'
5
+ require 'mini_api/case_transform'
5
6
 
6
7
  # Entrypoint module
7
8
  module MiniApi
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include CaseTransform
13
+
14
+ before_action :transform_params
15
+
16
+ def transform_params
17
+ self.params =
18
+ ActionController::Parameters.new(CaseTransform.request_params_keys(request.parameters))
19
+ end
20
+ end
21
+
8
22
  def render_json(resource, options = {})
9
23
  responder = Responder.new(self, resource, options)
10
24
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leon Cruz
@@ -35,7 +35,10 @@ files:
35
35
  - README.md
36
36
  - Rakefile
37
37
  - lib/mini_api.rb
38
+ - lib/mini_api/case_transform.rb
39
+ - lib/mini_api/config.rb
38
40
  - lib/mini_api/default_responder.rb
41
+ - lib/mini_api/exceptions/case_transform_option_invalid.rb
39
42
  - lib/mini_api/exceptions/kaminari_not_installed.rb
40
43
  - lib/mini_api/locales/en.yml
41
44
  - lib/mini_api/model_responder.rb