kind 2.3.0 → 4.1.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 +6 -3
  5. data/CHANGELOG.md +1267 -0
  6. data/Gemfile +10 -2
  7. data/README.md +1005 -489
  8. data/lib/kind.rb +53 -281
  9. data/lib/kind/active_model/kind_validator.rb +20 -13
  10. data/lib/kind/core.rb +10 -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/core/wrong_number_of_args.rb +9 -0
  15. data/lib/kind/deprecations/built_in_type_checkers.rb +23 -0
  16. data/lib/kind/{checker.rb → deprecations/checker.rb} +3 -2
  17. data/lib/kind/{checker → deprecations/checker}/factory.rb +1 -5
  18. data/lib/kind/{checker → deprecations/checker}/protocol.rb +3 -3
  19. data/lib/kind/deprecations/is.rb +35 -0
  20. data/lib/kind/deprecations/of.rb +258 -0
  21. data/lib/kind/{types.rb → deprecations/types.rb} +14 -8
  22. data/lib/kind/dig.rb +40 -0
  23. data/lib/kind/empty.rb +5 -11
  24. data/lib/kind/error.rb +2 -6
  25. data/lib/kind/maybe.rb +14 -130
  26. data/lib/kind/maybe/none.rb +57 -0
  27. data/lib/kind/maybe/result.rb +51 -0
  28. data/lib/kind/maybe/some.rb +90 -0
  29. data/lib/kind/maybe/typed.rb +29 -0
  30. data/lib/kind/maybe/wrappable.rb +33 -0
  31. data/lib/kind/presence.rb +33 -0
  32. data/lib/kind/try.rb +34 -0
  33. data/lib/kind/type_checker.rb +87 -0
  34. data/lib/kind/type_checkers.rb +30 -0
  35. data/lib/kind/type_checkers/core/array.rb +17 -0
  36. data/lib/kind/type_checkers/core/class.rb +13 -0
  37. data/lib/kind/type_checkers/core/comparable.rb +13 -0
  38. data/lib/kind/type_checkers/core/enumerable.rb +13 -0
  39. data/lib/kind/type_checkers/core/enumerator.rb +13 -0
  40. data/lib/kind/type_checkers/core/file.rb +13 -0
  41. data/lib/kind/type_checkers/core/float.rb +13 -0
  42. data/lib/kind/type_checkers/core/hash.rb +17 -0
  43. data/lib/kind/type_checkers/core/integer.rb +13 -0
  44. data/lib/kind/type_checkers/core/io.rb +13 -0
  45. data/lib/kind/type_checkers/core/method.rb +13 -0
  46. data/lib/kind/type_checkers/core/module.rb +17 -0
  47. data/lib/kind/type_checkers/core/numeric.rb +13 -0
  48. data/lib/kind/type_checkers/core/proc.rb +13 -0
  49. data/lib/kind/type_checkers/core/queue.rb +14 -0
  50. data/lib/kind/type_checkers/core/range.rb +13 -0
  51. data/lib/kind/type_checkers/core/regexp.rb +13 -0
  52. data/lib/kind/type_checkers/core/string.rb +17 -0
  53. data/lib/kind/type_checkers/core/struct.rb +13 -0
  54. data/lib/kind/type_checkers/core/symbol.rb +13 -0
  55. data/lib/kind/type_checkers/core/time.rb +13 -0
  56. data/lib/kind/type_checkers/custom/boolean.rb +19 -0
  57. data/lib/kind/type_checkers/custom/callable.rb +19 -0
  58. data/lib/kind/type_checkers/custom/lambda.rb +19 -0
  59. data/lib/kind/type_checkers/stdlib/open_struct.rb +13 -0
  60. data/lib/kind/type_checkers/stdlib/set.rb +17 -0
  61. data/lib/kind/undefined.rb +4 -2
  62. data/lib/kind/validator.rb +1 -1
  63. data/lib/kind/version.rb +1 -1
  64. data/test.sh +4 -4
  65. metadata +53 -9
  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 Numeric
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Numeric; end
8
+ end
9
+
10
+ def self.Numeric?(*values)
11
+ KIND.of?(::Numeric, values)
12
+ end
13
+ end
@@ -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.3.0'
4
+ VERSION = '4.1.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.3.0
4
+ version: 4.1.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-25 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,15 +33,57 @@ 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
35
- - lib/kind/checker/factory.rb
36
- - lib/kind/checker/protocol.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/core/wrong_number_of_args.rb
41
+ - lib/kind/deprecations/built_in_type_checkers.rb
42
+ - lib/kind/deprecations/checker.rb
43
+ - lib/kind/deprecations/checker/factory.rb
44
+ - lib/kind/deprecations/checker/protocol.rb
45
+ - lib/kind/deprecations/is.rb
46
+ - lib/kind/deprecations/of.rb
47
+ - lib/kind/deprecations/types.rb
48
+ - lib/kind/dig.rb
37
49
  - lib/kind/empty.rb
38
50
  - lib/kind/error.rb
39
- - lib/kind/is.rb
40
51
  - lib/kind/maybe.rb
41
- - lib/kind/of.rb
42
- - lib/kind/types.rb
52
+ - lib/kind/maybe/none.rb
53
+ - lib/kind/maybe/result.rb
54
+ - lib/kind/maybe/some.rb
55
+ - lib/kind/maybe/typed.rb
56
+ - lib/kind/maybe/wrappable.rb
57
+ - lib/kind/presence.rb
58
+ - lib/kind/try.rb
59
+ - lib/kind/type_checker.rb
60
+ - lib/kind/type_checkers.rb
61
+ - lib/kind/type_checkers/core/array.rb
62
+ - lib/kind/type_checkers/core/class.rb
63
+ - lib/kind/type_checkers/core/comparable.rb
64
+ - lib/kind/type_checkers/core/enumerable.rb
65
+ - lib/kind/type_checkers/core/enumerator.rb
66
+ - lib/kind/type_checkers/core/file.rb
67
+ - lib/kind/type_checkers/core/float.rb
68
+ - lib/kind/type_checkers/core/hash.rb
69
+ - lib/kind/type_checkers/core/integer.rb
70
+ - lib/kind/type_checkers/core/io.rb
71
+ - lib/kind/type_checkers/core/method.rb
72
+ - lib/kind/type_checkers/core/module.rb
73
+ - lib/kind/type_checkers/core/numeric.rb
74
+ - lib/kind/type_checkers/core/proc.rb
75
+ - lib/kind/type_checkers/core/queue.rb
76
+ - lib/kind/type_checkers/core/range.rb
77
+ - lib/kind/type_checkers/core/regexp.rb
78
+ - lib/kind/type_checkers/core/string.rb
79
+ - lib/kind/type_checkers/core/struct.rb
80
+ - lib/kind/type_checkers/core/symbol.rb
81
+ - lib/kind/type_checkers/core/time.rb
82
+ - lib/kind/type_checkers/custom/boolean.rb
83
+ - lib/kind/type_checkers/custom/callable.rb
84
+ - lib/kind/type_checkers/custom/lambda.rb
85
+ - lib/kind/type_checkers/stdlib/open_struct.rb
86
+ - lib/kind/type_checkers/stdlib/set.rb
43
87
  - lib/kind/undefined.rb
44
88
  - lib/kind/validator.rb
45
89
  - lib/kind/version.rb
@@ -65,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
109
  - !ruby/object:Gem::Version
66
110
  version: '0'
67
111
  requirements: []
68
- rubygems_version: 3.0.6
112
+ rubygems_version: 3.1.4
69
113
  signing_key:
70
114
  specification_version: 4
71
115
  summary: A simple type system (at runtime) for Ruby.
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