quonfig 0.0.9 → 0.0.11

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +4 -4
  4. data/lib/quonfig/evaluation_details.rb +60 -0
  5. data/lib/quonfig/options.rb +37 -16
  6. data/lib/quonfig/sse_config_client.rb +1 -1
  7. data/lib/quonfig/version.rb +5 -0
  8. data/lib/quonfig.rb +2 -1
  9. data/quonfig.gemspec +30 -163
  10. metadata +29 -182
  11. data/.claude/rules/constitution.md +0 -81
  12. data/.claude/rules/git-safety.md +0 -11
  13. data/.claude/rules/issue-tracking.md +0 -13
  14. data/.claude/rules/testing-workflow.md +0 -28
  15. data/.envrc.sample +0 -3
  16. data/.github/CODEOWNERS +0 -2
  17. data/.github/pull_request_template.md +0 -8
  18. data/.github/workflows/release.yml +0 -49
  19. data/.github/workflows/ruby.yml +0 -60
  20. data/.github/workflows/test.yaml +0 -40
  21. data/.rubocop.yml +0 -13
  22. data/.tool-versions +0 -1
  23. data/CLAUDE.md +0 -29
  24. data/CODEOWNERS +0 -1
  25. data/Gemfile +0 -26
  26. data/Gemfile.lock +0 -177
  27. data/Rakefile +0 -64
  28. data/VERSION +0 -1
  29. data/dev/allocation_stats +0 -60
  30. data/dev/benchmark +0 -40
  31. data/dev/console +0 -12
  32. data/dev/script_setup.rb +0 -18
  33. data/test/fixtures/datafile.json +0 -87
  34. data/test/integration/test_context_precedence.rb +0 -112
  35. data/test/integration/test_datadir_environment.rb +0 -54
  36. data/test/integration/test_dev_overrides.rb +0 -40
  37. data/test/integration/test_enabled.rb +0 -478
  38. data/test/integration/test_enabled_with_contexts.rb +0 -64
  39. data/test/integration/test_get.rb +0 -136
  40. data/test/integration/test_get_feature_flag.rb +0 -28
  41. data/test/integration/test_get_or_raise.rb +0 -60
  42. data/test/integration/test_get_weighted_values.rb +0 -34
  43. data/test/integration/test_helpers.rb +0 -667
  44. data/test/integration/test_helpers_test.rb +0 -73
  45. data/test/integration/test_post.rb +0 -44
  46. data/test/integration/test_telemetry.rb +0 -170
  47. data/test/support/common_helpers.rb +0 -106
  48. data/test/support/mock_base_client.rb +0 -27
  49. data/test/support/mock_config_loader.rb +0 -1
  50. data/test/test_bound_client.rb +0 -109
  51. data/test/test_caching_http_connection.rb +0 -218
  52. data/test/test_client.rb +0 -255
  53. data/test/test_client_network_mode.rb +0 -136
  54. data/test/test_client_telemetry.rb +0 -175
  55. data/test/test_config_loader.rb +0 -70
  56. data/test/test_context.rb +0 -139
  57. data/test/test_context_shape.rb +0 -37
  58. data/test/test_context_shape_aggregator.rb +0 -126
  59. data/test/test_datadir.rb +0 -203
  60. data/test/test_dev_context.rb +0 -163
  61. data/test/test_duration.rb +0 -37
  62. data/test/test_encryption.rb +0 -16
  63. data/test/test_evaluation_summaries_aggregator.rb +0 -180
  64. data/test/test_evaluator.rb +0 -285
  65. data/test/test_example_contexts_aggregator.rb +0 -119
  66. data/test/test_exponential_backoff.rb +0 -44
  67. data/test/test_fixed_size_hash.rb +0 -119
  68. data/test/test_helper.rb +0 -17
  69. data/test/test_http_connection.rb +0 -79
  70. data/test/test_internal_logger.rb +0 -34
  71. data/test/test_options.rb +0 -167
  72. data/test/test_rate_limit_cache.rb +0 -44
  73. data/test/test_reason.rb +0 -79
  74. data/test/test_rename.rb +0 -65
  75. data/test/test_resolver.rb +0 -291
  76. data/test/test_semantic_logger_filter.rb +0 -144
  77. data/test/test_semver.rb +0 -108
  78. data/test/test_should_log.rb +0 -186
  79. data/test/test_sse_config_client.rb +0 -297
  80. data/test/test_stdlib_formatter.rb +0 -195
  81. data/test/test_telemetry_reporter.rb +0 -209
  82. data/test/test_typed_getters.rb +0 -131
  83. data/test/test_types.rb +0 -141
  84. data/test/test_weighted_value_resolver.rb +0 -84
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2dfc7385d529233f3b0b7c5fc13dbe7d0d648851ea0815bde792465a1774319
4
- data.tar.gz: f6c702ba4eccdebeda95b8f9341fc0bb077a2c141c9397cb7f3dccb1cbfa782a
3
+ metadata.gz: 57f0f18dd1441f5471db495f868e1f14444dc9836038dd181260ec5adeb48bd5
4
+ data.tar.gz: f4cab0b5a07924424163ea4c8148cc1f93752caea78d827bdc426e6463477a40
5
5
  SHA512:
6
- metadata.gz: 368273026e247c7c01df6e85f11865f94bb588d4c4e512bbc44de65dda0a7659b96a8bd321de6ea676934b9483b0dd99d0fe516d3b288cf93a709f401bbfd824
7
- data.tar.gz: be80686fa0c8748c4e1c3f802cfc51c605b1a3e31ec7f9682885a139b5081a79d91d9155833143671bfffa75728bf1091116456defd90bd610d17a5133287e03
6
+ metadata.gz: 6695efb0125ed9092bca70cbb3fb0edd1a6b115174c7d50e8aeb7f0148628e21883fba714caf0945b8fa22b6b22346d7cd09d5884cf30d61ce6de67caa097272
7
+ data.tar.gz: 9985c30b27ec8fba439e107ca7d4175809358c2e8e0d2fbd9c22db53b9dfa2bd4af6c1c35b413130ab4e53b0fe7a0a62f1c1584ddfd710ab2c526e71939480a5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.0.11 - 2026-05-02
4
+
5
+ - **Fix (telemetry): SSE clientName attribution.** The SSE client was sending
6
+ `X-Quonfig-SDK-Version: sdk-ruby-<version>`, which the api-telemetry parser
7
+ splits on the first dash, so it landed as `clientName="sdk"`,
8
+ `clientVersion="ruby-<version>"`. Now sends `ruby-<version>` to match
9
+ `http_connection.rb`, so both transports attribute consistently as
10
+ `clientName="ruby"`.
11
+ - **Release plumbing: drop juwelier, tag-triggered publish.** The gem is now
12
+ built from a hand-written `quonfig.gemspec` that reads the version from
13
+ `Quonfig::VERSION` (in `lib/quonfig/version.rb`) and lists shipped files
14
+ explicitly. The `release.yml` workflow now fires on `v*` tag pushes, not
15
+ every successful main build, and refuses to publish unless the tag matches
16
+ `Quonfig::VERSION`. Together these eliminate the gemspec-vs-VERSION drift
17
+ that prevented the original 0.0.11 publish (gem built as 0.0.10 internally
18
+ while filename said 0.0.11) and the manifest-drift bug from qfg-e588.
19
+
20
+ ## 0.0.10 - 2026-05-01
21
+
22
+ - **BREAKING (env): `QUONFIG_TELEMETRY_URL` and `QUONFIG_API_URLS` env vars
23
+ removed.** Replaced by a single `QUONFIG_DOMAIN` env var (default
24
+ `quonfig.com`) that derives api, sse, and telemetry URLs uniformly. e.g.
25
+ `QUONFIG_DOMAIN=quonfig-staging.com` → `https://primary.quonfig-staging.com`,
26
+ `https://stream.primary.quonfig-staging.com`,
27
+ `https://telemetry.quonfig-staging.com`. Mirrors the CLI's
28
+ `domain-urls.ts` convention and matches sdk-go / sdk-node. Resolution order
29
+ (highest wins): explicit `api_urls:` / `telemetry_url:` kwargs >
30
+ `QUONFIG_DOMAIN` > hardcoded default. Fixes qfg-w6gg, where the prior
31
+ primary-prefix regex silently fell through to prod telemetry on staging
32
+ hosts. The new `Quonfig::Options#init` also accepts an explicit
33
+ `telemetry_url:` kwarg (was previously documented but not wired up).
34
+ - **Default `api_urls` now includes secondary.** Was `[primary]`, now
35
+ `[primary, secondary]` to match every other SDK and provide failover.
36
+ - **Release plumbing: pre-publish smoke check (qfg-e588).** The Rakefile
37
+ `:release` task and the `release.yml` workflow now run
38
+ `scripts/smoke_check.sh` after `gem build` and before `gem push`. The
39
+ script installs the freshly built `.gem` into a sandbox `GEM_HOME` and
40
+ shells out to `ruby -rquonfig -e 'puts Quonfig::VERSION'`. If the
41
+ require fails or the version mismatches, the publish aborts. This is
42
+ the prevention measure for qfg-e588, where 0.0.9 was published with a
43
+ stale gemspec manifest missing `lib/quonfig/evaluation_details.rb` and
44
+ every consumer hit `LoadError` at install time.
45
+
3
46
  ## 0.0.8 - 2026-04-26
