txlemetry-ruby 4.0.0

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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +48 -0
  3. data/NOTICE +5 -0
  4. data/bin/txlemetry +110 -0
  5. data/lib/txlemetry/backoff_policy.rb +49 -0
  6. data/lib/txlemetry/client.rb +1266 -0
  7. data/lib/txlemetry/defaults.rb +50 -0
  8. data/lib/txlemetry/exception_capture.rb +246 -0
  9. data/lib/txlemetry/feature_flag.rb +85 -0
  10. data/lib/txlemetry/feature_flag_error.rb +37 -0
  11. data/lib/txlemetry/feature_flag_evaluations.rb +237 -0
  12. data/lib/txlemetry/feature_flag_result.rb +81 -0
  13. data/lib/txlemetry/feature_flags.rb +1516 -0
  14. data/lib/txlemetry/field_parser.rb +219 -0
  15. data/lib/txlemetry/flag_definition_cache.rb +88 -0
  16. data/lib/txlemetry/internal/context.rb +119 -0
  17. data/lib/txlemetry/logging.rb +77 -0
  18. data/lib/txlemetry/mcp/README.md +53 -0
  19. data/lib/txlemetry/mcp/analytics.rb +116 -0
  20. data/lib/txlemetry/mcp/client.rb +257 -0
  21. data/lib/txlemetry/mcp/constants.rb +111 -0
  22. data/lib/txlemetry/mcp/conversation_id.rb +89 -0
  23. data/lib/txlemetry/mcp/event_builder.rb +168 -0
  24. data/lib/txlemetry/mcp/exceptions.rb +112 -0
  25. data/lib/txlemetry/mcp/identity.rb +194 -0
  26. data/lib/txlemetry/mcp/ids.rb +56 -0
  27. data/lib/txlemetry/mcp/instrumentation.rb +736 -0
  28. data/lib/txlemetry/mcp/intent.rb +101 -0
  29. data/lib/txlemetry/mcp/log.rb +37 -0
  30. data/lib/txlemetry/mcp/options.rb +128 -0
  31. data/lib/txlemetry/mcp/rack_middleware.rb +112 -0
  32. data/lib/txlemetry/mcp/request_scope.rb +72 -0
  33. data/lib/txlemetry/mcp/sanitization.rb +504 -0
  34. data/lib/txlemetry/mcp/schema_mutation.rb +179 -0
  35. data/lib/txlemetry/mcp/server_extension.rb +54 -0
  36. data/lib/txlemetry/mcp/session.rb +71 -0
  37. data/lib/txlemetry/mcp/session_token.rb +106 -0
  38. data/lib/txlemetry/mcp/sink.rb +98 -0
  39. data/lib/txlemetry/mcp/tools.rb +91 -0
  40. data/lib/txlemetry/mcp/tracking_data.rb +89 -0
  41. data/lib/txlemetry/mcp/truncation.rb +326 -0
  42. data/lib/txlemetry/mcp.rb +224 -0
  43. data/lib/txlemetry/message_batch.rb +80 -0
  44. data/lib/txlemetry/noop_worker.rb +39 -0
  45. data/lib/txlemetry/response.rb +17 -0
  46. data/lib/txlemetry/send_feature_flags_options.rb +49 -0
  47. data/lib/txlemetry/send_worker.rb +218 -0
  48. data/lib/txlemetry/transport.rb +216 -0
  49. data/lib/txlemetry/utils.rb +183 -0
  50. data/lib/txlemetry/version.rb +5 -0
  51. data/lib/txlemetry.rb +16 -0
  52. metadata +105 -0
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Txlemetry
6
+ # Represents the result of a feature flag evaluation
7
+ # containing both the flag value and payload
8
+ class FeatureFlagResult
9
+ # @return [String, Symbol] The feature flag key.
10
+ attr_reader :key
11
+
12
+ # @return [String, nil] The variant key for multivariate flags.
13
+ attr_reader :variant
14
+
15
+ # @return [Object, nil] The parsed feature flag payload.
16
+ attr_reader :payload
17
+
18
+ # @param key [String, Symbol] The feature flag key.
19
+ # @param enabled [Boolean] Whether the feature flag is enabled.
20
+ # @param variant [String, nil] The variant key for multivariate flags.
21
+ # @param payload [Object, nil] The parsed feature flag payload.
22
+ def initialize(key:, enabled:, variant: nil, payload: nil)
23
+ @key = key
24
+ @enabled = enabled
25
+ @variant = variant
26
+ @payload = payload
27
+ end
28
+
29
+ # Returns the effective value of the feature flag: variant if present,
30
+ # otherwise enabled status.
31
+ #
32
+ # @return [String, Boolean]
33
+ def value
34
+ @variant || @enabled
35
+ end
36
+
37
+ # Returns whether or not the feature flag evaluated as enabled.
38
+ #
39
+ # @return [Boolean]
40
+ def enabled?
41
+ @enabled
42
+ end
43
+
44
+ # Factory method to create from flag value and payload.
45
+ #
46
+ # @param key [String, Symbol] The feature flag key.
47
+ # @param value [String, Boolean, nil] The raw feature flag value.
48
+ # @param payload [Object, String, nil] The raw or JSON-encoded feature flag payload.
49
+ # @return [Txlemetry::FeatureFlagResult, nil]
50
+ def self.from_value_and_payload(key, value, payload)
51
+ return nil if value.nil?
52
+
53
+ parsed_payload = parse_payload(payload)
54
+
55
+ if value.is_a?(String)
56
+ new(key: key, enabled: true, variant: value, payload: parsed_payload)
57
+ else
58
+ new(key: key, enabled: value, payload: parsed_payload)
59
+ end
60
+ end
61
+
62
+ # Deserialize a flag payload. Strings are JSON-parsed (with the raw string
63
+ # returned when the body is not valid JSON); already-deserialized values
64
+ # pass through. Public so {FeatureFlagEvaluations} can normalize payloads
65
+ # the same way {FeatureFlagResult} does.
66
+ #
67
+ # @param payload [Object, String, nil] The raw payload value.
68
+ # @return [Object, nil] The parsed payload.
69
+ def self.parse_payload(payload)
70
+ return nil if payload.nil?
71
+ return payload unless payload.is_a?(String)
72
+ return nil if payload.empty?
73
+
74
+ begin
75
+ JSON.parse(payload)
76
+ rescue JSON::ParserError
77
+ payload
78
+ end
79
+ end
80
+ end
81
+ end