sorbet-runtime 0.4.4602 → 0.4.4651

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
  SHA1:
3
- metadata.gz: 669bee02c8d49eb43e2875a57f68471811056521
4
- data.tar.gz: 00f343319dc4bf60291fff125981531f47373cda
3
+ metadata.gz: eb29fced50e91266ad73cc771434de432387bd12
4
+ data.tar.gz: 9278be4e1ef30d46845e89a7647ad57a7d701966
5
5
  SHA512:
6
- metadata.gz: e6d6f5672d20293f428939d370061fb036d84592d5f8fef5c8d802d80d62bb2ca94b7906078141e68773cfc355f6d26911d3ea0818ece94d32006f4634c2f20d
7
- data.tar.gz: b851511665722ea42fa7fc18908c00ee3be0a0cb6f5b9ebac07c4bfc6e207bf24b38676d29b0acfcc07beefb02fa922f23fca80c724854823635f342a2ffb1e5
6
+ metadata.gz: 4bb1fc554bbce84f6c4989eef5d2c546c1ec77546663b19381d62ed74cae7be800c26630f9efbad29b0dd9055d036afcc333a0dab18861b8372271fd4009b545
7
+ data.tar.gz: 94817c53e7bd2649434f1477a7ab8107ccf1331f3757d2882fb1827a44af712cf70c9007b5634052363e00aeba1b4080cf462702a2689e88e864f7a7899aa403
@@ -30,6 +30,7 @@ require_relative 'types/private/methods/_methods'
30
30
  require_relative 'types/sig'
31
31
  require_relative 'types/helpers'
32
32
  require_relative 'types/private/final'
33
+ require_relative 'types/private/sealed'
33
34
 
34
35
  # The types themselves. First base classes
35
36
  require_relative 'types/types/base'
@@ -44,6 +45,7 @@ require_relative 'types/types/noreturn'
44
45
  require_relative 'types/types/proc'
45
46
  require_relative 'types/types/self_type'
46
47
  require_relative 'types/types/simple'
48
+ require_relative 'types/types/opus_enum'
47
49
  require_relative 'types/types/type_parameter'
48
50
  require_relative 'types/types/typed_array'
49
51
  require_relative 'types/types/typed_enumerator'
data/lib/types/helpers.rb CHANGED
@@ -21,7 +21,7 @@ module T::Helpers
21
21
  end
22
22
 
23
23
  def sealed!
24
- Kernel.raise "TODO(jez) sealed is not implemented in the runtime yet."
24
+ Private::Sealed.declare(self, Kernel.caller(1..1)&.first&.split(':')&.first)
25
25
  end
26
26
 
27
27
  # Causes a mixin to also mix in class methods from the named module.
@@ -96,9 +96,9 @@ module T::Private::ClassUtils
96
96
 
97
97
  overwritten = original_owner == mod
98
98
  T::Configuration.without_ruby_warnings do
99
- T::Private::DeclState.current.skip_on_method_added = true
100
- mod.send(:define_method, name, &blk) # rubocop:disable PrisonGuard/UsePublicSend
101
- T::Private::DeclState.current.skip_on_method_added = false
99
+ T::Private::DeclState.current.without_on_method_added do
100
+ mod.send(:define_method, name, &blk) # rubocop:disable PrisonGuard/UsePublicSend
101
+ end
102
102
  end
103
103
  mod.send(original_visibility, name) # rubocop:disable PrisonGuard/UsePublicSend
104
104
  new_method = mod.instance_method(name)
@@ -16,4 +16,15 @@ class T::Private::DeclState
16
16
  def reset!
17
17
  self.active_declaration = nil
18
18
  end
19
+
20
+ def without_on_method_added
21
+ begin
22
+ # explicit 'self' is needed here
23
+ old_value = self.skip_on_method_added
24
+ self.skip_on_method_added = true
25
+ yield
26
+ ensure
27
+ self.skip_on_method_added = old_value
28
+ end
29
+ end
19
30
  end
@@ -31,6 +31,9 @@ module T::Private::Final
31
31
  if T::AbstractUtils.abstract_module?(mod)
32
32
  raise "#{mod} was already declared as abstract and cannot be declared as final"
33
33
  end
34
+ if T::Private::Sealed.sealed_module?(mod)
35
+ raise "#{mod} was already declared as sealed and cannot be declared as final"
36
+ end
34
37
  mod.extend(mod.is_a?(Class) ? NoInherit : NoIncludeExtend)
35
38
  mark_as_final_module(mod)
36
39
  mark_as_final_module(mod.singleton_class)
@@ -37,9 +37,9 @@ module T::Private::Methods::CallValidation
37
37
  else
38
38
  T::Configuration.without_ruby_warnings do
39
39
  # get all the shims out of the way and put back the original method
40
- T::Private::DeclState.current.skip_on_method_added = true
41
- mod.send(:define_method, method_sig.method_name, original_method)
42
- T::Private::DeclState.current.skip_on_method_added = false
40
+ T::Private::DeclState.current.without_on_method_added do
41
+ mod.send(:define_method, method_sig.method_name, original_method)
42
+ end
43
43
  mod.send(original_visibility, method_sig.method_name)
44
44
  end
45
45
  end
@@ -172,15 +172,15 @@ module T::Private::Methods::CallValidation
172
172
  has_simple_procedure_types = all_args_are_simple && method_sig.return_type.is_a?(T::Private::Types::Void)
173
173
 
174
174
  T::Configuration.without_ruby_warnings do
175
- T::Private::DeclState.current.skip_on_method_added = true
176
- if has_fixed_arity && has_simple_method_types && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
177
- create_validator_method_fast(mod, original_method, method_sig)
178
- elsif has_fixed_arity && has_simple_procedure_types && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
179
- create_validator_procedure_fast(mod, original_method, method_sig)
180
- else
181
- create_validator_slow(mod, original_method, method_sig)
182
- end
183
- T::Private::DeclState.current.skip_on_method_added = false
175
+ T::Private::DeclState.current.without_on_method_added do
176
+ if has_fixed_arity && has_simple_method_types && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
177
+ create_validator_method_fast(mod, original_method, method_sig)
178
+ elsif has_fixed_arity && has_simple_procedure_types && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
179
+ create_validator_procedure_fast(mod, original_method, method_sig)
180
+ else
181
+ create_validator_slow(mod, original_method, method_sig)
182
+ end
183
+ end
184
184
  end
185
185
  mod.send(original_visibility, method_sig.method_name)
186
186
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ # typed: false
3
+
4
+ module T::Private::Sealed
5
+ module NoInherit
6
+ def inherited(other)
7
+ super
8
+ this_line = Kernel.caller.find {|line| !line.match(/in `inherited'$/)}
9
+ T::Private::Sealed.validate_inheritance(this_line, self, 'inherited')
10
+ end
11
+ end
12
+
13
+ module NoIncludeExtend
14
+ def included(other)
15
+ super
16
+ this_line = Kernel.caller.find {|line| !line.match(/in `included'$/)}
17
+ T::Private::Sealed.validate_inheritance(this_line, self, 'included')
18
+ end
19
+
20
+ def extended(other)
21
+ super
22
+ this_line = Kernel.caller.find {|line| !line.match(/in `extended'$/)}
23
+ T::Private::Sealed.validate_inheritance(this_line, self, 'extended')
24
+ end
25
+ end
26
+
27
+ def self.declare(mod, decl_file)
28
+ if !mod.is_a?(Module)
29
+ raise "#{mod} is not a class or module and cannot be declared `sealed!`"
30
+ end
31
+ if sealed_module?(mod)
32
+ raise "#{mod} was already declared `sealed!` and cannot be re-declared `sealed!`"
33
+ end
34
+ if T::Private::Final.final_module?(mod)
35
+ raise "#{mod} was already declared `final!` and cannot be declared `sealed!`"
36
+ end
37
+ mod.extend(mod.is_a?(Class) ? NoInherit : NoIncludeExtend)
38
+ if !decl_file
39
+ raise "Couldn't determine declaration file for sealed class."
40
+ end
41
+ mod.instance_variable_set(:@sorbet_sealed_module_decl_file, decl_file)
42
+ end
43
+
44
+ def self.sealed_module?(mod)
45
+ mod.instance_variable_defined?(:@sorbet_sealed_module_decl_file)
46
+ end
47
+
48
+ def self.validate_inheritance(this_line, parent, verb)
49
+ this_file = this_line&.split(':').first
50
+ decl_file = parent.instance_variable_get(:@sorbet_sealed_module_decl_file)
51
+
52
+ if !this_file || !decl_file
53
+ raise "Couldn't determine enough file information for checking sealed modules"
54
+ end
55
+
56
+ if !this_file.start_with?(decl_file)
57
+ raise "#{parent} was declared sealed and can only be #{verb} in #{decl_file}, not #{this_file}"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ # Validates that an object is equal to another Opus::Enum singleton value.
6
+ class OpusEnum < Base
7
+ attr_reader :val
8
+
9
+ def initialize(val)
10
+ @val = val
11
+ end
12
+
13
+ # @override Base
14
+ def name
15
+ @val.inspect
16
+ end
17
+
18
+ # @override Base
19
+ def valid?(obj)
20
+ @val == obj
21
+ end
22
+
23
+ # @override Base
24
+ private def subtype_of_single?(other)
25
+ case other
26
+ when OpusEnum
27
+ @val == other.val
28
+ else
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/types/utils.rb CHANGED
@@ -26,6 +26,8 @@ module T::Utils
26
26
  T::Types::FixedHash.new(val) # rubocop:disable PrisonGuard/UseOpusTypesShortcut
27
27
  elsif val.is_a?(T::Private::Methods::DeclBuilder)
28
28
  T::Private::Methods.finalize_proc(val.decl)
29
+ elsif defined?(::Opus) && defined?(::Opus::Enum) && val.is_a?(::Opus::Enum)
30
+ T::Types::OpusEnum.new(val) # rubocop:disable PrisonGuard/UseOpusTypesShortcut
29
31
  else
30
32
  raise "Invalid value for type constraint. Must be an #{T::Types::Base}, a " \
31
33
  "class/module, or an array. Got a `#{val.class}`."
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4602
4
+ version: 0.4.4651
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-09 00:00:00.000000000 Z
11
+ date: 2019-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -98,6 +98,7 @@ files:
98
98
  - lib/types/private/methods/signature_validation.rb
99
99
  - lib/types/private/mixins/mixins.rb
100
100
  - lib/types/private/runtime_levels.rb
101
+ - lib/types/private/sealed.rb
101
102
  - lib/types/private/types/not_typed.rb
102
103
  - lib/types/private/types/string_holder.rb
103
104
  - lib/types/private/types/void.rb
@@ -124,6 +125,7 @@ files:
124
125
  - lib/types/types/fixed_hash.rb
125
126
  - lib/types/types/intersection.rb
126
127
  - lib/types/types/noreturn.rb
128
+ - lib/types/types/opus_enum.rb
127
129
  - lib/types/types/proc.rb
128
130
  - lib/types/types/self_type.rb
129
131
  - lib/types/types/simple.rb