Module: LogBrew::Validation

Defined in:
lib/logbrew.rb

Class Method Summary collapse

Class Method Details

.normalize_metric_description(value) ⇒ Object



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

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)


826
827
828
# File 'lib/logbrew.rb', line 826

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

.read(attributes, key) ⇒ Object



816
817
818
819
820
# File 'lib/logbrew.rb', line 816

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:



746
747
748
749
750
751
# File 'lib/logbrew.rb', line 746

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:



787
788
789
790
791
792
793
794
# File 'lib/logbrew.rb', line 787

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:



767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
# File 'lib/logbrew.rb', line 767

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:



740
741
742
743
744
# File 'lib/logbrew.rb', line 740

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



753
754
755
756
757
758
759
760
761
762
763
764
765
# File 'lib/logbrew.rb', line 753

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



822
823
824
# File 'lib/logbrew.rb', line 822

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