bright_serializer 0.1.1 → 0.2.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
2
  SHA256:
3
- metadata.gz: 66d2b2229c0eeb734471ecc020e89ed4fb9046790683758688a17b9bf15c4810
4
- data.tar.gz: be732a5bc2a0f9ffec0dd41cfdab67ebdd65441c43ee9cf59945d863b29b7f08
3
+ metadata.gz: 124b91b1e579f871a02ebdc415fc663c3053ea9a45592a3bcf37cae0f3ef6f20
4
+ data.tar.gz: c59949c767f3391e97e38d332ecaf14a93525ea5971edf260a044af5b66ee513
5
5
  SHA512:
6
- metadata.gz: 885d120ebade43457feea87a3f325cd4eaefd44070eedf13222a466824e44c0cd2a597161ac95c0bf5187955c201bcba7422f1bb1084851e01cc098f8e32b6e9
7
- data.tar.gz: 21b5fa304294af30334c49bb5098e022615ab1c279437ee8d5cfbcbd1cfcab2a02612bebb8c675467eda4b5f9af72f758698557e21daac656fae5dba98283f33
6
+ metadata.gz: a716280c2dc9064f639f9e67ccf0ab24ae4cf0060293d5d0d77bad889598857cd1aadc75612cc38a8ffe564d57b8e24f97e699d9fa46efdad03964a890b6a856
7
+ data.tar.gz: 0311226ca9be88fcc43d690486de25195c25cd7ccdf0bad636b0b4707dc50a01a07b7f830071d947f01ee6d4660b04122f9fed601a5113c2ee2e83600b639d53
@@ -20,5 +20,4 @@ jobs:
20
20
  - name: Specs
21
21
  run: bundle exec rake
22
22
  - name: Rubocop
