Skip to content

Commit fff3d3c

Browse files
committed
Feature flag suggested changes
1 parent d48f119 commit fff3d3c

File tree

11 files changed

+208
-86
lines changed

11 files changed

+208
-86
lines changed

.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ SPLIT_PASSWORD=split_password
2929
SPLIT_USERNAME=split_username
3030
STRIPE_API_KEY=stripe_api_key
3131
STRIPE_PUBLISHABLE_KEY=stripe_publishable_key
32+
FEATURES_ADMIN_PASSWORD=supersecret

Gemfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ gem "autoprefixer-rails"
1010
gem "bourbon", "~> 5.0"
1111
gem "email_validator"
1212
gem "faraday"
13+
gem "flipper"
14+
gem "flipper-active_record"
15+
gem "flipper-ui"
1316
gem "haml-rails", "~> 2.0"
1417
gem "high_voltage"
1518
gem "inifile"

Gemfile.lock

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ GEM
122122
faraday (1.0.0)
123123
multipart-post (>= 1.2, < 3)
124124
ffi (1.12.2)
125+
flipper (0.17.2)
126+
flipper-active_record (0.17.2)
127+
activerecord (>= 4.2, < 7)
128+
flipper (~> 0.17.2)
129+
flipper-ui (0.17.2)
130+
erubi (>= 1.0.0, < 2.0.0)
131+
flipper (~> 0.17.2)
132+
rack (>= 1.4, < 3)
133+
rack-protection (>= 1.5.3, < 2.1.0)
125134
foreman (0.87.0)
126135
globalid (0.4.2)
127136
activesupport (>= 4.2.0)
@@ -383,6 +392,9 @@ DEPENDENCIES
383392
email_validator
384393
factory_girl_rails
385394
faraday
395+
flipper
396+
flipper-active_record
397+
flipper-ui
386398
foreman
387399
haml-rails (~> 2.0)
388400
high_voltage

app/models/owner.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ def metered_plan?
6464
whitelisted?
6565
end
6666

67+
def flipper_id
68+
"Owner:#{id}"
69+
end
70+
6771
private
6872

6973
def hound_config

app/models/violation.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ def source
2323
crypt.decrypt_and_verify(self[:source]) if self[:source]
2424
end
2525

26+
def owner
27+
file_review.build.repo.owner
28+
end
29+
2630
private
2731

2832
def crypt

app/services/suggest_changes.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@ def initialize(violation)
77
end
88

99
def call
10-
violation.messages.each do |message|
11-
apply_suggestion(message)
12-
break if suggestion.present?
13-
end
10+
if Flipper[:suggested_changes].enabled?(violation.owner)
11+
violation.messages.each do |message|
12+
apply_suggestion(message)
13+
break if suggestion.present?
14+
end
1415

15-
messages = violation.messages.join(CommentingPolicy::COMMENT_LINE_DELIMITER)
16+
formatted_messages = violation.messages.join(CommentingPolicy::COMMENT_LINE_DELIMITER)
1617

17-
if suggestion.blank?
18-
messages
18+
if suggestion.blank?
19+
formatted_messages
20+
else
21+
formatted_messages + "<br>\n```suggestion\n#{suggestion}\n```"
22+
end
1923
else
20-
messages + "<br>\n```suggestion\n#{suggestion}\n```"
24+
violation.messages.join(CommentingPolicy::COMMENT_LINE_DELIMITER)
2125
end
2226
end
2327

config/initializers/flipper.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require "flipper"
2+
require "flipper/adapters/active_record"
3+
4+
Flipper.configure do |config|
5+
config.default do
6+
Flipper.new(Flipper::Adapters::ActiveRecord.new)
7+
end
8+
end

config/routes.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
mount Sidekiq::Web, at: "/jobs"
2121
mount Split::Dashboard, at: "/split"
2222

23+
flipper_app = Flipper::UI.app(Flipper.instance) do |builder|
24+
builder.use Rack::Auth::Basic do |_, password|
25+
ActiveSupport::SecurityUtils.secure_compare(
26+
::Digest::SHA256.hexdigest(password),
27+
::Digest::SHA256.hexdigest(ENV["FEATURES_ADMIN_PASSWORD"]),
28+
)
29+
end
30+
end
31+
mount flipper_app, at: "/features"
32+
2333
get "/auth/github/callback", to: "sessions#create"
2434
get "/sign_out", to: "sessions#destroy"
2535
get "/configuration", to: redirect(ENV.fetch("DOCS_URL"), status: 302)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class CreateFlipperTables < ActiveRecord::Migration[6.0]
2+
def self.up
3+
create_table :flipper_features do |t|
4+
t.string :key, null: false
5+
t.timestamps null: false
6+
end
7+
add_index :flipper_features, :key, unique: true
8+
9+
create_table :flipper_gates do |t|
10+
t.string :feature_key, null: false
11+
t.string :key, null: false
12+
t.string :value
13+
t.timestamps null: false
14+
end
15+
add_index :flipper_gates, [:feature_key, :key, :value], unique: true
16+
end
17+
18+
def self.down
19+
drop_table :flipper_gates
20+
drop_table :flipper_features
21+
end
22+
end

db/schema.rb

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema.define(version: 2019_12_12_043041) do
13+
ActiveRecord::Schema.define(version: 2020_04_01_183732) do
1414

1515
# These are extensions that must be enabled in order to support this database
1616
enable_extension "plpgsql"
@@ -62,7 +62,23 @@
6262
t.index ["build_id"], name: "index_file_reviews_on_build_id"
6363
end
6464

65-
create_table "memberships", id: :serial, force: :cascade do |t|
65+
create_table "flipper_features", force: :cascade do |t|
66+
t.string "key", null: false
67+
t.datetime "created_at", precision: 6, null: false
68+
t.datetime "updated_at", precision: 6, null: false
69+
t.index ["key"], name: "index_flipper_features_on_key", unique: true
70+
end
71+
72+
create_table "flipper_gates", force: :cascade do |t|
73+
t.string "feature_key", null: false
74+
t.string "key", null: false
75+
t.string "value"
76+
t.datetime "created_at", precision: 6, null: false
77+
t.datetime "updated_at", precision: 6, null: false
78+
t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
79+
end
80+
81+
create_table "memberships", force: :cascade do |t|
6682
t.integer "user_id", null: false
6783
t.integer "repo_id", null: false
6884
t.datetime "created_at", null: false

0 commit comments

Comments
 (0)