low_type 1.2.0 → 1.3.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: 218e91b66e1cd32b9760929f79046c215475f4b07416589443e92cd61ff35af5
4
- data.tar.gz: bd69d269f5d4cab60a1e9b1277c93d62ab9540ae483a9c176921062150ef4430
3
+ metadata.gz: 4c2486123df7a2ef95af428ffed95c0cefa986c300f5b7e20edcba5926454d2c
4
+ data.tar.gz: b06eecc97f2d4d6a768e8dfc715bda4a7b38b4d281b5f4bb730350e56cad9663
5
5
  SHA512:
6
- metadata.gz: e03cedbb09f99af96a08cd6a3d755e775cefea140f9fa25b4a920079298b0e65fefcc27a5600890404c6988b977d6dc3540d3db5abdab37e4347aad6f322bd1e
7
- data.tar.gz: d31c9c3bd5e645043b4ad710c415858300013000862ab2ef0a6664e3e59751251c448c6a6cbaedf63147446aaa0aca1d5bac433b60952b7a7bd05a05b1342440
6
+ metadata.gz: 53654148a7e391a5f6bcdd86d1b33aea7b56e5a11d2e5be4b83c18901ae40ed72976d67c699710c3114babfd4390aef573580e750d49bfc3c0bbe076bd68f684
7
+ data.tar.gz: '05132820addc2ebe0ee79418b6f9c881ae881d205449a39a04bd24548b4cca8dc653fd1dbedf30207e4123632a263343e5920b5bed43d2c68f9f471c68100327'
@@ -35,37 +35,47 @@ module Low
35
35
  include Types
36
36
  using LowType::Syntax
37
37
 
38
- def instance_evaluate(proxy:)
38
+ def low_evaluate(proxy:)
39
39
  # Not a security risk because the code comes from a trusted source; the file that included lowtype.
40
40
  eval(proxy.value, binding, proxy.file_path, proxy.start_line) # rubocop:disable Security/Eval
41
41
  end
42
42
 
43
+ def class_evaluate(proxy:, class_binding:)
44
+ # Not a security risk because the code comes from a trusted source; the file that included lowtype.
45
+ eval(proxy.value, class_binding, proxy.file_path, proxy.start_line) # rubocop:disable Security/Eval
46
+ end
47
+
43
48
  class << self
44
- def evaluate(method_proxies:)
49
+ def evaluate(method_proxies:, class_binding: nil)
45
50
  require_relative '../syntax/union_types' if LowType.config.union_type_expressions
46
51
 
47
52
  method_proxies.each_value do |method_proxy|
48
- evaluate_param_proxy_expressions(method_proxy:)
53
+ evaluate_param_proxy_expressions(method_proxy:, class_binding:)
49
54
  evaluate_return_proxy_expression(return_proxy: method_proxy.return_proxy) if method_proxy.return_proxy
50
55
  end
51
56
  end
52
57
 
53
- def evaluate_param_proxy_expressions(method_proxy:)
58
+ def evaluate_param_proxy_expressions(method_proxy:, class_binding: nil)
54
59
  begin # rubocop:disable Style/RedundantBegin
55
60
  method_proxy.tagged_params(:value).each do |param_proxy|
56
- # TODO: Evaluate in the binding of the class that included LowType if not a type managed by LowType.
57
- expression = new.instance_evaluate(proxy: param_proxy)
61
+ expression = begin
62
+ new.low_evaluate(proxy: param_proxy)
63
+ rescue NameError
64
+ raise unless class_binding
65
+
66
+ new.class_evaluate(proxy: param_proxy, class_binding:)
67
+ end
58
68
  param_proxy.expression = cast_type_expression(expression:, method_proxy:)
59
69
  end
60
- rescue NameError
70
+ rescue NameError => e
61
71
  mp = method_proxy
62
- raise NameError, "Unknown type '#{mp.value}' for #{mp.scope} at #{mp.file_path}:#{mp.start_line}"
72
+ raise NameError, "Unknown type '#{e.name}' for #{mp.scope} at #{mp.file_path}:#{mp.start_line}"
63
73
  end
64
74
  end
65
75
 
66
76
  def evaluate_return_proxy_expression(return_proxy:)
67
77
  begin
68
- expression = new.instance_evaluate(proxy: return_proxy)
78
+ expression = new.low_evaluate(proxy: return_proxy)
69
79
  rescue NameError
70
80
  rp = return_proxy
71
81
  raise NameError, "Unknown return type '#{rp.value}' for #{rp.scope} at #{rp.file_path}:#{rp.start_line}"
@@ -5,6 +5,17 @@ require_relative '../proxies/return_proxy'
5
5
  require_relative '../queries/type_query'
6
6
 
7
7
  module Low
8
+ # Usage:
9
+ #
10
+ # type_accessor name: String # => @name getter and @name=() setter
11
+ # type_accessor name: String | 'Cher'
12
+ #
13
+ # type_reader name: String
14
+ # type_reader name: String | 'Cher' # defaults to 'Cher' if nil
15
+ #
16
+ # type_writer name: String
17
+ # type_writer name: String | nil # accepts String or nil
18
+ #
8
19
  module TypeAccessors
9
20
  def type_reader(named_expressions)
10
21
  named_expressions.each do |name, exp|
data/lib/low_type.rb CHANGED
@@ -50,7 +50,7 @@ module LowType
50
50
 
51
51
  class_proxy.class_binding = trace.binding
52
52
 
53
- Low::Evaluator.evaluate(method_proxies: class_proxy.keyed_methods)
53
+ Low::Evaluator.evaluate(method_proxies: class_proxy.keyed_methods, class_binding: class_proxy.class_binding)
54
54
 
55
55
  klass.prepend Low::Redefiner.redefine(method_proxies: class_proxy.instance_methods, class_proxy:)
56
56
  klass.singleton_class.prepend Low::Redefiner.redefine(method_proxies: class_proxy.class_methods, class_proxy:)
@@ -63,17 +63,18 @@ module LowType
63
63
  tp.enable
64
64
  end
65
65
 
66
+ Config = Struct.new(
67
+ :type_checking,
68
+ :error_mode,
69
+ :output_mode,
70
+ :output_size,
71
+ :deep_type_check,
72
+ :union_type_expressions
73
+ )
74
+
66
75
  class << self
67
76
  def config
68
- config = Struct.new(
69
- :type_checking,
70
- :error_mode,
71
- :output_mode,
72
- :output_size,
73
- :deep_type_check,
74
- :union_type_expressions
75
- )
76
- @config ||= config.new(true, :error, :type, 100, true, true)
77
+ @config ||= Config.new(true, :error, :type, 100, true, true)
77
78
  end
78
79
 
79
80
  def configure
data/lib/version.rb CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Low
4
4
  module Type
5
- VERSION = '1.2.0'
5
+ VERSION = '1.3.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: low_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi