ree_lib 1.0.0 → 1.0.3

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: be5ae7ea8b9a8508ae04cc0caf741b87bc67b974c0a14d6cfbabef16607e1c81
4
- data.tar.gz: fc7feb07cf62419e03262e4910fa9d02ac8c1b0eed9f60f76a4282f61357985f
3
+ metadata.gz: ff525a1db86ff974abe2f0095d70921fa49e324b808723042b1671140b372809
4
+ data.tar.gz: 899723f369a42828b8dc094cdcaf96c10d78704e23f95b9500ed76d453858f3b
5
5
  SHA512:
6
- metadata.gz: ff19ea51129ec5d6f3fdace442c2264fc8af6071e9e92f769916c3faea5da8aa9e59c04bcb94f6e063f0b363407d2c8b64ba7ce8136c750831b0ae60337d356d
7
- data.tar.gz: 777a59bf5a429a99d9f0c3e749d79a8af0223a08a1028cbae5d74d759fa6519bc12b48c36dc016373337e51d1f1427aca116acb0ccc26aaeac1a762891d28cd7
6
+ metadata.gz: 8a8630ad6fbb14f70ffef61be34708befd543be814a29fb81afda8a9020b8b46222e4aca37662e8504dbab8d43d408e9850168acc50595962245c93a4b377155
7
+ data.tar.gz: 1eb4b5d094c9b5aabf5882f5c055594348ea7a818920a1e55e87f48765e66dd0e2718a6643d7d4ba65f70ded911dd2a5575ad401497a5c69765f0700f34804cc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.0)
4
+ ree_lib (1.0.3)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -36,11 +36,11 @@ GEM
36
36
  crass (~> 1.0.2)
37
37
  nokogiri (>= 1.5.9)
38
38
  msgpack (1.5.3)
39
- nokogiri (1.13.7-x86_64-darwin)
39
+ nokogiri (1.13.8-x86_64-darwin)
40
40
  racc (~> 1.4)
41
- nokogiri (1.13.7-x86_64-linux)
41
+ nokogiri (1.13.8-x86_64-linux)
42
42
  racc (~> 1.4)
43
- oj (3.13.17)
43
+ oj (3.13.19)
44
44
  pg (1.4.1)
45
45
  public_suffix (4.0.7)
46
46
  racc (1.6.0)
@@ -10,6 +10,9 @@
10
10
  {
11
11
  "name": "ree_mapper"
12
12
  },
13
+ {
14
+ "name": "ree_swagger"
15
+ },
13
16
  {
14
17
  "name": "ree_validator"
15
18
  }
@@ -1,3 +1,5 @@
1
+ package_require 'ree_swagger/functions/register_type'
2
+
1
3
  module ReeEnum
2
4
  module DSL
3
5
  def self.included(base)
@@ -22,80 +24,102 @@ module ReeEnum
22
24
  Ree.container.compile(dsl.package, name)
23
25
  end
24
26
 
25
- def register_as_mapper_type
26
- mapper_factory = ReeMapper.get_mapper_factory(
27
- Object.const_get(self.name.split('::').first)
28
- )
27
+ def type_for_mapper
28
+ @type_for_mapper ||= begin
29
+ klass = Class.new(ReeMapper::AbstractType) do
30
+ def initialize(enum)
31
+ @enum = enum
32
+ end
29
33
 
30
- klass = Class.new(ReeMapper::AbstractType) do
31
- def initialize(enum)
32
- @enum = enum
33
- end
34
+ contract(
35
+ ReeEnum::Value,
36
+ Kwargs[
37
+ role: Nilor[Symbol, ArrayOf[Symbol]]
38
+ ] => String
39
+ )
40
+ def serialize(value, role: nil)
41
+ value.to_s
42
+ end
34
43
 
35
- contract(
36
- ReeEnum::Value,
37
- Kwargs[
38
- role: Nilor[Symbol, ArrayOf[Symbol]]
39
- ] => String
40
- )
41
- def serialize(value, role: nil)
42
- value.to_s
43
- end
44
+ contract(
45
+ Any,
46
+ Kwargs[
47
+ role: Nilor[Symbol, ArrayOf[Symbol]]
48
+ ] => ReeEnum::Value
49
+ ).throws(ReeMapper::CoercionError)
50
+ def cast(value, role: nil)
51
+ if value.is_a?(String)
52
+ enum_val = @enum.values.all.detect { |v| v.to_s == value }
44
53
 
45
- contract(
46
- Any,
47
- Kwargs[
48
- role: Nilor[Symbol, ArrayOf[Symbol]]
49
- ] => ReeEnum::Value
50
- ).throws(ReeMapper::CoercionError)
51
- def cast(value, role: nil)
52
- if value.is_a?(String)
53
- enum_val = @enum.values.all.detect { |v| v.to_s == value }
54
-
55
- if !enum_val
56
- raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
57
- end
54
+ if !enum_val
55
+ raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
56
+ end
58
57
 
59
- enum_val
60
- elsif value.is_a?(Integer)
61
- enum_val = @enum.values.all.detect { |v| v.to_i == value }
58
+ enum_val
59
+ elsif value.is_a?(Integer)
60
+ enum_val = @enum.values.all.detect { |v| v.to_i == value }
62
61
 
63
- if !enum_val
62
+ if !enum_val
63
+ raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
64
+ end
65
+
66
+ enum_val
67
+ else
64
68
  raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
65
69
  end
70
+ end
66
71
 
67
- enum_val
68
- else
69
- raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
72
+ contract(
73
+ ReeEnum::Value,
74
+ Kwargs[
75
+ role: Nilor[Symbol, ArrayOf[Symbol]]
76
+ ] => Integer
77
+ )
78
+ def db_dump(value, role: nil)
79
+ value.to_i
70
80
  end
71
- end
72
81
 
73
- contract(
74
- ReeEnum::Value,
75
- Kwargs[
76
- role: Nilor[Symbol, ArrayOf[Symbol]]
77
- ] => Integer
78
- )
79
- def db_dump(value, role: nil)
80
- value.to_i
82
+ contract(
83
+ Integer,
84
+ Kwargs[
85
+ role: Nilor[Symbol, ArrayOf[Symbol]]
86
+ ] => ReeEnum::Value
87
+ ).throws(ReeMapper::TypeError)
88
+ def db_load(value, role: nil)
89
+ cast(value, role: role)
90
+ end
81
91
  end
82
92
 
83
- contract(
84
- Integer,
85
- Kwargs[
86
- role: Nilor[Symbol, ArrayOf[Symbol]]
87
- ] => ReeEnum::Value
88
- ).throws(ReeMapper::TypeError)
89
- def db_load(value, role: nil)
90
- cast(value, role: role)
91
- end
93
+ klass.new(self)
92
94
  end
95
+ end
93
96
 
