sorbet-schema 0.1.0 → 0.2.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
2
  SHA256:
3
- metadata.gz: ffdfd75d86c1aae5d768f10ff0771233cf477e433a5f8fb8c97a426ac6082f33
4
- data.tar.gz: e800bb3ba0f34e67eec363581306299d57304ae5c1c3fae23db703888f2fd963
3
+ metadata.gz: 1d70fa44a21277553c70f83ca5bb33d012f165f4ce39921374bad60f4aafaead
4
+ data.tar.gz: ed9f24ad2785da98b16306587556c165e6218134540ce28ef22a422852a4fa3f
5
5
  SHA512:
6
- metadata.gz: 5974ed3fc6f0e7e9bfec18028a3c78ee66bd51fdd3329e6bf34980028ce7fb2254086f975cc58b6f5e143708f789170aeabc3ee095cdbc26dd2cf269dd471cd9
7
- data.tar.gz: 196aa60d08c1f12552307427737377eba10d19b7945282bdac35b3916decf93035c3039f9ec628bbc040bd1fe430b189bbc9e90714688256397caff5352744ac
6
+ metadata.gz: 9faa04758b3bca54e9c83024dcc30f94dcd84f6f4260bdff0f9e80a6e5ddd134626192264dbfc65df8bab1a5af0cdde9e65dd3f5d7f33ee1a0eb373729d007d5
7
+ data.tar.gz: '0649efc2845a54f4cfde1fc3adfc1330bc18dc06b22b501f0ce02d178af893228a81dc7a50373b771b230b15c42d97b35c50820b3fca9f49dbbd81667c22c78f'
data/CHANGELOG.md CHANGED
@@ -4,6 +4,31 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.2.0](https://github.com/maxveldink/sorbet-schema/compare/v0.1.1...v0.2.0) (2024-03-08)
8
+
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+
12
+ * Allow for custom Coercers ([#34](https://github.com/maxveldink/sorbet-schema/issues/34))
13
+
14
+ ### Features
15
+
16
+ * Allow for custom Coercers ([#34](https://github.com/maxveldink/sorbet-schema/issues/34)) ([54c6a53](https://github.com/maxveldink/sorbet-schema/commit/54c6a53019b18d65b18d6d1130c1034f1f6b1341))
17
+
18
+ ## [0.1.1](https://github.com/maxveldink/sorbet-schema/compare/v0.1.0...v0.1.1) (2024-03-08)
19
+
20
+
21
+ ### Features
22
+
23
+ * adds `to_h` and `to_json` methods to Deserialize errors ([#28](https://github.com/maxveldink/sorbet-schema/issues/28)) ([bf5f770](https://github.com/maxveldink/sorbet-schema/commit/bf5f770bc3ca176f18146dd780ad7ccd7fcb05b0))
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * Add release-please config ([#30](https://github.com/maxveldink/sorbet-schema/issues/30)) ([b311c28](https://github.com/maxveldink/sorbet-schema/commit/b311c2840d4929776e0133b061e531ae9d1f453f))
29
+ * Downgrade release-please action and publish gem through there ([#31](https://github.com/maxveldink/sorbet-schema/issues/31)) ([4ef9881](https://github.com/maxveldink/sorbet-schema/commit/4ef988120c73f42fdfa749d67b5ca0bafc4e52ce))
30
+ * update release-please permissions ([#33](https://github.com/maxveldink/sorbet-schema/issues/33)) ([b5d866c](https://github.com/maxveldink/sorbet-schema/commit/b5d866ca304879fc92c8d20ca2b303a3fcdd27c3))
31
+
7
32
  ## 0.1.0 (2024-03-05)
8
33
 
9
34
  ### Features
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sorbet-schema (0.1.0)
4
+ sorbet-schema (0.2.0)
5
5
  sorbet-result (~> 1.1)
6
6
  sorbet-runtime (~> 0.5)
7
7
  sorbet-struct-comparable (~> 1.3)
@@ -1,5 +1,5 @@
1
1
  # typed: strict
2
2
 
3
3
  module SorbetSchema
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Typed
4
4
  module Coercion
5
- module Coercer
5
+ class Coercer
6
6
  extend T::Sig
7
7
  extend T::Generic
8
8
 
@@ -10,6 +10,10 @@ module Typed
10
10
 
11
11
  Target = type_member(:out)
12
12
 
13
+ sig { abstract.params(type: T::Class[T.anything]).returns(T::Boolean) }
14
+ def used_for_type?(type)
15
+ end
16
+
13
17
  sig { abstract.params(field: Field, value: Value).returns(Result[Target, CoercionError]) }
14
18
  def coerce(field:, value:)
15
19
  end
@@ -0,0 +1,37 @@
1
+ # typed: strict
2
+
3
+ require "singleton"
4
+
5
+ module Typed
6
+ module Coercion
7
+ class CoercerRegistry
8
+ extend T::Sig
9
+
10
+ include Singleton
11
+
12
+ Registry = T.type_alias { T::Array[T.class_of(Coercer)] }
13
+
14
+ DEFAULT_COERCERS = T.let([StringCoercer, IntegerCoercer, FloatCoercer, StructCoercer], Registry)
15
+
16
+ sig { void }
17
+ def initialize
18
+ @available = T.let(DEFAULT_COERCERS.clone, Registry)
19
+ end
20
+
21
+ sig { params(coercer: T.class_of(Coercer)).void }
22
+ def register(coercer)
23
+ @available.prepend(coercer)
24
+ end
25
+
26
+ sig { void }
27
+ def reset!
28
+ @available = DEFAULT_COERCERS.clone
29
+ end
30
+
31
+ sig { params(type: T::Class[T.anything]).returns(T.nilable(T.class_of(Coercer))) }
32
+ def select_coercer_by(type:)
33
+ @available.find { |coercer| coercer.new.used_for_type?(type) }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,16 +2,18 @@
2
2
 
3
3
  module Typed
4
4
  module Coercion
5
- class FloatCoercer
6
- extend T::Sig
5
+ class FloatCoercer < Coercer
7
6
  extend T::Generic
8
7
 
9
- extend Coercer
8
+ Target = type_member { {fixed: Float} }
10
9
 
11
- Target = type_template { {fixed: Float} }
10
+ sig { override.params(type: T::Class[T.anything]).returns(T::Boolean) }
11
+ def used_for_type?(type)
12
+ type == Float
13
+ end
12
14
 
13
15
  sig { override.params(field: Field, value: Value).returns(Result[Target, CoercionError]) }
14
- def self.coerce(field:, value:)
16
+ def coerce(field:, value:)
15
17
  Success.new(Float(value))
16
18
  rescue ArgumentError, TypeError
17
19
  Failure.new(CoercionError.new("'#{value}' cannot be coerced into Float."))
@@ -2,16 +2,18 @@
2
2
 
3
3
  module Typed
4
4
  module Coercion
5
- class IntegerCoercer
6
- extend T::Sig
5
+ class IntegerCoercer < Coercer
7
6
  extend T::Generic
8
7
 
9
- extend Coercer
8
+ Target = type_member { {fixed: Integer} }
10
9
 
11
- Target = type_template { {fixed: Integer} }
10
+ sig { override.params(type: T::Class[T.anything]).returns(T::Boolean) }
11
+ def used_for_type?(type)
12
+ type == Integer
13
+ end
12
14
 
13
15
  sig { override.params(field: Field, value: Value).returns(Result[Target, CoercionError]) }
14
- def self.coerce(field:, value:)
16
+ def coerce(field:, value:)
15
17
  Success.new(Integer(value))
16
18
  rescue ArgumentError, TypeError
17
19
  Failure.new(CoercionError.new("'#{value}' cannot be coerced into Integer."))
@@ -2,16 +2,18 @@
2
2
 
3
3
  module Typed
4
4
  module Coercion
5
- class StringCoercer
6
- extend T::Sig
5
+ class StringCoercer < Coercer
7
6
  extend T::Generic
8
7
 
9
- extend Coercer
8
+ Target = type_member { {fixed: String} }
10
9
 
11
- Target = type_template { {fixed: String} }
10
+ sig { override.params(type: T::Class[T.anything]).returns(T::Boolean) }
11
+ def used_for_type?(type)
12
+ type == String
13
+ end
12
14
 
13
15
  sig { override.params(field: Field, value: Value).returns(Result[Target, CoercionError]) }
14
- def self.coerce(field:, value:)
16
+ def coerce(field:, value:)
15
17
  Success.new(String(value))
16
18
  end
17
19
  end
@@ -2,16 +2,18 @@
2
2
 
3
3
  module Typed
4
4
  module Coercion
5
- class StructCoercer
6
- extend T::Sig
5
+ class StructCoercer < Coercer
7
6
  extend T::Generic
8
7
 
9
- extend Coercer
8
+ Target = type_member { {fixed: T::Struct} }
10
9
 
11
- Target = type_template { {fixed: T::Struct} }
10
+ sig { override.params(type: T::Class[T.anything]).returns(T::Boolean) }
11
+ def used_for_type?(type)
12
+ !!(type < T::Struct)
13
+ end
12
14
 
13
15
  sig { override.params(field: Field, value: Value).returns(Result[Target, CoercionError]) }
14
- def self.coerce(field:, value:)
16
+ def coerce(field:, value:)
15
17
  type = field.type
16
18
 
17
19
  return Failure.new(CoercionError.new("Field type must inherit from T::Struct for Struct coercion.")) unless type < T::Struct
@@ -4,23 +4,18 @@ module Typed
4
4
  module Coercion
5
5
  extend T::Sig
6
6
 
7
- # TODO: We can definitely improve how we select which coercer to use
8
- # Related issues:
9
- # * https://github.com/maxveldink/sorbet-schema/issues/9
10
- # * https://github.com/maxveldink/sorbet-schema/issues/10
7
+ sig { params(coercer: T.class_of(Coercer)).void }
8
+ def self.register_coercer(coercer)
9
+ CoercerRegistry.instance.register(coercer)
10
+ end
11
+
11
12
  sig { type_parameters(:U).params(field: Field, value: Value).returns(Result[Value, CoercionError]) }
12
13
  def self.coerce(field:, value:)
13
- if field.type < T::Struct
14
- StructCoercer.coerce(field: field, value: value)
15
- elsif field.type == String
16
- StringCoercer.coerce(field: field, value: value)
17
- elsif field.type == Integer
18
- IntegerCoercer.coerce(field: field, value: value)
19
- elsif field.type == Float
20
- FloatCoercer.coerce(field: field, value: value)
21
- else
22
- Failure.new(CoercionNotSupportedError.new)
23
- end
14
+ coercer = CoercerRegistry.instance.select_coercer_by(type: field.type)
15
+
16
+ return Failure.new(CoercionNotSupportedError.new) unless coercer
17
+
18
+ coercer.new.coerce(field: field, value: value)
24
19
  end
25
20
  end
26
21
  end
@@ -2,5 +2,16 @@
2
2
 
3
3
  module Typed
4
4
  class DeserializeError < StandardError
5
+ extend T::Sig
6
+
7
+ sig { returns({error: String}) }
8
+ def to_h
9
+ {error: message}
10
+ end
11
+
12
+ sig { returns(String) }
13
+ def to_json
14
+ JSON.generate(to_h)
15
+ end
5
16
  end
6
17
  end
@@ -0,0 +1,14 @@
1
+ {
2
+ "release-type": "ruby",
3
+ "packages": {
4
+ ".": {
5
+ "monorepo-tags": false,
6
+ "include-component-in-tag": false,
7
+ "prerelease": false,
8
+ "bump-minor-pre-major": true,
9
+ "bump-patch-for-minor-pre-major": true,
10
+ "package-name": "sorbet-schema",
11
+ "version-file": "lib/sorbet-schema/version.rb"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.0"
3
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max VelDink
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-05 00:00:00.000000000 Z
11
+ date: 2024-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-result
@@ -66,7 +66,7 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.6'
69
- description:
69
+ description:
70
70
  email:
71
71
  - maxveldink@gmail.com
72
72
  executables: []
@@ -89,6 +89,7 @@ files:
89
89
  - lib/sorbet-schema/version.rb
90
90
  - lib/typed/coercion.rb
91
91
  - lib/typed/coercion/coercer.rb
92
+ - lib/typed/coercion/coercer_registry.rb
92
93
  - lib/typed/coercion/coercion_error.rb
93
94
  - lib/typed/coercion/coercion_not_supported_error.rb
94
95
  - lib/typed/coercion/float_coercer.rb
@@ -111,6 +112,8 @@ files:
111
112
  - lib/typed/validations/validated_value.rb
112
113
  - lib/typed/validations/validation_error.rb
113
114
  - lib/typed/validations/validation_results.rb
115
+ - release-please-config.json
116
+ - release-please-manifest.json
114
117
  - sorbet/config
115
118
  - sorbet/rbi/annotations/rainbow.rbi
116
119
  - sorbet/rbi/gems/.gitattributes
@@ -169,7 +172,7 @@ metadata:
169
172
  homepage_uri: https://github.com/maxveldink/sorbet-schema
170
173
  source_code_uri: https://github.com/maxveldink/sorbet-schema
171
174
  changelog_uri: https://github.com/maxveldink/sorbet-schema/blob/main/CHANGELOG.md
172
- post_install_message:
175
+ post_install_message:
173
176
  rdoc_options: []
174
177
  require_paths:
175
178
  - lib
@@ -184,8 +187,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
187
  - !ruby/object:Gem::Version
185
188
  version: '0'
186
189
  requirements: []
187
- rubygems_version: 3.5.6
188
- signing_key:
190
+ rubygems_version: 3.5.3
191
+ signing_key:
189
192
  specification_version: 4
190
193
  summary: Serialization and deserialization library into Sorbet structs.
191
194
  test_files: []