Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/experiments')
-rw-r--r--app/experiments/application_experiment.rb8
-rw-r--r--app/experiments/force_company_trial_experiment.rb11
-rw-r--r--app/experiments/members/invite_email_experiment.rb93
-rw-r--r--app/experiments/new_project_readme_content_experiment.rb2
-rw-r--r--app/experiments/new_project_readme_experiment.rb38
5 files changed, 18 insertions, 134 deletions
diff --git a/app/experiments/application_experiment.rb b/app/experiments/application_experiment.rb
index 4ebf4a80498..37d87baf30b 100644
--- a/app/experiments/application_experiment.rb
+++ b/app/experiments/application_experiment.rb
@@ -12,17 +12,21 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
def publish(_result = nil)
super
- publish_to_client if should_track? # publish the experiment data to the client
- publish_to_database if @record # publish the experiment context to the database
+ publish_to_client
+ publish_to_database if @record
end
def publish_to_client
+ return unless should_track?
+
Gon.push({ experiment: { name => signature } }, true)
rescue NoMethodError
# means we're not in the request cycle, and can't add to Gon. Log a warning maybe?
end
def publish_to_database
+ return unless should_track?
+
# if the context contains a namespace, group, project, user, or actor
value = context.value
subject = value[:namespace] || value[:group] || value[:project] || value[:user] || value[:actor]
diff --git a/app/experiments/force_company_trial_experiment.rb b/app/experiments/force_company_trial_experiment.rb
new file mode 100644
index 00000000000..00bdd5d693d
--- /dev/null
+++ b/app/experiments/force_company_trial_experiment.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class ForceCompanyTrialExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
+ exclude :setup_for_personal
+
+ private
+
+ def setup_for_personal
+ !context.user.setup_for_company
+ end
+end
diff --git a/app/experiments/members/invite_email_experiment.rb b/app/experiments/members/invite_email_experiment.rb
deleted file mode 100644
index 893061e34f3..00000000000
--- a/app/experiments/members/invite_email_experiment.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-module Members
- class InviteEmailExperiment < ApplicationExperiment
- exclude { context.actor.created_by.blank? }
- exclude { context.actor.created_by.avatar_url.nil? }
-
- INVITE_TYPE = 'initial_email'
-
- def self.initial_invite_email?(invite_type)
- invite_type == INVITE_TYPE
- end
-
- def resolve_variant_name
- RoundRobin.new(feature_flag_name, %i[activity control]).execute
- end
- end
-
- class RoundRobin
- CacheError = Class.new(StandardError)
-
- COUNTER_EXPIRE_TIME = 86400 # one day
-
- def initialize(key, variants)
- @key = key
- @variants = variants
- end
-
- def execute
- increment_counter
- resolve_variant_name
- end
-
- # When the counter would expire
- #
- # @api private Used internally by SRE and debugging purpose
- # @return [Integer] Number in seconds until expiration or false if never
- def counter_expires_in
- Gitlab::Redis::SharedState.with do |redis|
- redis.ttl(key)
- end
- end
-
- # Return the actual counter value
- #
- # @return [Integer] value
- def counter_value
- Gitlab::Redis::SharedState.with do |redis|
- (redis.get(key) || 0).to_i
- end
- end
-
- # Reset the counter
- #
- # @private Used internally by SRE and debugging purpose
- # @return [Boolean] whether reset was a success
- def reset!
- redis_cmd do |redis|
- redis.del(key)
- end
- end
-
- private
-
- attr_reader :key, :variants
-
- # Increase the counter
- #
- # @return [Boolean] whether operation was a success
- def increment_counter
- redis_cmd do |redis|
- redis.incr(key)
- redis.expire(key, COUNTER_EXPIRE_TIME)
- end
- end
-
- def resolve_variant_name
- remainder = counter_value % variants.size
-
- variants[remainder]
- end
-
- def redis_cmd
- Gitlab::Redis::SharedState.with { |redis| yield(redis) }
-
- true
- rescue CacheError => e
- Gitlab::AppLogger.warn("GitLab: An unexpected error occurred in writing to Redis: #{e}")
-
- false
- end
- end
-end
diff --git a/app/experiments/new_project_readme_content_experiment.rb b/app/experiments/new_project_readme_content_experiment.rb
index f86803db093..d9f0fb3b93e 100644
--- a/app/experiments/new_project_readme_content_experiment.rb
+++ b/app/experiments/new_project_readme_content_experiment.rb
@@ -19,7 +19,7 @@ class NewProjectReadmeContentExperiment < ApplicationExperiment # rubocop:disabl
end
def redirect(to_url)
- experiment_redirect_url(self, to_url)
+ experiment_redirect_url(self, url: to_url)
end
private
diff --git a/app/experiments/new_project_readme_experiment.rb b/app/experiments/new_project_readme_experiment.rb
deleted file mode 100644
index c5c41330949..00000000000
--- a/app/experiments/new_project_readme_experiment.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class NewProjectReadmeExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
- include ProjectCommitCount
-
- INITIAL_WRITE_LIMIT = 3
- EXPERIMENT_START_DATE = DateTime.parse('2021/1/20')
- MAX_ACCOUNT_AGE = 7.days
-
- exclude { context.value[:actor].nil? }
- exclude { context.actor.created_at < MAX_ACCOUNT_AGE.ago }
-
- def control_behavior
- false # we don't want the checkbox to be checked
- end
-
- def candidate_behavior
- true # check the checkbox by default
- end
-
- def track_initial_writes(project)
- return unless should_track? # early return if we don't need to ask for commit counts
- return unless project.created_at > EXPERIMENT_START_DATE # early return for older projects
- return unless (count = commit_count(project)) < INITIAL_WRITE_LIMIT
-
- track(:write, property: project.created_at.to_s, value: count)
- end
-
- private
-
- def commit_count(project)
- commit_count_for(project,
- default_count: INITIAL_WRITE_LIMIT,
- max_count: INITIAL_WRITE_LIMIT,
- experiment: name
- )
- end
-end