diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 915939fa18e6da0a791ee8c24570058df6d898f6..0a2e2a1e77dd4acd1d53cf2d1e49352f80d52183 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -720,9 +720,6 @@ def signup_form_data end def vscode_extension_marketplace_settings_view - # NOTE: This is intentionally not scoped to a specific actor since it affects instance-level settings. - return unless Feature.enabled?(:vscode_extension_marketplace_settings, nil) - presets = ::WebIde::ExtensionMarketplacePreset.all.map do |preset| preset.to_h.deep_transform_keys { |key| key.to_s.camelize(:lower) } end diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index ef31153232b4c1544ac2c4ff11fe88d92493f747..09963484032245483b610365fc189c72e281a1fc 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -163,7 +163,7 @@ def integration_views private def extensions_marketplace_view - return unless WebIde::ExtensionMarketplace.feature_enabled?(user: current_user) + return unless WebIde::ExtensionMarketplace.feature_enabled_from_application_settings? build_extensions_marketplace_view( title: s_("Preferences|Web IDE"), diff --git a/config/feature_flags/beta/vscode_extension_marketplace_settings.yml b/config/feature_flags/beta/vscode_extension_marketplace_settings.yml deleted file mode 100644 index bb4f5797137fbd2fb1c6fb9f38942db42e54a6ce..0000000000000000000000000000000000000000 --- a/config/feature_flags/beta/vscode_extension_marketplace_settings.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: vscode_extension_marketplace_settings -feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/508977 -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181624 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/508996 -milestone: '17.10' -group: group::remote development -type: beta -default_enabled: true diff --git a/config/feature_flags/beta/web_ide_extensions_marketplace.yml b/config/feature_flags/beta/web_ide_extensions_marketplace.yml deleted file mode 100644 index 03f8a375bf66af1280e1fd2b3ddaaebd8651d307..0000000000000000000000000000000000000000 --- a/config/feature_flags/beta/web_ide_extensions_marketplace.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: web_ide_extensions_marketplace -feature_issue_url: https://gitlab.com/groups/gitlab-org/-/epics/7685 -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/151352 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/459028 -milestone: '17.0' -group: group::ide -type: beta -default_enabled: true diff --git a/doc/user/enterprise_user/_index.md b/doc/user/enterprise_user/_index.md index 6f71b36fa48664d8c135b19c9b8b42890399099d..af845faf75186237fe4ac76bec3ef62a9569137b 100644 --- a/doc/user/enterprise_user/_index.md +++ b/doc/user/enterprise_user/_index.md @@ -264,28 +264,22 @@ Allowing group Owners to change primary emails is proposed in [issue 412966](htt {{< details >}} -- Status: Beta +- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated {{< /details >}} {{< history >}} -- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/161819) as a [beta](../../policy/development_stages_support.md#beta) in GitLab 17.0 [with flags](../../administration/feature_flags.md) named `web_ide_oauth` and `web_ide_extensions_marketplace`. Disabled by default. +- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/161819) as a [beta](../../policy/development_stages_support.md#beta) in GitLab 17.4 [with flags](../../administration/feature_flags.md) named `web_ide_oauth` and `web_ide_extensions_marketplace`. Disabled by default. - `web_ide_oauth` [enabled on GitLab.com, GitLab Self-Managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163181) in GitLab 17.4. - `web_ide_extensions_marketplace` [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.4. - `web_ide_oauth` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167464) in GitLab 17.5. - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/508996) the `vscode_extension_marketplace_settings` [feature flag](../../administration/feature_flags.md) in GitLab 17.10. Disabled by default. -- `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.11. +- `web_ide_extensions_marketplace` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662), and `vscode_extension_marketplace_settings` [enabled on GitLab.com and GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662) in GitLab 17.11. +- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/192659) in GitLab 18.1. Feature flags `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` removed. {{< /history >}} -{{< alert type="flag" >}} - -The availability of this feature is controlled by a feature flag. -For more information, see the history. - -{{< /alert >}} - Prerequisites: - In the **Admin** area, a GitLab administrator must diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md index 5a7036462ba123d913dd52546b4baf446cc8d38f..99d15b8ecb22ba69fee35eff1dcce8ebf8eb5ff3 100644 --- a/doc/user/profile/preferences.md +++ b/doc/user/profile/preferences.md @@ -472,29 +472,23 @@ You must be the administrator of the GitLab instance to configure GitLab with So {{< details >}} -- Offering: GitLab.com +- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated {{< /details >}} {{< history >}} -- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/161819) as a [beta](../../policy/development_stages_support.md#beta) in GitLab 17.0 [with flags](../../administration/feature_flags.md) named `web_ide_oauth` and `web_ide_extensions_marketplace`. Disabled by default. +- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/151352) as a [beta](../../policy/development_stages_support.md#beta) in GitLab 17.0 [with flags](../../administration/feature_flags.md) named `web_ide_oauth` and `web_ide_extensions_marketplace`. Disabled by default. - `web_ide_oauth` [enabled on GitLab.com, GitLab Self-Managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163181) in GitLab 17.4. - `web_ide_extensions_marketplace` [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.4. - `web_ide_oauth` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167464) in GitLab 17.5. - Enabled by default for [workspaces](../workspace/_index.md) in GitLab 17.6. Workspaces do not require any feature flags for the extension marketplace to be available. - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/508996) the `vscode_extension_marketplace_settings` [feature flag](../../administration/feature_flags.md) in GitLab 17.10. Disabled by default. -- `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.11. +- `web_ide_extensions_marketplace` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662), and `vscode_extension_marketplace_settings` [enabled on GitLab.com and GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662) in GitLab 17.11. +- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/192659) in GitLab 18.1. Feature flags `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` removed. {{< /history >}} -{{< alert type="flag" >}} - -The availability of this feature is controlled by a feature flag. -For more information, see the history. - -{{< /alert >}} - You can use the extension marketplace to search and [manage extensions](../project/web_ide/_index.md#manage-extensions) for the [Web IDE](../project/web_ide/_index.md) and [workspaces](../workspace/_index.md). For third-party extensions, you must enable the marketplace in user preferences. diff --git a/doc/user/project/web_ide/_index.md b/doc/user/project/web_ide/_index.md index 86c7cbb7cace4be0e01025918ddfc41c37884f3b..4305427ba94616564e474f7e53183c6bcc954379 100644 --- a/doc/user/project/web_ide/_index.md +++ b/doc/user/project/web_ide/_index.md @@ -257,17 +257,11 @@ To view any notification you might have missed: - `web_ide_extensions_marketplace` [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.4. - `web_ide_oauth` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167464) in GitLab 17.5. - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/508996) the `vscode_extension_marketplace_settings` [feature flag](../../../administration/feature_flags.md) in GitLab 17.10. Disabled by default. -- `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/issues/459028) in GitLab 17.11. +- `web_ide_extensions_marketplace` [enabled on GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662), and `vscode_extension_marketplace_settings` [enabled on GitLab.com and GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184662) in GitLab 17.11. +- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/192659) in GitLab 18.1. Feature flags `web_ide_extensions_marketplace` and `vscode_extension_marketplace_settings` removed. {{< /history >}} -{{< alert type="flag" >}} - -The availability of this feature is controlled by a feature flag. -For more information, see the history. - -{{< /alert >}} - The VS Code Extension Marketplace provides you with access to extensions that enhance the functionality of the Web IDE. By default, the GitLab Web IDE instance is configured to use the [Open VSX Registry](https://open-vsx.org/). diff --git a/ee/app/graphql/mutations/remote_development/workspace_operations/create.rb b/ee/app/graphql/mutations/remote_development/workspace_operations/create.rb index 03ba3fdd4836635d2e302e9859a73df81813434a..85963b77e923e31aabe193d1944eb3c4255a9bb8 100644 --- a/ee/app/graphql/mutations/remote_development/workspace_operations/create.rb +++ b/ee/app/graphql/mutations/remote_development/workspace_operations/create.rb @@ -126,8 +126,7 @@ def resolve(args) WebIde::Settings.get( [:vscode_extension_marketplace_metadata, :vscode_extension_marketplace], - user: current_user, - vscode_extension_marketplace_feature_flag_enabled: true + user: current_user ) => { vscode_extension_marketplace_metadata: Hash => vscode_extension_marketplace_metadata, diff --git a/ee/app/helpers/ee/preferences_helper.rb b/ee/app/helpers/ee/preferences_helper.rb index e7241d9dbdb34a5566160cc0144a8b64bdb3b045..47cd9bb227dd60a806f7bb661cd95d033deca218 100644 --- a/ee/app/helpers/ee/preferences_helper.rb +++ b/ee/app/helpers/ee/preferences_helper.rb @@ -15,10 +15,8 @@ def excluded_dashboard_choices override :extensions_marketplace_view def extensions_marketplace_view - return unless ::WebIde::ExtensionMarketplace.feature_enabled_from_application_settings?(user: current_user) - if License.feature_available?(:remote_development) && - ::WebIde::ExtensionMarketplace.feature_enabled?(user: current_user) + ::WebIde::ExtensionMarketplace.feature_enabled_from_application_settings? build_extensions_marketplace_view( title: s_("Preferences|Web IDE and Workspaces"), message: s_("PreferencesIntegrations|Uses %{extensions_marketplace_home} as the extension marketplace " \ diff --git a/ee/app/models/ee/group.rb b/ee/app/models/ee/group.rb index 28e9afa9c5438c8ed49a55bb5062715544a6b851..b9c64dbd93ba7dc25df6f5085320ded2e42700b2 100644 --- a/ee/app/models/ee/group.rb +++ b/ee/app/models/ee/group.rb @@ -1049,7 +1049,7 @@ def code_suggestions_purchased? def can_manage_extensions_marketplace_for_enterprise_users? root? && licensed_feature_available?(:disable_extensions_marketplace_for_enterprise_users) && - ::WebIde::ExtensionMarketplace.feature_enabled_for_any_user? + ::WebIde::ExtensionMarketplace.feature_enabled_from_application_settings? end def enterprise_users_extensions_marketplace_enabled? diff --git a/ee/spec/helpers/preferences_helper_spec.rb b/ee/spec/helpers/preferences_helper_spec.rb index 44925ddb64d9fb976d93e1cedf5b1be7e83002cd..4a249ad2cb572a055de70ba89ec67b44383b4627 100644 --- a/ee/spec/helpers/preferences_helper_spec.rb +++ b/ee/spec/helpers/preferences_helper_spec.rb @@ -48,18 +48,12 @@ end describe '#extensions_marketplace_view' do - let(:feature_enabled) { false } let(:application_setting_enabled) { true } subject { helper.extensions_marketplace_view } before do - allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled?) - .with(user: user) - .and_return(feature_enabled) - allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?) - .with(user: user) .and_return(application_setting_enabled) end @@ -75,24 +69,28 @@ end context 'when Web IDE Extension Marketplace feature is enabled' do - let(:feature_enabled) { true } + let(:application_setting_enabled) { true } it { is_expected.to match(a_hash_including(title: 'Web IDE and Workspaces', message: /IDE and Workspaces/)) } end context 'when Web IDE Extension Marketplace feature not enabled' do + let(:application_setting_enabled) { false } + it { is_expected.to match(a_hash_including(title: 'Workspaces', message: /for Workspaces/)) } end end context 'when remote_development licensed feature is not enabled' do + before do + stub_licensed_features(remote_development: false) + end + context 'when Web IDE Extension Marketplace feature is enabled' do - let(:feature_enabled) { true } + let(:application_setting_enabled) { true } - it { is_expected.to match(a_hash_including(title: 'Web IDE', message: /for the Web IDE/)) } + it { is_expected.to match(a_hash_including(name: 'extensions_marketplace')) } end - - it { is_expected.not_to match(a_hash_including(name: 'extensions_marketplace')) } end end diff --git a/ee/spec/lib/ee/web_ide/settings/extension_marketplace_metadata_generator_spec.rb b/ee/spec/lib/ee/web_ide/settings/extension_marketplace_metadata_generator_spec.rb index 10c030a3f9630f3c97c4128b97e9774c6f9031c4..aacedb7374631e71d968fb0ef7d83c174631b388 100644 --- a/ee/spec/lib/ee/web_ide/settings/extension_marketplace_metadata_generator_spec.rb +++ b/ee/spec/lib/ee/web_ide/settings/extension_marketplace_metadata_generator_spec.rb @@ -24,8 +24,7 @@ def flipper_id { requested_setting_names: [:vscode_extension_marketplace_metadata], options: { - user: user, - vscode_extension_marketplace_feature_flag_enabled: true + user: user }, settings: { vscode_extension_marketplace_home_url: marketplace_home_url @@ -59,7 +58,6 @@ def flipper_id allow(group).to receive(:enterprise_users_extensions_marketplace_enabled?).and_return(enterprise_group_enabled) allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?) - .with(user: user) .and_return(true) end diff --git a/ee/spec/lib/web_ide/settings/settings_integration_spec.rb b/ee/spec/lib/web_ide/settings/settings_integration_spec.rb index 76e2699fc7d61f2d51b5eb6cb2dc8567a3306f13..24e0984ffe3151ee5f137bcae1730f2c9bac655d 100644 --- a/ee/spec/lib/web_ide/settings/settings_integration_spec.rb +++ b/ee/spec/lib/web_ide/settings/settings_integration_spec.rb @@ -15,12 +15,8 @@ subject(:settings) { described_class.get([:vscode_extension_marketplace_metadata], options) } before do - stub_feature_flags( - web_ide_extensions_marketplace: true, - vscode_extension_marketplace_settings: true - ) stub_licensed_features(disable_extensions_marketplace_for_enterprise_users: true) - stub_application_setting(vscode_extension_marketplace: { enabled: true, preset: 'open_vsx' }) + stub_application_setting(vscode_extension_marketplace_enabled: true) user.update!(extensions_marketplace_opt_in_status: "enabled") end diff --git a/ee/spec/models/ee/group_spec.rb b/ee/spec/models/ee/group_spec.rb index 58996fa8a2999459816c3776254a2a1fe9f69fcd..bd802c62d46bdf2be4732e94e1033e9fce0ce1db 100644 --- a/ee/spec/models/ee/group_spec.rb +++ b/ee/spec/models/ee/group_spec.rb @@ -4208,7 +4208,7 @@ def webhook_headers subject(:can_manage_extensions_marketplace_for_enterprise_users?) { group.can_manage_extensions_marketplace_for_enterprise_users? } - where(:group, :licensed_feature_available, :feature_flags_enabled, :expected) do + where(:group, :licensed_feature_available, :settings_enabled, :expected) do ref(:root_group) | true | true | true ref(:child_group) | true | true | false ref(:root_group) | false | true | false @@ -4217,7 +4217,7 @@ def webhook_headers with_them do before do - allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_for_any_user?).and_return(feature_flags_enabled) + allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?).and_return(settings_enabled) stub_licensed_features(disable_extensions_marketplace_for_enterprise_users: licensed_feature_available) end @@ -4284,7 +4284,7 @@ def webhook_headers with_them do before do group.update!(enterprise_users_extensions_marketplace_enabled: value) - allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_for_any_user?).and_return(true) + allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?).and_return(true) stub_licensed_features(disable_extensions_marketplace_for_enterprise_users: licensed_feature_available) end diff --git a/ee/spec/requests/api/graphql/mutations/remote_development/workspace_operations/create_spec.rb b/ee/spec/requests/api/graphql/mutations/remote_development/workspace_operations/create_spec.rb index c37438c027eddec840d435cea6a48185e46712c7..11a65ef74f5e714178770ecb858a2dc1be60039b 100644 --- a/ee/spec/requests/api/graphql/mutations/remote_development/workspace_operations/create_spec.rb +++ b/ee/spec/requests/api/graphql/mutations/remote_development/workspace_operations/create_spec.rb @@ -117,8 +117,7 @@ def mutation_response allow(WebIde::Settings) .to receive(:get).with( [:vscode_extension_marketplace_metadata, :vscode_extension_marketplace], - user: current_user, - vscode_extension_marketplace_feature_flag_enabled: true + user: current_user ).and_return( { vscode_extension_marketplace_metadata: { enabled: true }, diff --git a/ee/spec/requests/groups_controller_spec.rb b/ee/spec/requests/groups_controller_spec.rb index 695db7ea48ec68d08844d66b4b217740e6db7952..b004ea23446372f106f4a4e4afcc68d87f9bf567 100644 --- a/ee/spec/requests/groups_controller_spec.rb +++ b/ee/spec/requests/groups_controller_spec.rb @@ -484,8 +484,7 @@ let(:params) { { group: { enterprise_users_extensions_marketplace_enabled: true } } } before do - stub_feature_flags(web_ide_extensions_marketplace: true) - stub_application_setting(vscode_extension_marketplace: { enabled: true, preset: 'open_vsx' }) + stub_application_setting(vscode_extension_marketplace_enabled: true) end it 'does not change the column' do diff --git a/lib/web_ide/extension_marketplace.rb b/lib/web_ide/extension_marketplace.rb index 5791bede7b2998fa72c6bb62bd887a42eb6fd50f..c6c0fd7ee215760f712934906c439837a1ca22a6 100644 --- a/lib/web_ide/extension_marketplace.rb +++ b/lib/web_ide/extension_marketplace.rb @@ -2,32 +2,11 @@ module WebIde module ExtensionMarketplace - # Returns true if the extensions marketplace feature is enabled for any users - # - # @return [Boolean] - def self.feature_enabled_for_any_user? - # note: Intentionally pass `nil` here since we don't have a user in scope - feature_enabled_from_application_settings?(user: nil) && - feature_flag_enabled_for_any_actor?(:web_ide_extensions_marketplace) - end - - # Returns true if the extensions marketplace feature is enabled for the given user - # - # @param user [User] - # @return [Boolean] - def self.feature_enabled?(user:) - feature_enabled_from_application_settings?(user: user) && - feature_enabled_from_flags?(user: user) - end - # Returns true if the ExtensionMarketplace feature is enabled from application settings # - # @param user [User, nil] Current user for feature enablement context # @return [Boolean] - def self.feature_enabled_from_application_settings?(user:) - return true unless should_use_application_settings?(user: user) - - Gitlab::CurrentSettings.vscode_extension_marketplace&.fetch('enabled', false) + def self.feature_enabled_from_application_settings? + Gitlab::CurrentSettings.vscode_extension_marketplace_enabled? end # This value is used when the end-user is accepting the third-party extension marketplace integration. @@ -54,48 +33,7 @@ def self.help_preferences_url # @param [User] user The current user # @return [Hash] def self.webide_extension_marketplace_settings(user:) - Settings.get_single_setting( - :vscode_extension_marketplace_view_model, - user: user, - vscode_extension_marketplace_feature_flag_enabled: feature_enabled_from_flags?(user: user) - ) - end - - # Returns true if the given flag is enabled for any actor - # - # @param [Symbol] flag - # @return [Boolean] - def self.feature_flag_enabled_for_any_actor?(flag) - # Short circuit if we're globally enabled - return true if Feature.enabled?(flag, nil) - - # The feature could be conditionally applied, so check if `!off?` - # We also can't *just* check `!off?` because the ActiveRecord might not exist and be default enabled - feature = Feature.get(flag) # rubocop:disable Gitlab/AvoidFeatureGet -- See above - feature && !feature.off? - end - - # Returns true if we should use `feature_enabled_from_application_settings?` to determine feature availability - # - # @param user [User, nil] Current user for feature enablement context - # @return [Boolean] - def self.should_use_application_settings?(user:) - if user - Feature.enabled?(:vscode_extension_marketplace_settings, user) - else - feature_flag_enabled_for_any_actor?(:vscode_extension_marketplace_settings) - end - end - - # This returns true if the extensions marketplace flags are enabled - # - # @param user [User] - # @return [Boolean] - def self.feature_enabled_from_flags?(user:) - Feature.enabled?(:web_ide_extensions_marketplace, user) + Settings.get_single_setting(:vscode_extension_marketplace_view_model, user: user) end - - private_class_method :feature_flag_enabled_for_any_actor?, :should_use_application_settings?, - :feature_enabled_from_flags? end end diff --git a/lib/web_ide/settings/extension_marketplace_generator.rb b/lib/web_ide/settings/extension_marketplace_generator.rb index 47de4e9a054688c3a08c214082b05fca2d80d6fc..3bbbe455b5633fda730ee22a34b48c78f4f69638 100644 --- a/lib/web_ide/settings/extension_marketplace_generator.rb +++ b/lib/web_ide/settings/extension_marketplace_generator.rb @@ -8,19 +8,13 @@ class ExtensionMarketplaceGenerator def self.generate(context) return context unless context.fetch(:requested_setting_names).include?(:vscode_extension_marketplace) - user = context.dig(:options, :user) - - context[:settings][:vscode_extension_marketplace] = extension_marketplace_from_application_settings(user) + context[:settings][:vscode_extension_marketplace] = extension_marketplace_from_application_settings context end # @param [User, nil] user # @return [Hash] - def self.extension_marketplace_from_application_settings(user) - unless Feature.enabled?(:vscode_extension_marketplace_settings, user) - return ::WebIde::ExtensionMarketplacePreset.open_vsx.values - end - + def self.extension_marketplace_from_application_settings settings = Gitlab::CurrentSettings.vscode_extension_marketplace preset_key = settings.fetch("preset", ::WebIde::ExtensionMarketplacePreset.open_vsx.key) diff --git a/lib/web_ide/settings/extension_marketplace_metadata_generator.rb b/lib/web_ide/settings/extension_marketplace_metadata_generator.rb index fc53e9e1d06dab5bfa02861e17a46bba63309bb9..d7c88186a1621ec707d70e44adb6bf474db0e1c0 100644 --- a/lib/web_ide/settings/extension_marketplace_metadata_generator.rb +++ b/lib/web_ide/settings/extension_marketplace_metadata_generator.rb @@ -29,16 +29,13 @@ def self.generate(context) vscode_extension_marketplace_home_url: String => marketplace_home_url, } } - options_with_defaults = { user: nil, vscode_extension_marketplace_feature_flag_enabled: nil }.merge(options) + options_with_defaults = { user: nil }.merge(options) options_with_defaults => { - user: ::User | NilClass => user, - vscode_extension_marketplace_feature_flag_enabled: TrueClass | FalseClass | NilClass => - extension_marketplace_feature_flag_enabled + user: ::User | NilClass => user } extension_marketplace_metadata = build_metadata( user: user, - flag_enabled: extension_marketplace_feature_flag_enabled, marketplace_home_url: marketplace_home_url ) @@ -49,12 +46,10 @@ def self.generate(context) # @param [User, nil] user # @param [Boolean, nil] flag_enabled # @return [Hash] - def self.build_metadata(user:, flag_enabled:, marketplace_home_url:) + def self.build_metadata(user:, marketplace_home_url:) return metadata_disabled(:no_user) unless user - return metadata_disabled(:no_flag) if flag_enabled.nil? - return metadata_disabled(:instance_disabled) unless flag_enabled - unless ::WebIde::ExtensionMarketplace.feature_enabled_from_application_settings?(user: user) + unless ::WebIde::ExtensionMarketplace.feature_enabled_from_application_settings? return metadata_disabled(:instance_disabled) end diff --git a/spec/features/ide_spec.rb b/spec/features/ide_spec.rb index 46d1ee96e126edc1c604fd6c17581b94c6abc07e..8e6dfb63b0e586dd31fa7d28eca58a2c543aa929 100644 --- a/spec/features/ide_spec.rb +++ b/spec/features/ide_spec.rb @@ -11,11 +11,6 @@ let(:user) { create(:user, organizations: [current_organization]) } before do - # TODO - We need to be able to handle requests to https://*.cdn.web-ide.gitlab-static.net - # in order to support `web_ide_extensions_marketplace` in our feature specs. - # https://gitlab.com/gitlab-org/gitlab/-/issues/478626 - stub_feature_flags(web_ide_extensions_marketplace: false) - project.add_maintainer(user) sign_in(user) end diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb index 5833a674e8194bc7b53e82ef9d789157a252877e..8849601ef17ffafc12db73539a1a681134e423d8 100644 --- a/spec/helpers/application_settings_helper_spec.rb +++ b/spec/helpers/application_settings_helper_spec.rb @@ -480,33 +480,21 @@ let(:vscode_extension_marketplace) { { "enabled" => false } } before do - stub_feature_flags(vscode_extension_marketplace_settings: feature_flag) - application_setting.vscode_extension_marketplace = vscode_extension_marketplace helper.instance_variable_set(:@application_setting, application_setting) end - context 'with flag on' do - it 'returns hash of view properties' do - expect(helper.vscode_extension_marketplace_settings_view).to match({ - title: _('VS Code Extension Marketplace'), - description: _('Enable VS Code Extension Marketplace and configure the extensions registry for Web IDE.'), - view_model: { - initialSettings: vscode_extension_marketplace, - presets: [ - hash_including("key" => "open_vsx") - ] - } - }) - end - end - - context 'with flag off' do - let(:feature_flag) { false } - - it 'returns nil' do - expect(helper.vscode_extension_marketplace_settings_view).to be_nil - end + it 'returns hash of view properties' do + expect(helper.vscode_extension_marketplace_settings_view).to match({ + title: _('VS Code Extension Marketplace'), + description: _('Enable VS Code Extension Marketplace and configure the extensions registry for Web IDE.'), + view_model: { + initialSettings: vscode_extension_marketplace, + presets: [ + hash_including("key" => "open_vsx") + ] + } + }) end end end diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index acc24554db9c47bfb7526b2d890b997a5aea21cb..613afcef5eddab4de4d3e0731f683408f5bd5a87 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -269,11 +269,6 @@ def stub_user(messages = {}) context 'when Web IDE Extension Marketplace feature is enabled' do before do allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?) - .with(user: user) - .and_return(true) - - allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled?) - .with(user: user) .and_return(true) end diff --git a/spec/lib/web_ide/extension_marketplace_spec.rb b/spec/lib/web_ide/extension_marketplace_spec.rb index 19f69a3926b1b18c678c905a3f62008f65ff3fd4..e7ca71cad80dd8f96eb1a5077f80a03ebde481a4 100644 --- a/spec/lib/web_ide/extension_marketplace_spec.rb +++ b/spec/lib/web_ide/extension_marketplace_spec.rb @@ -24,54 +24,20 @@ let_it_be_with_reload(:current_user) { create(:user) } - describe 'feature enabled methods' do - where(:web_ide_extensions_marketplace, :vscode_extension_marketplace_settings, :app_setting, - :expectation) do - ref(:current_user) | false | {} | true - ref(:current_user) | true | {} | false - ref(:current_user) | true | { enabled: true } | true - false | false | { enabled: true } | false - end - - with_them do - before do - stub_feature_flags( - web_ide_extensions_marketplace: web_ide_extensions_marketplace, - vscode_extension_marketplace_settings: vscode_extension_marketplace_settings - ) - - stub_application_setting(vscode_extension_marketplace: app_setting) - end - - describe '#feature_enabled?' do - it { expect(described_class.feature_enabled?(user: current_user)).to be(expectation) } - end - - describe '#feature_enabled_for_any_user?' do - it { expect(described_class.feature_enabled_for_any_user?).to be(expectation) } - end - end - end - describe '#feature_enabled_from_application_settings?' do - where(:vscode_extension_marketplace_settings, :app_setting, :user_arg, :expectation) do - false | {} | ref(:current_user) | true - false | { enabled: true } | ref(:current_user) | true - false | { enabled: true } | nil | true - ref(:current_user) | { enabled: true } | nil | true - ref(:current_user) | { enabled: true } | ref(:current_user) | true - ref(:current_user) | {} | ref(:current_user) | false - ref(:current_user) | { enabled: false } | ref(:current_user) | false + where(:app_setting, :expectation) do + { enabled: true } | true + { enabled: false } | false + {} | false end subject(:enabled) do - described_class.feature_enabled_from_application_settings?(user: user_arg) + described_class.feature_enabled_from_application_settings? end with_them do before do - stub_feature_flags(vscode_extension_marketplace_settings: vscode_extension_marketplace_settings) - stub_application_setting(vscode_extension_marketplace: app_setting) + Gitlab::CurrentSettings.update!(vscode_extension_marketplace: app_setting) end it { is_expected.to be(expectation) } @@ -79,11 +45,10 @@ end describe '#marketplace_home_url' do - where(:vscode_extension_marketplace_settings, :app_setting, :expectation) do - false | {} | "https://open-vsx.org" - true | {} | "https://open-vsx.org" - true | ref(:custom_app_setting) | "https://example.com:8444" - true | ref(:open_vsx_app_setting) | "https://open-vsx.org" + where(:app_setting, :expectation) do + {} | "https://open-vsx.org" + ref(:open_vsx_app_setting) | "https://open-vsx.org" + ref(:custom_app_setting) | "https://example.com:8444" end subject(:marketplace_home_url) do @@ -92,8 +57,7 @@ with_them do before do - stub_feature_flags(vscode_extension_marketplace_settings: vscode_extension_marketplace_settings) - stub_application_setting(vscode_extension_marketplace: app_setting) + Gitlab::CurrentSettings.update!(vscode_extension_marketplace: app_setting) end it { is_expected.to eq(expectation) } @@ -107,30 +71,21 @@ end describe '#webide_extension_marketplace_settings' do - # rubocop:disable Layout/LineLength -- last parameter extens past line but is preferable to rubocop's suggestion - where(:web_ide_extensions_marketplace, :vscode_extension_marketplace_settings, :app_setting, :opt_in_status, :opt_in_url, :expectation) do - # web_ide_extensions_marketplace | vscode_extension_marketplace_settings | app_setting | opt_in_status | opt_in_url | expectation - true | false | {} | :enabled | nil | lazy { { enabled: true, vscode_settings: ::WebIde::ExtensionMarketplacePreset.open_vsx.values } } - true | false | {} | :unset | nil | lazy { { enabled: false, reason: :opt_in_unset, help_url: /#{help_url}/, user_preferences_url: /#{user_preferences_url}/ } } - true | false | {} | :disabled | nil | lazy { { enabled: false, reason: :opt_in_disabled, help_url: /#{help_url}/, user_preferences_url: /#{user_preferences_url}/ } } - false | false | {} | :enabled | nil | lazy { { enabled: false, reason: :instance_disabled, help_url: /#{help_url}/ } } - true | true | {} | :enabled | nil | lazy { { enabled: false, reason: :instance_disabled, help_url: /#{help_url}/ } } - true | true | { enabled: false } | :enabled | nil | lazy { { enabled: false, reason: :instance_disabled, help_url: /#{help_url}/ } } - true | true | ref(:custom_app_setting) | :enabled | nil | lazy { { enabled: false, reason: :opt_in_unset, help_url: /#{help_url}/, user_preferences_url: /#{user_preferences_url}/ } } - true | true | ref(:custom_app_setting) | :enabled | ref(:custom_home_url) | lazy { { enabled: true, vscode_settings: custom_app_setting[:custom_values] } } - true | true | ref(:open_vsx_app_setting) | :enabled | nil | lazy { { enabled: true, vscode_settings: ::WebIde::ExtensionMarketplacePreset.open_vsx.values } } + # rubocop:disable Layout/LineLength -- last parameter extends past line but is preferable to rubocop's suggestion + where(:app_setting, :opt_in_status, :opt_in_url, :expectation) do + # app_setting | opt_in_status | opt_in_url | expectation + {} | :enabled | nil | lazy { { enabled: false, reason: :instance_disabled, help_url: /#{help_url}/ } } + { enabled: false } | :enabled | nil | lazy { { enabled: false, reason: :instance_disabled, help_url: /#{help_url}/ } } + ref(:custom_app_setting) | :enabled | nil | lazy { { enabled: false, reason: :opt_in_unset, help_url: /#{help_url}/, user_preferences_url: /#{user_preferences_url}/ } } + ref(:custom_app_setting) | :enabled | ref(:custom_home_url) | lazy { { enabled: true, vscode_settings: custom_app_setting[:custom_values] } } + ref(:open_vsx_app_setting) | :enabled | nil | lazy { { enabled: true, vscode_settings: ::WebIde::ExtensionMarketplacePreset.open_vsx.values } } end # rubocop:enable Layout/LineLength subject(:webide_settings) { described_class.webide_extension_marketplace_settings(user: current_user) } before do - stub_feature_flags( - vscode_extension_marketplace_settings: vscode_extension_marketplace_settings, - web_ide_extensions_marketplace: web_ide_extensions_marketplace - ) - - stub_application_setting(vscode_extension_marketplace: app_setting) + Gitlab::CurrentSettings.update!(vscode_extension_marketplace: app_setting) current_user.update!( extensions_marketplace_opt_in_status: opt_in_status, diff --git a/spec/lib/web_ide/settings/extension_marketplace_generator_spec.rb b/spec/lib/web_ide/settings/extension_marketplace_generator_spec.rb index 891400204966fe71a0a08a39292ef4bf8a8ec870..faaf72504a0ed6439d3cd00b6c1ccf8e35d0e72b 100644 --- a/spec/lib/web_ide/settings/extension_marketplace_generator_spec.rb +++ b/spec/lib/web_ide/settings/extension_marketplace_generator_spec.rb @@ -41,18 +41,16 @@ def flipper_id subject(:result) { described_class.generate(context)[:settings][:vscode_extension_marketplace] } before do - allow(Feature).to receive(:enabled?).with(:vscode_extension_marketplace_settings, user).and_return(settings_flag) - allow(Gitlab::CurrentSettings).to receive(:vscode_extension_marketplace).and_return(app_setting) + allow(Gitlab::CurrentSettings).to receive(:method_missing).and_return(app_setting) end describe 'default (with setting requested)' do - where(:settings_flag, :app_setting, :expectation) do - false | {} | ::WebIde::ExtensionMarketplacePreset.open_vsx.values - true | {} | ::WebIde::ExtensionMarketplacePreset.open_vsx.values - true | { "preset" => 'open_vsx' } | ::WebIde::ExtensionMarketplacePreset.open_vsx.values - true | ref(:custom_app_settings) | { item_url: "abc", service_url: "def", resource_url_template: "ghi" } + where(:app_setting, :expectation) do + {} | ::WebIde::ExtensionMarketplacePreset.open_vsx.values + { "preset" => 'open_vsx' } | ::WebIde::ExtensionMarketplacePreset.open_vsx.values + ref(:custom_app_settings) | { item_url: "abc", service_url: "def", resource_url_template: "ghi" } # This should never happen, but lets test it anyways - true | { "preset" => 'DNE' } | nil + { "preset" => 'DNE' } | nil end with_them do diff --git a/spec/lib/web_ide/settings/extension_marketplace_metadata_generator_spec.rb b/spec/lib/web_ide/settings/extension_marketplace_metadata_generator_spec.rb index aae02ae3f6f12a9366df4a14419895a05bda5df7..0c9ce44876032dfc57663a87400b26fc0364d133 100644 --- a/spec/lib/web_ide/settings/extension_marketplace_metadata_generator_spec.rb +++ b/spec/lib/web_ide/settings/extension_marketplace_metadata_generator_spec.rb @@ -46,26 +46,17 @@ where( :user_exists, :opt_in_status, - :flag_exists, - :flag_enabled, :app_settings_enabled, :expected_vscode_extension_marketplace_metadata ) do # @formatter:off - Turn off RubyMine autoformatting - - # rubocop:disable Layout/LineLength -- Parameterized rows overflow and its better than the alternative - # user exists | opt_in_status | flag exists | flag_enabled | app_settings_enabled | expected_settings - false | :undefined | false | :undefined | true | { enabled: false, disabled_reason: :no_user } - false | :undefined | true | true | true | { enabled: false, disabled_reason: :no_user } - true | :unset | false | :undefined | true | { enabled: false, disabled_reason: :no_flag } - true | :unset | true | false | true | { enabled: false, disabled_reason: :instance_disabled } - true | :unset | true | true | true | { enabled: false, disabled_reason: :opt_in_unset } - true | :disabled | true | true | true | { enabled: false, disabled_reason: :opt_in_disabled } - true | :enabled | true | true | false | { enabled: false, disabled_reason: :instance_disabled } - true | :enabled | true | true | true | { enabled: true } - true | :invalid | true | true | true | RuntimeError - # rubocop:enable Layout/LineLength - + # user exists | opt_in_status | app_settings_enabled | expected_settings + false | :undefined | true | { enabled: false, disabled_reason: :no_user } + true | :unset | true | { enabled: false, disabled_reason: :opt_in_unset } + true | :disabled | true | { enabled: false, disabled_reason: :opt_in_disabled } + true | :enabled | false | { enabled: false, disabled_reason: :instance_disabled } + true | :enabled | true | { enabled: true } + true | :invalid | true | RuntimeError # @formatter:on end @@ -87,7 +78,6 @@ def flipper_id let(:options) do options = {} options[:user] = user if user_exists - options[:vscode_extension_marketplace_feature_flag_enabled] = flag_enabled if flag_exists options end @@ -100,7 +90,6 @@ def flipper_id allow(user).to receive(:enterprise_user?).and_return(false) allow(enums).to receive(:statuses).and_return({ unset: :unset, enabled: :enabled, disabled: :disabled }) allow(::WebIde::ExtensionMarketplace).to receive(:feature_enabled_from_application_settings?) - .with(user: user) .and_return(app_settings_enabled) end diff --git a/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb b/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb index 85be19c0027ca8fc6f3db235cdf7d5385bf2ba1f..f8f6f61d7e36185a61fad278539450458a586da9 100644 --- a/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb +++ b/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb @@ -26,7 +26,7 @@ let(:mutation_response) { graphql_mutation_response(:userPreferencesUpdate) } before do - stub_application_setting(vscode_extension_marketplace: { + Gitlab::CurrentSettings.update!(vscode_extension_marketplace: { enabled: false, preset: 'custom', custom_values: { diff --git a/spec/views/admin/application_settings/_extension_marketplace.html.haml_spec.rb b/spec/views/admin/application_settings/_extension_marketplace.html.haml_spec.rb index c4379ad581d246866fe6a3728bdf1b8a92f1f1c7..1bf46b5be2065a44498acdde5409ed9361015734 100644 --- a/spec/views/admin/application_settings/_extension_marketplace.html.haml_spec.rb +++ b/spec/views/admin/application_settings/_extension_marketplace.html.haml_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'admin/application_settings/_extension_marketplace', feature_category: :web_ide do - let(:feature_available) { true } - subject(:page) do # We use `view.render`, because just `render` throws a "no implicit conversion of nil into String" exception # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53093#note_499060593 @@ -14,50 +12,36 @@ rendered && Nokogiri::HTML.parse(rendered) end - before do - stub_feature_flags(vscode_extension_marketplace_settings: feature_available) - end - - context 'when feature available' do - it 'renders settings' do - settings = page.at('#js-extension-marketplace-settings') + it 'renders settings' do + settings = page.at('#js-extension-marketplace-settings') - expect(settings).not_to be_nil - expect(settings).to have_text(_('VS Code Extension Marketplace')) - expect(settings).to have_text( - _('Enable VS Code Extension Marketplace and configure the extensions registry for Web IDE.') - ) - end + expect(settings).not_to be_nil + expect(settings).to have_text(_('VS Code Extension Marketplace')) + expect(settings).to have_text( + _('Enable VS Code Extension Marketplace and configure the extensions registry for Web IDE.') + ) + end - it 'renders data-view-model for vue app' do - vue_app = page.at('#js-extension-marketplace-settings-app') - expected_presets = ::WebIde::ExtensionMarketplacePreset.all.map do |x| - { - key: x.key, - name: x.name, - values: { - serviceUrl: x.values[:service_url], - itemUrl: x.values[:item_url], - resourceUrlTemplate: x.values[:resource_url_template] - } + it 'renders data-view-model for vue app' do + vue_app = page.at('#js-extension-marketplace-settings-app') + expected_presets = ::WebIde::ExtensionMarketplacePreset.all.map do |x| + { + key: x.key, + name: x.name, + values: { + serviceUrl: x.values[:service_url], + itemUrl: x.values[:item_url], + resourceUrlTemplate: x.values[:resource_url_template] } - end - - expected_json = { - presets: expected_presets, - initialSettings: { enabled: false } - }.to_json - - expect(vue_app).not_to be_nil - expect(vue_app['data-view-model']).to eq(expected_json) + } end - end - context 'when feature not available' do - let(:feature_available) { false } + expected_json = { + presets: expected_presets, + initialSettings: { enabled: false } + }.to_json - it 'renders nothing' do - expect(page).to be_nil - end + expect(vue_app).not_to be_nil + expect(vue_app['data-view-model']).to eq(expected_json) end end