Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
d9d4ac4a
Commit
d9d4ac4a
authored
Jul 29, 2021
by
Pedro Pombeiro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow Limitable to use override feature flag
Changelog: added
parent
7ddbd75c
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
48 additions
and
17 deletions
+48
-17
app/models/concerns/limitable.rb
app/models/concerns/limitable.rb
+2
-0
rubocop/cop/gitlab/mark_used_feature_flags.rb
rubocop/cop/gitlab/mark_used_feature_flags.rb
+1
-0
spec/models/concerns/limitable_spec.rb
spec/models/concerns/limitable_spec.rb
+41
-17
spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
+4
-0
No files found.
app/models/concerns/limitable.rb
View file @
d9d4ac4a
...
...
@@ -9,6 +9,7 @@ module Limitable
class_attribute
:limit_relation
class_attribute
:limit_name
class_attribute
:limit_feature_flag
class_attribute
:limit_feature_flag_for_override
# Allows selectively disabling by actor (as per https://docs.gitlab.com/ee/development/feature_flags/#selectively-disable-by-actor)
self
.
limit_name
=
self
.
name
.
demodulize
.
tableize
validate
:validate_plan_limit_not_exceeded
,
on: :create
...
...
@@ -28,6 +29,7 @@ module Limitable
scope_relation
=
self
.
public_send
(
limit_scope
)
# rubocop:disable GitlabSecurity/PublicSend
return
unless
scope_relation
return
if
limit_feature_flag
&&
::
Feature
.
disabled?
(
limit_feature_flag
,
scope_relation
,
default_enabled: :yaml
)
return
if
limit_feature_flag_for_override
&&
::
Feature
.
enabled?
(
limit_feature_flag_for_override
,
scope_relation
,
default_enabled: :yaml
)
relation
=
limit_relation
?
self
.
public_send
(
limit_relation
)
:
self
.
class
.
where
(
limit_scope
=>
scope_relation
)
# rubocop:disable GitlabSecurity/PublicSend
limits
=
scope_relation
.
actual_limits
...
...
rubocop/cop/gitlab/mark_used_feature_flags.rb
View file @
d9d4ac4a
...
...
@@ -32,6 +32,7 @@ module RuboCop
SELF_METHODS
=
%i[
push_frontend_feature_flag
limit_feature_flag=
limit_feature_flag_for_override=
]
.
freeze
+
EXPERIMENT_METHODS
+
RUGGED_METHODS
+
WORKER_METHODS
RESTRICT_ON_SEND
=
FEATURE_METHODS
+
EXPERIMENTATION_METHODS
+
GRAPHQL_METHODS
+
SELF_METHODS
...
...
spec/models/concerns/limitable_spec.rb
View file @
d9d4ac4a
# frozen_string_literal: true
require
'fast_spec_helper'
require
'active_model'
require
'spec_helper'
RSpec
.
describe
Limitable
do
let
(
:minimal_test_class
)
do
...
...
@@ -17,7 +16,7 @@ RSpec.describe Limitable do
end
before
do
stub_const
(
"MinimalTestClass"
,
minimal_test_class
)
stub_const
(
'MinimalTestClass'
,
minimal_test_class
)
end
it
{
expect
(
MinimalTestClass
.
limit_name
).
to
eq
(
'test_classes'
)
}
...
...
@@ -37,25 +36,50 @@ RSpec.describe Limitable do
instance
.
valid?
(
:create
)
end
context
'with custom relation'
do
before
do
MinimalTestClass
.
limit_relation
=
:custom_relation
context
'with custom relation and feature flags'
do
using
RSpec
::
Parameterized
::
TableSyntax
where
(
:limit_feature_flag
,
:limit_feature_flag_value
,
:limit_feature_flag_for_override
,
:limit_feature_flag_override_value
,
:expect_limit_applied?
)
do
nil
|
nil
|
nil
|
nil
|
true
:some_feature_flag
|
false
|
nil
|
nil
|
false
:some_feature_flag
|
true
|
nil
|
nil
|
true
:some_feature_flag
|
true
|
:some_feature_flag_disable
|
false
|
true
:some_feature_flag
|
false
|
:some_feature_flag_disable
|
false
|
false
:some_feature_flag
|
false
|
:some_feature_flag_disable
|
true
|
false
:some_feature_flag
|
true
|
:some_feature_flag_disable
|
true
|
false
end
it
'triggers custom limit_relation'
do
instance
=
MinimalTestClass
.
new
with_them
do
let
(
:instance
)
{
MinimalTestClass
.
new
}
def
instance
.
project
@project
||=
Object
.
new
end
before
do
def
instance
.
project
@project
||=
stub_feature_flag_gate
(
'CustomActor'
)
end
stub_feature_flags
(
"
#{
limit_feature_flag
}
"
:
limit_feature_flag_value
?
[
instance
.
project
]
:
false
)
if
limit_feature_flag
stub_feature_flags
(
"
#{
limit_feature_flag_for_override
}
"
:
limit_feature_flag_override_value
?
[
instance
.
project
]
:
false
)
if
limit_feature_flag_for_override
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
limits
=
Object
.
new
custom_relation
=
Object
.
new
expect
(
instance
).
to
receive
(
:custom_relation
).
and_return
(
custom_relation
)
expect
(
instance
.
project
).
to
receive
(
:actual_limits
).
and_return
(
limits
)
expect
(
limits
).
to
receive
(
:exceeded?
).
with
(
instance
.
class
.
name
.
demodulize
.
tableize
,
custom_relation
).
and_return
(
false
)
MinimalTestClass
.
limit_relation
=
:custom_relation
MinimalTestClass
.
limit_feature_flag
=
limit_feature_flag
MinimalTestClass
.
limit_feature_flag_for_override
=
limit_feature_flag_for_override
end
instance
.
valid?
(
:create
)
it
'acts according to the feature flag settings'
do
limits
=
Object
.
new
custom_relation
=
Object
.
new
if
expect_limit_applied?
expect
(
instance
).
to
receive
(
:custom_relation
).
and_return
(
custom_relation
)
expect
(
instance
.
project
).
to
receive
(
:actual_limits
).
and_return
(
limits
)
expect
(
limits
).
to
receive
(
:exceeded?
).
with
(
instance
.
class
.
name
.
demodulize
.
tableize
,
custom_relation
).
and_return
(
false
)
else
expect
(
instance
).
not_to
receive
(
:custom_relation
)
end
instance
.
valid?
(
:create
)
end
end
end
end
...
...
spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
View file @
d9d4ac4a
...
...
@@ -194,6 +194,10 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
include_examples
'sets flag as used'
,
'self.limit_feature_flag = :foo'
,
'foo'
end
describe
'self.limit_feature_flag_for_override = :foo'
do
include_examples
'sets flag as used'
,
'self.limit_feature_flag_for_override = :foo'
,
'foo'
end
describe
'FEATURE_FLAG = :foo'
do
include_examples
'sets flag as used'
,
'FEATURE_FLAG = :foo'
,
'foo'
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment