destructure 0.0.12 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d1c33debe9be83eab196be5c71b8602b4467a0e
4
- data.tar.gz: d28c21e0de1f1ddd88bbfa73a858025375f13fba
3
+ metadata.gz: e5d0b1548c863bb1ba5146873b0c166fd36e055b
4
+ data.tar.gz: 52f6b0b15e2ceec3c4d486570f3bef4dda4a0371
5
5
  SHA512:
6
- metadata.gz: d4266394d4d8ee34872c810c777ca1882a43f6cc1d769f62855ef8e5eb16e38b4a3cf10c09ee1a0c7418932e6faba1a2eb6fa226b08a3ea4952b3217158e38bb
7
- data.tar.gz: 52ede93459670e44d1407263210267aedae88a6a69f184fb271e24ef709b5148675f251644e34ccc02b00bd94b2cd7584ccb12eaa3eb63773fd1f44aa5f8f802
6
+ metadata.gz: b3517fb92fe51414e8568857aa3e98b85151196e07633af028c110a249be9d1ef7774390e9288b93a2e48f3ad2c3abe2a6816beb3318ea6681a947e8f992b248
7
+ data.tar.gz: d4f3647f5cd6d0bcb3862292abf31e629e79c7c71f3a3ac3e82f12323e3a6d45103efe3aba01845d5342166c60ef7a670e823d3d94fe6f871153e8b571527852
@@ -16,73 +16,109 @@ module Destructure
16
16
  _ = DMatch::_
17
17
  klass_sym = DMatch::Var.new(&method(:is_constant?))
18
18
  case
19
+
19
20
  # '_' (wildcard)
20
- when e = dmatch([:call, _, :_, _], sp); _
21
+ when e = dmatch([:call, _, :_, _], sp); _
22
+
21
23
  # object matcher without parameters
22
- when e = dmatch([:const, klass_sym], sp)
23
- make_obj(e[klass_sym], {})
24
+ when e = dmatch([:const, klass_sym], sp)
25
+ make_obj(e[klass_sym], {})
26
+
27
+ # namespace-qualified object matcher without parameters
28
+ when e = dmatch([:colon2, splat(:args)], sp)
29
+ make_obj(read_fq_const(sp), {})
30
+
24
31
  # '~' (splat)
25
- when e = dmatch([:call, var(:identifier_sexp), :~, [:arglist]], sp); splat(unwind_receivers_and_clean(e[:identifier_sexp]))
32
+ when e = dmatch([:call, var(:identifier_sexp), :~, [:arglist]], sp); splat(unwind_receivers_and_clean(e[:identifier_sexp]))
33
+
26
34
  # '!' (variable value)
27
- when e = dmatch([:not, var(:value_sexp)], sp)
28
- @caller_binding.eval(unwind_receivers_and_clean(e[:value_sexp]).to_s)
35
+ when e = dmatch([:not, var(:value_sexp)], sp)
36
+ @caller_binding.eval(unwind_receivers_and_clean(e[:value_sexp]).to_s)
37
+
29
38
  # '|' (alternative patterns)
30
- when e = dmatch([:call, var(:rest), :|, [:arglist, var(:alt)]], sp); DMatch::Or.new(*[e[:rest], e[:alt]].map(&method(:transform)))
39
+ when e = dmatch([:call, var(:rest), :|, [:arglist, var(:alt)]], sp); DMatch::Or.new(*[e[:rest], e[:alt]].map(&method(:transform)))
40
+
31
41
  # generic call
32
- when e = dmatch([:call, var(:receiver), var(:msg), var(:arglist)], sp)
33
- transform_call(e[:receiver], e[:msg], e[:arglist])
42
+ when e = dmatch([:call, var(:receiver), var(:msg), var(:arglist)], sp)
43
+ transform_call(e[:receiver], e[:msg], e[:arglist])
44
+
34
45
  # instance variable