94
- mapper_factory.register(
95
- self.enum_name,
96
- ReeMapper::Mapper.build(
97
- mapper_factory.strategies, klass.new(self)
97
+ def register_as_swagger_type
98
+ swagger_type_registrator = ReeSwagger::RegisterType.new
99
+
100
+ [:casters, :serializers].each do |kind|
101
+ swagger_type_registrator.call(
102
+ kind,
103
+ type_for_mapper.class,
104
+ ->(*) {
105
+ {
106
+ type: 'string',
107
+ enum: values.all.map(&:to_s)
108
+ }
109
+ }
98
110
  )
111
+ end
112
+ end
113
+
114
+ def register_as_mapper_type
115
+ register_as_swagger_type
116
+
117
+ mapper_factory = ReeMapper.get_mapper_factory(
118
+ Object.const_get(self.name.split('::').first)
119
+ )
120
+
121
+ mapper_factory.register_type(
122
+ self.enum_name, type_for_mapper
99
123
  )
100
124
  end
101
125
  end
@@ -5,6 +5,7 @@ module ReeEnum
5
5
 
6
6
  package do
7
7
  depends_on :ree_mapper
8
+ depends_on :ree_swagger
8
9
  depends_on :ree_validator
9
10
  end
10
11
  end
@@ -6,5 +6,4 @@ module ReeJson
6
6
  package do
7
7
  depends_on :ree_hash
8
8
  end
9
-
10
9
  end
@@ -83,7 +83,7 @@ class ReeLogger::MultiLogger < Logger
83
83
  end
84
84
 
85
85
  contract(String, Hash, Nilor[Exception], Bool => nil)
86
- def unknown(message, parameters = {}, exception =nil, log_args = true)
86
+ def unknown(message, parameters = {}, exception = nil, log_args = true)
87
87
  log(:unknown, message, parameters, exception, true)
88
88
  end
89
89
 
@@ -11,6 +11,14 @@ class ReeMapper::MapperFactory
11
11
  string: ReeMapper::StringKeyHashOutput
12
12
  }.freeze
13
13
 
14
+ contract(Symbol, Any => Class).throws(ArgumentError)
15
+ def self.register_type(name, object_type)
16
+ register(
17
+ name,
18
+ ReeMapper::Mapper.build(strategies, object_type)
19
+ )
20
+ end
21
+
14
22
  contract(Symbol, Any => Class).throws(ArgumentError)
15
23
  def self.register(name, type)
16
24
  raise ArgumentError, "name of mapper type should not include `?`" if name.to_s.end_with?('?')
@@ -10,6 +10,9 @@
10
10
  {
11
11
  "name": "ree_dto"
12
12
  },
13
+ {
14
+ "name": "ree_enum"
15
+ },
13
16
  {
14
17
  "name": "ree_hash"
15
18
  },
@@ -9,40 +9,40 @@ class ReeSwagger::TypeDefinitionsRepo
9
9
  def build
10
10
  {
11
11
  serializers: {
12
- 'ReeMapper::Integer' => ->(*) {
12
+ ReeMapper::Integer => ->(*) {
13
13
  { type: 'integer' }
14
14
  },
15
- 'ReeMapper::String' => ->(*) {
15
+ ReeMapper::String => ->(*) {
16
16
  { type: 'string' }
17
17
  },
18
- 'ReeMapper::Bool' => ->(*) {
18
+ ReeMapper::Bool => ->(*) {
19
19
  { type: 'boolean' }
20
20
  },
21
- 'ReeMapper::Float' => ->(*) {
21
+ ReeMapper::Float => ->(*) {
22
22
  {
23
23
  type: 'number',
24
24
  format: 'float'
25
25
  }
26
26
  },
27
- 'ReeMapper::Array' => ->(type, build_serializer_schema) {
27
+ ReeMapper::Array => ->(type, build_serializer_schema) {
28
28
  {
29
29
  type: 'array',
30
30
  items: build_serializer_schema.(type.of.type)
31
31
  }
32
32
  },
33
- 'ReeMapper::DateTime' => ->(*) {
33
+ ReeMapper::DateTime => ->(*) {
34
34
  {
35
35
  type: 'string',
36
36
  format: 'date-time'
37
37
  }
38
38
  },
39
- 'ReeMapper::Date' => ->(*) {
39
+ ReeMapper::Date => ->(*) {
40
40
  {
41
41
  type: 'string',
42
42
  format: 'date'
43
43
  }
44
44
  },
45
- 'ReeMapper::Time' => ->(*) {
45
+ ReeMapper::Time => ->(*) {
46
46
  {
47
47
  type: 'string',
48
48
  format: 'date-time'
@@ -50,40 +50,40 @@ class ReeSwagger::TypeDefinitionsRepo
50
50
  }
51
51
  },
52
52
  casters: {
53
- 'ReeMapper::Integer' => ->(*) {
53
+ ReeMapper::Integer => ->(*) {
54
54
  { type: 'integer' }
55
55
  },
56
- 'ReeMapper::String' => ->(*) {
56
+ ReeMapper::String => ->(*) {
57
57
  { type: 'string' }
58
58
  },
59
- 'ReeMapper::Bool' => ->(*) {
59
+ ReeMapper::Bool => ->(*) {
60
60
  { type: 'boolean' }
61
61
  },
62
- 'ReeMapper::Float' => ->(*) {
62
+ ReeMapper::Float => ->(*) {
63
63
  {
64
64
  type: 'number',
65
65
  format: 'float'
66
66
  }
67
67
  },
68
- 'ReeMapper::Array' => ->(type, build_caster_schema) {
68
+ ReeMapper::Array => ->(type, build_caster_schema) {
69
69
  {
70
70
  type: 'array',
71
71
  items: build_caster_schema.(type.of.type)
72
72
  }
73
73
  },
74
- 'ReeMapper::DateTime' => ->(*) {
74
+ ReeMapper::DateTime => ->(*) {
75
75
  {
76
76
  type: 'string',
77
77
  format: 'date-time'
78
78
  }
79
79
  },
80
- 'ReeMapper::Date' => ->(*) {
80
+ ReeMapper::Date => ->(*) {
81
81
  {
82
82
  type: 'string',
83
83
  format: 'date'
84
84
  }
85
85
  },
86
- 'ReeMapper::Time' => ->(*) {
86
+ ReeMapper::Time => ->(*) {
87
87
  {
88
88
  type: 'string',
89
89
  format: 'date-time'
@@ -1,5 +1,8 @@
1
1
  class ReeSwagger::EndpointDto
2
2
  include ReeDto::EntityDSL
3
+ include Ree::LinkDSL
4
+
5
+ link 'ree_swagger/dto/error_dto', -> { ErrorDto }
3
6
 
4
7
  properties(
5
8
  method: Or[:get, :post, :put, :patch, :delete],
@@ -8,6 +11,7 @@ class ReeSwagger::EndpointDto
8
11
  serializer: Nilor[ReeMapper::Mapper],
9
12
  description: Nilor[String],
10
13
  response_status: Integer,
11
- response_description: Nilor[String]
14
+ response_description: Nilor[String],
15
+ errors: ArrayOf[ErrorDto]
12
16
  )
13
17
  end
@@ -0,0 +1,9 @@
1
+
2
+ class ReeSwagger::ErrorDto
3
+ include ReeDto::EntityDSL
4
+
5
+ properties(
6
+ status: Integer,
7
+ description: String,
8
+ )
9
+ end
@@ -88,6 +88,17 @@ class ReeSwagger::BuildEndpointSchema
88
88
  endpoint.response_status => response_schema
89
89
  }
90
90
 
91
+ endpoint.errors.each do |error|
92
+ if responses.key?(error.status)
93
+ responses[error.status][:description] += "\n- #{error.description}"
94
+ next
95
+ end
96
+
97
+ responses[error.status] = {
98
+ description: "- #{error.description}",
99
+ }
100
+ end
101
+
91
102
  method_schema = {
92
103
  responses: responses
93
104
  }
@@ -10,7 +10,7 @@ class ReeSwagger::GetCasterDefinition
10
10
  contract(Any, Proc => Nilor[Hash])
11
11
  def call(type, schema_builder)
12
12
  type_definitions_repo
13
- .dig(:casters, type.class.name)
13
+ .dig(:casters, type.class)
14
14
  &.(type, schema_builder)
15
15
  end
16
16
  end
@@ -10,7 +10,7 @@ class ReeSwagger::GetSerializerDefinition
10
10
  contract(Any, Proc => Nilor[Hash])
11
11
  def call(type, build_serializer_schema)
12
12
  type_definitions_repo
13
- .dig(:serializers, type.class.name)
13
+ .dig(:serializers, type.class)
14
14
  &.(type, build_serializer_schema)
15
15
  end
16
16
  end
@@ -12,7 +12,7 @@ class ReeSwagger::RegisterType
12
12
  contract(Or[:casters, :serializers], Any, Proc => nil)
13
13
  def call(kind, type, definition)
14
14
  SEMAPHORE.synchronize do
15
- type_definitions_repo[kind][type.name] = definition
15
+ type_definitions_repo[kind][type] = definition
16
16
  end
17
17
 
18
18
  nil
@@ -5,5 +5,6 @@ module ReeSwagger
5
5
  depends_on :ree_mapper
6
6
  depends_on :ree_dto
7
7
  depends_on :ree_hash
8
+ depends_on :ree_enum
8
9
  end
9
10
  end
@@ -3,6 +3,14 @@ RSpec.describe :build_endpoint_schema do
3
3
  link :build_mapper_factory, from: :ree_mapper
4
4
  link :build_mapper_strategy, from: :ree_mapper
5
5
 
6
+ before :all do
7
+ Ree.enable_irb_mode
8
+ end
9
+
10
+ after :all do
11
+ Ree.disable_irb_mode
12
+ end
13
+
6
14
  let(:mapper_factory) {
7
15
  strategies = [
8
16
  build_mapper_strategy(method: :serialize, output: :symbol_key_hash),
@@ -15,6 +23,27 @@ RSpec.describe :build_endpoint_schema do
15
23
  }
16
24
 
17
25
  it {
26
+ module ReeSwaggerTest
27
+ include Ree::PackageDSL
28
+
29
+ package
30
+
31
+ class Locales
32
+ include ReeEnum::DSL
33
+
34
+ enum :locales
35
+
36
+ val :en, 0
37
+ val :ru, 1
38
+ end
39
+ end
40
+
41
+ mapper_factory.register_type(
42
+ :locales, ReeSwaggerTest::Locales.type_for_mapper
43
+ )
44
+
45
+ ReeSwaggerTest::Locales.register_as_swagger_type
46
+
18
47
  serializer = mapper_factory.call.use(:serialize) do
19
48
  integer :id
20
49
  end
@@ -28,6 +57,7 @@ RSpec.describe :build_endpoint_schema do
28
57
  integer :id
29
58
  string :name
30
59
  tag :tag
60
+ locales :locale
31
61
  end
32
62
 
33
63
  schema = build_endpoint_schema(ReeSwagger::EndpointDto.new(
@@ -36,7 +66,21 @@ RSpec.describe :build_endpoint_schema do
36
66
  caster: caster,
37
67
  serializer: serializer,
38
68
  response_status: 200,
39
- description: nil
69
+ description: nil,
70
+ errors: [
71
+ ReeSwagger::ErrorDto.new(
72
+ status: 400,
73
+ description: "1st 400 error"
74
+ ),
75
+ ReeSwagger::ErrorDto.new(
76
+ status: 400,
77
+ description: "2nd 400 error"
78
+ ),
79
+ ReeSwagger::ErrorDto.new(
80
+ status: 401,
81
+ description: "401 error"
82
+ )
83
+ ]
40
84
  ))
41
85
 
42
86
  expect(schema).to eq(ReeSwagger::PathDto.new(
@@ -64,6 +108,10 @@ RSpec.describe :build_endpoint_schema do
64
108
  name: { type: 'string' },
65
109
  value: { type: 'string' }
66
110
  }
111
+ },
112
+ locale: {
113
+ type: 'string',
114
+ enum: ['en', 'ru']
67
115
  }
68
116
  }
69
117
  }
@@ -83,6 +131,13 @@ RSpec.describe :build_endpoint_schema do
83
131
  }
84
132
  }
85
133
  }
134
+ },
135
+ 400 => {
136
+ description: "- 1st 400 error\n- 2nd 400 error",
137
+
138
+ },
139
+ 401 => {
140
+ description: "- 401 error",
86
141
  }
87
142
  }
88
143
  }
@@ -109,7 +164,8 @@ RSpec.describe :build_endpoint_schema do
109
164
  caster: caster,
110
165
  serializer: nil,
111
166
  response_status: 200,
112
- description: nil
167
+ description: nil,
168
+ errors: []
113
169
  ))
114
170
 
115
171
  expect(schema).to eq(ReeSwagger::PathDto.new(
@@ -167,7 +223,8 @@ RSpec.describe :build_endpoint_schema do
167
223
  caster: nil,
168
224
  serializer: nil,
169
225
  response_status: 200,
170
- description: nil
226
+ description: nil,
227
+ errors: []
171
228
  ))
172
229
  }.to raise_error(
173
230
  ReeSwagger::BuildEndpointSchema::MissingCasterError,
@@ -187,7 +244,8 @@ RSpec.describe :build_endpoint_schema do
187
244
  caster: caster,
188
245
  serializer: nil,
189
246
  response_status: 200,
190
- description: nil
247
+ description: nil,
248
+ errors: []
191
249
  ))
192
250
  }.to raise_error(
193
251
  ReeSwagger::BuildEndpointSchema::MissingCasterError,
@@ -12,7 +12,8 @@ RSpec.describe :build_schema do
12
12
  caster: nil,
13
13
  serializer: nil,
14
14
  response_status: 200,
15
- description: nil
15
+ description: nil,
16
+ errors: []
16
17
  )]
17
18
  )
18
19
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-23 00:00:00.000000000 Z
11
+ date: 2022-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -1120,6 +1120,7 @@ files:
1120
1120
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger.rb
1121
1121
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/beans/type_definitions_repo.rb
1122
1122
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/endpoint_dto.rb
1123
+ - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/error_dto.rb
1123
1124
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/path_dto.rb
1124
1125
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_endpoint_schema.rb
1125
1126
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_parameters.rb