kind 4.0.0 → 5.3.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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -1
  3. data/.travis.sh +39 -7
  4. data/.travis.yml +1 -2
  5. data/CHANGELOG.md +486 -28
  6. data/Gemfile +13 -6
  7. data/README.md +153 -49
  8. data/kind.gemspec +1 -1
  9. data/lib/kind.rb +2 -84
  10. data/lib/kind/__lib__/action_steps.rb +57 -0
  11. data/lib/kind/__lib__/attributes.rb +66 -0
  12. data/lib/kind/__lib__/kind.rb +51 -0
  13. data/lib/kind/__lib__/of.rb +17 -0
  14. data/lib/kind/__lib__/strict.rb +49 -0
  15. data/lib/kind/__lib__/undefined.rb +14 -0
  16. data/lib/kind/action.rb +127 -0
  17. data/lib/kind/active_model/validation.rb +3 -4
  18. data/lib/kind/basic.rb +79 -0
  19. data/lib/kind/basic/error.rb +29 -0
  20. data/lib/kind/{undefined.rb → basic/undefined.rb} +6 -1
  21. data/lib/kind/dig.rb +21 -5
  22. data/lib/kind/either.rb +30 -0
  23. data/lib/kind/either/left.rb +29 -0
  24. data/lib/kind/either/methods.rb +17 -0
  25. data/lib/kind/either/monad.rb +65 -0
  26. data/lib/kind/either/monad/wrapper.rb +19 -0
  27. data/lib/kind/either/right.rb +38 -0
  28. data/lib/kind/empty.rb +2 -2
  29. data/lib/kind/empty/constant.rb +7 -0
  30. data/lib/kind/enum.rb +63 -0
  31. data/lib/kind/enum/item.rb +40 -0
  32. data/lib/kind/enum/methods.rb +72 -0
  33. data/lib/kind/function.rb +45 -0
  34. data/lib/kind/functional.rb +89 -0
  35. data/lib/kind/functional/action.rb +90 -0
  36. data/lib/kind/immutable_attributes.rb +34 -0
  37. data/lib/kind/immutable_attributes/initializer.rb +70 -0
  38. data/lib/kind/immutable_attributes/reader.rb +38 -0
  39. data/lib/kind/maybe.rb +37 -12
  40. data/lib/kind/maybe/methods.rb +21 -0
  41. data/lib/kind/maybe/monad.rb +82 -0
  42. data/lib/kind/maybe/monad/wrapper.rb +19 -0
  43. data/lib/kind/maybe/none.rb +12 -19
  44. data/lib/kind/maybe/some.rb +68 -26
  45. data/lib/kind/maybe/typed.rb +11 -5
  46. data/lib/kind/maybe/{wrappable.rb → wrapper.rb} +9 -7
  47. data/lib/kind/monad.rb +22 -0
  48. data/lib/kind/monads.rb +5 -0
  49. data/lib/kind/objects.rb +17 -0
  50. data/lib/kind/objects/basic_object.rb +43 -0
  51. data/lib/kind/objects/modules.rb +32 -0
  52. data/lib/kind/{type_checkers → objects/modules}/core/array.rb +3 -1
  53. data/lib/kind/{type_checkers → objects/modules}/core/class.rb +1 -1
  54. data/lib/kind/{type_checkers → objects/modules}/core/comparable.rb +1 -1
  55. data/lib/kind/{type_checkers → objects/modules}/core/enumerable.rb +1 -1
  56. data/lib/kind/{type_checkers → objects/modules}/core/enumerator.rb +1 -1
  57. data/lib/kind/{type_checkers → objects/modules}/core/file.rb +1 -1
  58. data/lib/kind/{type_checkers → objects/modules}/core/float.rb +1 -1
  59. data/lib/kind/{type_checkers → objects/modules}/core/hash.rb +3 -1
  60. data/lib/kind/{type_checkers → objects/modules}/core/integer.rb +1 -1
  61. data/lib/kind/{type_checkers → objects/modules}/core/io.rb +1 -1
  62. data/lib/kind/{type_checkers → objects/modules}/core/method.rb +1 -1
  63. data/lib/kind/{type_checkers → objects/modules}/core/module.rb +1 -1
  64. data/lib/kind/{type_checkers → objects/modules}/core/numeric.rb +1 -1
  65. data/lib/kind/{type_checkers → objects/modules}/core/proc.rb +1 -1
  66. data/lib/kind/{type_checkers → objects/modules}/core/queue.rb +1 -1
  67. data/lib/kind/{type_checkers → objects/modules}/core/range.rb +1 -1
  68. data/lib/kind/{type_checkers → objects/modules}/core/regexp.rb +1 -1
  69. data/lib/kind/{type_checkers → objects/modules}/core/string.rb +3 -1
  70. data/lib/kind/{type_checkers → objects/modules}/core/struct.rb +1 -1
  71. data/lib/kind/{type_checkers → objects/modules}/core/symbol.rb +1 -1
  72. data/lib/kind/{type_checkers → objects/modules}/core/time.rb +1 -1
  73. data/lib/kind/{type_checkers → objects/modules}/custom/boolean.rb +2 -2
  74. data/lib/kind/{type_checkers → objects/modules}/custom/callable.rb +1 -1
  75. data/lib/kind/{type_checkers → objects/modules}/custom/lambda.rb +1 -1
  76. data/lib/kind/{type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
  77. data/lib/kind/{type_checkers → objects/modules}/stdlib/set.rb +3 -1
  78. data/lib/kind/objects/nil.rb +17 -0
  79. data/lib/kind/objects/not_nil.rb +9 -0
  80. data/lib/kind/objects/object.rb +56 -0
  81. data/lib/kind/objects/respond_to.rb +30 -0
  82. data/lib/kind/objects/union_type.rb +44 -0
  83. data/lib/kind/presence.rb +4 -2
  84. data/lib/kind/result.rb +31 -0
  85. data/lib/kind/result/abstract.rb +53 -0
  86. data/lib/kind/result/failure.rb +33 -0
  87. data/lib/kind/result/methods.rb +17 -0
  88. data/lib/kind/result/monad.rb +74 -0
  89. data/lib/kind/result/monad/wrapper.rb +19 -0
  90. data/lib/kind/result/success.rb +53 -0
  91. data/lib/kind/strict/disabled.rb +34 -0
  92. data/lib/kind/try.rb +21 -11
  93. data/lib/kind/validator.rb +111 -0
  94. data/lib/kind/version.rb +1 -1
  95. metadata +78 -48
  96. data/lib/kind/active_model/kind_validator.rb +0 -96
  97. data/lib/kind/core.rb +0 -9
  98. data/lib/kind/core/deprecation.rb +0 -29
  99. data/lib/kind/core/kind.rb +0 -61
  100. data/lib/kind/core/undefined.rb +0 -7
  101. data/lib/kind/deprecations/built_in_type_checkers.rb +0 -23
  102. data/lib/kind/deprecations/checker.rb +0 -16
  103. data/lib/kind/deprecations/checker/factory.rb +0 -31
  104. data/lib/kind/deprecations/checker/protocol.rb +0 -73
  105. data/lib/kind/deprecations/is.rb +0 -35
  106. data/lib/kind/deprecations/of.rb +0 -258
  107. data/lib/kind/deprecations/types.rb +0 -121
  108. data/lib/kind/error.rb +0 -15
  109. data/lib/kind/maybe/result.rb +0 -51
  110. data/lib/kind/type_checker.rb +0 -73
  111. data/lib/kind/type_checkers.rb +0 -30
@@ -1,121 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Types
5
- extend self
6
-
7
- COLONS = '::'.freeze
8
-
9
- KIND_OF = <<-RUBY
10
- def self.%{method_name}(object = Undefined, options = Empty::HASH)
11
- DEPRECATION.warn_method_replacement('Kind::Of::%{method_name}', 'Kind::%{method_name}')
12
-
13
- default = options[:or]
14
-
15
- return Kind::Of::%{kind_name} if Undefined == object && default.nil?
16
-
17
- is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
18
-
19
- return object if is_instance
20
-
21
- KIND.of!(::%{kind_name_to_check}, object && default ? default : object || default)
22
- end
23
- RUBY
24
-
25
- KIND_OF_IS = <<-RUBY
26
- def self.%{method_name}?(*args)
27
- DEPRECATION.warn_method_replacement('Kind::Of::%{method_name}?', 'Kind::%{method_name}?')
28
-
29
- Kind::Of::%{kind_name}.instance?(*args)
30
- end
31
- RUBY
32
-
33
- KIND_IS = <<-RUBY
34
- def self.%{method_name}(value)
35
- DEPRECATION.warn_removal('Kind::Is::%{method_name}')
36
-
37
- KIND.is!(::%{kind_name_to_check}, value)
38
- end
39
- RUBY
40
-
41
- private_constant :KIND_OF, :KIND_IS, :COLONS
42
-
43
- def add(kind, name: nil)
44
- DEPRECATION.warn_removal('Kind::Types')
45
-
46
- kind_name = KIND.of_module_or_class!(kind).name
47
- checker = name ? Kind::String[name] : kind_name
48
-
49
- if checker.include?(COLONS)
50
- add_kind_with_namespace(checker, method_name: name)
51
- else
52
- add_root(checker, kind_name, method_name: name,
53
- kind_name_to_check: kind_name,
54
- create_kind_is_mod: false)
55
- end
56
- end
57
-
58
- private
59
-
60
- def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
61
- root_kind_name = method_name ? method_name : kind_name
62
-
63
- params = {
64
- method_name: method_name ? method_name : checker,
65
- kind_name: method_name ? method_name : kind_name,
66
- kind_name_to_check: kind_name_to_check || root_kind_name
67
- }
68
-
69
- add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
70
- end
71
-
72
- def add_kind_with_namespace(checker, method_name:)
73
- raise NotImplementedError if method_name
74
-
75
- const_names = checker.split(COLONS)
76
- const_names.each_with_index do |const_name, index|
77
- if index == 0
78
- add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
79
- else
80
- add_node(const_names, index)
81
- end
82
- end
83
- end
84
-
85
- def add_node(const_names, index)
86
- namespace = const_names[0..(index-1)]
87
- namespace_name = namespace.join(COLONS)
88
-
89
- kind_of_mod = Kind::Of.const_get(namespace_name)
90
- kind_is_mod = Kind::Is.const_get(namespace_name)
91
-
92
- checker = const_names[index]
93
- kind_name = const_names[0..index].join(COLONS)
94
-
95
- params = { method_name: checker, kind_name: kind_name }
96
-
97
- add_kind(params, kind_of_mod, kind_is_mod, true)
98
- end
99
-
100
- def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
101
- method_name = params[:method_name]
102
-
103
- unless kind_of_mod.respond_to?(method_name)
104
- kind_name = params[:kind_name]
105
- params[:kind_name_to_check] ||= kind_name
106
-
107
- kind_checker = ::Module.new { extend Checker::Protocol }
108
- kind_checker.module_eval("def self.__kind; ::#{params[:kind_name_to_check]}; end")
109
-
110
- kind_of_mod.instance_eval(KIND_OF % params)
111
- kind_of_mod.const_set(method_name, kind_checker)
112
- kind_of_mod.instance_eval(KIND_OF_IS % params)
113
- end
114
-
115
- unless kind_is_mod.respond_to?(method_name)
116
- kind_is_mod.instance_eval(KIND_IS % params)
117
- kind_is_mod.const_set(method_name, ::Module.new) if create_kind_is_mod
118
- end
119
- end
120
- end
121
- end
data/lib/kind/error.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- class Error < TypeError
5
- def initialize(arg, object = UNDEFINED)
6
- if UNDEFINED == object
7
- # Will be used when the exception was raised with a message. e.g:
8
- # raise Kind::Error, "some message"
9
- super(arg)
10
- else
11
- super("#{object.inspect} expected to be a kind of #{arg}")
12
- end
13
- end
14
- end
15
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Maybe
5
- class Result
6
- attr_reader :value
7
-
8
- Value = ->(arg) { arg.kind_of?(::Kind::Maybe::Result) ? arg.value : arg } # :nodoc:
9
-
10
- def initialize(arg)
11
- @value = Value.(arg)
12
- end
13
-
14
- def value_or(method_name = UNDEFINED, &block)
15
- raise NotImplementedError
16
- end
17
-
18
- def none?
19
- raise NotImplementedError
20
- end
21
-
22
- def some?; !none?; end
23
-
24
- def map(&fn)
25
- raise NotImplementedError
26
- end
27
-
28
- alias_method :map!, :map
29
- alias_method :then, :map
30
- alias_method :then!, :map
31
-
32
- def check(&fn)
33
- raise NotImplementedError
34
- end
35
-
36
- def try(method_name = UNDEFINED, &block)
37
- raise NotImplementedError
38
- end
39
-
40
- alias_method :try!, :try
41
-
42
- def dig(*keys)
43
- raise NotImplementedError
44
- end
45
-
46
- def presence
47
- raise NotImplementedError
48
- end
49
- end
50
- end
51
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module TypeChecker
5
- def name
6
- kind.name
7
- end
8
-
9
- def ===(value)
10
- kind === value
11
- end
12
-
13
- def [](value)
14
- return value if self === value
15
-
16
- KIND.error!(name, value)
17
- end
18
-
19
- def or_nil(value)
20
- return value if self === value
21
- end
22
-
23
- def or_undefined(value)
24
- or_nil(value) || Undefined
25
- end
26
-
27
- def or(fallback, value = UNDEFINED)
28
- return __or_func.(fallback) if UNDEFINED === value
29
-
30
- self === value ? value : fallback
31
- end
32
-
33
- def value?(value = UNDEFINED)
34
- return self === value if UNDEFINED != value
35
-
36
- @__is_value ||= ->(ck) { ->(value) { ck === value } }.(self)
37
- end
38
-
39
- def value(arg, default:)
40
- KIND.value(self, arg, self[default])
41
- end
42
-
43
- def or_null(value) # :nodoc:
44
- KIND.null?(value) ? value : self[value]
45
- end
46
-
47
- private
48
-
49
- def __or_func
50
- @__or_func ||= ->(tc, fb, value) { tc === value ? value : tc.or_null(fb) }.curry[self]
51
- end
52
- end
53
-
54
- class TypeChecker::Object # :nodoc: all
55
- include TypeChecker
56
-
57
- ResolveKindName = ->(kind, opt) do
58
- name = Try.(opt, :[], :name)
59
- name || Try.(kind, :name)
60
- end
61
-
62
- attr_reader :kind, :name
63
-
64
- def initialize(kind, opt)
65
- name = ResolveKindName.(kind, opt)
66
-
67
- @name = KIND.of!(::String, name)
68
- @kind = KIND.respond_to!(:===, kind)
69
- end
70
-
71
- private_constant :ResolveKindName
72
- end
73
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kind/type_checkers/core/array'
4
- require 'kind/type_checkers/core/class'
5
- require 'kind/type_checkers/core/comparable'
6
- require 'kind/type_checkers/core/enumerable'
7
- require 'kind/type_checkers/core/enumerator'
8
- require 'kind/type_checkers/core/file'
9
- require 'kind/type_checkers/core/float'
10
- require 'kind/type_checkers/core/hash'
11
- require 'kind/type_checkers/core/integer'
12
- require 'kind/type_checkers/core/io'
13
- require 'kind/type_checkers/core/module'
14
- require 'kind/type_checkers/core/method'
15
- require 'kind/type_checkers/core/numeric'
16
- require 'kind/type_checkers/core/proc'
17
- require 'kind/type_checkers/core/queue'
18
- require 'kind/type_checkers/core/range'
19
- require 'kind/type_checkers/core/regexp'
20
- require 'kind/type_checkers/core/string'
21
- require 'kind/type_checkers/core/struct'
22
- require 'kind/type_checkers/core/symbol'
23
- require 'kind/type_checkers/core/time'
24
-
25
- require 'kind/type_checkers/stdlib/open_struct'
26
- require 'kind/type_checkers/stdlib/set'
27
-
28
- require 'kind/type_checkers/custom/boolean'
29
- require 'kind/type_checkers/custom/callable'
30
- require 'kind/type_checkers/custom/lambda'