Module: LogBrew::Validation

Defined in:
lib/logbrew.rb

Class Method Summary collapse

Class Method Details

.normalize_metric_description(value) ⇒ Object



828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
# File 'lib/logbrew.rb', line 828

def normalize_metric_description(value)
  unless value.is_a?(String) && value.valid_encoding?
    raise SdkError.new(
      "validation_error",
      "metric description must be a non-blank string of at most 1024 non-control characters"
    )
  end
  normalized = value.strip
  invalid = normalized.each_codepoint.any? do |character|
    character <= 0x1f || (character >= 0x7f && character <= 0x9f) || character == 0x2028 || character == 0x2029
  end
  if normalized.empty? || normalized.each_codepoint.count > 1024 || invalid
    raise SdkError.new(
      "validation_error",
      "metric description must be a non-blank string of at most 1024 non-control characters"
    )
  end
  normalized
end

.numeric_nan?(value) ⇒ Boolean

Returns:

  • (Boolean)


858
859
860
# File 'lib/logbrew.rb', line 858

def numeric_nan?(value)
  value.is_a?(Float) && (value.nan? || value.infinite?)
end

.read(attributes, key) ⇒ Object



848
849
850
851
852
# File 'lib/logbrew.rb', line 848

def read(attributes, key)
  return nil unless attributes.is_a?(Hash)

  attributes[key] || attributes[key.to_sym]
end

.require_allowed_value(label, value, allowed_values) ⇒ Object

Raises:



778
779
780
781
782
783
# File 'lib/logbrew.rb', line 778

def require_allowed_value(label, value, allowed_values)
  require_non_empty(label, value)
  return if allowed_values.include?(value)

  raise SdkError.new("validation_error", "#{label} must be one of: #{allowed_values.join(', ')}")
end

.require_finite_number(label, value) ⇒ Object

Raises:



819
820
821
822
823
824
825
826
# File 'lib/logbrew.rb', line 819

def require_finite_number(label, value)
  unless value.is_a?(Integer) || value.is_a?(Float)
    raise SdkError.new("validation_error", "#{label} must be a finite number")
  end
  raise SdkError.new("validation_error", "#{label} must be a finite number") if numeric_nan?(value)

  value
end

.require_metadata(metadata) ⇒ Object

Raises:



799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
# File 'lib/logbrew.rb', line 799

def ()
  return nil if .nil?
  raise SdkError.new("validation_error", "metadata must be an object") unless .is_a?(Hash)

  .each_with_object({}) do |(key, value), copied|
    normalized_key = key.to_s
    require_non_empty("metadata key", normalized_key)
    unless value.nil? || value.is_a?(String) || value.is_a?(Integer) || value.is_a?(Float) ||
           value == true || value == false
      raise SdkError.new(
        "validation_error",
        "metadata value for #{normalized_key} must be a string, number, boolean, or null"
      )
    end
    raise SdkError.new("validation_error", "metadata value for #{normalized_key} must be finite") if numeric_nan?(value)

    copied[normalized_key] = value
  end
end

.require_non_empty(label, value) ⇒ Object

Raises:



772
773
774
775
776
# File 'lib/logbrew.rb', line 772

def require_non_empty(label, value)
  return if value.is_a?(String) && value.valid_encoding? && !value.strip.empty?

  raise SdkError.new("validation_error", "#{label} must be non-empty")
end

.require_timestamp(timestamp) ⇒ Object



785
786
787
788
789
790
791
792
793
794
795
796
797
# File 'lib/logbrew.rb', line 785

def require_timestamp(timestamp)
  require_non_empty("timestamp", timestamp)
  return if timestamp.end_with?("Z")

  time_parts = timestamp.split("T", 2)
  raise timestamp_error(timestamp) if time_parts.length < 2

  time_portion = time_parts[1]
  return if time_portion.include?("+")
  return if time_portion.rindex("-") && time_portion.rindex("-").positive?

  raise timestamp_error(timestamp)
end

.timestamp_error(timestamp) ⇒ Object



854
855
856
# File 'lib/logbrew.rb', line 854

def timestamp_error(timestamp)
  SdkError.new("validation_error", "timestamp must include a timezone offset: #{timestamp}")
end