feature_toggles 0.1.0 → 1.0.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: 2b6aff154b3d0208aa37c53a90c3068e2a69fa393ba9e2e3b4a946e17f7479f2
4
- data.tar.gz: d2aedea7c963de5cabcec3650b576eb20db4401ae3166978ab0cc0b76e998ebd
3
+ metadata.gz: ced315883f27c7dfa71e43d3b04a2e0c6111d7e3ab24ebb2d96b309880349abc
4
+ data.tar.gz: 2567a6b58344a5b1b05c2380374ef85e1325119a243af0310003b2ad170838bf
5
5
  SHA512:
6
- metadata.gz: 33972a4e5055b04dc3b6507d44b76fa6ed4ed81b594d086c6c0dfba579cf2fe09dbe0d06ccce9aad54390c33640087e61334edb22591cd81424f6b7903a6eb31
7
- data.tar.gz: 7e50201fd0c9b9d9ac10babf891bd76bf5337303f2b46a7ad9026d38095ce71a5bdc9b0444efdf4158bbb9344f51ce26f406e0aac75e9695d9dffe03550ea9e6
6
+ metadata.gz: f3d9058efacee049c3feed1bc5878e3ba301d2e1d424954e8f871e802d2e31f110503a870b6f7dc90a92a84cca9012e02cacc5eb8c3ca52c2af912547fc05e20
7
+ data.tar.gz: 6f80548653e6f6f6792ef1a0b42c385d9def25c730a91d10d41e3b1d13d49442ecd8e799d7a0d66ac3e591366f207c7723b685b314a2ce670251ef5c0495f9c3
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  This gem provides a mechanism for pending features that take longer than a single release cycle. The basic idea is to have a configuration file that defines a bunch of toggles for various features you have pending. The running application then uses these toggles in order to decide whether or not to show the new feature.
7
7
 
8
- <a href="https://evilmartians.com/?utm_source=activerecord-postgres_enum">
8
+ <a href="https://evilmartians.com/?utm_source=feature_toggles">
9
9
  <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
10
10
 
11
11
  ## Installation
@@ -13,7 +13,7 @@ This gem provides a mechanism for pending features that take longer than a singl
13
13
  Add this line to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
- gem 'feature_toggles'
16
+ gem "feature_toggles"
17
17
  ```
18
18
 
19
19
  And then execute:
@@ -24,7 +24,9 @@ Or install it yourself as:
24
24
 
25
25
  $ gem install feature_toggles
26
26
 
27
- ## Usage
27
+ ## Framework-agnostic usage
28
+
29
+ Features could be defined dynamically
28
30
 
29
31
  ```ruby
30
32
  features = FeatureToggles.build do
@@ -46,6 +48,81 @@ features.enabled?(:bar, user: user)
46
48
  features.for(user: user).enabled?(:foo)
47
49
  ```
48
50
 
51
+ or loaded from files
52
+
53
+ ```ruby
54
+ features = FeatureToggles.build(["/path/to/features.rb"])
55
+ ```
56
+
57
+ ### Rails usage
58
+
59
+ This is step-by-step guide to add `feature_toggles` to Rails application.
60
+
61
+ **Step 0. (optional) Add `features` to User model**
62
+
63
+ **NOTE**: This is not the part of this gem–you can model you per-user features settings differently.
64
+
65
+ ```ruby
66
+ class AddFeaturesToUsers < ActiveRecord::Migration
67
+ def change
68
+ # we use a `features` array column to store user's active features
69
+ add_column :users, :features, :string, array: true, default: []
70
+ end
71
+ end
72
+ ```
73
+
74
+ **Step 1. Define features**
75
+
76
+ Features from file `<rails-root-or-engine>/config/initializers/features.rb` are loaded by convention.
77
+
78
+ ```ruby
79
+ # config/initializers/features.rb
80
+ env "FEATURE"
81
+
82
+ feature :chat do |user: nil|
83
+ user&.features.include?("chat")
84
+ end
85
+ ```
86
+
87
+ Features will be available at `Rails.features` after the end of application initialization.
88
+
89
+ **Step 2. Add `current_features` helper and use it.**
90
+
91
+ ```ruby
92
+ class ApplicationController < ActionController::Base
93
+ # ...
94
+ helper_method :current_features
95
+
96
+ def current_features
97
+ Rails.features.for(user: current_user)
98
+ end
99
+ end
100
+ ```
101
+
102
+ **Step 3. Use `current_features`.**
103
+
104
+ For example, in your navigation template:
105
+
106
+ ```erb
107
+ <ul>
108
+ <% if current_features.enabled?(:chat) %>
109
+ <li><a href="/chat">Chat</a></li>
110
+ <% end %>
111
+ </ul>
112
+ ```
113
+
114
+ Or in your controller:
115
+
116
+ ```ruby
117
+ class ChatController < ApplicationController
118
+ def index
119
+ unless current_features.enabled?(:chat)
120
+ return render template: "comming_soon"
121
+ end
122
+ end
123
+ end
124
+ ```
125
+
49
126
  ## Development
50
127
 
51
128
  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.
@@ -7,9 +7,13 @@ module FeatureToggles
7
7
  # Which env variables should be considered truthy
8
8
  POSSIBLE_ENABLING_VALUES = %w(true on yes 1).freeze
9
9
 
10
- def initialize(&block)
10
+ def initialize(definition_file_paths = nil, &block)
11
11
  @features = {}
12
12
 
13
+ definition_file_paths&.each do |file|
14
+ instance_eval(File.read(file), file)
15
+ end
16
+
13
17
  instance_eval(&block) if block_given?
14
18
  end
15
19
 
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/railtie"
4
+
5
+ module Rails
6
+ class << self
7
+ delegate :features, to: "application.config"
8
+ end
9
+ end
10
+
11
+ module FeatureToggles
12
+ class Railtie < ::Rails::Railtie
13
+ config.to_prepare do
14
+ paths = []
15
+
16
+ ::Rails.application.railties.each do |railtie|
17
+ next unless railtie.respond_to?(:root)
18
+
19
+ file = railtie.root.join("config", "features.rb")
20
+ next unless file.exist?
21
+
22
+ paths << file.to_s
23
+ end
24
+
25
+ # Rails-root features must be last to override engines' configuration
26
+ file = ::Rails.root.join("config", "features.rb")
27
+ paths << file.to_s if file.exist?
28
+
29
+ Rails.application.config.features = FeatureToggles.build(paths)
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FeatureToggles
4
- VERSION = "0.1.0"
4
+ VERSION = "1.0.0"
5
5
  end
@@ -6,7 +6,9 @@ require "feature_toggles/mechatronic"
6
6
  module FeatureToggles
7
7
  module_function
8
8
 
9
- def build(&block)
10
- Mechatronic.new(&block)
9
+ def build(file_paths = nil, &block)
10
+ Mechatronic.new(file_paths, &block)
11
11
  end
12
12
  end
13
+
14
+ require "feature_toggles/railtie" if defined?(Rails)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feature_toggles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.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: 2018-10-31 00:00:00.000000000 Z
11
+ date: 2019-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: combustion
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -78,6 +106,7 @@ files:
78
106
  - lib/feature_toggles.rb
79
107
  - lib/feature_toggles/mechatronic.rb
80
108
  - lib/feature_toggles/proxy.rb
109
+ - lib/feature_toggles/railtie.rb
81
110
  - lib/feature_toggles/version.rb
82
111
  homepage: https://github.com/bibendi/feature_toggles
83
112
  licenses: