smart_types 0.8.0 → 0.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b592f16e69b2b34662ca1ff8199a5fc0e4ae7234fb47288df3e41444a53c214
4
- data.tar.gz: 7f1ff6580098205bb9e4b5295eff21e4ced1173a73e4e967bdd5f4997e398377
3
+ metadata.gz: ecaa56176fade082d67794d331c28cfb819e51a43d4e3dcce6b59f35cb2884b3
4
+ data.tar.gz: 511f1a70284b7f986de8d1c3cabbf40aa872bc00be68e9d151032db827c09cae
5
5
  SHA512:
6
- metadata.gz: 1b3c4a74168dcfcdf3f85f9baa9f3a66e0c95d0b2cf726a4f9b2ec711cf5f127dd0e060e322369780178ed7d3fe2efc708d31458c9099b2eee5ef1746a72eddc
7
- data.tar.gz: 9beb0d346cc40c8f2ce8233c448306d51aa5b771e1473b358c7650e1238813e8c9115bdc66d8e1409900642baf854f6f4a9de2b51faf968351cd924972156f59
6
+ metadata.gz: b89d4104c04d5cd36856fbc760f1a9c561d90b3b812531e31f5572a29f605b396fa95f69af89b00d52e85299b2f0f180bce736e69a75d4c4ab550ce595d7e51d
7
+ data.tar.gz: 2e94034f7b1073f28c46302b5a06344a9757142a09e5334109c804365c791f16f244dc27cfd785fe0c7eea6ec77bb04efae7cff10a77ca2595a11cdf91cad2da
data/.rubocop.yml CHANGED
@@ -26,3 +26,6 @@ Lint/EmptyBlock:
26
26
  # NOTE: too situative and too subjective
27
27
  Naming/VariableNumber:
28
28
  Enabled: false
29
+
30
+ Style/RedundantConstantBase:
31
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ # [Unreleased]
5
+ - New types of `SmartCore::Types::Value` category:
6
+ - `SmartCore::Types::Value::UnboundMethod`;
7
+ - `SmartCore::Types::Value::Range`;
8
+ - `SmartCore::Types::Value::Rational`;
9
+
10
+ # [0.8.1] - 2026-07-03
11
+ ### Changed
12
+ - Performance: faster `SmartCore::Types::Primitive#valid?` (the common validation path):
13
+ - `SmartCore::Types::Primitive::InvariantControl#simply_check` now short-circuits for types
14
+ without invariants (precomputed at build time) — the majority of types (e.g. `Value::String`,
15
+ `Protocol::InstanceOf`) define only a checker, so the empty-invariant iteration is skipped;
16
+ - `SmartCore::Types::Primitive::Validator#valid?` and `#validate` fetch `runtime_attributes`
17
+ once instead of twice;
18
+ - ~17–20% faster validation for `Value::String` and `Protocol::InstanceOf` (3M-iteration benchmark).
19
+ No public API or validation-semantics change.
20
+
4
21
  # [0.8.0] - 2022-11-25
5
22
  ### Added
6
23
  - New types of `SmartCore::Types::Value` category:
data/Gemfile.lock CHANGED
@@ -1,88 +1,90 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_types (0.8.0)
5
- smart_engine (~> 0.11)
4
+ smart_types (0.8.1)
5
+ smart_engine (~> 0.17)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (7.0.4)
10
+ activesupport (7.0.5)
11
11
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
12
  i18n (>= 1.6, < 2)
13
13
  minitest (>= 5.1)
14
14
  tzinfo (~> 2.0)
15
- armitage-rubocop (1.36.0)
16
- rubocop (= 1.36.0)
17
- rubocop-performance (= 1.15.0)
18
- rubocop-rails (= 2.16.1)
15
+ armitage-rubocop (1.51.0.4)
16
+ rubocop (= 1.51.0)
17
+ rubocop-capybara (= 2.18.0)
18
+ rubocop-factory_bot (= 2.23.1)
19
+ rubocop-performance (= 1.18.0)
20
+ rubocop-rails (= 2.19.1)
19
21
  rubocop-rake (= 0.6.0)
20
- rubocop-rspec (= 2.13.2)
22
+ rubocop-rspec (= 2.22.0)
21
23
  ast (2.4.2)
