dspy 0.34.3 → 0.34.4

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.
data/lib/dspy.rb CHANGED
@@ -159,13 +159,61 @@ module DSPy
159
159
  if value.is_a?(Hash)
160
160
  flatten_attributes(value, new_key, result)
161
161
  else
162
- result[new_key] = value
162
+ result[new_key] = sanitize_event_attribute_value(value)
163
163
  end
164
164
  end
165
165
 
166
166
  result
167
167
  end
168
168
 
169
+ def self.sanitize_event_attribute_value(value)
170
+ return value if primitive_event_attribute_value?(value)
171
+
172
+ if value.is_a?(Array)
173
+ return value if homogeneous_primitive_array?(value)
174
+ return JSON.generate(value.map { |item| normalize_event_json_value(item) })
175
+ end
176
+
177
+ if value.is_a?(Hash)
178
+ return JSON.generate(normalize_event_json_value(value))
179
+ end
180
+
181
+ if value.respond_to?(:to_h)
182
+ return JSON.generate(normalize_event_json_value(value.to_h))
183
+ end
184
+
185
+ value.respond_to?(:to_json) ? value.to_json : value.to_s
186
+ rescue StandardError
187
+ value.to_s
188
+ end
189
+
190
+ def self.primitive_event_attribute_value?(value)
191
+ value.nil? || value.is_a?(String) || value.is_a?(Integer) || value.is_a?(Float) || value.is_a?(TrueClass) || value.is_a?(FalseClass)
192
+ end
193
+
194
+ def self.homogeneous_primitive_array?(value)
195
+ return true if value.empty?
196
+ return false unless value.all? { |item| primitive_event_attribute_value?(item) }
197
+
198
+ value.map(&:class).uniq.size == 1
199
+ end
200
+
201
+ def self.normalize_event_json_value(value)
202
+ if primitive_event_attribute_value?(value)
203
+ value
204
+ elsif value.is_a?(Array)
205
+ value.map { |item| normalize_event_json_value(item) }
206
+ elsif value.is_a?(Hash)
207
+ value.each_with_object({}) do |(k, v), acc|
208
+ acc[k.to_s] = normalize_event_json_value(v)
209
+ end
210
+ elsif value.respond_to?(:to_h)
211
+ normalize_event_json_value(value.to_h)
212
+ else
213
+ value.to_s
214
+ end
215
+ end
216
+
169
217
  def self.create_logger
170
218
  env = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
171
219
  log_output = ENV['DSPY_LOG'] # Allow override
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dspy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.34.3
4
+ version: 0.34.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vicente Reig Rincón de Arellano
@@ -100,6 +100,9 @@ dependencies:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0.5'
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 0.5.1
103
106
  type: :runtime
104
107
  prerelease: false
105
108
  version_requirements: !ruby/object:Gem::Requirement
@@ -107,6 +110,9 @@ dependencies:
107
110
  - - "~>"
108
111
  - !ruby/object:Gem::Version
109
112
  version: '0.5'
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: 0.5.1
110
116
  - !ruby/object:Gem::Dependency
111
117
  name: sorbet-toon
112
118
  requirement: !ruby/object:Gem::Requirement