4
47
 
5
48
  - **Fix (gemspec): drop deleted `scripts/` entry from manifest** — regenerated
data/README.md CHANGED
@@ -114,14 +114,14 @@ client = Quonfig::Client.new # reads QUONFIG_DIR + QUONFIG_ENVIRONMENT
114
114
  | `QUONFIG_BACKEND_SDK_KEY` | SDK key used to authenticate against the Quonfig API. Used when `sdk_key:` is omitted. |
115
115
  | `QUONFIG_DIR` | Path to a workspace directory. When set, the SDK runs in datadir/offline mode. |
116
116
  | `QUONFIG_ENVIRONMENT` | Environment name (`production`, `staging`, `development`) evaluated in datadir mode. |
117
- | `QUONFIG_TELEMETRY_URL` | Overrides the telemetry endpoint. Defaults to `https://telemetry.quonfig.com`. |
117
+ | `QUONFIG_DOMAIN` | Base domain used to derive api, sse, and telemetry URLs. Defaults to `quonfig.com`. Set to `quonfig-staging.com` to point at staging. Explicit `api_urls:` / `telemetry_url:` kwargs override this. |
118
118
 
119
119
  ## Constructor options
120
120
 
121
121
  ```ruby
122
122
  Quonfig::Client.new(
123
123
  sdk_key: '...', # required unless QUONFIG_BACKEND_SDK_KEY is set
124
- api_urls: ['https://primary.quonfig.com'],
124
+ api_urls: ['https://primary.quonfig.com', 'https://secondary.quonfig.com'],
125
125
  telemetry_url: 'https://telemetry.quonfig.com',
126
126
  enable_sse: true,
127
127
  enable_polling: false,
@@ -137,8 +137,8 @@ Quonfig::Client.new(
137
137
  | Option | Type | Default | Description |
138
138
  |-------------------|----------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
139
139
  | `sdk_key` | `String` | `ENV['QUONFIG_BACKEND_SDK_KEY']` | SDK key for API authentication. |
140
- | `api_urls` | `Array<String>` | `['https://primary.quonfig.com']` | Ordered list of API base URLs to try. SSE stream URLs are derived by prepending `stream.` to each hostname. |
141
- | `telemetry_url` | `String` | `https://telemetry.quonfig.com` (or `ENV['QUONFIG_TELEMETRY_URL']`) | Base URL for the telemetry service. |
140
+ | `api_urls` | `Array<String>` | `["https://primary.${QUONFIG_DOMAIN}", "https://secondary.${QUONFIG_DOMAIN}"]` | Ordered list of API base URLs to try. SSE stream URLs are derived by prepending `stream.` to each hostname. Defaults derive from `QUONFIG_DOMAIN` (default `quonfig.com`). |
141
+ | `telemetry_url` | `String` | `https://telemetry.${QUONFIG_DOMAIN}` | Base URL for the telemetry service. Default derives from `QUONFIG_DOMAIN`. |
142
142
  | `enable_sse` | `Boolean` | `true` | Receive real-time updates over Server-Sent Events. |
143
143
  | `enable_polling` | `Boolean` | `false` | Poll the API on an interval as a fallback. |