22
24
  coderay (1.1.3)
23
- concurrent-ruby (1.1.10)
25
+ concurrent-ruby (1.2.2)
24
26
  diff-lcs (1.5.0)
25
27
  docile (1.4.0)
26
- ffi (1.15.5-java)
27
- i18n (1.12.0)
28
+ i18n (1.13.0)
28
29
  concurrent-ruby (~> 1.0)
29
- json (2.6.2)
30
- json (2.6.2-java)
30
+ json (2.6.3)
31
31
  method_source (1.0.0)
32
- minitest (5.16.3)
33
- parallel (1.22.1)
34
- parser (3.1.2.1)
32
+ minitest (5.18.0)
33
+ parallel (1.23.0)
34
+ parser (3.2.2.1)
35
35
  ast (~> 2.4.1)
36
- pry (0.14.1)
36
+ pry (0.14.2)
37
37
  coderay (~> 1.1)
38
38
  method_source (~> 1.0)
39
- pry (0.14.1-java)
40
- coderay (~> 1.1)
41
- method_source (~> 1.0)
42
- spoon (~> 0.0)
43
- rack (3.0.1)
39
+ rack (3.0.7)
44
40
  rainbow (3.1.1)
45
41
  rake (13.0.6)
46
- regexp_parser (2.6.1)
42
+ regexp_parser (2.8.0)
47
43
  rexml (3.2.5)
48
44
  rspec (3.12.0)
49
45
  rspec-core (~> 3.12.0)
50
46
  rspec-expectations (~> 3.12.0)
51
47
  rspec-mocks (~> 3.12.0)
52
- rspec-core (3.12.0)
48
+ rspec-core (3.12.2)
53
49
  rspec-support (~> 3.12.0)
54
- rspec-expectations (3.12.0)
50
+ rspec-expectations (3.12.3)
55
51
  diff-lcs (>= 1.2.0, < 2.0)
56
52
  rspec-support (~> 3.12.0)
57
- rspec-mocks (3.12.0)
53
+ rspec-mocks (3.12.5)
58
54
  diff-lcs (>= 1.2.0, < 2.0)
59
55
  rspec-support (~> 3.12.0)
60
56
  rspec-support (3.12.0)
61
- rubocop (1.36.0)
57
+ rubocop (1.51.0)
62
58
  json (~> 2.3)
63
59
  parallel (~> 1.10)
64
- parser (>= 3.1.2.1)
60
+ parser (>= 3.2.0.0)
65
61
  rainbow (>= 2.2.2, < 4.0)
66
62
  regexp_parser (>= 1.8, < 3.0)
67
63
  rexml (>= 3.2.5, < 4.0)
68
- rubocop-ast (>= 1.20.1, < 2.0)
64
+ rubocop-ast (>= 1.28.0, < 2.0)
69
65
  ruby-progressbar (~> 1.7)
70
- unicode-display_width (>= 1.4.0, < 3.0)
71
- rubocop-ast (1.23.0)
72
- parser (>= 3.1.1.0)
73
- rubocop-performance (1.15.0)
66
+ unicode-display_width (>= 2.4.0, < 3.0)
67
+ rubocop-ast (1.28.1)
68
+ parser (>= 3.2.1.0)
69
+ rubocop-capybara (2.18.0)
70
+ rubocop (~> 1.41)
71
+ rubocop-factory_bot (2.23.1)
72
+ rubocop (~> 1.33)
73
+ rubocop-performance (1.18.0)
74
74
  rubocop (>= 1.7.0, < 2.0)
75
75
  rubocop-ast (>= 0.4.0)
76
- rubocop-rails (2.16.1)
76
+ rubocop-rails (2.19.1)
77
77
  activesupport (>= 4.2.0)
78
78
  rack (>= 1.1)
79
79
  rubocop (>= 1.33.0, < 2.0)
80
80
  rubocop-rake (0.6.0)
81
81
  rubocop (~> 1.0)
82
- rubocop-rspec (2.13.2)
82
+ rubocop-rspec (2.22.0)
83
83
  rubocop (~> 1.33)
84
- ruby-progressbar (1.11.0)
85
- simplecov (0.21.2)
84
+ rubocop-capybara (~> 2.17)
85
+ rubocop-factory_bot (~> 2.22)
86
+ ruby-progressbar (1.13.0)
87
+ simplecov (0.22.0)
86
88
  docile (~> 1.1)
