iba 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/iba.rb +80 -45
- data/test/analyse_test.rb +21 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: aa34cf98d021bff67ebed44e9b62e2445c34793422660c0e221b06ca641c722d
|
4
|
+
data.tar.gz: c23f48c6e815351c9181efb572c98e0849e87d3c35a8b922fad6581e87090157
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 992248f06af84ad50da540697617ce9980acc400adbf8fe1df08965d54345bd335a98c8071ec8e32920fb1454ae0820dbe74b7b32322125b8769a3d611c93b82
|
7
|
+
data.tar.gz: 4ae83722fa833dd949a6b0ec254f395afbe2bed6fcd26d92cb919932f2c5f8bb101dcce3bcf9082df188a5019e97ceb7348dd4f956bc9e36076983e6970b43e6
|
data/lib/iba.rb
CHANGED
@@ -35,37 +35,59 @@ module Iba
|
|
35
35
|
nil
|
36
36
|
else
|
37
37
|
str = expr._to_s
|
38
|
-
|
38
|
+
value = expr._evaluate(@block.binding).inspect
|
39
|
+
"#{str} is #{value}"
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
|
-
class
|
44
|
+
class BaseExpression
|
44
45
|
def method_missing method, *args
|
45
46
|
super if method.to_s =~ /^_/
|
46
47
|
MethodCallExpression.new self, method, args
|
47
48
|
end
|
48
49
|
|
49
|
-
def respond_to_missing?
|
50
|
+
def respond_to_missing? method
|
51
|
+
return false if method.to_s =~ /^_/
|
50
52
|
true
|
51
53
|
end
|
52
54
|
|
55
|
+
def to_s
|
56
|
+
method_missing :to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def == other
|
60
|
+
method_missing :==, other
|
61
|
+
end
|
62
|
+
|
63
|
+
def _wrap arg
|
64
|
+
if arg.is_a? BaseExpression
|
65
|
+
arg
|
66
|
+
else
|
67
|
+
LiteralExpression.new arg
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def coerce other
|
72
|
+
[_wrap(other), self]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class EmptyExpression < BaseExpression
|
53
77
|
def _parse &blk
|
54
|
-
|
78
|
+
bnd = blk.binding
|
55
79
|
|
56
|
-
vars =
|
57
|
-
ivars =
|
80
|
+
vars = bnd.local_variables
|
81
|
+
ivars = bnd.receiver.instance_variables
|
58
82
|
|
59
83
|
_override_instance_variables ivars
|
60
84
|
|
61
|
-
_override_local_variables vars,
|
85
|
+
_override_local_variables vars, bnd
|
62
86
|
|
63
87
|
result = instance_eval(&blk)
|
64
|
-
|
65
|
-
result = LiteralExpression.new(result)
|
66
|
-
end
|
88
|
+
result = _wrap(result)
|
67
89
|
|
68
|
-
_restore_local_variables vars,
|
90
|
+
_restore_local_variables vars, bnd
|
69
91
|
|
70
92
|
result
|
71
93
|
end
|
@@ -73,22 +95,22 @@ module Iba
|
|
73
95
|
def _override_instance_variables vars
|
74
96
|
vars.each do |v|
|
75
97
|
next if v =~ /^@_/
|
76
|
-
|
98
|
+
instance_variable_set v, Iba::InstanceVariableExpression.new(v.to_sym)
|
77
99
|
end
|
78
100
|
end
|
79
101
|
|
80
|
-
def _override_local_variables vars,
|
102
|
+
def _override_local_variables vars, bnd
|
81
103
|
vars.each do |v|
|
82
104
|
next if v =~ /^_/
|
83
|
-
|
84
|
-
|
105
|
+
bnd.local_variable_set "_#{v}", bnd.local_variable_get(v)
|
106
|
+
bnd.local_variable_set v, LocalVariableExpression.new(v.to_sym)
|
85
107
|
end
|
86
108
|
end
|
87
109
|
|
88
|
-
def _restore_local_variables vars,
|
110
|
+
def _restore_local_variables vars, bnd
|
89
111
|
vars.each do |v|
|
90
112
|
next if v =~ /^_/
|
91
|
-
|
113
|
+
bnd.local_variable_set v, bnd.local_variable_get("_#{v}")
|
92
114
|
end
|
93
115
|
end
|
94
116
|
|
@@ -97,7 +119,7 @@ module Iba
|
|
97
119
|
end
|
98
120
|
end
|
99
121
|
|
100
|
-
class LiteralExpression
|
122
|
+
class LiteralExpression < BaseExpression
|
101
123
|
def initialize val
|
102
124
|
@value = val
|
103
125
|
end
|
@@ -105,9 +127,41 @@ module Iba
|
|
105
127
|
def _to_s
|
106
128
|
@value.inspect
|
107
129
|
end
|
130
|
+
|
131
|
+
def _evaluate _bnd
|
132
|
+
@value
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class InstanceVariableExpression < BaseExpression
|
137
|
+
def initialize ivar_name
|
138
|
+
@_ivar_name = ivar_name
|
139
|
+
end
|
140
|
+
|
141
|
+
def _to_s
|
142
|
+
@_ivar_name.to_s
|
143
|
+
end
|
144
|
+
|
145
|
+
def _evaluate bnd
|
146
|
+
bnd.receiver.instance_variable_get @_ivar_name
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class LocalVariableExpression < BaseExpression
|
151
|
+
def initialize lvar_name
|
152
|
+
@_lvar_name = lvar_name
|
153
|
+
end
|
154
|
+
|
155
|
+
def _to_s
|
156
|
+
@_lvar_name.to_s
|
157
|
+
end
|
158
|
+
|
159
|
+
def _evaluate bnd
|
160
|
+
bnd.local_variable_get @_lvar_name
|
161
|
+
end
|
108
162
|
end
|
109
163
|
|
110
|
-
class MethodCallExpression
|
164
|
+
class MethodCallExpression < BaseExpression
|
111
165
|
attr_reader :_method, :_reciever, :_args
|
112
166
|
|
113
167
|
def initialize reciever, methodname, args
|
@@ -122,7 +176,7 @@ module Iba
|
|
122
176
|
|
123
177
|
if @_method == :[]
|
124
178
|
"#{rcv}[#{args[0]}]"
|
125
|
-
elsif
|
179
|
+
elsif _method_is_operator?
|
126
180
|
case @_args.length
|
127
181
|
when 0
|
128
182
|
"#{@_method.to_s.sub(/@$/, '')}#{rcv}"
|
@@ -139,35 +193,16 @@ module Iba
|
|
139
193
|
end
|
140
194
|
end
|
141
195
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
def respond_to_missing? _method
|
148
|
-
true
|
149
|
-
end
|
150
|
-
|
151
|
-
def method_is_operator?
|
152
|
-
@_method.to_s !~ /^[a-z]/
|
153
|
-
end
|
154
|
-
|
155
|
-
def to_s
|
156
|
-
method_missing :to_s
|
157
|
-
end
|
158
|
-
|
159
|
-
def == other
|
160
|
-
method_missing :==, other
|
196
|
+
def _evaluate bnd
|
197
|
+
rcv = @_reciever._evaluate(bnd)
|
198
|
+
args = @_args.map { |arg| arg._evaluate(bnd) }
|
199
|
+
rcv.send @_method, *args
|
161
200
|
end
|
162
201
|
|
163
202
|
private
|
164
203
|
|
165
|
-
def
|
166
|
-
|
167
|
-
arg
|
168
|
-
else
|
169
|
-
LiteralExpression.new arg
|
170
|
-
end
|
204
|
+
def _method_is_operator?
|
205
|
+
@_method.to_s !~ /^[a-z]/
|
171
206
|
end
|
172
207
|
end
|
173
208
|
|
data/test/analyse_test.rb
CHANGED
@@ -54,4 +54,25 @@ class AnalyseTest < Test::Unit::TestCase
|
|
54
54
|
@foo = 23
|
55
55
|
assert_equal '@foo is 23', combinator { @foo }.analyse
|
56
56
|
end
|
57
|
+
|
58
|
+
def test_instance_variable_method_call
|
59
|
+
@foo = 23
|
60
|
+
assert_equal "(@foo == 23) is true\n@foo is 23", combinator { @foo == 23 }.analyse
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_instance_variable_as_argument_of_operator
|
64
|
+
@foo = 23
|
65
|
+
assert_equal '(23 + @foo) is 46', combinator { 23 + @foo }.analyse
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_complex_subexpressions
|
69
|
+
@foo = 23
|
70
|
+
bar = 42
|
71
|
+
baz = [42]
|
72
|
+
result = combinator { (@foo + baz.first) == (bar + 23) }.analyse
|
73
|
+
assert_equal \
|
74
|
+
"((@foo + baz.first) == (bar + 23)) is true\n" \
|
75
|
+
'(@foo + baz.first) is 65, (bar + 23) is 65',
|
76
|
+
result
|
77
|
+
end
|
57
78
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iba
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matijs van Zuijlen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -73,7 +73,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: 2.
|
76
|
+
version: 2.2.0
|
77
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - ">="
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
version: '0'
|
82
82
|
requirements: []
|
83
83
|
rubyforge_project:
|
84
|
-
rubygems_version: 2.6
|
84
|
+
rubygems_version: 2.7.6
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Introspective Block Assertions
|