144
144
  | `poll_interval` | `Integer` (seconds) | `60` | Polling interval when `enable_polling` is `true`. |
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Quonfig
4
+ # Public details record returned by Quonfig::Client#get_*_details. Surfaces
5
+ # the resolution reason and (on error) an error_code/error_message alongside
6
+ # the resolved value, so downstream layers — most importantly the
7
+ # OpenFeature provider — can map the result without losing fidelity.
8
+ #
9
+ # +reason+ is one of the strings:
10
+ # "STATIC" — config has no targeting rules; matched value is the static default
11
+ # "TARGETING_MATCH" — a targeting rule matched (any non-ALWAYS_TRUE criterion)
12
+ # "SPLIT" — matched value came from a weighted variant
13
+ # "DEFAULT" — no rule matched (eval fell through)
14
+ # "ERROR" — evaluation failed
15
+ #
16
+ # +error_code+ (only when reason == "ERROR") is one of:
17
+ # "FLAG_NOT_FOUND" — the key was unknown to the store
18
+ # "TYPE_MISMATCH" — the resolved value didn't satisfy the requested type
19
+ # "GENERAL" — any other failure
20
+ class EvaluationDetails
21
+ REASON_STATIC = 'STATIC'
22
+ REASON_TARGETING_MATCH = 'TARGETING_MATCH'
23
+ REASON_SPLIT = 'SPLIT'
24
+ REASON_DEFAULT = 'DEFAULT'
25
+ REASON_ERROR = 'ERROR'
26
+
27
+ ERROR_FLAG_NOT_FOUND = 'FLAG_NOT_FOUND'
28
+ ERROR_TYPE_MISMATCH = 'TYPE_MISMATCH'
29
+ ERROR_GENERAL = 'GENERAL'
30
+
31
+ attr_reader :value, :reason, :error_code, :error_message
32
+
33
+ def initialize(value:, reason:, error_code: nil, error_message: nil)
34
+ @value = value
35
+ @reason = reason
36
+ @error_code = error_code
37
+ @error_message = error_message
38
+ end
39
+
40
+ def ==(other)
41
+ other.is_a?(EvaluationDetails) &&
42
+ other.value == @value &&
43
+ other.reason == @reason &&
44
+ other.error_code == @error_code &&
45
+ other.error_message == @error_message
46
+ end
47
+ alias eql? ==
48
+
49
+ def hash
50
+ [@value, @reason, @error_code, @error_message].hash
51
+ end
52
+
53
+ def inspect
54
+ parts = ["value=#{@value.inspect}", "reason=#{@reason.inspect}"]
55
+ parts << "error_code=#{@error_code.inspect}" if @error_code
56
+ parts << "error_message=#{@error_message.inspect}" if @error_message
57
+ "#<Quonfig::EvaluationDetails #{parts.join(' ')}>"
58
+ end
59
+ end
60
+ end
@@ -39,10 +39,38 @@ module Quonfig
39
39
  DEFAULT_MAX_EXAMPLE_CONTEXTS = 100_000
40
40
  DEFAULT_MAX_EVAL_SUMMARIES = 100_000
41
41
 
42
+ # Hardcoded fallback domain. Overridden by ENV['QUONFIG_DOMAIN'].
43
+ DEFAULT_DOMAIN = 'quonfig.com'
44
+
45
+ # Hardcoded fallback API URLs (used only when no QUONFIG_DOMAIN is set
46
+ # and no explicit api_urls are provided). Mirrors derive_api_urls(DEFAULT_DOMAIN).
42
47
  DEFAULT_API_URLS = [
43
48
  'https://primary.quonfig.com',
49
+ 'https://secondary.quonfig.com',
44
50
  ].freeze
45
51
 
52
+ # Resolve the active domain. Reads QUONFIG_DOMAIN; falls back to
53
+ # DEFAULT_DOMAIN. Mirrors `cli/src/util/domain-urls.ts#getDomain`.
54
+ def self.domain
55
+ env = ENV['QUONFIG_DOMAIN']
56
+ env && !env.empty? ? env : DEFAULT_DOMAIN
57
+ end
58
+
59
+ # Derive default api_urls for a given domain. e.g. for domain
60
+ # `quonfig-staging.com` returns
61
+ # `["https://primary.quonfig-staging.com", "https://secondary.quonfig-staging.com"]`.
62
+ def self.derive_api_urls(domain)
63
+ [
64
+ "https://primary.#{domain}",
65
+ "https://secondary.#{domain}",
66
+ ]
67
+ end
68
+
69
+ # Derive the telemetry URL for a given domain.
70
+ def self.derive_telemetry_url(domain)
71
+ "https://telemetry.#{domain}"
72
+ end
73
+
46
74
  # Derive the SSE stream URL for a given API URL by prepending `stream.` to
47
75
  # the hostname. Preserves scheme, port, and path.
48
76
  #
@@ -58,6 +86,7 @@ module Quonfig
58
86
 
