core-type 0.0.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 +7 -0
- data/CHANGELOG.md +7 -0
- data/LICENSE +353 -0
- data/README.md +4 -0
- data/lib/core/type/check_failed.rb +12 -0
- data/lib/core/type/coercions/array.rb +23 -0
- data/lib/core/type/coercions/decimal.rb +26 -0
- data/lib/core/type/coercions/float.rb +23 -0
- data/lib/core/type/coercions/hash.rb +23 -0
- data/lib/core/type/coercions/integer.rb +23 -0
- data/lib/core/type/coercions/string.rb +23 -0
- data/lib/core/type/coercions/symbol.rb +23 -0
- data/lib/core/type/coercions.rb +17 -0
- data/lib/core/type/composed.rb +72 -0
- data/lib/core/type/conversions/array.rb +19 -0
- data/lib/core/type/conversions/decimal.rb +26 -0
- data/lib/core/type/conversions/float.rb +28 -0
- data/lib/core/type/conversions/hash.rb +27 -0
- data/lib/core/type/conversions/integer.rb +28 -0
- data/lib/core/type/conversions/string.rb +23 -0
- data/lib/core/type/conversions/symbol.rb +36 -0
- data/lib/core/type/conversions.rb +17 -0
- data/lib/core/type/error.rb +10 -0
- data/lib/core/type/inputs/array.rb +31 -0
- data/lib/core/type/inputs/boolean.rb +58 -0
- data/lib/core/type/inputs/date.rb +21 -0
- data/lib/core/type/inputs/date_time.rb +21 -0
- data/lib/core/type/inputs/decimal.rb +11 -0
- data/lib/core/type/inputs/float.rb +11 -0
- data/lib/core/type/inputs/hash.rb +31 -0
- data/lib/core/type/inputs/integer.rb +11 -0
- data/lib/core/type/inputs/string.rb +11 -0
- data/lib/core/type/inputs/symbol.rb +11 -0
- data/lib/core/type/inputs/time.rb +21 -0
- data/lib/core/type/inputs.rb +21 -0
- data/lib/core/type/types/array.rb +25 -0
- data/lib/core/type/types/boolean.rb +25 -0
- data/lib/core/type/types/class.rb +25 -0
- data/lib/core/type/types/date.rb +25 -0
- data/lib/core/type/types/date_time.rb +27 -0
- data/lib/core/type/types/decimal.rb +27 -0
- data/lib/core/type/types/false.rb +25 -0
- data/lib/core/type/types/float.rb +25 -0
- data/lib/core/type/types/hash.rb +25 -0
- data/lib/core/type/types/integer.rb +25 -0
- data/lib/core/type/types/nil.rb +25 -0
- data/lib/core/type/types/object.rb +25 -0
- data/lib/core/type/types/string.rb +25 -0
- data/lib/core/type/types/symbol.rb +25 -0
- data/lib/core/type/types/time.rb +25 -0
- data/lib/core/type/types/true.rb +25 -0
- data/lib/core/type/types.rb +26 -0
- data/lib/core/type/validator.rb +37 -0
- data/lib/core/type/version.rb +13 -0
- data/lib/core/type.rb +19 -0
- data/lib/is/typed.rb +112 -0
- metadata +153 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict hash type.
|
9
|
+
#
|
10
|
+
class Hash
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a hash" do |value|
|
20
|
+
value.is_a?(::Hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict integer type.
|
9
|
+
#
|
10
|
+
class Integer
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a integer" do |value|
|
20
|
+
value.is_a?(::Integer)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict nil type.
|
9
|
+
#
|
10
|
+
class Nil
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(...)
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be nil" do |value|
|
20
|
+
value.is_a?(NilClass)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict object type.
|
9
|
+
#
|
10
|
+
class Object
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a object" do |value|
|
20
|
+
value.is_a?(::Object)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict string type.
|
9
|
+
#
|
10
|
+
class String
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a string" do |value|
|
20
|
+
value.is_a?(::String)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict symbol type.
|
9
|
+
#
|
10
|
+
class Symbol
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a symbol" do |value|
|
20
|
+
value.is_a?(::Symbol)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict time type.
|
9
|
+
#
|
10
|
+
class Time
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be a time" do |value|
|
20
|
+
value.is_a?(::Time)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../is/typed"
|
4
|
+
|
5
|
+
module Core
|
6
|
+
module Type
|
7
|
+
module Types
|
8
|
+
# [public] Strict true type.
|
9
|
+
#
|
10
|
+
class True
|
11
|
+
include Is::Typed
|
12
|
+
|
13
|
+
# [public]
|
14
|
+
#
|
15
|
+
def self.build(value)
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
check "must be true" do |value|
|
20
|
+
value.is_a?(::TrueClass)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Core
|
4
|
+
module Type
|
5
|
+
# [public] Default strict types.
|
6
|
+
#
|
7
|
+
module Types
|
8
|
+
require_relative "types/array"
|
9
|
+
require_relative "types/boolean"
|
10
|
+
require_relative "types/class"
|
11
|
+
require_relative "types/date"
|
12
|
+
require_relative "types/date_time"
|
13
|
+
require_relative "types/decimal"
|
14
|
+
require_relative "types/false"
|
15
|
+
require_relative "types/float"
|
16
|
+
require_relative "types/hash"
|
17
|
+
require_relative "types/integer"
|
18
|
+
require_relative "types/nil"
|
19
|
+
require_relative "types/object"
|
20
|
+
require_relative "types/string"
|
21
|
+
require_relative "types/symbol"
|
22
|
+
require_relative "types/time"
|
23
|
+
require_relative "types/true"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "is/pipeline"
|
4
|
+
|
5
|
+
require_relative "check_failed"
|
6
|
+
|
7
|
+
module Core
|
8
|
+
module Type
|
9
|
+
# [public]
|
10
|
+
#
|
11
|
+
class Validator
|
12
|
+
include Is::Pipeline
|
13
|
+
|
14
|
+
def initialize(type)
|
15
|
+
@type = type
|
16
|
+
end
|
17
|
+
|
18
|
+
def check(description = nil, &block)
|
19
|
+
action do |value, safe = false|
|
20
|
+
unless block.call(value)
|
21
|
+
if safe
|
22
|
+
halt(false)
|
23
|
+
else
|
24
|
+
raise CheckFailed, if description.nil?
|
25
|
+
"#{value.inspect} did not pass the constraint defined by #{@type}"
|
26
|
+
else
|
27
|
+
"#{value.inspect} did not pass the constraint defined by #{@type} (#{description})"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/core/type.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Core
|
4
|
+
module Type
|
5
|
+
require_relative "type/check_failed"
|
6
|
+
require_relative "type/coercions"
|
7
|
+
require_relative "type/composed"
|
8
|
+
require_relative "type/conversions"
|
9
|
+
require_relative "type/inputs"
|
10
|
+
require_relative "type/types"
|
11
|
+
require_relative "type/version"
|
12
|
+
|
13
|
+
# Allow default strict types to be accessed through the top-level `Core::Type` namespace.
|
14
|
+
#
|
15
|
+
include Types
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require_relative "../is/typed"
|
data/lib/is/typed.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "is/extension"
|
4
|
+
require "is/global"
|
5
|
+
require "is/stateful"
|
6
|
+
|
7
|
+
require_relative "../core/type/composed"
|
8
|
+
require_relative "../core/type/validator"
|
9
|
+
|
10
|
+
module Is
|
11
|
+
# [public]
|
12
|
+
#
|
13
|
+
module Typed
|
14
|
+
extend Is::Extension
|
15
|
+
|
16
|
+
extends :definition do
|
17
|
+
# [public]
|
18
|
+
#
|
19
|
+
def check(description = nil, &block)
|
20
|
+
validator.check(description, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# [public]
|
24
|
+
#
|
25
|
+
def normalize(value)
|
26
|
+
value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
extends :definition, prepend: true do
|
31
|
+
# [public]
|
32
|
+
#
|
33
|
+
def build(value = nil)
|
34
|
+
global.build(value)
|
35
|
+
end
|
36
|
+
|
37
|
+
# [public]
|
38
|
+
#
|
39
|
+
def |(other)
|
40
|
+
Core::Type::Composed.new(self) | other
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
extends :implementation do
|
45
|
+
# [public]
|
46
|
+
#
|
47
|
+
attr_reader :builder
|
48
|
+
|
49
|
+
# [public]
|
50
|
+
#
|
51
|
+
def build(value = nil)
|
52
|
+
finalize.build(value)
|
53
|
+
end
|
54
|
+
|
55
|
+
# [public]
|
56
|
+
#
|
57
|
+
def try(value = nil)
|
58
|
+
finalize.try(value)
|
59
|
+
end
|
60
|
+
|
61
|
+
# [public]
|
62
|
+
#
|
63
|
+
def valid?(value = nil)
|
64
|
+
finalize.valid?(value)
|
65
|
+
end
|
66
|
+
|
67
|
+
# [public]
|
68
|
+
#
|
69
|
+
def finalize
|
70
|
+
super if defined?(super)
|
71
|
+
|
72
|
+
@builder = self.class.method(:build).super_method
|
73
|
+
@normalizer = self.class.method(:normalize)
|
74
|
+
|
75
|
+
singleton_class.class_eval(<<~CODE, __FILE__, __LINE__ + 1)
|
76
|
+
def build(value = nil)
|
77
|
+
value = @normalizer.call(value)
|
78
|
+
@validator.call(value)
|
79
|
+
@builder.call(value)
|
80
|
+
rescue ArgumentError, TypeError => error
|
81
|
+
raise Core::Type::Error, error.message
|
82
|
+
end
|
83
|
+
|
84
|
+
def try(value = nil)
|
85
|
+
value = @normalizer.call(value)
|
86
|
+
if @validator.call(value, true)
|
87
|
+
@builder.call(value)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def valid?(value = nil)
|
92
|
+
value = @normalizer.call(value)
|
93
|
+
@validator.call(value, true)
|
94
|
+
end
|
95
|
+
CODE
|
96
|
+
|
97
|
+
self
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
extends dependencies: [
|
102
|
+
Is::Global,
|
103
|
+
Is::Stateful
|
104
|
+
]
|
105
|
+
|
106
|
+
applies do
|
107
|
+
# [public]
|
108
|
+
#
|
109
|
+
state :validator, default: Core::Type::Validator.new(self)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: core-type
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bryan Powell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: core-extension
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: core-global
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: core-pipeline
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.5'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: core-state
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.1'
|
69
|
+
description: Types for Ruby programs.
|
70
|
+
email: bryan@bryanp.org
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- CHANGELOG.md
|
76
|
+
- LICENSE
|
77
|
+
- README.md
|
78
|
+
- lib/core/type.rb
|
79
|
+
- lib/core/type/check_failed.rb
|
80
|
+
- lib/core/type/coercions.rb
|
81
|
+
- lib/core/type/coercions/array.rb
|
82
|
+
- lib/core/type/coercions/decimal.rb
|
83
|
+
- lib/core/type/coercions/float.rb
|
84
|
+
- lib/core/type/coercions/hash.rb
|
85
|
+
- lib/core/type/coercions/integer.rb
|
86
|
+
- lib/core/type/coercions/string.rb
|
87
|
+
- lib/core/type/coercions/symbol.rb
|
88
|
+
- lib/core/type/composed.rb
|
89
|
+
- lib/core/type/conversions.rb
|
90
|
+
- lib/core/type/conversions/array.rb
|
91
|
+
- lib/core/type/conversions/decimal.rb
|
92
|
+
- lib/core/type/conversions/float.rb
|
93
|
+
- lib/core/type/conversions/hash.rb
|
94
|
+
- lib/core/type/conversions/integer.rb
|
95
|
+
- lib/core/type/conversions/string.rb
|
96
|
+
- lib/core/type/conversions/symbol.rb
|
97
|
+
- lib/core/type/error.rb
|
98
|
+
- lib/core/type/inputs.rb
|
99
|
+
- lib/core/type/inputs/array.rb
|
100
|
+
- lib/core/type/inputs/boolean.rb
|
101
|
+
- lib/core/type/inputs/date.rb
|
102
|
+
- lib/core/type/inputs/date_time.rb
|
103
|
+
- lib/core/type/inputs/decimal.rb
|
104
|
+
- lib/core/type/inputs/float.rb
|
105
|
+
- lib/core/type/inputs/hash.rb
|
106
|
+
- lib/core/type/inputs/integer.rb
|
107
|
+
- lib/core/type/inputs/string.rb
|
108
|
+
- lib/core/type/inputs/symbol.rb
|
109
|
+
- lib/core/type/inputs/time.rb
|
110
|
+
- lib/core/type/types.rb
|
111
|
+
- lib/core/type/types/array.rb
|
112
|
+
- lib/core/type/types/boolean.rb
|
113
|
+
- lib/core/type/types/class.rb
|
114
|
+
- lib/core/type/types/date.rb
|
115
|
+
- lib/core/type/types/date_time.rb
|
116
|
+
- lib/core/type/types/decimal.rb
|
117
|
+
- lib/core/type/types/false.rb
|
118
|
+
- lib/core/type/types/float.rb
|
119
|
+
- lib/core/type/types/hash.rb
|
120
|
+
- lib/core/type/types/integer.rb
|
121
|
+
- lib/core/type/types/nil.rb
|
122
|
+
- lib/core/type/types/object.rb
|
123
|
+
- lib/core/type/types/string.rb
|
124
|
+
- lib/core/type/types/symbol.rb
|
125
|
+
- lib/core/type/types/time.rb
|
126
|
+
- lib/core/type/types/true.rb
|
127
|
+
- lib/core/type/validator.rb
|
128
|
+
- lib/core/type/version.rb
|
129
|
+
- lib/is/typed.rb
|
130
|
+
homepage: https://github.com/bryanp/corerb/
|
131
|
+
licenses:
|
132
|
+
- MPL-2.0
|
133
|
+
metadata: {}
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
require_paths:
|
137
|
+
- lib
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '3.0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
requirements: []
|
149
|
+
rubygems_version: 3.4.22
|
150
|
+
signing_key:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Types for Ruby programs.
|
153
|
+
test_files: []
|