low_type 0.2.1 → 0.2.2

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/redefiner.rb +84 -0
  3. data/lib/version.rb +1 -1
  4. metadata +2 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76a73e683c2e961c41eef7d14d5f41ac3e7252f9c22cc2b4b807c6ede92b6a89
4
- data.tar.gz: 0a264a10f5c070c2b08160e0c94d69cf403c86a2961a0b72eab069b5e47c33af
3
+ metadata.gz: f39ec6a2c5d0986b75bd52a8bec8033b38bd5ba094515994fa655e253b47a669
4
+ data.tar.gz: f7aa54e8ce075b121a8e8fed025ea5a60e13a151a6891cb6aaedbe63432f8769
5
5
  SHA512:
6
- metadata.gz: cd2e3b8caf03f7575d765eb573b66035706f2cc82fecea20fb806902e94aae5a7040d3eac4afdb3888b49359a035903e5b714a4662dd1cc4b25b28d79d40797b
7
- data.tar.gz: 56c33ae15714520170d9cc85df710ce20b5a50dd1162705341938129ab95f0c6556baec3cd19c3371523c3f3994ed549d024a17937c83688ec91879e8e36e6b0
6
+ metadata.gz: 021eec0aae1a09604d45f5911647000f1620a0d1482cd743ee5066ae660b7e425af246a4806b7ef50763bc1dad3587631eeeea5e428abb7cc20308dec043d9f1
7
+ data.tar.gz: a238797c74dbe741db04a104ebad2f081d197bd5cea38dde2ae4ee5cb4a6735de183d1722b08229691d063c14e2f8ffd2662957fb19573f840bb19bc01cc4626
data/lib/redefiner.rb ADDED
@@ -0,0 +1,84 @@
1
+ require_relative 'param_proxy'
2
+ require_relative 'parser'
3
+ require_relative 'type_expression'
4
+
5
+ module LowType
6
+ class Redefiner
7
+ class << self
8
+ def redefine_methods(method_nodes:, private_start_line:, klass:)
9
+ Module.new do
10
+ method_nodes.each do |method_node|
11
+ args = method_node.parameters.slice
12
+
13
+ proxy_method = eval("-> (#{args}) {}")
14
+ required_args, required_kwargs = Redefiner.required_args(proxy_method)
15
+
16
+ klass.low_params[method_node.name] = Redefiner.type_expressions_from_params(proxy_method, args, required_args, required_kwargs)
17
+ next if klass.low_params[method_node.name].empty?
18
+
19
+ define_method(method_node.name) do |*args, **kwargs|
20
+ klass.low_params[method_node.name].each do |param_proxy|
21
+ arg = param_proxy.position ? args[param_proxy.position] : kwargs[param_proxy.name]
22
+ arg = param_proxy.type_expression.default_value if arg.nil? && param_proxy.type_expression.default_value != :LOW_TYPE_UNDEFINED
23
+ param_proxy.type_expression.validate!(arg:, name: param_proxy.name)
24
+ param_proxy.position ? args[param_proxy.position] = arg : kwargs[param_proxy.name] = arg
25
+ end
26
+
27
+ super(*args, **kwargs)
28
+ end
29
+
30
+ if private_start_line && method_node.start_line > private_start_line
31
+ private method_node.name
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def required_args(proxy_method)
38
+ required_args = []
39
+ required_kwargs = {}
40
+
41
+ proxy_method.parameters.each do |param|
42
+ param_type, param_name = param
43
+
44
+ case param_type
45
+ when :req
46
+ required_args << nil
47
+ when :keyreq
48
+ required_kwargs[param_name] = nil
49
+ end
50
+ end
51
+
52
+ [required_args, required_kwargs]
53
+ end
54
+
55
+ def type_expressions_from_params(proxy_method, args, required_args, required_kwargs)
56
+ typed_method = eval(
57
+ <<~RUBY
58
+ -> (#{args}) {
59
+ param_proxies = []
60
+
61
+ proxy_method.parameters.each_with_index do |param, position|
62
+ type, name = param
63
+ position = nil unless [:opt, :req, :rest].include?(type)
64
+
65
+ expression = binding.local_variable_get(name)
66
+
67
+ if expression.class == TypeExpression
68
+ param_proxies << ParamProxy.new(type_expression: expression, name:, type:, position:)
69
+ elsif ::LowType.type?(expression)
70
+ param_proxies << ParamProxy.new(type_expression: TypeExpression.new(type: expression), name:, type:, position:)
71
+ end
72
+ end
73
+
74
+ param_proxies
75
+ }
76
+ RUBY
77
+ )
78
+
79
+ # Call method with only its required args to evaluate type expressions (which are stored as default values).
80
+ typed_method.call(*required_args, **required_kwargs)
81
+ end
82
+ end
83
+ end
84
+ end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LowType
4
- VERSION = '0.2.1'
4
+ VERSION = '0.2.2'
5
5
  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: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -20,6 +20,7 @@ files:
20
20
  - lib/low_type.rb
21
21
  - lib/param_proxy.rb
22
22
  - lib/parser.rb
23
+ - lib/redefiner.rb
23
24
  - lib/type_expression.rb
24
25
  - lib/version.rb
25
26
  homepage: https://codeberg.org/low_ruby/low_type