code-ruby 0.7.8 → 0.8.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
  SHA256:
3
- metadata.gz: 5bbad84793e5bbf2f414b6f151f528534f7925ae62182cb101afb3d4c3d79ef0
4
- data.tar.gz: 76759f9e4dc4ac0a1abce13727d003930cd498933ffabe83b8b83334850e5af1
3
+ metadata.gz: efd32092c4583410121731e5e6a0300001ef215812e690b0a3fe3c280f0cf84e
4
+ data.tar.gz: b7a88bce4d570b5c9156e79fe5a684f8e945a18faca8a3ecfb242b8ca720d96f
5
5
  SHA512:
6
- metadata.gz: e2058ad57bcd88790c5b7201c3509df3fc3ff876db19a53811a7db679e5687ff95800df13cecdc114dbd4ec4b3cec4b36c3778a7800f1568ba251f6b770a5fd9
7
- data.tar.gz: 7628080cb943ae6169e4e859849fecabe8b4ddc0ac938cdd81f34a689938d6caf3bfd56c0f3d25a76088a6f18789b1309bc80e94ca99922882733bc9ab6b6abc
6
+ metadata.gz: 2d047f84b6ddb2ac77b8154692089eea38f02a6e4d8b7a46b2e2334594d9a00178dcdfa4b649c82267178c7a681ccd3874685b19c5a8c531c7fb72b7ce5e3189
7
+ data.tar.gz: df9dd8a546339658b3efa419685559981b20aba4b3e7a48e52a580cae0dabc7e19e5691efabdd4591f89ed0525358b557947cf0a744eee52d59297722ef059a2
@@ -9,18 +9,16 @@ class Code
9
9
  @raw = raw
10
10
  end
11
11
 
12
- def call(**args)
13
- operator = args.fetch(:operator, nil)
12
+ def call(...)
13
+ raw.call(...)
14
+ end
15
+
16
+ def to_s
17
+ raw.name
18
+ end
14
19
 
15
- if raw == Time && operator.to_s == "tomorrow"
16
- sig(args)
17
- Time.code_tomorrow
18
- elsif raw == Date && operator.to_s == "tomorrow"
19
- sig(args)
20
- Date.code_tomorrow
21
- else
22
- super
23
- end
20
+ def inspect
21
+ to_s
24
22
  end
25
23
 
26
24
  def self.name
@@ -13,6 +13,18 @@ class Code
13
13
  "Date"
14
14
  end
15
15
 
16
+ def self.call(**args)
17
+ operator = args.fetch(:operator, nil)
18
+
19
+ case operator.to_s
20
+ when "tomorrow"
21
+ sig(args)
22
+ code_tomorrow
23
+ else
24
+ super
25
+ end
26
+ end
27
+
16
28
  def self.code_tomorrow
17
29
  ::Time.zone ||= Time::DEFAULT_ZONE
18
30
  new(::Time.zone.tomorrow)
@@ -15,6 +15,18 @@ class Code
15
15
  "Time"
16
16
  end
17
17
 
18
+ def self.call(**args)
19
+ operator = args.fetch(:operator, nil)
20
+
21
+ case operator.to_s
22
+ when "tomorrow"
23
+ sig(args)
24
+ code_tomorrow
25
+ else
26
+ super
27
+ end
28
+ end
29
+
18
30
  def self.code_tomorrow
19
31
  ::Time.zone ||= DEFAULT_ZONE
20
32
  new(::Time.zone.tomorrow.beginning_of_day)
data/lib/code/object.rb CHANGED
@@ -18,6 +18,151 @@ class Code
18
18
  Type::Or.new(self, other)
19
19
  end
20
20
 