87
89
  simplecov-html (~> 0.11)
88
90
  simplecov_json_formatter (~> 0.1)
@@ -90,27 +92,23 @@ GEM
90
92
  simplecov-lcov (0.8.0)
91
93
  simplecov_json_formatter (0.1.4)
92
94
  smart_engine (0.17.0)
93
- spoon (0.0.6)
94
- ffi
95
- tzinfo (2.0.5)
95
+ tzinfo (2.0.6)
96
96
  concurrent-ruby (~> 1.0)
97
- unicode-display_width (2.3.0)
97
+ unicode-display_width (2.4.2)
98
98
 
99
99
  PLATFORMS
100
- arm64-darwin-21
101
- ruby
102
- universal-java-11
100
+ arm64-darwin-22
103
101
  x86_64-linux
104
102
 
105
103
  DEPENDENCIES
106
- armitage-rubocop (~> 1.7)
107
- bundler (~> 2.1)
108
- pry (~> 0.13)
104
+ armitage-rubocop (~> 1.51)
105
+ bundler (~> 2.4)
106
+ pry (~> 0.14)
109
107
  rake (~> 13.0)
110
- rspec (~> 3.10)
111
- simplecov (~> 0.21)
108
+ rspec (~> 3.12)
109
+ simplecov (~> 0.22)
112
110
  simplecov-lcov (~> 0.8)
113
111
  smart_types!
114
112
 
115
113
  BUNDLED WITH
116
- 2.3.17
114
+ 2.4.13
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2020-2021 Rustam Ibragimov
3
+ Copyright (c) 2020-2024 Rustam Ibragimov
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -102,6 +102,8 @@ SmartCore::Types::Value::Array
102
102
  SmartCore::Types::Value::Set
103
103
  SmartCore::Types::Value::Hash
104
104
  SmartCore::Types::Value::Proc
105
+ SmartCore::Types::Value::Range
106
+ SmartCore::Types::Value::Rational
105
107
  SmartCore::Types::Value::Class
106
108
  SmartCore::Types::Value::Module
107
109
  SmartCore::Types::Value::Time
@@ -109,6 +111,7 @@ SmartCore::Types::Value::DateTime
109
111
  SmartCore::Types::Value::Date
110
112
  SmartCore::Types::Value::TimeBased
111
113
  SmartCore::Types::Value::Method
114
+ SmartCore::Types::Value::UnboundMethod
112
115
  ```
113
116
 
114
117
  ---
@@ -389,6 +392,8 @@ SmartCore::Types::Value::CryptoString = SmartCore::Types::Value::NumberdString &
389
392
 
390
393
  - migrate to `Github Actions`;
391
394
 
395
+ - an ability to cast `nil` to `nil` if `nil` is passed (example: `String.nilable_cast(nil) # => nil` and `String.cast(nil) # => ""`);
396
+
392
397
  - support for `block`-attribute in runtime attributes;
393
398
 
394
399
  - type configuration:
@@ -506,13 +511,10 @@ SmartCore::Types::YourCategoryName.define_type(:YourNewType) { ... }
506
511
  - new types:
507
512
 
