kind 3.0.0 → 5.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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/.travis.sh +37 -12
  4. data/.travis.yml +6 -5
  5. data/CHANGELOG.md +1295 -0
  6. data/Gemfile +10 -2
  7. data/README.md +985 -490
  8. data/lib/kind.rb +35 -287
  9. data/lib/kind/active_model/kind_validator.rb +20 -13
  10. data/lib/kind/core.rb +8 -0
  11. data/lib/kind/core/kind.rb +61 -0
  12. data/lib/kind/core/undefined.rb +7 -0
  13. data/lib/kind/dig.rb +40 -0
  14. data/lib/kind/empty.rb +4 -12
  15. data/lib/kind/empty/constant.rb +7 -0
  16. data/lib/kind/error.rb +2 -6
  17. data/lib/kind/maybe.rb +14 -153
  18. data/lib/kind/maybe/none.rb +57 -0
  19. data/lib/kind/maybe/result.rb +51 -0
  20. data/lib/kind/maybe/some.rb +90 -0
  21. data/lib/kind/maybe/typed.rb +29 -0
  22. data/lib/kind/maybe/wrappable.rb +33 -0
  23. data/lib/kind/presence.rb +33 -0
  24. data/lib/kind/try.rb +34 -0
  25. data/lib/kind/type_checker.rb +87 -0
  26. data/lib/kind/type_checkers.rb +30 -0
  27. data/lib/kind/type_checkers/core/array.rb +17 -0
  28. data/lib/kind/type_checkers/core/class.rb +13 -0
  29. data/lib/kind/type_checkers/core/comparable.rb +13 -0
  30. data/lib/kind/type_checkers/core/enumerable.rb +13 -0
  31. data/lib/kind/type_checkers/core/enumerator.rb +13 -0
  32. data/lib/kind/type_checkers/core/file.rb +13 -0
  33. data/lib/kind/type_checkers/core/float.rb +13 -0
  34. data/lib/kind/type_checkers/core/hash.rb +17 -0
  35. data/lib/kind/type_checkers/core/integer.rb +13 -0
  36. data/lib/kind/type_checkers/core/io.rb +13 -0
  37. data/lib/kind/type_checkers/core/method.rb +13 -0
  38. data/lib/kind/type_checkers/core/module.rb +17 -0
  39. data/lib/kind/type_checkers/core/numeric.rb +13 -0
  40. data/lib/kind/type_checkers/core/proc.rb +13 -0
  41. data/lib/kind/type_checkers/core/queue.rb +14 -0
  42. data/lib/kind/type_checkers/core/range.rb +13 -0
  43. data/lib/kind/type_checkers/core/regexp.rb +13 -0
  44. data/lib/kind/type_checkers/core/string.rb +17 -0
  45. data/lib/kind/type_checkers/core/struct.rb +13 -0
  46. data/lib/kind/type_checkers/core/symbol.rb +13 -0
  47. data/lib/kind/type_checkers/core/time.rb +13 -0
  48. data/lib/kind/type_checkers/custom/boolean.rb +19 -0
  49. data/lib/kind/type_checkers/custom/callable.rb +19 -0
  50. data/lib/kind/type_checkers/custom/lambda.rb +19 -0
  51. data/lib/kind/type_checkers/stdlib/open_struct.rb +13 -0
  52. data/lib/kind/type_checkers/stdlib/set.rb +17 -0
  53. data/lib/kind/undefined.rb +4 -2
  54. data/lib/kind/validator.rb +1 -1
  55. data/lib/kind/version.rb +1 -1
  56. data/test.sh +4 -4
  57. metadata +45 -9
  58. data/lib/kind/checker.rb +0 -15
  59. data/lib/kind/checker/factory.rb +0 -35
  60. data/lib/kind/checker/protocol.rb +0 -73
  61. data/lib/kind/is.rb +0 -19
  62. data/lib/kind/of.rb +0 -11
  63. data/lib/kind/types.rb +0 -115
data/lib/kind/is.rb DELETED
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Is
5
- def self.call(expected, object)
6
- __call__(Kind::Of.Module(expected), object)
7
- end
8
-
9
- def self.__call__(expected_kind, object)
10
- kind = Kind::Of.Module(object)
11
-
12
- if kind.is_a?(Class)
13
- kind <= expected_kind || false
14
- else
15
- kind == expected_kind || kind.is_a?(expected_kind)
16
- end
17
- end
18
- end
19
- end
data/lib/kind/of.rb DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Of
5
- def self.call(kind, object, kind_name = nil)
6
- return object if kind === object
7
-
8
- raise Kind::Error.new(kind_name || kind.name, object)
9
- end
10
- end
11
- end
data/lib/kind/types.rb DELETED
@@ -1,115 +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
- default = options[:or]
12
-
13
- return Kind::Of::%{kind_name} if Undefined == object && default.nil?
14
-
15
- is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
16
-
17
- return object if is_instance
18
-
19
- Kind::Of.(::%{kind_name_to_check}, object && default ? default : object || default)
20
- end
21
- RUBY
22
-
23
- KIND_OF_IS = <<-RUBY
24
- def self.%{method_name}?(*args)
25
- Kind::Of::%{kind_name}.instance?(*args)
26
- end
27
- RUBY
28
-
29
- KIND_IS = <<-RUBY
30
- def self.%{method_name}(value = Undefined)
31
- return Kind::Is::%{kind_name} if Undefined == value
32
-
33
- Kind::Is.__call__(::%{kind_name_to_check}, value)
34
- end
35
- RUBY
36
-
37
- private_constant :KIND_OF, :KIND_IS, :COLONS
38
-
39
- def add(kind, name: nil)
40
- kind_name = Kind.of.Module(kind).name
41
- checker = name ? Kind::Of.(String, name) : kind_name
42
-
43
- if checker.include?(COLONS)
44
- add_kind_with_namespace(checker, method_name: name)
45
- else
46
- add_root(checker, kind_name, method_name: name,
47
- kind_name_to_check: kind_name,
48
- create_kind_is_mod: false)
49
- end
50
- end
51
-
52
- private
53
-
54
- def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
55
- root_kind_name = method_name ? method_name : kind_name
56
-
57
- params = {
58
- method_name: method_name ? method_name : checker,
59
- kind_name: method_name ? method_name : kind_name,
60
- kind_name_to_check: kind_name_to_check || root_kind_name
61
- }
62
-
63
- add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
64
- end
65
-
66
- def add_kind_with_namespace(checker, method_name:)
67
- raise NotImplementedError if method_name
68
-
69
- const_names = checker.split(COLONS)
70
- const_names.each_with_index do |const_name, index|
71
- if index == 0
72
- add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
73
- else
74
- add_node(const_names, index)
75
- end
76
- end
77
- end
78
-
79
- def add_node(const_names, index)
80
- namespace = const_names[0..(index-1)]
81
- namespace_name = namespace.join(COLONS)
82
-
83
- kind_of_mod = Kind::Of.const_get(namespace_name)
84
- kind_is_mod = Kind::Is.const_get(namespace_name)
85
-
86
- checker = const_names[index]
87
- kind_name = const_names[0..index].join(COLONS)
88
-
89
- params = { method_name: checker, kind_name: kind_name }
90
-
91
- add_kind(params, kind_of_mod, kind_is_mod, true)
92
- end
93
-
94
- def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
95
- method_name = params[:method_name]
96
-
97
- unless kind_of_mod.respond_to?(method_name)
98
- kind_name = params[:kind_name]
99
- params[:kind_name_to_check] ||= kind_name
100
-
101
- kind_checker = ::Module.new { extend Checker::Protocol }
102
- kind_checker.module_eval("def self.__kind; #{params[:kind_name_to_check]}; end")
103
-
104
- kind_of_mod.instance_eval(KIND_OF % params)
105
- kind_of_mod.const_set(method_name, kind_checker)
106
- kind_of_mod.instance_eval(KIND_OF_IS % params)
107
- end
108
-
109
- unless kind_is_mod.respond_to?(method_name)
110
- kind_is_mod.instance_eval(KIND_IS % params)
111
- kind_is_mod.const_set(method_name, Module.new) if create_kind_is_mod
112
- end
113
- end
114
- end
115
- end