feature_toggles 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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.