diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-06 09:08:48 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-06 09:08:48 +0300 |
commit | c77b780ee080b978bd5a63f642f741e8892383dc (patch) | |
tree | 7c50ab6450a61d27485f9557b666af46ec5adfdd /app/services/packages | |
parent | 5e448ff06309854c838fb5eaa46fd05ebc5218ab (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/packages')
22 files changed, 150 insertions, 199 deletions
diff --git a/app/services/packages/cleanup/execute_policy_service.rb b/app/services/packages/cleanup/execute_policy_service.rb index b432f6d0acb..891866bce5f 100644 --- a/app/services/packages/cleanup/execute_policy_service.rb +++ b/app/services/packages/cleanup/execute_policy_service.rb @@ -79,10 +79,9 @@ module Packages end def batch_deadline - strong_memoize(:batch_deadline) do - MAX_EXECUTION_TIME.from_now - end + MAX_EXECUTION_TIME.from_now end + strong_memoize_attr :batch_deadline def response_success(timeout:) ServiceResponse.success( diff --git a/app/services/packages/cleanup/update_policy_service.rb b/app/services/packages/cleanup/update_policy_service.rb index 6744accc007..911a060a18f 100644 --- a/app/services/packages/cleanup/update_policy_service.rb +++ b/app/services/packages/cleanup/update_policy_service.rb @@ -18,10 +18,9 @@ module Packages private def policy - strong_memoize(:policy) do - project.packages_cleanup_policy - end + project.packages_cleanup_policy end + strong_memoize_attr :policy def allowed? can?(current_user, :admin_package, project) diff --git a/app/services/packages/composer/create_package_service.rb b/app/services/packages/composer/create_package_service.rb index 0f5429f667e..ae5933fad7c 100644 --- a/app/services/packages/composer/create_package_service.rb +++ b/app/services/packages/composer/create_package_service.rb @@ -27,10 +27,9 @@ module Packages end def composer_json - strong_memoize(:composer_json) do - ::Packages::Composer::ComposerJsonService.new(project, target).execute - end + ::Packages::Composer::ComposerJsonService.new(project, target).execute end + strong_memoize_attr :composer_json def package_name composer_json['name'] diff --git a/app/services/packages/debian/extract_changes_metadata_service.rb b/app/services/packages/debian/extract_changes_metadata_service.rb index fdca8c88fdc..5f06f46de58 100644 --- a/app/services/packages/debian/extract_changes_metadata_service.rb +++ b/app/services/packages/debian/extract_changes_metadata_service.rb @@ -26,10 +26,9 @@ module Packages private def metadata - strong_memoize(:metadata) do - ::Packages::Debian::ExtractMetadataService.new(@package_file).execute - end + ::Packages::Debian::ExtractMetadataService.new(@package_file).execute end + strong_memoize_attr :metadata def file_type metadata[:file_type] @@ -40,20 +39,19 @@ module Packages end def files - strong_memoize(:files) do - raise ExtractionError, "is not a changes file" unless file_type == :changes - raise ExtractionError, "Files field is missing" if fields['Files'].blank? - raise ExtractionError, "Checksums-Sha1 field is missing" if fields['Checksums-Sha1'].blank? - raise ExtractionError, "Checksums-Sha256 field is missing" if fields['Checksums-Sha256'].blank? - - init_entries_from_files - entries_from_checksums_sha1 - entries_from_checksums_sha256 - entries_from_package_files - - @entries - end + raise ExtractionError, "is not a changes file" unless file_type == :changes + raise ExtractionError, "Files field is missing" if fields['Files'].blank? + raise ExtractionError, "Checksums-Sha1 field is missing" if fields['Checksums-Sha1'].blank? + raise ExtractionError, "Checksums-Sha256 field is missing" if fields['Checksums-Sha256'].blank? + + init_entries_from_files + entries_from_checksums_sha1 + entries_from_checksums_sha256 + entries_from_package_files + + @entries end + strong_memoize_attr :files def init_entries_from_files each_lines_for('Files') do |line| diff --git a/app/services/packages/debian/generate_distribution_key_service.rb b/app/services/packages/debian/generate_distribution_key_service.rb index 917965da58e..37e25c2db47 100644 --- a/app/services/packages/debian/generate_distribution_key_service.rb +++ b/app/services/packages/debian/generate_distribution_key_service.rb @@ -43,10 +43,9 @@ module Packages attr_reader :params def passphrase - strong_memoize(:passphrase) do - params[:passphrase] || ::User.random_password - end + params[:passphrase] || ::User.random_password end + strong_memoize_attr :passphrase def pinentry_script_content escaped_passphrase = Shellwords.escape(passphrase) diff --git a/app/services/packages/debian/generate_distribution_service.rb b/app/services/packages/debian/generate_distribution_service.rb index d69f6eb1511..9feb860ae87 100644 --- a/app/services/packages/debian/generate_distribution_service.rb +++ b/app/services/packages/debian/generate_distribution_service.rb @@ -213,10 +213,9 @@ module Packages end def release_content - strong_memoize(:release_content) do - release_header + release_sums - end + release_header + release_sums end + strong_memoize_attr :release_content def release_header [ @@ -235,10 +234,9 @@ module Packages end def release_date - strong_memoize(:release_date) do - Time.now.utc - end + Time.now.utc end + strong_memoize_attr :release_date def release_sums # NB: MD5Sum was removed for FIPS compliance diff --git a/app/services/packages/debian/process_changes_service.rb b/app/services/packages/debian/process_changes_service.rb index 129f2e5c9bc..abd631dbc70 100644 --- a/app/services/packages/debian/process_changes_service.rb +++ b/app/services/packages/debian/process_changes_service.rb @@ -76,10 +76,9 @@ module Packages end def metadata - strong_memoize(:metadata) do - ::Packages::Debian::ExtractChangesMetadataService.new(package_file).execute - end + ::Packages::Debian::ExtractChangesMetadataService.new(package_file).execute end + strong_memoize_attr :metadata def files metadata[:files] @@ -90,16 +89,15 @@ module Packages end def package - strong_memoize(:package) do - params = { - 'name': metadata[:fields]['Source'], - 'version': metadata[:fields]['Version'], - 'distribution_name': metadata[:fields]['Distribution'] - } - response = Packages::Debian::FindOrCreatePackageService.new(project, creator, params).execute - response.payload[:package] - end + params = { + 'name': metadata[:fields]['Source'], + 'version': metadata[:fields]['Version'], + 'distribution_name': metadata[:fields]['Distribution'] + } + response = Packages::Debian::FindOrCreatePackageService.new(project, creator, params).execute + response.payload[:package] end + strong_memoize_attr :package # used by ExclusiveLeaseGuard def lease_key diff --git a/app/services/packages/helm/process_file_service.rb b/app/services/packages/helm/process_file_service.rb index f53c63d2b01..219f3d8c781 100644 --- a/app/services/packages/helm/process_file_service.rb +++ b/app/services/packages/helm/process_file_service.rb @@ -57,28 +57,25 @@ module Packages end def temp_package - strong_memoize(:temp_package) do - package_file.package - end + package_file.package end + strong_memoize_attr :temp_package def package - strong_memoize(:package) do - project_packages = package_file.package.project.packages - package = project_packages.with_package_type(:helm) - .with_name(metadata['name']) - .with_version(metadata['version']) - .not_pending_destruction - .last - package || temp_package - end + project_packages = package_file.package.project.packages + package = project_packages.with_package_type(:helm) + .with_name(metadata['name']) + .with_version(metadata['version']) + .not_pending_destruction + .last + package || temp_package end + strong_memoize_attr :package def metadata - strong_memoize(:metadata) do - ::Packages::Helm::ExtractFileMetadataService.new(package_file).execute - end + ::Packages::Helm::ExtractFileMetadataService.new(package_file).execute end + strong_memoize_attr :metadata def file_name "#{metadata['name']}-#{metadata['version']}.tgz" diff --git a/app/services/packages/maven/metadata/base_create_xml_service.rb b/app/services/packages/maven/metadata/base_create_xml_service.rb index 3b0d93e1dfb..d67d5a21a91 100644 --- a/app/services/packages/maven/metadata/base_create_xml_service.rb +++ b/app/services/packages/maven/metadata/base_create_xml_service.rb @@ -19,12 +19,11 @@ module Packages attr_reader :logger def xml_doc - strong_memoize(:xml_doc) do - Nokogiri::XML(@metadata_content) do |config| - config.default_xml.noblanks - end + Nokogiri::XML(@metadata_content) do |config| + config.default_xml.noblanks end end + strong_memoize_attr :xml_doc def xml_node(name, content) xml_doc.create_element(name).tap { |e| e.content = content } diff --git a/app/services/packages/maven/metadata/create_plugins_xml_service.rb b/app/services/packages/maven/metadata/create_plugins_xml_service.rb index 707a8c577ba..e99a72bc0ab 100644 --- a/app/services/packages/maven/metadata/create_plugins_xml_service.rb +++ b/app/services/packages/maven/metadata/create_plugins_xml_service.rb @@ -40,37 +40,34 @@ module Packages end def plugins_xml_node - strong_memoize(:plugins_xml_node) do - xml_doc.xpath(XPATH_PLUGINS) + xml_doc.xpath(XPATH_PLUGINS) .first - end end + strong_memoize_attr :plugins_xml_node def plugin_artifact_ids_from_xml - strong_memoize(:plugin_artifact_ids_from_xml) do - plugins_xml_node.xpath(XPATH_PLUGIN_ARTIFACT_ID) + plugins_xml_node.xpath(XPATH_PLUGIN_ARTIFACT_ID) .map(&:content) - end end + strong_memoize_attr :plugin_artifact_ids_from_xml def plugin_artifact_ids_from_database - strong_memoize(:plugin_artifact_ids_from_database) do - package_names = plugin_artifact_ids_from_xml.map do |artifact_id| - "#{@package.name}/#{artifact_id}" - end - - packages = @package.project.packages - .maven - .displayable - .with_name(package_names) - .has_version - - ::Packages::Maven::Metadatum.for_package_ids(packages.select(:id)) - .order_created - .pluck_app_name - .uniq + package_names = plugin_artifact_ids_from_xml.map do |artifact_id| + "#{@package.name}/#{artifact_id}" end + + packages = @package.project.packages + .maven + .displayable + .with_name(package_names) + .has_version + + ::Packages::Maven::Metadatum.for_package_ids(packages.select(:id)) + .order_created + .pluck_app_name + .uniq end + strong_memoize_attr :plugin_artifact_ids_from_database def plugin_node_for(artifact_id) xml_doc.create_element('plugin').tap do |plugin_node| diff --git a/app/services/packages/maven/metadata/create_versions_xml_service.rb b/app/services/packages/maven/metadata/create_versions_xml_service.rb index c2ac7fea703..966540bcba2 100644 --- a/app/services/packages/maven/metadata/create_versions_xml_service.rb +++ b/app/services/packages/maven/metadata/create_versions_xml_service.rb @@ -91,49 +91,43 @@ module Packages end def versioning_xml_node - strong_memoize(:versioning_xml_node) do - xml_doc.xpath(XPATH_VERSIONING).first - end + xml_doc.xpath(XPATH_VERSIONING).first end + strong_memoize_attr :versioning_xml_node def versions_xml_node - strong_memoize(:versions_xml_node) do - versioning_xml_node&.xpath(XPATH_VERSIONS) + versioning_xml_node&.xpath(XPATH_VERSIONS) &.first - end end + strong_memoize_attr :versions_xml_node def version_xml_nodes versions_xml_node&.xpath(XPATH_VERSION) end def latest_xml_node - strong_memoize(:latest_xml_node) do - versioning_xml_node&.xpath(XPATH_LATEST) + versioning_xml_node&.xpath(XPATH_LATEST) &.first - end end + strong_memoize_attr :latest_xml_node def release_xml_node - strong_memoize(:release_xml_node) do - versioning_xml_node&.xpath(XPATH_RELEASE) + versioning_xml_node&.xpath(XPATH_RELEASE) &.first - end end + strong_memoize_attr :release_xml_node def last_updated_xml_node - strong_memoize(:last_updated_xml_mode) do - versioning_xml_node.xpath(XPATH_LAST_UPDATED) + versioning_xml_node.xpath(XPATH_LAST_UPDATED) .first - end end + strong_memoize_attr :last_updated_xml_node def versions_from_xml - strong_memoize(:versions_from_xml) do - versions_xml_node.xpath(XPATH_VERSION) + versions_xml_node.xpath(XPATH_VERSION) .map(&:text) - end end + strong_memoize_attr :versions_from_xml def latest_from_xml latest_xml_node&.text @@ -144,27 +138,25 @@ module Packages end def versions_from_database - strong_memoize(:versions_from_database) do - @package.project.packages + @package.project.packages .maven .displayable .with_name(@package.name) .has_version .order_created .pluck_versions - end end + strong_memoize_attr :versions_from_database def latest_from_database versions_from_database.last end def release_from_database - strong_memoize(:release_from_database) do - non_snapshot_versions_from_database = versions_from_database.reject { |v| v.ends_with?('SNAPSHOT') } - non_snapshot_versions_from_database.last - end + non_snapshot_versions_from_database = versions_from_database.reject { |v| v.ends_with?('SNAPSHOT') } + non_snapshot_versions_from_database.last end + strong_memoize_attr :release_from_database def log_malformed_content(reason) logger.warn( diff --git a/app/services/packages/maven/metadata/sync_service.rb b/app/services/packages/maven/metadata/sync_service.rb index dacf6750412..14196f090dd 100644 --- a/app/services/packages/maven/metadata/sync_service.rb +++ b/app/services/packages/maven/metadata/sync_service.rb @@ -70,25 +70,22 @@ module Packages end def metadata_package_file_for_versions - strong_memoize(:metadata_file_for_versions) do - metadata_package_file_for(versionless_package_for_versions) - end + metadata_package_file_for(versionless_package_for_versions) end + strong_memoize_attr :metadata_package_file_for_versions def versionless_package_for_versions - strong_memoize(:versionless_package_for_versions) do - versionless_package_named(package_name) - end + versionless_package_named(package_name) end + strong_memoize_attr :versionless_package_for_versions def metadata_package_file_for_plugins - strong_memoize(:metadata_package_file_for_plugins) do - pkg_name = package_name_for_plugins - next unless pkg_name + pkg_name = package_name_for_plugins + return unless pkg_name - metadata_package_file_for(versionless_package_named(package_name_for_plugins)) - end + metadata_package_file_for(versionless_package_named(package_name_for_plugins)) end + strong_memoize_attr :metadata_package_file_for_plugins def metadata_package_file_for(package) return unless package diff --git a/app/services/packages/npm/create_package_service.rb b/app/services/packages/npm/create_package_service.rb index c71ae060dd9..2c578760cc5 100644 --- a/app/services/packages/npm/create_package_service.rb +++ b/app/services/packages/npm/create_package_service.rb @@ -61,10 +61,9 @@ module Packages end def version - strong_memoize(:version) do - params[:versions].each_key.first - end + params[:versions].each_key.first end + strong_memoize_attr :version def version_data params[:versions][version] @@ -79,30 +78,27 @@ module Packages end def package_file_name - strong_memoize(:package_file_name) do - "#{name}-#{version}.tgz" - end + "#{name}-#{version}.tgz" end + strong_memoize_attr :package_file_name def attachment - strong_memoize(:attachment) do - params['_attachments'][package_file_name] - end + params['_attachments'][package_file_name] end + strong_memoize_attr :attachment # TODO (technical debt): Extract the package size calculation to its own component and unit test it separately. def calculated_package_file_size - strong_memoize(:calculated_package_file_size) do - # This calculation is based on: - # 1. 4 chars in a Base64 encoded string are 3 bytes in the original string. Meaning 1 char is 0.75 bytes. - # 2. The encoded string may have 1 or 2 extra '=' chars used for padding. Each padding char means 1 byte less in the original string. - # Reference: - # - https://blog.aaronlenoir.com/2017/11/10/get-original-length-from-base-64-string/ - # - https://en.wikipedia.org/wiki/Base64#Decoding_Base64_with_padding - encoded_data = attachment['data'] - ((encoded_data.length * 0.75) - encoded_data[-2..].count('=')).to_i - end + # This calculation is based on: + # 1. 4 chars in a Base64 encoded string are 3 bytes in the original string. Meaning 1 char is 0.75 bytes. + # 2. The encoded string may have 1 or 2 extra '=' chars used for padding. Each padding char means 1 byte less in the original string. + # Reference: + # - https://blog.aaronlenoir.com/2017/11/10/get-original-length-from-base-64-string/ + # - https://en.wikipedia.org/wiki/Base64#Decoding_Base64_with_padding + encoded_data = attachment['data'] + ((encoded_data.length * 0.75) - encoded_data[-2..].count('=')).to_i end + strong_memoize_attr :calculated_package_file_size def file_params { @@ -134,29 +130,26 @@ module Packages end def field_sizes - strong_memoize(:field_sizes) do - package_json.transform_values do |value| - value.to_s.size - end + package_json.transform_values do |value| + value.to_s.size end end + strong_memoize_attr :field_sizes def filtered_field_sizes - strong_memoize(:filtered_field_sizes) do - field_sizes.select do |_, size| - size >= ::Packages::Npm::Metadatum::MIN_PACKAGE_JSON_FIELD_SIZE_FOR_ERROR_TRACKING - end + field_sizes.select do |_, size| + size >= ::Packages::Npm::Metadatum::MIN_PACKAGE_JSON_FIELD_SIZE_FOR_ERROR_TRACKING end end + strong_memoize_attr :filtered_field_sizes def largest_fields - strong_memoize(:largest_fields) do - field_sizes + field_sizes .sort_by { |a| a[1] } .reverse[0..::Packages::Npm::Metadatum::NUM_FIELDS_FOR_ERROR_TRACKING - 1] .to_h - end end + strong_memoize_attr :largest_fields def field_sizes_for_error_tracking filtered_field_sizes.empty? ? largest_fields : filtered_field_sizes diff --git a/app/services/packages/npm/create_tag_service.rb b/app/services/packages/npm/create_tag_service.rb index 82974d0ca4b..e212b37c9ba 100644 --- a/app/services/packages/npm/create_tag_service.rb +++ b/app/services/packages/npm/create_tag_service.rb @@ -23,12 +23,11 @@ module Packages private def existing_tag - strong_memoize(:existing_tag) do - Packages::TagsFinder + Packages::TagsFinder .new(package.project, package.name, package_type: package.package_type) .find_by_name(tag_name) - end end + strong_memoize_attr :existing_tag end end end diff --git a/app/services/packages/nuget/metadata_extraction_service.rb b/app/services/packages/nuget/metadata_extraction_service.rb index 3b92d977c79..5c60a2912ae 100644 --- a/app/services/packages/nuget/metadata_extraction_service.rb +++ b/app/services/packages/nuget/metadata_extraction_service.rb @@ -39,10 +39,9 @@ module Packages private def package_file - strong_memoize(:package_file) do - ::Packages::PackageFile.find_by_id(@package_file_id) - end + ::Packages::PackageFile.find_by_id(@package_file_id) end + strong_memoize_attr :package_file def valid_package_file? package_file && diff --git a/app/services/packages/nuget/search_service.rb b/app/services/packages/nuget/search_service.rb index fea424b3aa8..7d1585f8903 100644 --- a/app/services/packages/nuget/search_service.rb +++ b/app/services/packages/nuget/search_service.rb @@ -89,17 +89,16 @@ module Packages end def base_matching_package_names - strong_memoize(:base_matching_package_names) do - # rubocop: disable CodeReuse/ActiveRecord - pkgs = nuget_packages.order_name + # rubocop: disable CodeReuse/ActiveRecord + pkgs = nuget_packages.order_name .select_distinct_name .where(project_id: project_ids) - pkgs = pkgs.without_version_like(PRE_RELEASE_VERSION_MATCHING_TERM) unless include_prerelease_versions? - pkgs = pkgs.search_by_name(@search_term) if @search_term.present? - pkgs - # rubocop: enable CodeReuse/ActiveRecord - end + pkgs = pkgs.without_version_like(PRE_RELEASE_VERSION_MATCHING_TERM) unless include_prerelease_versions? + pkgs = pkgs.search_by_name(@search_term) if @search_term.present? + pkgs + # rubocop: enable CodeReuse/ActiveRecord end + strong_memoize_attr :base_matching_package_names def nuget_packages Packages::Package.nuget @@ -111,11 +110,10 @@ module Packages def project_ids_cte return unless use_project_ids_cte? - strong_memoize(:project_ids_cte) do - query = projects_visible_to_user(@current_user, within_group: @project_or_group) - Gitlab::SQL::CTE.new(:project_ids, query.select(:id)) - end + query = projects_visible_to_user(@current_user, within_group: @project_or_group) + Gitlab::SQL::CTE.new(:project_ids, query.select(:id)) end + strong_memoize_attr :project_ids_cte def project_ids return @project_or_group.id if project? diff --git a/app/services/packages/pypi/create_package_service.rb b/app/services/packages/pypi/create_package_service.rb index b464ce4504a..087a8e42a66 100644 --- a/app/services/packages/pypi/create_package_service.rb +++ b/app/services/packages/pypi/create_package_service.rb @@ -29,10 +29,9 @@ module Packages private def created_package - strong_memoize(:created_package) do - find_or_create_package!(:pypi) - end + find_or_create_package!(:pypi) end + strong_memoize_attr :created_package def file_params { diff --git a/app/services/packages/rpm/parse_package_service.rb b/app/services/packages/rpm/parse_package_service.rb index d2751c77c5b..3995eedef53 100644 --- a/app/services/packages/rpm/parse_package_service.rb +++ b/app/services/packages/rpm/parse_package_service.rb @@ -43,10 +43,9 @@ module Packages end def package_tags - strong_memoize(:package_tags) do - rpm.tags - end + rpm.tags end + strong_memoize_attr :package_tags def extract_static_attributes STATIC_ATTRIBUTES.index_with do |attribute| diff --git a/app/services/packages/rubygems/dependency_resolver_service.rb b/app/services/packages/rubygems/dependency_resolver_service.rb index 839a7683632..214a4adc47f 100644 --- a/app/services/packages/rubygems/dependency_resolver_service.rb +++ b/app/services/packages/rubygems/dependency_resolver_service.rb @@ -33,10 +33,9 @@ module Packages private def packages - strong_memoize(:packages) do - project.packages.with_name(gem_name) - end + project.packages.with_name(gem_name) end + strong_memoize_attr :packages def gem_name params[:gem_name] diff --git a/app/services/packages/rubygems/process_gem_service.rb b/app/services/packages/rubygems/process_gem_service.rb index c771af28f73..ca4aaa8fdde 100644 --- a/app/services/packages/rubygems/process_gem_service.rb +++ b/app/services/packages/rubygems/process_gem_service.rb @@ -64,10 +64,9 @@ module Packages end def gemspec - strong_memoize(:gemspec) do - gem.spec - end + gem.spec end + strong_memoize_attr :gemspec def success ServiceResponse.success(payload: { package: package }) @@ -78,24 +77,21 @@ module Packages end def temp_package - strong_memoize(:temp_package) do - package_file.package - end + package_file.package end + strong_memoize_attr :temp_package def package - strong_memoize(:package) do - # if package with name/version already exists, use that package - package = temp_package.project + package = temp_package.project .packages .rubygems .with_name(gemspec.name) .with_version(gemspec.version.to_s) .not_pending_destruction .last - package || temp_package - end + package || temp_package end + strong_memoize_attr :package def gem # use_file will set an exclusive lease on the file for as long as diff --git a/app/services/packages/terraform_module/create_package_service.rb b/app/services/packages/terraform_module/create_package_service.rb index 3afecc6c1ca..9df722db529 100644 --- a/app/services/packages/terraform_module/create_package_service.rb +++ b/app/services/packages/terraform_module/create_package_service.rb @@ -43,16 +43,14 @@ module Packages end def name - strong_memoize(:name) do - "#{params[:module_name]}/#{params[:module_system]}" - end + "#{params[:module_name]}/#{params[:module_system]}" end + strong_memoize_attr :name def file_name - strong_memoize(:file_name) do - "#{params[:module_name]}-#{params[:module_system]}-#{params[:module_version]}.tgz" - end + "#{params[:module_name]}-#{params[:module_system]}-#{params[:module_version]}.tgz" end + strong_memoize_attr :file_name def file_params { diff --git a/app/services/packages/update_tags_service.rb b/app/services/packages/update_tags_service.rb index f29c54dacb9..cf1acc6ee19 100644 --- a/app/services/packages/update_tags_service.rb +++ b/app/services/packages/update_tags_service.rb @@ -21,10 +21,9 @@ module Packages private def existing_tags - strong_memoize(:existing_tags) do - @package.tag_names - end + @package.tag_names end + strong_memoize_attr :existing_tags def rows(tags) now = Time.zone.now |