59
87
  private def init(
60
88
  api_urls: nil,
89
+ telemetry_url: nil,
61
90
  sdk_key: ENV['QUONFIG_BACKEND_SDK_KEY'],
62
91
  environment: ENV['QUONFIG_ENVIRONMENT'],
63
92
  datadir: ENV['QUONFIG_DIR'],
@@ -104,16 +133,19 @@ module Quonfig
104
133
  @collect_example_contexts = false
105
134
  @collect_max_example_contexts = 0
106
135
 
107
- if ENV['QUONFIG_API_URLS'] && ENV['QUONFIG_API_URLS'].length > 0
108
- api_urls = ENV['QUONFIG_API_URLS']
109
- end
136
+ # URL resolution order (highest wins):
137
+ # 1. Explicit kwargs (api_urls:, telemetry_url:)
138
+ # 2. ENV['QUONFIG_DOMAIN'] -> derives all three
139
+ # 3. Hardcoded DEFAULT_DOMAIN ('quonfig.com')
140
+ domain = Quonfig::Options.domain
110
141
 
111
- @api_urls = Array(api_urls || DEFAULT_API_URLS).map { |url| remove_trailing_slash(url) }
142
+ @api_urls = Array(api_urls || Quonfig::Options.derive_api_urls(domain))
143
+ .map { |url| remove_trailing_slash(url) }
112
144
 
113
145
  @sse_api_urls = @api_urls.map { |url| Quonfig::Options.derive_stream_url(url) }
114
146
  @config_api_urls = @api_urls
115
147
 
116
- @telemetry_destination = ENV['QUONFIG_TELEMETRY_URL'] || derive_telemetry_destination(@api_urls)
148
+ @telemetry_destination = telemetry_url || Quonfig::Options.derive_telemetry_url(domain)
117
149
 
118
150
  case context_upload_mode
119
151
  when :none
@@ -188,16 +220,5 @@ module Quonfig
188
220
  def remove_trailing_slash(url)
189
221
  url.end_with?('/') ? url[0..-2] : url
190
222
  end
191
-
192
- # Derive a telemetry URL from the configured api_urls by swapping the
193
- # primary/secondary host prefix for `telemetry` on a *.quonfig.com host.
194
- # Falls back to https://telemetry.quonfig.com if no URL matches.
195
- def derive_telemetry_destination(api_urls)
196
- api_urls.each do |api_url|
197
- match = api_url.match(%r{\Ahttps?://(?:primary|secondary)\.([^/]*quonfig\.com)}i)
198
- return "https://telemetry.#{match[1]}" if match
199
- end
200
- 'https://telemetry.quonfig.com'
201
- end
202
223
  end
203
224
  end
@@ -119,7 +119,7 @@ module Quonfig
119
119
  return {
120
120
  'Authorization' => "Basic #{auth_string}",
121
121
  'Accept' => 'text/event-stream',
122
- 'X-Quonfig-SDK-Version' => "sdk-ruby-#{Quonfig::VERSION}"
122
+ 'X-Quonfig-SDK-Version' => "ruby-#{Quonfig::VERSION}"
123
123
  }
124
124
  end
125
125
 
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Quonfig
4
+ VERSION = '0.0.11'
5
+ end
data/lib/quonfig.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'quonfig/version'
4
+
3
5
  module Quonfig
4
6
  NO_DEFAULT_PROVIDED = :no_default_provided
5
- VERSION = File.read(File.dirname(__FILE__) + '/../VERSION').strip
6
7
  end
7
8
 
8
9
  begin
data/quonfig.gemspec CHANGED
@@ -1,169 +1,36 @@
1
- # Generated by juwelier
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: quonfig 0.0.9 ruby lib
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/quonfig/version'
6
4
 
7
5
  Gem::Specification.new do |s|
8
- s.name = "quonfig".freeze
9
- s.version = "0.0.9".freeze
6
+ s.name = 'quonfig'
7
+ s.version = Quonfig::VERSION
8
+ s.authors = ['Jeff Dwyer']
9
+ s.email = 'jeff@quonfig.com'
10
+ s.summary = 'Quonfig Ruby SDK'
11
+ s.description = 'Quonfig — feature flags and live config, stored as files in git.'
12
+ s.homepage = 'https://github.com/quonfig/sdk-ruby'
13
+ s.license = 'MIT'
14
+ s.required_ruby_version = '>= 3.0'
10
15
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib".freeze]
13
- s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2026-04-27"
15
- s.description = "Quonfig \u2014 feature flags and live config, stored as files in git.".freeze
16
- s.email = "jeff@quonfig.com".freeze
17
- s.extra_rdoc_files = [
18
- "CHANGELOG.md",
19
- "LICENSE.txt",
20
- "README.md"
21
- ]
22
- s.files = [
23
- ".claude/rules/constitution.md",
24
- ".claude/rules/git-safety.md",
25
- ".claude/rules/issue-tracking.md",
26
- ".claude/rules/testing-workflow.md",
27
- ".envrc.sample",
28
- ".github/CODEOWNERS",
29
- ".github/pull_request_template.md",
30
- ".github/workflows/release.yml",
31
- ".github/workflows/ruby.yml",
32
- ".github/workflows/test.yaml",
33
- ".rubocop.yml",
34
- ".tool-versions",
35
- "CHANGELOG.md",
36
- "CLAUDE.md",
37
- "CODEOWNERS",
38
- "Gemfile",
39
- "Gemfile.lock",
40
- "LICENSE.txt",
41
- "README.md",
42
- "Rakefile",
43
- "VERSION",
44
- "dev/allocation_stats",
45
- "dev/benchmark",
46
- "dev/console",
47
- "dev/script_setup.rb",
48
- "lib/quonfig.rb",
49
- "lib/quonfig/bound_client.rb",
50
- "lib/quonfig/caching_http_connection.rb",
51
- "lib/quonfig/client.rb",
52
- "lib/quonfig/config_envelope.rb",
53
- "lib/quonfig/config_loader.rb",
54
- "lib/quonfig/config_store.rb",
55
- "lib/quonfig/context.rb",
56
- "lib/quonfig/datadir.rb",
57
- "lib/quonfig/dev_context.rb",
58
- "lib/quonfig/duration.rb",
59
- "lib/quonfig/encryption.rb",
60
- "lib/quonfig/error.rb",
61
- "lib/quonfig/errors/decryption_error.rb",
62
- "lib/quonfig/errors/env_var_parse_error.rb",
63
- "lib/quonfig/errors/initialization_timeout_error.rb",
64
- "lib/quonfig/errors/invalid_environment_error.rb",
65
- "lib/quonfig/errors/invalid_sdk_key_error.rb",
66
- "lib/quonfig/errors/missing_default_error.rb",
67
- "lib/quonfig/errors/missing_env_var_error.rb",
68
- "lib/quonfig/errors/missing_environment_error.rb",
69
- "lib/quonfig/errors/type_mismatch_error.rb",
70
- "lib/quonfig/errors/uninitialized_error.rb",
71
- "lib/quonfig/evaluation.rb",
72
- "lib/quonfig/evaluator.rb",
73
- "lib/quonfig/exponential_backoff.rb",
74
- "lib/quonfig/fixed_size_hash.rb",
75
- "lib/quonfig/http_connection.rb",
76
- "lib/quonfig/internal_logger.rb",
77
- "lib/quonfig/murmer3.rb",
78
- "lib/quonfig/options.rb",
79
- "lib/quonfig/periodic_sync.rb",
80
- "lib/quonfig/quonfig.rb",
81
- "lib/quonfig/rate_limit_cache.rb",
82
- "lib/quonfig/reason.rb",
83
- "lib/quonfig/resolver.rb",
84
- "lib/quonfig/semantic_logger_filter.rb",
85
- "lib/quonfig/semver.rb",
86
- "lib/quonfig/sse_config_client.rb",
87
- "lib/quonfig/stdlib_formatter.rb",
88
- "lib/quonfig/telemetry/context_shape.rb",
89
- "lib/quonfig/telemetry/context_shape_aggregator.rb",
90
- "lib/quonfig/telemetry/evaluation_summaries_aggregator.rb",
91
- "lib/quonfig/telemetry/example_contexts_aggregator.rb",
92
- "lib/quonfig/telemetry/telemetry_reporter.rb",
93
- "lib/quonfig/time_helpers.rb",
94
- "lib/quonfig/types.rb",
95
- "lib/quonfig/weighted_value_resolver.rb",
96
- "quonfig.gemspec",
97
- "test/fixtures/datafile.json",
98
- "test/integration/test_context_precedence.rb",
99
- "test/integration/test_datadir_environment.rb",
100
- "test/integration/test_dev_overrides.rb",
101
- "test/integration/test_enabled.rb",
102
- "test/integration/test_enabled_with_contexts.rb",
103
- "test/integration/test_get.rb",
104
- "test/integration/test_get_feature_flag.rb",
105
- "test/integration/test_get_or_raise.rb",
106
- "test/integration/test_get_weighted_values.rb",
107
- "test/integration/test_helpers.rb",
108
- "test/integration/test_helpers_test.rb",
109
- "test/integration/test_post.rb",
110
- "test/integration/test_telemetry.rb",
111
- "test/support/common_helpers.rb",
112
- "test/support/mock_base_client.rb",
113
- "test/support/mock_config_loader.rb",
114
- "test/test_bound_client.rb",
115
- "test/test_caching_http_connection.rb",
116
- "test/test_client.rb",
117
- "test/test_client_network_mode.rb",
118
- "test/test_client_telemetry.rb",
119
- "test/test_config_loader.rb",
120
- "test/test_context.rb",
121
- "test/test_context_shape.rb",
122
- "test/test_context_shape_aggregator.rb",
123
- "test/test_datadir.rb",
124
- "test/test_dev_context.rb",
125
- "test/test_duration.rb",
126
- "test/test_encryption.rb",
127
- "test/test_evaluation_summaries_aggregator.rb",
128
- "test/test_evaluator.rb",
129
- "test/test_example_contexts_aggregator.rb",
130
- "test/test_exponential_backoff.rb",
131
- "test/test_fixed_size_hash.rb",
132
- "test/test_helper.rb",
133
- "test/test_http_connection.rb",
134
- "test/test_internal_logger.rb",
135
- "test/test_options.rb",
136
- "test/test_rate_limit_cache.rb",
137
- "test/test_reason.rb",
138
- "test/test_rename.rb",
139
- "test/test_resolver.rb",
140
- "test/test_semantic_logger_filter.rb",
141
- "test/test_semver.rb",
142
- "test/test_should_log.rb",
143
- "test/test_sse_config_client.rb",
144
- "test/test_stdlib_formatter.rb",
145
- "test/test_telemetry_reporter.rb",
146
- "test/test_typed_getters.rb",
147
- "test/test_types.rb",
148
- "test/test_weighted_value_resolver.rb"
149
- ]
150
- s.homepage = "https://github.com/quonfig/sdk-ruby".freeze
151
- s.licenses = ["MIT".freeze]
152
- s.rubygems_version = "3.5.22".freeze
153
- s.summary = "Quonfig Ruby SDK".freeze
16
+ s.metadata = {
17
+ 'source_code_uri' => 'https://github.com/quonfig/sdk-ruby',
18
+ 'changelog_uri' => 'https://github.com/quonfig/sdk-ruby/blob/main/CHANGELOG.md',
19
+ 'rubygems_mfa_required' => 'true'
20
+ }
154
21
 
155
- s.specification_version = 4
22
+ s.require_paths = ['lib']
23
+ s.files = Dir['lib/**/*.rb'] + %w[
24
+ CHANGELOG.md
25
+ LICENSE.txt
26
+ README.md
27
+ quonfig.gemspec
28
+ ]
29
+ s.extra_rdoc_files = %w[CHANGELOG.md LICENSE.txt README.md]
156
30
 
157
- s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0".freeze, ">= 1.0.5".freeze])
158
- s.add_runtime_dependency(%q<faraday>.freeze, [">= 0".freeze])
159
- s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0".freeze])
160
- s.add_runtime_dependency(%q<uuid>.freeze, [">= 0".freeze])
161
- s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4".freeze])
162
- s.add_development_dependency(%q<allocation_stats>.freeze, [">= 0".freeze])
163
- s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0".freeze])
164
- s.add_development_dependency(%q<bundler>.freeze, [">= 0".freeze])
165
- s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9".freeze])
166
- s.add_development_dependency(%q<rdoc>.freeze, [">= 0".freeze])
167
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
31
+ s.add_runtime_dependency 'activesupport', '>= 4'
32
+ s.add_runtime_dependency 'concurrent-ruby', '~> 1.0', '>= 1.0.5'
33
+ s.add_runtime_dependency 'faraday', '>= 1.0'
34
+ s.add_runtime_dependency 'ld-eventsource', '>= 2.0'
35
+ s.add_runtime_dependency 'uuid', '>= 2.0'
168
36
  end
169
-