this_feature 0.10.0 → 0.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a1fb53b4ceabfd85df7c059b02331d419259b23d7f0de2d90c942528bab1bbc
4
- data.tar.gz: 81f8b34041e14e8d02c455c9c427c760b5d02ddf50531f016867f91bb7668368
3
+ metadata.gz: 4f8b9d3709cdadcd289f916ccaabf17d6163daa087a2952f08e6cb800769685b
4
+ data.tar.gz: ff11aeed6a2deba49bd5d1ca4517f73dce29d3238fceff6bee6f1a7735dedce6
5
5
  SHA512:
6
- metadata.gz: 8eb7586c9d9b39cabe35d29257e79352f4eb807104f685fd23286717a6b358435c724bc194997b01bd8270d13de743374f763c6e32e4be355fa1db3c46caceb3
7
- data.tar.gz: 3b0f23e8392bb6eb1eb52bf3858fb064aad0e59d5c5ef535e15ccb95acf88a974c64ae2ad32d0ee925e37b34ff55bf6b499e459593c656c7a01c5fee55712498
6
+ metadata.gz: fcdd8e883cf7ac9abf17d00b2051a3d23aebe1b84bff45d58ea730621f4a629f07a2bf649f8107f7e38544e9c0edb266e632681c7dea069378342f8f205032ca
7
+ data.tar.gz: 41e40d6517de30f310414987c16b91807271a69fa41c4a14204107cda7f3a94e85696ace92b968f0e5c8063af5dc2f739230b6dbeb9d6009d263e56a133da143
@@ -0,0 +1,13 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ commit-message:
6
+ prefix: "[bot] "
7
+ cooldown:
8
+ default-days: 7
9
+ schedule:
10
+ interval: "weekly"
11
+ day: "wednesday"
12
+ time: "11:00"
13
+ timezone: "America/Los_Angeles"
@@ -11,7 +11,7 @@ jobs:
11
11
  uses: actions/checkout@main
12
12
 
13
13
  - name: Set up Ruby
14
- uses: ruby/setup-ruby@v1
14
+ uses: ruby/setup-ruby@e65c17d16e57e481586a6a5a0282698790062f92 # v1
15
15
  with:
16
16
  bundler-cache: true
17
17
 
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- this_feature (0.10.0)
5
- this_feature-adapters-flipper (0.10.0)
4
+ this_feature (0.11.0)
5
+ this_feature-adapters-flipper (0.11.0)
6
6
  flipper
7
7
  flipper-active_record
8
8
  this_feature
9
- this_feature-adapters-split_io (0.10.0)
9
+ this_feature-adapters-split_io (0.11.0)
10
10
  splitclient-rb
11
11
  this_feature
12
12
 
data/docs/memory.md CHANGED
@@ -18,6 +18,10 @@ Under the hood, the memory adapter stores data in a dictionary like so:
18
18
  User1: 'treatment_name_1',
19
19
  User2: 'treatment_name_2',
20
20
  User3: 'treatment_name_3'
21
+ },
22
+ config_contexts: {
23
+ User1: {},
24
+ User2: {}
21
25
  }
22
26
  }
23
27
  }
@@ -34,6 +34,25 @@ class ThisFeature
34
34
  !present?(flag_name)
35
35
  end
36
36
 
37
+ def treatment_config(flag_name, context: nil, data: {}, record: nil)
38
+ return if !present?(flag_name) || context.nil?
39
+
40
+ flag_data = storage[flag_name][:config_contexts]
41
+ context_registered = flag_data&.key?(context_key(context))
42
+
43
+ return if !flag_data || !context_registered
44
+
45
+ flag_data[context_key(context)]
46
+ end
47
+
48
+ def enable_config!(flag_name, config: nil, context: nil)
49
+ return false if config.nil? || flag_name.nil? || context.nil?
50
+
51
+ storage[flag_name] ||= {}
52
+ storage[flag_name][:config_contexts] ||= {}
53
+ storage[flag_name][:config_contexts][context_key(context)] = config
54
+ end
55
+
37
56
  def treatment_value(flag_name, context: nil, data: {}, record: nil)
38
57
  return 'control' if !present?(flag_name) || context.nil?
39
58
 
@@ -42,7 +61,6 @@ class ThisFeature
42
61
 
43
62
  return 'control' if !flag_data || !context_registered
44
63
 
45
- flag_data ||= {}
46
64
  flag_data[context_key(context)]
47
65
  end
48
66
 
@@ -1,6 +1,6 @@
1
1
  class ThisFeature
2
2
  class Configuration
3
- attr_writer :adapters, :default_adapter, :test_adapter, :base_data_lambda
3
+ attr_writer :adapters, :default_adapter, :test_adapter, :base_data_lambda, :on_nil_context
4
4
 
5
5
  def init
6
6
  validate_adapters!
@@ -29,5 +29,9 @@ class ThisFeature
29
29
  def base_data_lambda
30
30
  @base_data_lambda ||= ->(_record) { {} }
31
31
  end
32
+
33
+ def on_nil_context
34
+ @on_nil_context ||= ->(_flag_name, _caller_location) {}
35
+ end
32
36
  end
33
37
  end
@@ -1,3 +1,3 @@
1
1
  class ThisFeature
2
- VERSION = '0.10.0'.freeze
2
+ VERSION = '0.11.0'.freeze
3
3
  end
data/lib/this_feature.rb CHANGED
@@ -5,7 +5,20 @@ require 'this_feature/configuration'
5
5
  require 'this_feature/flag'
6
6
 
7
7
  class ThisFeature
8
- def self.flag(flag_name, context: nil, data: {}, record: nil)
8
+ OMITTED_CONTEXT = Object.new.freeze
9
+ private_constant :OMITTED_CONTEXT
10
+
11
+ def self.flag(flag_name, context: OMITTED_CONTEXT, data: {}, record: nil)
12
+ if context.nil?
13
+ begin
14
+ configuration.on_nil_context.call(flag_name, caller_locations(1, 1)&.first)
15
+ rescue StandardError => e
16
+ warn("ThisFeature on_nil_context callback failed: #{e.class}: #{e.message}")
17
+ end
18
+ end
19
+ # OMITTED_CONTEXT used to distinguish omission from passing nil; restore nil for the rest of the gem.
20
+ context = nil if context.equal?(OMITTED_CONTEXT)
21
+
9
22
  adapter = adapter_for(flag_name)
10
23
 
11
24
  Flag.new(flag_name, adapter: adapter, context: context, data: data, record: record)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: this_feature
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Pleaner
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2023-10-16 00:00:00.000000000 Z
14
+ date: 2026-05-05 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description: ''
17
17
  email:
@@ -23,6 +23,7 @@ executables: []
23
23
  extensions: []
24
24
  extra_rdoc_files: []
25
25
  files:
26
+ - ".github/dependabot.yml"
26
27
  - ".github/workflows/linter-rubocop.yml"
27
28
  - ".github/workflows/test.yml"
28
29
  - ".gitignore"