diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/additional_metadata.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/additional_metadata.vue index 059f038b6e72946e70afe35200350043bfd60184..3595f83baf03123b4adb13bf2d243174c8a6e11f 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/additional_metadata.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/additional_metadata.vue @@ -6,6 +6,7 @@ import { PACKAGE_TYPE_CONAN, PACKAGE_TYPE_MAVEN, PACKAGE_TYPE_COMPOSER, + PACKAGE_TYPE_PYPI, } from '~/packages_and_registries/package_registry/constants'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import DetailsRow from '~/vue_shared/components/registry/details_row.vue'; @@ -22,6 +23,7 @@ export default { composerJson: s__( 'PackageRegistry|Composer.json with license: %{license} and version: %{version}', ), + requiredPython: s__('PackageRegistry|Required Python: %{pythonVersion}'), }, components: { DetailsRow, @@ -43,6 +45,7 @@ export default { PACKAGE_TYPE_CONAN, PACKAGE_TYPE_MAVEN, PACKAGE_TYPE_COMPOSER, + PACKAGE_TYPE_PYPI, ].includes(this.packageEntity.packageType) && this.packageEntity.metadata ); }, @@ -58,6 +61,9 @@ export default { showComposerMetadata() { return this.packageEntity.packageType === PACKAGE_TYPE_COMPOSER; }, + showPypiMetadata() { + return this.packageEntity.packageType === PACKAGE_TYPE_PYPI; + }, }, }; </script> @@ -141,6 +147,19 @@ export default { </gl-sprintf> </details-row> </template> + + <details-row + v-else-if="showPypiMetadata" + icon="information-o" + padding="gl-p-4" + data-testid="pypi-required-python" + > + <gl-sprintf :message="$options.i18n.requiredPython"> + <template #pythonVersion> + <strong>{{ packageEntity.metadata.requiredPython }}</strong> + </template> + </gl-sprintf> + </details-row> </div> </div> </template> diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 21e8d2fc0b9aee7a0ceebab10f89a575b1f6d6b7..5dbc880fff5a7e4c8338209d867f669a8081debd 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -24043,6 +24043,9 @@ msgstr "" msgid "PackageRegistry|Remove package" msgstr "" +msgid "PackageRegistry|Required Python: %{pythonVersion}" +msgstr "" + msgid "PackageRegistry|RubyGems" msgstr "" diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/additional_metadata_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/additional_metadata_spec.js index e5147b0b6b1e7d41a0f7538ae031016cc4a950a4..dda0b5bef8def7d5f1d1f93055e639abffdefeaf 100644 --- a/spec/frontend/packages_and_registries/package_registry/components/details/additional_metadata_spec.js +++ b/spec/frontend/packages_and_registries/package_registry/components/details/additional_metadata_spec.js @@ -6,6 +6,7 @@ import { nugetMetadata, packageData, composerMetadata, + pypiMetadata, } from 'jest/packages_and_registries/package_registry/mock_data'; import component from '~/packages_and_registries/package_registry/components/details/additional_metadata.vue'; import { @@ -14,6 +15,7 @@ import { PACKAGE_TYPE_MAVEN, PACKAGE_TYPE_NPM, PACKAGE_TYPE_COMPOSER, + PACKAGE_TYPE_PYPI, } from '~/packages_and_registries/package_registry/constants'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import DetailsRow from '~/vue_shared/components/registry/details_row.vue'; @@ -22,6 +24,7 @@ const mavenPackage = { packageType: PACKAGE_TYPE_MAVEN, metadata: mavenMetadata( const conanPackage = { packageType: PACKAGE_TYPE_CONAN, metadata: conanMetadata() }; const nugetPackage = { packageType: PACKAGE_TYPE_NUGET, metadata: nugetMetadata() }; const composerPackage = { packageType: PACKAGE_TYPE_COMPOSER, metadata: composerMetadata() }; +const pypiPackage = { packageType: PACKAGE_TYPE_PYPI, metadata: pypiMetadata() }; const npmPackage = { packageType: PACKAGE_TYPE_NPM, metadata: {} }; describe('Package Additional Metadata', () => { @@ -58,6 +61,7 @@ describe('Package Additional Metadata', () => { const findComposerTargetSha = () => wrapper.findByTestId('composer-target-sha'); const findComposerTargetShaCopyButton = () => wrapper.findComponent(ClipboardButton); const findComposerJson = () => wrapper.findByTestId('composer-json'); + const findPypiRequiredPython = () => wrapper.findByTestId('pypi-required-python'); it('has the correct title', () => { mountComponent(); @@ -74,6 +78,7 @@ describe('Package Additional Metadata', () => { ${conanPackage} | ${true} | ${PACKAGE_TYPE_CONAN} ${nugetPackage} | ${true} | ${PACKAGE_TYPE_NUGET} ${composerPackage} | ${true} | ${PACKAGE_TYPE_COMPOSER} + ${pypiPackage} | ${true} | ${PACKAGE_TYPE_PYPI} ${npmPackage} | ${false} | ${PACKAGE_TYPE_NPM} `( `It is $visible that the component is visible when the package is $packageType`, @@ -160,4 +165,20 @@ describe('Package Additional Metadata', () => { }); }); }); + + describe('pypi metadata', () => { + beforeEach(() => { + mountComponent({ packageEntity: pypiPackage }); + }); + + it.each` + name | finderFunction | text | icon + ${'pypi-required-python'} | ${findPypiRequiredPython} | ${'Required Python: 1.0.0'} | ${'information-o'} + `('$name element', ({ finderFunction, text, icon }) => { + const element = finderFunction(); + expect(element.exists()).toBe(true); + expect(element.text()).toBe(text); + expect(element.props('icon')).toBe(icon); + }); + }); }); diff --git a/spec/frontend/packages_and_registries/package_registry/mock_data.js b/spec/frontend/packages_and_registries/package_registry/mock_data.js index 98ff29ef728115f5903079cccf38485035143eb0..9438a2d2d72a74e6dd83caf1755605bff91a47f8 100644 --- a/spec/frontend/packages_and_registries/package_registry/mock_data.js +++ b/spec/frontend/packages_and_registries/package_registry/mock_data.js @@ -133,7 +133,7 @@ export const composerMetadata = () => ({ }, }); -export const pypyMetadata = () => ({ +export const pypiMetadata = () => ({ requiredPython: '1.0.0', }); @@ -157,7 +157,7 @@ export const packageDetailsQuery = (extendPackage) => ({ metadata: { ...conanMetadata(), ...composerMetadata(), - ...pypyMetadata(), + ...pypiMetadata(), ...mavenMetadata(), ...nugetMetadata(), },