21
+ def self.sig(args, &block)
22
+ Type::Sig.sig(args, object: self, &block)
23
+ end
24
+
25
+ def self.call(**args)
26
+ operator = args.fetch(:operator, nil)
27
+ arguments = args.fetch(:arguments, [])
28
+ value = arguments.first&.value
29
+
30
+ case operator.to_s
31
+ when "!", "not"
32
+ sig(args)
33
+ code_exclamation_point
34
+ when "!=", "different"
35
+ sig(args) { Object }
36
+ code_different(value)
37
+ when "&&", "and"
38
+ sig(args) { Object }
39
+ code_and_operator(value)
40
+ when "+", "self"
41
+ sig(args)
42
+ code_self
43
+ when "..", "inclusive_range"
44
+ sig(args) { Object }
45
+ code_inclusive_range(value)
46
+ when "...", "exclusive_range"
47
+ sig(args) { Object }
48
+ code_exclusive_range(value)
49
+ when "==", "equal"
50
+ sig(args) { Object }
51
+ code_equal_equal(value)
52
+ when "===", "strict_equal"
53
+ sig(args) { Object }
54
+ code_equal_equal_equal(value)
55
+ when "falsy?"
56
+ sig(args)
57
+ Boolean.new(falsy?)
58
+ when "to_string"
59
+ sig(args)
60
+ code_to_string
61
+ when "truthy?"
62
+ sig(args)
63
+ Boolean.new(truthy?)
64
+ when "||", "or"
65
+ sig(args) { Object }
66
+ code_or_operator(value)
67
+ when /=$/
68
+ sig(args) { Object }
69
+
70
+ if operator == "="
71
+ context = args[:context]
72
+ context.code_set(self, value)
73
+ else
74
+ context = args[:context].lookup!(self)
75
+ context.code_set(
76
+ self,
77
+ context.code_fetch(self).call(
78
+ **args,
79
+ operator: operator[..-2],
80
+ arguments: [Argument.new(value)]
81
+ )
82
+ )
83
+ end
84
+
85
+ context.code_fetch(self)
86
+ else
87
+ raise(
88
+ Code::Error::Undefined,
89
+ "#{operator} not defined on #{inspect}:#{name}"
90
+ )
91
+ end
92
+ end
93
+
94
+ def self.code_and_operator(other)
95
+ truthy? ? other : self
96
+ end
97
+
98
+ def self.code_different(other)
99
+ Boolean.new(self != other)
100
+ end
101
+
102
+ def self.code_equal_equal(other)
103
+ Boolean.new(self == other)
104
+ end
105
+
106
+ def self.code_exclamation_point
107
+ Boolean.new(falsy?)
108
+ end
109
+
110
+ def self.code_exclusive_range(value)
111
+ Range.new(self, value, exclude_end: true)
112
+ end
113
+
114
+ def self.code_inclusive_range(value)
115
+ Range.new(self, value, exclude_end: false)
116
+ end
117
+
118
+ def self.code_or_operator(other)
119
+ truthy? ? self : other
120
+ end
121
+
122
+ def self.code_self
123
+ self
124
+ end
125
+
126
+ def self.code_equal_equal_equal(other)
127
+ Boolean.new(self === other)
128
+ end
129
+
130
+ def self.code_to_string
131
+ String.new(to_s)
132
+ end
133
+
134
+ def self.falsy?
135
+ !truthy?
136
+ end
137
+
138
+ def self.hash
139
+ unless respond_to?(:raw)
140
+ raise NotImplementedError, "#{self.class.name}#hash"
141
+ end
142
+
143
+ [self.class, raw].hash
144
+ end
145
+
146
+ def self.multi_fetch(hash, *keys)
147
+ keys.map { |key| [key, hash.fetch(key)] }.to_h
148
+ end
149
+
150
+ def self.sig(args, &block)
151
+ Type::Sig.sig(args, object: self, &block)
152
+ end
153
+
154
+ def self.name
155
+ raise NotImplementedError, "name"
156
+ end
157
+
158
+ def self.to_s
159
+ name
160
+ end
161
+
162
+ def self.truthy?
163
+ true
164
+ end
165
+
21
166
  def <=>(other)
22
167
  if respond_to?(:raw)
23
168
  raw <=> (other.respond_to?(:raw) ? other.raw : other)
@@ -117,7 +262,7 @@ class Code
117
262
  end
118
263
 
119
264
  def code_exclamation_point
120
- truthy? ? Object::Boolean.new(false) : Object::Boolean.new(true)
265
+ Boolean.new(falsy?)
121
266
  end
122
267
 
123
268
  def code_exclusive_range(value)
data/lib/code/version.rb CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  require_relative "../code"
4
4
 
5
- Code::Version = Gem::Version.new("0.7.8")
5
+ Code::Version = Gem::Version.new("0.8.0")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.8
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-13 00:00:00.000000000 Z
11
+ date: 2024-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal