kind 2.2.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/.travis.sh +37 -12
  4. data/.travis.yml +10 -4
  5. data/CHANGELOG.md +1230 -0
  6. data/Gemfile +10 -2
  7. data/README.md +938 -460
  8. data/lib/kind.rb +52 -298
  9. data/lib/kind/active_model/kind_validator.rb +7 -7
  10. data/lib/kind/core.rb +9 -0
  11. data/lib/kind/core/deprecation.rb +29 -0
  12. data/lib/kind/core/kind.rb +61 -0
  13. data/lib/kind/core/undefined.rb +7 -0
  14. data/lib/kind/deprecations/built_in_type_checkers.rb +23 -0
  15. data/lib/kind/deprecations/checker.rb +16 -0
  16. data/lib/kind/deprecations/checker/factory.rb +31 -0
  17. data/lib/kind/deprecations/checker/protocol.rb +73 -0
  18. data/lib/kind/deprecations/is.rb +35 -0
  19. data/lib/kind/deprecations/of.rb +258 -0
  20. data/lib/kind/{types.rb → deprecations/types.rb} +15 -9
  21. data/lib/kind/dig.rb +40 -0
  22. data/lib/kind/empty.rb +5 -11
  23. data/lib/kind/error.rb +2 -6
  24. data/lib/kind/maybe.rb +22 -113
  25. data/lib/kind/maybe/none.rb +57 -0
  26. data/lib/kind/maybe/result.rb +51 -0
  27. data/lib/kind/maybe/some.rb +90 -0
  28. data/lib/kind/maybe/typed.rb +29 -0
  29. data/lib/kind/maybe/wrappable.rb +35 -0
  30. data/lib/kind/presence.rb +33 -0
  31. data/lib/kind/try.rb +36 -0
  32. data/lib/kind/type_checker.rb +73 -0
  33. data/lib/kind/type_checkers.rb +30 -0
  34. data/lib/kind/type_checkers/core/array.rb +17 -0
  35. data/lib/kind/type_checkers/core/class.rb +13 -0
  36. data/lib/kind/type_checkers/core/comparable.rb +13 -0
  37. data/lib/kind/type_checkers/core/enumerable.rb +13 -0
  38. data/lib/kind/type_checkers/core/enumerator.rb +13 -0
  39. data/lib/kind/type_checkers/core/file.rb +13 -0
  40. data/lib/kind/type_checkers/core/float.rb +13 -0
  41. data/lib/kind/type_checkers/core/hash.rb +17 -0
  42. data/lib/kind/type_checkers/core/integer.rb +13 -0
  43. data/lib/kind/type_checkers/core/io.rb +13 -0
  44. data/lib/kind/type_checkers/core/method.rb +13 -0
  45. data/lib/kind/type_checkers/core/module.rb +17 -0
  46. data/lib/kind/type_checkers/core/numeric.rb +13 -0
  47. data/lib/kind/type_checkers/core/proc.rb +13 -0
  48. data/lib/kind/type_checkers/core/queue.rb +14 -0
  49. data/lib/kind/type_checkers/core/range.rb +13 -0
  50. data/lib/kind/type_checkers/core/regexp.rb +13 -0
  51. data/lib/kind/type_checkers/core/string.rb +17 -0
  52. data/lib/kind/type_checkers/core/struct.rb +13 -0
  53. data/lib/kind/type_checkers/core/symbol.rb +13 -0
  54. data/lib/kind/type_checkers/core/time.rb +13 -0
  55. data/lib/kind/type_checkers/custom/boolean.rb +19 -0
  56. data/lib/kind/type_checkers/custom/callable.rb +19 -0
  57. data/lib/kind/type_checkers/custom/lambda.rb +19 -0
  58. data/lib/kind/type_checkers/stdlib/open_struct.rb +13 -0
  59. data/lib/kind/type_checkers/stdlib/set.rb +17 -0
  60. data/lib/kind/undefined.rb +4 -2
  61. data/lib/kind/validator.rb +1 -1
  62. data/lib/kind/version.rb +1 -1
  63. data/test.sh +4 -4
  64. metadata +52 -7
  65. data/lib/kind/checker.rb +0 -83
  66. data/lib/kind/is.rb +0 -19
  67. data/lib/kind/of.rb +0 -11
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Proc
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Proc; end
8
+ end
9
+
10
+ def self.Proc?(*values)
11
+ KIND.of?(::Proc, values)
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Queue
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Queue; end
8
+ def name; 'Queue'; end
9
+ end
10
+
11
+ def self.Queue?(*values)
12
+ KIND.of?(::Queue, values)
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Range
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Range; end
8
+ end
9
+
10
+ def self.Range?(*values)
11
+ KIND.of?(::Range, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Regexp
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Regexp; end
8
+ end
9
+
10
+ def self.Regexp?(*values)
11
+ KIND.of?(::Regexp, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module String
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::String; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::STRING)
11
+ end
12
+ end
13
+
14
+ def self.String?(*values)
15
+ KIND.of?(::String, values)
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Struct
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Struct; end
8
+ end
9
+
10
+ def self.Struct?(*values)
11
+ KIND.of?(::Struct, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Symbol
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Symbol; end
8
+ end
9
+
10
+ def self.Symbol?(*values)
11
+ KIND.of?(::Symbol, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Time
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Time; end
8
+ end
9
+
10
+ def self.Time?(*values)
11
+ KIND.of?(::Time, values)
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Boolean
5
+ extend self, TypeChecker
6
+
7
+ def kind; [TrueClass, FalseClass].freeze; end
8
+
9
+ def name; 'Boolean'; end
10
+
11
+ def ===(value)
12
+ ::TrueClass === value || ::FalseClass === value
13
+ end
14
+ end
15
+
16
+ def self.Boolean?(*values)
17
+ KIND.of?(Boolean, values)
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Callable
5
+ extend self, TypeChecker
6
+
7
+ def kind; raise NotImplementedError; end
8
+
9
+ def name; 'Callable'; end
10
+
11
+ def ===(value)
12
+ value.respond_to?(:call)
13
+ end
14
+ end
15
+
16
+ def self.Callable?(*values)
17
+ KIND.of?(Callable, values)
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Lambda
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Proc; end
8
+
9
+ def name; 'Lambda'; end
10
+
11
+ def ===(value)
12
+ value.kind_of?(::Proc) && value.lambda?
13
+ end
14
+ end
15
+
16
+ def self.Lambda?(*values)
17
+ KIND.of?(Lambda, values)
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module OpenStruct
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::OpenStruct; end
8
+ end
9
+
10
+ def self.OpenStruct?(*values)
11
+ KIND.of?(::OpenStruct, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Set
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Set; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::SET)
11
+ end
12
+ end
13
+
14
+ def self.Set?(*values)
15
+ KIND.of?(::Set, values)
16
+ end
17
+ end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
-
3
2
  module Kind
4
3
  Undefined = Object.new.tap do |undefined|
5
4
  def undefined.inspect
@@ -19,9 +18,12 @@ module Kind
19
18
  end
20
19
 
21
20
  def undefined.default(value, default)
22
- return self if self != value
21
+ return value if self != value
23
22
 
24
23
  default.respond_to?(:call) ? default.call : default
25
24
  end
25
+
26
+ undefined.inspect
27
+ undefined.freeze
26
28
  end
27
29
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Validator
5
- DEFAULT_STRATEGIES = Set.new(%w[instance_of kind_of]).freeze
5
+ DEFAULT_STRATEGIES = ::Set.new(%w[instance_of kind_of]).freeze
6
6
 
7
7
  class InvalidDefinition < ArgumentError
8
8
  OPTIONS = 'Options to define one: :of, :is, :respond_to, :instance_of, :array_of or :array_with'.freeze
data/lib/kind/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kind
4
- VERSION = '2.2.0'
4
+ VERSION = '4.0.0'
5
5
  end
data/test.sh CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/bin/bash
2
2
 
3
- bundle
4
-
5
- rm Gemfile.lock
6
-
7
3
  source $(dirname $0)/.travis.sh
8
4
 
5
+ echo ''
6
+ echo 'Resetting Gemfile'
7
+ echo ''
8
+
9
9
  rm Gemfile.lock
10
10
 
11
11
  bundle
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kind
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-23 00:00:00.000000000 Z
11
+ date: 2021-02-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple type system (at runtime) for Ruby - free of dependencies.
14
14
  email:
@@ -18,8 +18,10 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - ".gitignore"
21
+ - ".tool-versions"
21
22
  - ".travis.sh"
22
23
  - ".travis.yml"
24
+ - CHANGELOG.md
23
25
  - CODE_OF_CONDUCT.md
24
26
  - Gemfile
25
27
  - LICENSE.txt
@@ -31,13 +33,56 @@ files:
31
33
  - lib/kind.rb
32
34
  - lib/kind/active_model/kind_validator.rb
33
35
  - lib/kind/active_model/validation.rb
34
- - lib/kind/checker.rb
36
+ - lib/kind/core.rb
37
+ - lib/kind/core/deprecation.rb
38
+ - lib/kind/core/kind.rb
39
+ - lib/kind/core/undefined.rb
40
+ - lib/kind/deprecations/built_in_type_checkers.rb
41
+ - lib/kind/deprecations/checker.rb
42
+ - lib/kind/deprecations/checker/factory.rb
43
+ - lib/kind/deprecations/checker/protocol.rb
44
+ - lib/kind/deprecations/is.rb
45
+ - lib/kind/deprecations/of.rb
46
+ - lib/kind/deprecations/types.rb
47
+ - lib/kind/dig.rb
35
48
  - lib/kind/empty.rb
36
49
  - lib/kind/error.rb
37
- - lib/kind/is.rb
38
50
  - lib/kind/maybe.rb
39
- - lib/kind/of.rb
40
- - lib/kind/types.rb
51
+ - lib/kind/maybe/none.rb
52
+ - lib/kind/maybe/result.rb
53
+ - lib/kind/maybe/some.rb
54
+ - lib/kind/maybe/typed.rb
55
+ - lib/kind/maybe/wrappable.rb
56
+ - lib/kind/presence.rb
57
+ - lib/kind/try.rb
58
+ - lib/kind/type_checker.rb
59
+ - lib/kind/type_checkers.rb
60
+ - lib/kind/type_checkers/core/array.rb
61
+ - lib/kind/type_checkers/core/class.rb
62
+ - lib/kind/type_checkers/core/comparable.rb
63
+ - lib/kind/type_checkers/core/enumerable.rb
64
+ - lib/kind/type_checkers/core/enumerator.rb
65
+ - lib/kind/type_checkers/core/file.rb
66
+ - lib/kind/type_checkers/core/float.rb
67
+ - lib/kind/type_checkers/core/hash.rb
68
+ - lib/kind/type_checkers/core/integer.rb
69
+ - lib/kind/type_checkers/core/io.rb
70
+ - lib/kind/type_checkers/core/method.rb
71
+ - lib/kind/type_checkers/core/module.rb
72
+ - lib/kind/type_checkers/core/numeric.rb
73
+ - lib/kind/type_checkers/core/proc.rb
74
+ - lib/kind/type_checkers/core/queue.rb
75
+ - lib/kind/type_checkers/core/range.rb
76
+ - lib/kind/type_checkers/core/regexp.rb
77
+ - lib/kind/type_checkers/core/string.rb
78
+ - lib/kind/type_checkers/core/struct.rb
79
+ - lib/kind/type_checkers/core/symbol.rb
80
+ - lib/kind/type_checkers/core/time.rb
81
+ - lib/kind/type_checkers/custom/boolean.rb
82
+ - lib/kind/type_checkers/custom/callable.rb
83
+ - lib/kind/type_checkers/custom/lambda.rb
84
+ - lib/kind/type_checkers/stdlib/open_struct.rb
85
+ - lib/kind/type_checkers/stdlib/set.rb
41
86
  - lib/kind/undefined.rb
42
87
  - lib/kind/validator.rb
43
88
  - lib/kind/version.rb
@@ -63,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
108
  - !ruby/object:Gem::Version
64
109
  version: '0'
65
110
  requirements: []
66
- rubygems_version: 3.0.6
111
+ rubygems_version: 3.1.4
67
112
  signing_key:
68
113
  specification_version: 4
69
114
  summary: A simple type system (at runtime) for Ruby.
data/lib/kind/checker.rb DELETED
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Checkable
5
- def class?(value)
6
- Kind::Is.__call__(__kind, value)
7
- end
8
-
9
- def instance(value, options = Empty::HASH)
10
- default = options[:or]
11
-
12
- return Kind::Of.(__kind, value) if ::Kind::Maybe::Value.none?(default)
13
-
14
- Kind::Undefined != value && instance?(value) ? value : Kind::Of.(__kind, default)
15
- end
16
-
17
- def [](value, options = options = Empty::HASH)
18
- instance(value, options)
19
- end
20
-
21
- def to_proc
22
- @to_proc ||=
23
- -> checker { -> value { checker.instance(value) } }.call(self)
24
- end
25
-
26
- def __is_instance__(value)
27
- value.kind_of?(__kind)
28
- end
29
-
30
- def is_instance_to_proc
31
- @is_instance_to_proc ||=
32
- -> checker { -> value { checker.__is_instance__(value) } }.call(self)
33
- end
34
-
35
- def instance?(*args)
36
- return is_instance_to_proc if args.empty?
37
-
38
- return args.all? { |object| __is_instance__(object) } if args.size > 1
39
-
40
- arg = args[0]
41
- Kind::Undefined == arg ? is_instance_to_proc : __is_instance__(arg)
42
- end
43
-
44
- def or_nil(value)
45
- return value if instance?(value)
46
- end
47
-
48
- def or_undefined(value)
49
- or_nil(value) || Kind::Undefined
50
- end
51
-
52
- def __as_maybe__(value)
53
- Kind::Maybe.new(or_nil(value))
54
- end
55
-
56
- def as_maybe_to_proc
57
- @as_maybe_to_proc ||=
58
- -> checker { -> value { checker.__as_maybe__(value) } }.call(self)
59
- end
60
-
61
- def as_maybe(value = Kind::Undefined)
62
- return __as_maybe__(value) if Kind::Undefined != value
63
-
64
- as_maybe_to_proc
65
- end
66
-
67
- def as_optional(value = Kind::Undefined)
68
- as_maybe(value)
69
- end
70
- end
71
-
72
- private_constant :Checkable
73
-
74
- class Checker
75
- include Checkable
76
-
77
- attr_reader :__kind
78
-
79
- def initialize(kind)
80
- @__kind = kind
81
- end
82
- end
83
- end