Module: Cadenya::Util

Defined in:
lib/cadenya/core.rb

Class Method Summary collapse

Class Method Details

.deep_jsonify(value) ⇒ Object

Recursively prepare a body value for JSON: Time -> RFC 3339.



66
67
68
69
70
71
72
73
# File 'lib/cadenya/core.rb', line 66

def deep_jsonify(value)
  case value
  when Time then timestamp(value)
  when Hash then value.to_h { |k, v| [k, deep_jsonify(v)] }
  when Array then value.map { |v| deep_jsonify(v) }
  else value
  end
end

.path_escape(value) ⇒ Object



45
46
47
# File 'lib/cadenya/core.rb', line 45

def path_escape(value)
  CGI.escape(value.to_s).gsub("+", "%20")
end

.path_param(name, value) ⇒ Object

Encode one path segment, rejecting blank values at the boundary — an empty segment silently rewrites the route (/parents//children).

Raises:

  • (ArgumentError)


51
52
53
54
55
56
# File 'lib/cadenya/core.rb', line 51

def path_param(name, value)
  text = value.to_s
  raise ArgumentError, "missing required path parameter #{name}" if text.strip.empty?

  path_escape(text)
end

.plain(value) ⇒ Object

Unwrap decoded value objects (and containers of them) into plain snake-keyed hashes so responses round-trip into request params.



77
78
79
80
81
82
83
84
# File 'lib/cadenya/core.rb', line 77

def plain(value)
  case value
  when Hash then value.to_h { |k, v| [k, plain(v)] }
  when Array then value.map { |v| plain(v) }
  else
    value.class.name.to_s.start_with?("#{name.split("::").first}::Types") ? value.to_h : value
  end
end

.query_value(value) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/cadenya/core.rb', line 86

def query_value(value)
  case value
  when true, false then value.to_s
  when Time then timestamp(value)
  else value.to_s
  end
end

.timestamp(value) ⇒ Object

RFC 3339 with caller-supplied fractional seconds preserved (trailing fractional zeros trimmed): plain iso8601 would silently truncate to whole seconds.



61
62
63
# File 'lib/cadenya/core.rb', line 61

def timestamp(value)
  value.iso8601(9).sub(/\.(\d*?)0+(?=Z|[+-])/) { Regexp.last_match(1).empty? ? "" : ".#{Regexp.last_match(1)}" }
end