35
- when e = dmatch([:ivar, var(:name)], sp); var(e[:name].to_s)
46
+ when e = dmatch([:ivar, var(:name)], sp); var(e[:name].to_s)
47
+
36
48
  # let
37
49
  # ... with local or instance vars
38
- when e = dmatch([DMatch::Or.new(:lasgn, :iasgn), var(:lhs), var(:rhs)], sp)
39
- let_var(e[:lhs], transform(e[:rhs]))
50
+ when e = dmatch([DMatch::Or.new(:lasgn, :iasgn), var(:lhs), var(:rhs)], sp)
51
+ let_var(e[:lhs], transform(e[:rhs]))
52
+
40
53
  # ... with attributes or something more complicated
41
- when e = dmatch([:attrasgn, var(:obj), var(:attr), [:arglist, var(:rhs)]], sp)
42
- var_name = unwind_receivers_and_clean([:call, e[:obj], e[:attr].to_s.sub(/=$/,'').to_sym, [:arglist]])
43
- let_var(var_name, transform(e[:rhs]))
54
+ when e = dmatch([:attrasgn, var(:obj), var(:attr), [:arglist, var(:rhs)]], sp)
55
+ var_name = unwind_receivers_and_clean([:call, e[:obj], e[:attr].to_s.sub(/=$/,'').to_sym, [:arglist]])
56
+ let_var(var_name, transform(e[:rhs]))
57
+
44
58
  # literal values
45
- when e = dmatch([:lit, var(:value)], sp); e[:value]
46
- when e = dmatch([:true], sp); true
47
- when e = dmatch([:false], sp); false
48
- when e = dmatch([:nil], sp); nil
49
- when e = dmatch([:str, var(:s)], sp); e[:s]
50
- when e = dmatch([:array, splat(:items)], sp); e[:items].map(&method(:transform))
51
- when e = dmatch([:hash, splat(:kvs)], sp); Hash[*e[:kvs].map(&method(:transform))]
52
- else; raise "Unexpected sexp: #{sp.inspect}"
59
+ when e = dmatch([:lit, var(:value)], sp); e[:value]
60
+ when e = dmatch([:true], sp); true
61
+ when e = dmatch([:false], sp); false
62
+ when e = dmatch([:nil], sp); nil
63
+ when e = dmatch([:str, var(:s)], sp); e[:s]
64
+ when e = dmatch([:array, splat(:items)], sp); e[:items].map(&method(:transform))
65
+ when e = dmatch([:hash, splat(:kvs)], sp); Hash[*e[:kvs].map(&method(:transform))]
66
+ else; raise "Unexpected sexp: #{sp.inspect}"
53
67
  end
54
68
  end
55
69
 
56
70
  private ########################################
57
71
 
72
+ def read_fq_const(sp, parts=[])
73
+ klass_sym = DMatch::Var.new(&method(:is_constant?))
74
+ case
75
+ when e = dmatch([:const, klass_sym], sp)
76
+ parts = [e[klass_sym]] + parts
77
+ Object.const_get("#{parts.join('::')}")
78
+ when e = dmatch([:colon2, var(:prefix), var(:last)], sp)
79
+ read_fq_const(e[:prefix], [e[:last]] + parts)
80
+ end
81
+ end
82
+
58
83
  def transform_call(*sexp_call)
59
84
  sexp_receiver, sexp_msg, sexp_args = sexp_call
60
85
  _ = DMatch::_
61
86
  klass_sym_var = DMatch::Var.new(&method(:is_constant?))
62
87
  case
63
88
  # Class[...]
64
- when e = dmatch([[:const, klass_sym_var], :[]], [sexp_receiver, sexp_msg])
65
- field_map = make_field_map(sexp_args)
66
- klass_sym = e[klass_sym_var]
67
- klass_sym == :Hash ? field_map : make_obj(klass_sym, field_map)
89
+ when e = dmatch([[:const, klass_sym_var], :[]], [sexp_receiver, sexp_msg])
90
+ field_map = make_field_map(sexp_args)
91
+ klass_sym = e[klass_sym_var]
92
+ klass_sym == :Hash ? field_map : make_obj(klass_sym, field_map)
93
+
94
+ # namespace-qualified constant receiver
95
+ when e = dmatch([:colon2, splat(:args)], sexp_receiver)
96
+ field_map = make_field_map(sexp_args)
97
+ klass_sym = read_fq_const(sexp_receiver)
98
+ make_obj(klass_sym, field_map)
99
+
68
100
  # local variable