508
513
  ```ruby
509
- SmartCore::Types::Value::UnboundMethod
510
514
  SmartCore::Types::Value::Enumerable
511
515
  SmartCore::Types::Value::Comparable
512
516
  SmartCore::Types::Value::Enumerator
513
517
  SmartCore::Types::Value::EnumeratorChain
514
- SmartCore::Types::Value::Range
515
- SmartCore::Types::Value::Rational
516
518
  SmartCore::Types::Value::SortedSet
517
519
  SmartCore::Types::Value::IO
518
520
  SmartCore::Types::Value::StringIO
@@ -27,9 +27,13 @@ class SmartCore::Types::Primitive::InvariantControl
27
27
  #
28
28
  # @api private
29
29
  # @since 0.2.0
30
+ # @version 0.8.1
30
31
  def initialize(invariant_chains, invariants)
31
32
  @invariant_chains = invariant_chains
32
33
  @invariants = invariants
34
+ # NOTE: most types define only a checker (no invariants); precompute the
35
+ # empty-case so #simply_check can short-circuit on the hot validation path.
36
+ @no_invariants = invariant_chains.empty? && invariants.empty?
33
37
  end
34
38
 
35
39
  # @param value [Any]
@@ -57,7 +61,10 @@ class SmartCore::Types::Primitive::InvariantControl
57
61
  #
58
62
  # @api private
59
63
  # @since 0.8.0
64
+ # @version 0.8.1
60
65
  def simply_check(value, runtime_attributes)
66
+ return true if @no_invariants
67
+
61
68
  return false if invariant_chains.any? do |chain|
62
69
  chain.simply_check(value, runtime_attributes) == false
63
70
  end
@@ -61,11 +61,11 @@ class SmartCore::Types::Primitive::Validator
61
61
  #
62
62
  # @api private
63
63
  # @since 0.2.0
64
- # @version 0.8.0
64
+ # @version 0.8.1
65
65
  def valid?(value)
66
- return false unless type_checker.call(value, type.runtime_attributes) # => Boolean
67
- return false unless invariant_control.simply_check(value, type.runtime_attributes) # => Boolean
68
- true
66
+ runtime_attributes = type.runtime_attributes
67
+ return false unless type_checker.call(value, runtime_attributes) # => Boolean
68
+ invariant_control.simply_check(value, runtime_attributes) # => Boolean
69
69
  end
70
70
 
71
71
  # @param value [Any]
@@ -73,11 +73,12 @@ class SmartCore::Types::Primitive::Validator
73
73
  #
74
74
  # @api private
75
75
  # @since 0.2.0
76
- # @version 0.3.0
76
+ # @version 0.8.1
77
77
  def validate(value)
78
- checker_result = type_checker.call(value, type.runtime_attributes) # => Boolean
78
+ runtime_attributes = type.runtime_attributes
79
+ checker_result = type_checker.call(value, runtime_attributes) # => Boolean
79
80
  return Result.new(type, value, checker_result) unless checker_result
80
- invariant_result = invariant_control.check(value, type.runtime_attributes)
81
+ invariant_result = invariant_control.check(value, runtime_attributes)
81
82
  invariant_errors = invariant_result.invariant_errors.map { |error| "#{type.name}.#{error}" }
82
83
  Result.new(type, value, checker_result, invariant_errors)
83
84
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ using SmartCore::Ext::BasicObjectAsObject
4
+
3
5
  # @api public
4
- # @since 0.x.0
6
+ # @since 0.9.0
5
7
  SmartCore::Types::Value.define_type(:Range) do |type|
6
8
  type.define_checker do |value|
7
- # TODO: realize
9
+ value.is_a?(::Range)
8
10
  end
9
11
  end
@@ -1,13 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ using SmartCore::Ext::BasicObjectAsObject
4
+
3
5
  # @api public
4
- # @since 0.x.0
6
+ # @since 0.9.0
5
7
  SmartCore::Types::Value.define_type(:Rational) do |type|
6
8
  type.define_checker do |value|
7
- # TODO: realize
9
+ value.is_a?(::Rational)
8
10
  end
9
11
 
10
12
  type.define_caster do |value|
11
- # TODO: realize
13
+ ::Kernel.Rational(value)
14
+ rescue ::TypeError, ::FloatDomainError
15
+ # NOTE: FloatDomainError is raised when you try to type cast Float::INFINITY or Float::NAN
16
+ raise(SmartCore::Types::TypeCastingError, 'Non-castable to Rational')
12
17
  end
13
18
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ using SmartCore::Ext::BasicObjectAsObject
4
+
3
5
  # @api public
4
- # @since 0.x.0
6
+ # @since 0.9.0
5
7
  SmartCore::Types::Value.define_type(:UnboundMethod) do |type|
6
8
  type.define_checker do |value|
7
- # TODO: realize
9
+ value.is_a?(::UnboundMethod)
8
10
  end
9
11
  end
@@ -7,6 +7,6 @@ module SmartCore
7
7
  # @api public
8
8
  # @since 0.1.0
9
9
  # @version 0.8.0
10
- VERSION = '0.8.0'
10
+ VERSION = '0.8.1'
11
11
  end
12
12
  end
data/smart_types.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
  require_relative 'lib/smart_core/types/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.required_ruby_version = Gem::Requirement.new('>= 2.7')
6
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.0')
7
7
 
8
8
  spec.name = 'smart_types'
9
9
  spec.version = SmartCore::Types::VERSION
@@ -32,13 +32,13 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ['lib']
34
34
 
35
- spec.add_dependency 'smart_engine', '~> 0.11'
35
+ spec.add_dependency 'smart_engine', '~> 0.17'
36
36
 
37
- spec.add_development_dependency 'bundler', '~> 2.1'
37
+ spec.add_development_dependency 'bundler', '~> 2.4'
38
38
  spec.add_development_dependency 'rake', '~> 13.0'
39
- spec.add_development_dependency 'rspec', '~> 3.10'
40
- spec.add_development_dependency 'armitage-rubocop', '~> 1.7'
41
- spec.add_development_dependency 'simplecov', '~> 0.21'
39
+ spec.add_development_dependency 'rspec', '~> 3.12'
40
+ spec.add_development_dependency 'armitage-rubocop', '~> 1.51'
41
+ spec.add_development_dependency 'simplecov', '~> 0.22'
42
42
  spec.add_development_dependency 'simplecov-lcov', '~> 0.8'
43
- spec.add_development_dependency 'pry', '~> 0.13'
43
+ spec.add_development_dependency 'pry', '~> 0.14'
44
44
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2022-11-25 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: smart_engine
@@ -16,28 +15,28 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '0.11'
18
+ version: '0.17'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '0.11'
25
+ version: '0.17'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: bundler
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '2.1'
32
+ version: '2.4'
34
33
  type: :development
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '2.1'
39
+ version: '2.4'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: rake
43
42
  requirement: !ruby/object:Gem::Requirement
@@ -58,42 +57,42 @@ dependencies:
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: '3.10'
60
+ version: '3.12'
62
61
  type: :development
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
- version: '3.10'
67
+ version: '3.12'
69
68
  - !ruby/object:Gem::Dependency
70
69
  name: armitage-rubocop
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: '1.7'
74
+ version: '1.51'
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: '1.7'
81
+ version: '1.51'
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: simplecov
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '0.21'
88
+ version: '0.22'
90
89
  type: :development
91
90
  prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
93
92
  requirements:
94
93
  - - "~>"
95
94
  - !ruby/object:Gem::Version
96
- version: '0.21'
95
+ version: '0.22'
97
96
  - !ruby/object:Gem::Dependency
98
97
  name: simplecov-lcov
99
98
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +113,14 @@ dependencies:
114
113
  requirements:
115
114
  - - "~>"
116
115
  - !ruby/object:Gem::Version
117
- version: '0.13'
116
+ version: '0.14'
118
117
  type: :development
119
118
  prerelease: false
120
119
  version_requirements: !ruby/object:Gem::Requirement
121
120
  requirements:
122
121
  - - "~>"
123
122
  - !ruby/object:Gem::Version
124
- version: '0.13'
123
+ version: '0.14'
125
124
  description: |
126
125
  Full-featured type system for any ruby project. Supports custom type definition,
127
126
  type validation, type casting and type categorizing. Provides a set of commonly used type
@@ -224,7 +223,6 @@ metadata:
224
223
  homepage_uri: https://github.com/smart-rb/smart_types
225
224
  source_code_uri: https://github.com/smart-rb/smart_types
226
225
  changelog_uri: https://github.com/smart-rb/smart_types/blob/master/CHANGELOG.md
227
- post_install_message:
228
226
  rdoc_options: []
229
227
  require_paths:
230
228
  - lib
@@ -232,15 +230,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
230
  requirements:
233
231
  - - ">="
234
232
  - !ruby/object:Gem::Version
235
- version: '2.7'
233
+ version: '3.0'
236
234
  required_rubygems_version: !ruby/object:Gem::Requirement
237
235
  requirements:
238
236
  - - ">="
239
237
  - !ruby/object:Gem::Version
240
238
  version: '0'
241
239
  requirements: []
242
- rubygems_version: 3.3.7
243
- signing_key:
240
+ rubygems_version: 3.6.9
244
241
  specification_version: 4
245
242
  summary: Full-featured type system for any ruby project.
246
243
  test_files: []