23
- run: bundle exec rubocop
24
-
23
+ run: bundle exec rubocop --parallel
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ * Your contribution
6
+
7
+ ## 0.2.0 (2020-07-17)
8
+
9
+ * Add RubyGems version badge
10
+ * Handle inherit from a parent serializer
11
+ * Define entity in serializer for grape_swagger (#9)
12
+
5
13
  ## 0.1.1 (2020-07-13)
6
14
 
7
15
  * Add description in gemspec file
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bright_serializer (0.1.1)
4
+ bright_serializer (0.2.0)
5
5
  oj (~> 3)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Actions Status](https://github.com/petalmd/bright_serializer/workflows/Build/badge.svg)](https://github.com/petalmd/bright_serializer/actions?query=workflow%3ABuild)
2
+ [![Gem Version](https://badge.fury.io/rb/bright_serializer.svg)](https://badge.fury.io/rb/bright_serializer)
2
3
 
3
4
  # BrightSerializer
4
5
 
@@ -124,6 +125,27 @@ class AccountSerializer
124
125
  end
125
126
  ```
126
127
 
128
+ ### Entity
129
+
130
+ You can define the entity of your serializer to generate documentation with the option `entity`.
131
+ The feature was build to work with [grape-swagger](https://github.com/ruby-grape/grape-swagger).
132
+ For more information about defining a model entity see the [Swagger documentation](https://swagger.io/specification/v2/?sbsearch=array%20response#schema-object).
133
+
134
+ ```ruby
135
+ class AccountSerializer
136
+ include BrightSerializer::Serializer
137
+ attribute :id, entity: { type: :string, description: 'The id of the account' }
138
+ attribute :name
139
+
140
+ attribute :friends,
141
+ entity: {
142
+ type: :array, items: { ref: 'FriendSerializer' }, description: 'The list the account friends.'
143
+ } do |object|
144
+ FriendSerializer.new(object.friends)
145
+ end
146
+ end
147
+ ```
148
+
127
149
  ## Development
128
150
 
129
151
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'entity/base'
4
+
3
5
  module BrightSerializer
4
6
  class Attribute
5
- attr_reader :key, :block, :condition
7
+ attr_reader :key, :block, :condition, :entity
6
8
  attr_accessor :transformed_key
7
9
 
8
- def initialize(key, condition, &block)
10
+ def initialize(key, condition, entity, &block)
9
11
  @key = key
10
12
  @condition = condition
11
13
  @block = block
14
+ @entity = entity ? Entity::Base.new(entity) : nil
12
15
  end
13
16
 
14
17
  def serialize(object, params)
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'parser'
4
+
5
+ module BrightSerializer
6
+ module Entity
7
+ class Base
8
+ DEFAULT_DEFINITION = { type: :undefined }.freeze
9
+
10
+ # https://swagger.io/specification/v2/?sbsearch=array%20response#schema-object
11
+
12
+ def initialize(definition)
13
+ @definition = definition
14
+ end
15
+
16
+ def to_h
17
+ @definition.transform_keys! { |k| Inflector.camel_lower k.to_s }
18
+ parse_ref!
19
+ @definition
20
+ end
21
+
22
+ def parse_ref!
23
+ object = nested_hash(@definition, 'ref')
24
+ return unless object
25
+
26
+ ref_entity_name = Inflector.constantize(object.delete('ref')).entity_name
27
+ relation = "#/definitions/#{ref_entity_name}"
28
+ object['$ref'] = relation
29
+ end
30
+
31
+ def nested_hash(obj, key)
32
+ if obj.respond_to?(:key?) && obj.key?(key)
33
+ obj
34
+ elsif obj.respond_to?(:each)
35
+ r = nil
36
+ obj.find { |*a| r = nested_hash(a.last, key) }
37
+ r
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BrightSerializer
4
+ module Entity
5
+ class Parser
6
+ attr_reader :model
7
+ attr_reader :endpoint
8
+
9
+ def initialize(model, endpoint)
10
+ @model = model
11
+ @endpoint = endpoint
12
+ end
13
+
14
+ def call
15
+ @model.entity
16
+ end
17
+ end
18
+ end
19
+ end
@@ -28,5 +28,36 @@ class Inflector
28
28
  underscored_word.tr!('_', '-')
29
29
  underscored_word
30
30
  end
31
+
32
+ # File activesupport/lib/active_support/inflector/methods.rb, line 271
33
+ def constantize(camel_cased_word)
34
+ names = camel_cased_word.split('::')
35
+
36
+ # Trigger a built-in NameError exception including the ill-formed constant in the message.
37
+ Object.const_get(camel_cased_word) if names.empty?
38
+
39
+ # Remove the first blank element in case of '::ClassName' notation.
40
+ names.shift if names.size > 1 && names.first.empty?
41
+
42
+ names.inject(Object) do |constant, name|
43
+ if constant == Object
44
+ constant.const_get(name)
45
+ else
46
+ candidate = constant.const_get(name)
47
+ next candidate if constant.const_defined?(name, false)
48
+ next candidate unless Object.const_defined?(name)
49
+
50
+ # Go down the ancestors to check if it is owned directly. The check
51
+ # stops when we reach Object or the end of ancestors tree.
52
+ constant = constant.ancestors.each_with_object(constant) do |ancestor, const|
53
+ break const if ancestor == Object
54
+ break ancestor if ancestor.const_defined?(name, false)
55
+ end
56
+
57
+ # owner is in Object, so raise
58
+ constant.const_get(name, false)
59
+ end
60
+ end
61
+ end
31
62
  end
32
63
  end
@@ -4,6 +4,7 @@ require 'oj'
4
4
  require 'set'
5
5
  require_relative 'attribute'
6
6
  require_relative 'inflector'
7
+ require_relative 'entity/base'
7
8
 
8
9
  module BrightSerializer
9
10
  module Serializer
@@ -31,7 +32,7 @@ module BrightSerializer
31
32
  end
32
33
 
33
34
  def serializable_hash
34
- if @object.respond_to?(:size) && !@object.respond_to?(:each_pair)
35
+ if @object.respond_to?(:each) && !@object.respond_to?(:each_pair)
35
36
  @object.map { |o| serialize o }
36
37
  else
37
38
  serialize(@object)
@@ -49,9 +50,15 @@ module BrightSerializer
49
50
  module ClassMethods
50
51
  attr_reader :attributes_to_serialize, :transform_method
51
52
 
53
+ def inherited(subclass)
54
+ super
55
+ subclass.instance_variable_set(:@attributes_to_serialize, []) unless subclass.attributes_to_serialize
56
+ subclass.attributes_to_serialize.concat(@attributes_to_serialize)
57
+ end
58
+
52
59
  def attributes(*attributes, **options, &block)
53
60
  attributes.each do |key|
54
- attribute = Attribute.new(key, options[:if], &block)
61
+ attribute = Attribute.new(key, options[:if], options[:entity], &block)
55
62
  attribute.transformed_key = run_transform_key(key)
56
63
  @attributes_to_serialize << attribute
57
64
  end
@@ -74,6 +81,19 @@ module BrightSerializer
74
81
  input.to_sym
75
82
  end
76
83
  end
84
+
85
+ def entity
86
+ {}.tap do |result|
87
+ @attributes_to_serialize.each do |attribute|
88
+ entity_value = attribute.entity&.to_h || BrightSerializer::Entity::Base::DEFAULT_DEFINITION
89
+ result.merge!(attribute.transformed_key => entity_value)
90
+ end
91
+ end
92
+ end
93
+
94
+ def entity_name
95
+ name.split('::').last.downcase
96
+ end
77
97
  end
78
98
  end
79
99
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrightSerializer
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bright_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Francis Bastien
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-13 00:00:00.000000000 Z
11
+ date: 2020-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -101,6 +101,8 @@ files:
101
101
  - bright_serializer.gemspec
102
102
  - lib/bright_serializer.rb
103
103
  - lib/bright_serializer/attribute.rb
104
+ - lib/bright_serializer/entity/base.rb
105
+ - lib/bright_serializer/entity/parser.rb
104
106
  - lib/bright_serializer/inflector.rb
105
107
  - lib/bright_serializer/serializer.rb
106
108
  - lib/bright_serializer/version.rb