fino 1.6.1 → 1.7.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: fbf6ae8c4754a465d2ff42bf3f83115ec172f74f70d09206c219a9ca4f3575e1
4
- data.tar.gz: 3e5b9ae472067d9b3f056a72c166fc48822bad47ab41d9a432b1b924d6940aa6
3
+ metadata.gz: 2e033b28ee38e474bbeec0146b678dbcb3f076a510546e7317fe41be05476cf5
4
+ data.tar.gz: 772f29714cd61978a22b3cf1a4fee9f2570396a57703d5b3f228d005f09536f8
5
5
  SHA512:
6
- metadata.gz: 6ab577464b46727146b2afbbe2f0e27dbcab41936b45b468a9e1c5200081dde332ee446c0d7bb65692de9dd4ae733e1d32fce8f5cb9c3b1e3567b87e369eef3d
7
- data.tar.gz: 6da1a0b383910a58972b95dce2794741fbbb9a6042fc726ac12a4be1c85d199a6b9d0641d578f41fb1f5e0d775e121c500548fd2ed54c54c4e1a01ec3128f893
6
+ metadata.gz: 53eed6d59234333c47cdb1fe147011198827a10488c40772bd5abc14fffa57f36dafc7b34dd478ca9f218b938411cd37a842d374dbf2abe47e645b60a4c3a52b
7
+ data.tar.gz: 59bfaa481e797ee8974af6e8402e449266f9fb01c0acb3f81d1faf5d19635d1df00963e54075c8de513ff3662fdc9047786e13b467213cf9d14e79921fea376c
data/README.md CHANGED
@@ -46,8 +46,8 @@ Fino.configure do
46
46
  end
47
47
 
48
48
  section :my_micro_service, label: "My Micro Service" do
49
- setting :http_read_timeout, :integer, default: 200 # in ms
50
- setting :http_open_timeout, :integer, default: 100 # in ms
49
+ setting :http_read_timeout, :integer, unit: :ms, default: 200
50
+ setting :http_open_timeout, :integer, unit: :ms, default: 100
51
51
  end
52
52
  end
53
53
  end
@@ -65,6 +65,17 @@ Fino.set(model: "gpt-5", at: :openai)
65
65
  Fino.value(:model, at: :openai) #=> "gpt-5"
66
66
  ```
67
67
 
68
+ ### Feature toggles
69
+
70
+ ```ruby
71
+ Fino.enabled?(:maintenance_mode) #=> false
72
+ Fino.disabled?(:maintenance_mode) #=> true
73
+
74
+ Fino.enabled?(:maintenance_mode, for: "qa") #=> false
75
+ Fino.add_override(:maintenance_mode, "qa" => true)
76
+ Fino.enabled?(:maintenance_mode, for: "qa") #=> true
77
+ ```
78
+
68
79
  ### Overrides
69
80
 
70
81
  ```ruby
@@ -76,6 +87,9 @@ Fino.value(:model, at: :openai) #=> "gpt-5"
76
87
  Fino.value(:model, at: :openai, for: "qa") #=> "our_local_model_not_to_pay_to_sam_altman"
77
88
 
78
89
  Fino.setting(:model, at: :openai).overrides #=> { "qa" => "our_local_model_not_to_pay_to_sam_altman" }
90
+
91
+ Fino.add_override(:model, at: :openai, "admin" => "gpt-2000")
92
+ Fino.setting(:model, at: :openai).overrides #=> { "qa" => "our_local_model_not_to_pay_to_sam_altman", "admin" => "gpt-2000" }
79
93
  ```
80
94
 
81
95
  ### A/B testing
@@ -95,6 +109,31 @@ Fino.value(:model, at: :openai, for: "user_1") #=> "gpt-6"
95
109
  Fino.value(:model, at: :openai, for: "user_2") #=> "gpt-5"
96
110
  ```
97
111
 
112
+ ### Unit conversion
113
+
114
+ Fino is able to convert numeric settings into various units
115
+
116
+ ```ruby
117
+ Fino.configure do
118
+ # ...
119
+
120
+ settings do
121
+ section :my_micro_service, label: "My Micro Service" do
122
+ setting :http_read_timeout,
123
+ :integer,
124
+ unit: :ms, # When you define setting, specify unit (e.g ms/sec) to later be able to convert it
125
+ default: 200
126
+ end
127
+ end
128
+ end
129
+
130
+ Fino.value(:http_read_timeout, at: :my_micro_service) #=> 200
131
+
132
+ # Convert from ms to sec on the fly
133
+ Fino.value(:http_read_timeout, at: :my_micro_service, unit: :sec) #=> 0.2
134
+ Fino.setting(:http_read_timeout, at: :my_micro_service).value(unit: :sec) #=> 0.2
135
+ ```
136
+
98
137
  ## Rails integration
99
138
 
100
139
  Fino easily integrates with Rails. Just add the gem to your Gemfile:
data/lib/fino/library.rb CHANGED
@@ -48,6 +48,25 @@ class Fino::Library
48
48
  pipeline.read_multi(setting_definitions)
49
49
  end
50
50
 
51
+ def add_override(setting_name, at: nil, **overrides)
52
+ setting_definition = build_setting_definition(setting_name, at: at)
53
+ current_setting = pipeline.read(setting_definition)
54
+
55
+ deserialized_overrides = overrides.transform_values { |v| setting_definition.type_class.deserialize(v) }
56
+ merged_overrides = current_setting.overrides.merge(deserialized_overrides)
57
+
58
+ variants = current_setting.experiment&.variants || []
59
+
60
+ pipeline.write(
61
+ setting_definition,
62
+ current_setting.global_value,
63
+ merged_overrides,
64
+ variants
65
+ )
66
+
67
+ true
68
+ end
69
+
51
70
  def set(**data)
52
71
  at = data.delete(:at)
53
72
  raw_overrides = data.delete(:overrides) || {}
@@ -74,6 +93,8 @@ class Fino::Library
74
93
  overrides,
75
94
  experiment.variants
76
95
  )
96
+
97
+ true
77
98
  end
78
99
 
79
100
  def slice(*settings)
data/lib/fino/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fino
4
- VERSION = "1.6.1"
4
+ VERSION = "1.7.0"
5
5
  REQUIRED_RUBY_VERSION = ">= 3.0.0"
6
6
  end
data/lib/fino.rb CHANGED
@@ -44,7 +44,8 @@ module Fino
44
44
  :setting,
45
45
  :settings,
46
46
  :slice,
47
- :set
47
+ :set,
48
+ :add_override
48
49
 
49
50
  def library
50
51
  raise NotImplementedError
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fino
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Egor Iskrenkov