uinit-type 0.1.4 → 0.1.5
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 +4 -4
- data/README.md +0 -3
- data/lib/uinit/type/composition.rb +0 -2
- data/lib/uinit/type/context.rb +6 -6
- data/lib/uinit/type/float.rb +70 -0
- data/lib/uinit/type/fn.rb +1 -1
- data/lib/uinit/type/integer.rb +49 -0
- data/lib/uinit/type/{hash_of.rb → schema.rb} +1 -1
- data/lib/uinit/type/string.rb +49 -0
- data/lib/uinit/type/version.rb +1 -1
- data/lib/uinit/type.rb +1 -1
- data/uinit-type.gemspec +0 -5
- metadata +7 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bd4a4dd91cfd1b86c516b8a94c0449f01e410222900c73f352a6cba5c9d701f
|
4
|
+
data.tar.gz: 050b3c0341ec1abdb28bfb876487ca56a1572c2cdc8e7b2eb9455c59c88d857c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eec7569793abefa92343963566c67dddc2486bd1576973f4dcb8e2aa2ffa49699a26726cad42e00c6b9f38cd4017624705eb22cb1aa6c029a100a3a848d0e390
|
7
|
+
data.tar.gz: 1f0ce366d5488199b402e5fa4d291291e5543b1847892f600a405e194cb5b405976da6ee83dec1d22f1d993cf1381a16113dcb3b4c20feb976b30ecc70b4db47
|
data/README.md
CHANGED
data/lib/uinit/type/context.rb
CHANGED
@@ -5,10 +5,10 @@ module Uinit
|
|
5
5
|
module Context
|
6
6
|
Nil = Const[nil].freeze
|
7
7
|
Boolean = (Const[true] | Const[false]).freeze
|
8
|
-
Str =
|
8
|
+
Str = String.freeze
|
9
9
|
Sym = TypeOf[Symbol].freeze
|
10
|
-
Int =
|
11
|
-
Float =
|
10
|
+
Int = Integer.freeze
|
11
|
+
Float = Float.freeze
|
12
12
|
Hsh = TypeOf[Hash].freeze
|
13
13
|
Arr = TypeOf[Array].freeze
|
14
14
|
|
@@ -32,15 +32,15 @@ module Uinit
|
|
32
32
|
Fn.new(arity)
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
35
|
+
def schema(schema, strict: false)
|
36
|
+
Schema.new(schema, strict:)
|
37
37
|
end
|
38
38
|
|
39
39
|
def impl(*, **)
|
40
40
|
Impl.new(*, **)
|
41
41
|
end
|
42
42
|
|
43
|
-
def set_of(type)
|
43
|
+
def set_of(type)
|
44
44
|
SetOf.new(type)
|
45
45
|
end
|
46
46
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Uinit
|
4
|
+
module Type
|
5
|
+
class Float < TypeOf
|
6
|
+
# rubocop:disable Metrics/ParameterLists
|
7
|
+
def initialize(min: nil, max: nil, positive: nil, negative: nil, zero: nil, precision: nil, finite: true)
|
8
|
+
super(::Float)
|
9
|
+
|
10
|
+
@min = min
|
11
|
+
@max = max
|
12
|
+
@positive = positive
|
13
|
+
@negative = negative
|
14
|
+
@zero = zero
|
15
|
+
@precision = precision
|
16
|
+
@finite = finite
|
17
|
+
end
|
18
|
+
# rubocop:enable Metrics/ParameterLists
|
19
|
+
|
20
|
+
attr_reader :min, :max, :positive, :negative, :zero, :precision, :finite
|
21
|
+
|
22
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
23
|
+
def is?(value)
|
24
|
+
return false unless super
|
25
|
+
|
26
|
+
return false if finite && !value.finite?
|
27
|
+
return false if min && value < min
|
28
|
+
return false if max && value > max
|
29
|
+
return false if positive == false && value.positive?
|
30
|
+
return false if positive == true && value <= 0
|
31
|
+
return false if negative == false && value.negative?
|
32
|
+
return false if negative == true && value >= 0
|
33
|
+
return false if zero == false && value.zero?
|
34
|
+
return false if zero == true && !value.zero?
|
35
|
+
return false if precision && !valid_precision?(value)
|
36
|
+
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
def check!(value, depth)
|
41
|
+
type_error!('Float must be finite (not Infinity or NaN)', depth) if finite && !value.finite?
|
42
|
+
type_error!("Float too small (minimum #{min})", depth) if min && value < min
|
43
|
+
type_error!("Float too large (maximum #{max})", depth) if max && value > max
|
44
|
+
type_error!('Float cannot be positive', depth) if positive == false && value.positive?
|
45
|
+
type_error!('Float must be positive', depth) if positive == true && value <= 0
|
46
|
+
type_error!('Float cannot be negative', depth) if negative == false && value.negative?
|
47
|
+
type_error!('Float must be negative', depth) if negative == true && value >= 0
|
48
|
+
type_error!('Float cannot be zero', depth) if zero == false && value.zero?
|
49
|
+
type_error!('Float must be zero', depth) if zero == true && !value.zero?
|
50
|
+
|
51
|
+
if precision && !valid_precision?(value)
|
52
|
+
type_error!("Float exceeds maximum precision of #{precision} decimal places", depth)
|
53
|
+
end
|
54
|
+
|
55
|
+
value
|
56
|
+
end
|
57
|
+
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def valid_precision?(value)
|
62
|
+
return true if precision.nil?
|
63
|
+
|
64
|
+
# Compter les décimales
|
65
|
+
decimal_places = value.to_s.split('.').last&.length || 0
|
66
|
+
decimal_places <= precision
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/uinit/type/fn.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Uinit
|
4
|
+
module Type
|
5
|
+
class Integer < TypeOf
|
6
|
+
def initialize(min: nil, max: nil, positive: nil, negative: nil, zero: nil)
|
7
|
+
super(::Integer)
|
8
|
+
|
9
|
+
@min = min
|
10
|
+
@max = max
|
11
|
+
@positive = positive
|
12
|
+
@negative = negative
|
13
|
+
@zero = zero
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :min, :max, :positive, :negative, :zero
|
17
|
+
|
18
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
19
|
+
def is?(value)
|
20
|
+
return false unless super
|
21
|
+
|
22
|
+
return false if min && value < min
|
23
|
+
return false if max && value > max
|
24
|
+
return false if positive == false && value.positive?
|
25
|
+
return false if positive == true && value <= 0
|
26
|
+
return false if negative == false && value.negative?
|
27
|
+
return false if negative == true && value >= 0
|
28
|
+
return false if zero == false && value.zero?
|
29
|
+
return false if zero == true && !value.zero?
|
30
|
+
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def check!(value, depth)
|
35
|
+
type_error!("Integer too small (minimum #{min})", depth) if min && value < min
|
36
|
+
type_error!("Integer too large (maximum #{max})", depth) if max && value > max
|
37
|
+
type_error!('Integer cannot be positive', depth) if positive == false && value.positive?
|
38
|
+
type_error!('Integer must be positive', depth) if positive == true && value <= 0
|
39
|
+
type_error!('Integer cannot be negative', depth) if negative == false && value.negative?
|
40
|
+
type_error!('Integer must be negative', depth) if negative == true && value >= 0
|
41
|
+
type_error!('Integer cannot be zero', depth) if zero == false && value.zero?
|
42
|
+
type_error!('Integer must be zero', depth) if zero == true && !value.zero?
|
43
|
+
|
44
|
+
value
|
45
|
+
end
|
46
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Uinit
|
4
|
+
module Type
|
5
|
+
class String < TypeOf
|
6
|
+
def initialize(empty: true, min_length: nil, max_length: nil, format: nil)
|
7
|
+
super(::String)
|
8
|
+
|
9
|
+
@empty = empty
|
10
|
+
@min_length = min_length
|
11
|
+
@max_length = max_length
|
12
|
+
@format = format
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :empty, :min_length, :max_length, :format
|
16
|
+
|
17
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
18
|
+
def is?(value)
|
19
|
+
return false unless super
|
20
|
+
|
21
|
+
return false if !empty && (value.empty? || value.match?(/^\s+$/))
|
22
|
+
return false if min_length && value.length < min_length
|
23
|
+
return false if max_length && value.length > max_length
|
24
|
+
return false if format && !value.match?(format)
|
25
|
+
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def check!(value, depth)
|
30
|
+
if !empty && (value.empty? || value.match?(/^\s+$/))
|
31
|
+
type_error!('String cannot be empty or contain only whitespace', depth)
|
32
|
+
end
|
33
|
+
|
34
|
+
if min_length && value.length < min_length
|
35
|
+
type_error!("String too short (minimum #{min_length} characters)", depth)
|
36
|
+
end
|
37
|
+
|
38
|
+
if max_length && value.length > max_length
|
39
|
+
type_error!("String too long (maximum #{max_length} characters)", depth)
|
40
|
+
end
|
41
|
+
|
42
|
+
type_error!('String doesn\'t match required pattern', depth) if format && !value.match?(format)
|
43
|
+
|
44
|
+
value
|
45
|
+
end
|
46
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/uinit/type/version.rb
CHANGED
data/lib/uinit/type.rb
CHANGED
data/uinit-type.gemspec
CHANGED
@@ -28,10 +28,5 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_runtime_dependency 'zeitwerk', '~> 2.6'
|
30
30
|
|
31
|
-
spec.add_development_dependency 'bundler'
|
32
|
-
spec.add_development_dependency 'pry'
|
33
|
-
spec.add_development_dependency 'rake'
|
34
|
-
spec.add_development_dependency 'rspec'
|
35
|
-
spec.add_development_dependency 'rubocop'
|
36
31
|
spec.metadata['rubygems_mfa_required'] = 'true'
|
37
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uinit-type
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kimoja
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|
@@ -24,76 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.6'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: pry
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rubocop
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
27
|
description: Dynamic type checker
|
98
28
|
email:
|
99
29
|
- joakim.carrilho@cheerz.com
|
@@ -113,12 +43,15 @@ files:
|
|
113
43
|
- lib/uinit/type/context.rb
|
114
44
|
- lib/uinit/type/error.rb
|
115
45
|
- lib/uinit/type/extensions.rb
|
46
|
+
- lib/uinit/type/float.rb
|
116
47
|
- lib/uinit/type/fn.rb
|
117
48
|
- lib/uinit/type/generic.rb
|
118
|
-
- lib/uinit/type/hash_of.rb
|
119
49
|
- lib/uinit/type/impl.rb
|
50
|
+
- lib/uinit/type/integer.rb
|
120
51
|
- lib/uinit/type/operators.rb
|
52
|
+
- lib/uinit/type/schema.rb
|
121
53
|
- lib/uinit/type/set_of.rb
|
54
|
+
- lib/uinit/type/string.rb
|
122
55
|
- lib/uinit/type/type.rb
|
123
56
|
- lib/uinit/type/type_of.rb
|
124
57
|
- lib/uinit/type/version.rb
|
@@ -148,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
81
|
- !ruby/object:Gem::Version
|
149
82
|
version: '0'
|
150
83
|
requirements: []
|
151
|
-
rubygems_version: 3.
|
84
|
+
rubygems_version: 3.5.3
|
152
85
|
signing_key:
|
153
86
|
specification_version: 4
|
154
87
|
summary: Dynamic type checker
|