feature_toggles 1.0.0 → 1.1.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: ced315883f27c7dfa71e43d3b04a2e0c6111d7e3ab24ebb2d96b309880349abc
4
- data.tar.gz: 2567a6b58344a5b1b05c2380374ef85e1325119a243af0310003b2ad170838bf
3
+ metadata.gz: c5c7424620e5960a2af091b3c18324fbbe8c67b26d6c76a66c1ff5a565f470fd
4
+ data.tar.gz: 821a7d830e4b917b621067dd81e3dcffd2db9ae36dd2f40ffd337da4fe5f2043
5
5
  SHA512:
6
- metadata.gz: f3d9058efacee049c3feed1bc5878e3ba301d2e1d424954e8f871e802d2e31f110503a870b6f7dc90a92a84cca9012e02cacc5eb8c3ca52c2af912547fc05e20
7
- data.tar.gz: 6f80548653e6f6f6792ef1a0b42c385d9def25c730a91d10d41e3b1d13d49442ecd8e799d7a0d66ac3e591366f207c7723b685b314a2ce670251ef5c0495f9c3
6
+ metadata.gz: b2fc3fcb95576f873f56b4a693a9a4e62c78c18c3aad6c4fbb264920640d785f72818ba1dfdbb03a06df01371ea9f0efa80ff859b5a4ba96e61f210f2f544f27
7
+ data.tar.gz: 11304a728a27e23dd7cbf3c7766c674e95c299e229761d80d1bf49b1b6b4386f7cb58fe3b1e2a08cf110b60f6e47fe063c029b669306cddc7a9e10c7c8be3c5b
data/README.md CHANGED
@@ -73,10 +73,10 @@ end
73
73
 
74
74
  **Step 1. Define features**
75
75
 
76
- Features from file `<rails-root-or-engine>/config/initializers/features.rb` are loaded by convention.
76
+ Features from file `<rails-root-or-engine>/config/features.rb` are loaded by convention.
77
77
 
78
78
  ```ruby
79
- # config/initializers/features.rb
79
+ # config/features.rb
80
80
  env "FEATURE"
81
81
 
82
82
  feature :chat do |user: nil|
@@ -123,6 +123,24 @@ class ChatController < ApplicationController
123
123
  end
124
124
  ```
125
125
 
126
+ ### Metadata
127
+
128
+ You can add arbitrary metadata to features:
129
+
130
+ ```ruby
131
+ feature :manual_quantity_backsync, icon: :updated, description: "Manual quantity sync for imported products" do |user: nil|
132
+ !!user&.features&.fetch("manual_quantity_backsync", false)
133
+ end
134
+ ```
135
+
136
+ That metadata can be later programmatically accessed and exposed into admin panels, API documentation, etc.
137
+
138
+ ```ruby
139
+ Rails.features.first.metadata
140
+ # => { icon: :updated, description: "Manual quantity sync for imported products" }
141
+ ```
142
+
143
+
126
144
  ## Development
127
145
 
128
146
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FeatureToggles
4
+ class Feature
5
+ def initialize(name, resolver, **metadata)
6
+ @name = name
7
+ @resolver = resolver
8
+ @metadata = metadata
9
+ end
10
+
11
+ attr_reader :name, :resolver, :metadata
12
+
13
+ def [](key)
14
+ @metadata[key]
15
+ end
16
+ end
17
+ end
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "proxy"
4
+ require_relative "feature"
4
5
 
5
6
  module FeatureToggles
6
7
  class Mechatronic
8
+ include Enumerable
9
+
7
10
  # Which env variables should be considered truthy
8
11
  POSSIBLE_ENABLING_VALUES = %w(true on yes 1).freeze
9
12
 
@@ -21,10 +24,10 @@ module FeatureToggles
21
24
  @env_prefix = val
22
25
  end
23
26
 
24
- def feature(name, &block)
27
+ def feature(name, **metadata, &block)
25
28
  raise(ArgumentError, "Flag #{name} already exists") if @features.key?(name)
26
29
 
27
- features[name] = block
30
+ features[name] = Feature.new(name, block, **metadata)
28
31
  end
29
32
 
30
33
  def names
@@ -32,7 +35,7 @@ module FeatureToggles
32
35
  end
33
36
 
34
37
  def enabled?(feature, *args)
35
- enabled_globally?(feature) || !!features.fetch(feature).call(*args)
38
+ enabled_globally?(feature) || !!features.fetch(feature).resolver.call(*args)
36
39
  end
37
40
 
38
41
  def for(*args)
@@ -51,6 +54,14 @@ module FeatureToggles
51
54
  end]
52
55
  end
53
56
 
57
+ def each
58
+ if block_given?
59
+ features.values.each { |f| yield f }
60
+ else
61
+ features.values.to_enum
62
+ end
63
+ end
64
+
54
65
  private
55
66
 
56
67
  attr_reader :features, :env_prefix
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FeatureToggles
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feature_toggles
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Merkushin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-21 00:00:00.000000000 Z
11
+ date: 2019-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.16'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '13.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -104,6 +104,7 @@ files:
104
104
  - LICENSE.txt
105
105
  - README.md
106
106
  - lib/feature_toggles.rb
107
+ - lib/feature_toggles/feature.rb
107
108
  - lib/feature_toggles/mechatronic.rb
108
109
  - lib/feature_toggles/proxy.rb
109
110
  - lib/feature_toggles/railtie.rb
@@ -128,8 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
129
  - !ruby/object:Gem::Version
129
130
  version: '0'
130
131
  requirements: []
131
- rubyforge_project:
132
- rubygems_version: 2.7.6
132
+ rubygems_version: 3.0.6
133
133
  signing_key:
134
134
  specification_version: 4
135
135
  summary: This gem provides a mechanism for pending features.