69
- when e = dmatch([nil, var(:name), [:arglist]], sexp_call); var(e[:name])
101
+ when e = dmatch([nil, var(:name), [:arglist]], sexp_call)
102
+ var(e[:name])
103
+
70
104
  # call chain (@one.two(12).three[3].four)
71
- else; var(unwind_receivers_and_clean([:call, *sexp_call]))
105
+ else
106
+ var(unwind_receivers_and_clean([:call, *sexp_call]))
72
107
  end
73
108
  end
74
109
 
75
110
  def make_field_map(sexp_args)
76
111
  case
77
112
  # Class[a: 1, b: 2]
78
- when e = dmatch([:arglist, [:hash, splat(:kv_sexps)]], sexp_args)
79
- kvs = transform_many(e[:kv_sexps])
80
- Hash[*kvs]
113
+ when e = dmatch([:arglist, [:hash, splat(:kv_sexps)]], sexp_args)
114
+ kvs = transform_many(e[:kv_sexps])
115
+ Hash[*kvs]
116
+
81
117
  # Class[a, b, c]
82
- when e = dmatch([:arglist, splat(:field_name_sexps)], sexp_args)
83
- field_names = transform_many(e[:field_name_sexps])
84
- Hash[field_names.map { |f| [f.name, var(f.name)] }]
85
- else; raise 'oops'
118
+ when e = dmatch([:arglist, splat(:field_name_sexps)], sexp_args)
119
+ field_names = transform_many(e[:field_name_sexps])
120
+ Hash[field_names.map { |f| [f.name, var(f.name)] }]
121
+ else; raise 'oops'
86
122
  end
87
123
  end
88
124
 
@@ -96,16 +132,15 @@ module Destructure
96
132
  end
97
133
 
98
134
  def unwind_receivers(receiver)
99
- to_s
100
135
  case
101
- when receiver.nil?; ''
102
- when e = dmatch([:lit, var(:value)], receiver); "#{e[:value]}."
103
- when e = dmatch([:ivar, var(:name)], receiver); "#{e[:name]}."
104
- when e = dmatch([:call, var(:receiver), :[], [:arglist, splat(:args)]], receiver)
105
- unwind_receivers(e[:receiver]) + format_hash_call(e[:args])
106
- when e = dmatch([:call, var(:receiver), var(:msg), [:arglist, splat(:args)]], receiver)
107
- unwind_receivers(e[:receiver]) + format_method_call(e[:msg], e[:args])
108
- else; raise 'oops'
136
+ when receiver.nil?; ''
137
+ when e = dmatch([:lit, var(:value)], receiver); "#{e[:value]}."
138
+ when e = dmatch([:ivar, var(:name)], receiver); "#{e[:name]}."
139
+ when e = dmatch([:call, var(:receiver), :[], [:arglist, splat(:args)]], receiver)
140
+ unwind_receivers(e[:receiver]) + format_hash_call(e[:args])
141
+ when e = dmatch([:call, var(:receiver), var(:msg), [:arglist, splat(:args)]], receiver)
142
+ unwind_receivers(e[:receiver]) + format_method_call(e[:msg], e[:args])
143
+ else; raise 'oops'
109
144
  end
110
145
  end
111
146
 
@@ -153,4 +188,4 @@ module Destructure
153
188
  DMatch::Splat.new(name)
154
189
  end
155
190
  end
156
- end
191
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: destructure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Winton
@@ -10,6 +10,20 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2013-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: sourcify
15
29
  requirement: !ruby/object:Gem::Requirement