1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# frozen_string_literal: true
module Packages
module Nuget
module PresenterHelpers
include ::API::Helpers::RelatedResourcesHelpers
BLANK_STRING = ''
PACKAGE_DEPENDENCY_GROUP = 'PackageDependencyGroup'
PACKAGE_DEPENDENCY = 'PackageDependency'
private
def json_url_for(package)
path = api_v4_projects_packages_nuget_metadata_package_name_package_version_path(
{
id: package.project_id,
package_name: package.name,
package_version: package.version,
format: '.json'
},
true
)
expose_url(path)
end
def archive_url_for(package)
path = api_v4_projects_packages_nuget_download_package_name_package_version_package_filename_path(
{
id: package.project_id,
package_name: package.name,
package_version: package.version,
package_filename: package.package_files.last&.file_name
},
true
)
expose_url(path)
end
def catalog_entry_for(package)
{
json_url: json_url_for(package),
authors: BLANK_STRING,
dependency_groups: dependency_groups_for(package),
package_name: package.name,
package_version: package.version,
archive_url: archive_url_for(package),
summary: BLANK_STRING,
tags: tags_for(package),
metadatum: metadatum_for(package)
}
end
def dependency_groups_for(package)
base_nuget_id = "#{json_url_for(package)}#dependencyGroup"
dependency_links_grouped_by_target_framework(package).map do |target_framework, dependency_links|
nuget_id = target_framework_nuget_id(base_nuget_id, target_framework)
{
id: nuget_id,
type: PACKAGE_DEPENDENCY_GROUP,
target_framework: target_framework,
dependencies: dependencies_for(nuget_id, dependency_links)
}.compact
end
end
def dependency_links_grouped_by_target_framework(package)
package
.dependency_links
.includes_dependency
.preload_nuget_metadatum
.group_by { |dependency_link| dependency_link.nuget_metadatum&.target_framework }
end
def dependencies_for(nuget_id, dependency_links)
return [] if dependency_links.empty?
dependency_links.map do |dependency_link|
dependency = dependency_link.dependency
{
id: "#{nuget_id}/#{dependency.name.downcase}",
type: PACKAGE_DEPENDENCY,
name: dependency.name,
range: dependency.version_pattern
}
end
end
def target_framework_nuget_id(base_nuget_id, target_framework)
target_framework.blank? ? base_nuget_id : "#{base_nuget_id}/#{target_framework.downcase}"
end
def metadatum_for(package)
metadatum = package.nuget_metadatum
return {} unless metadatum
metadatum.slice(:project_url, :license_url, :icon_url)
.compact
end
def base_path_for(package)
api_v4_projects_packages_nuget_path(id: package.project_id)
end
def tags_for(package)
package.tag_names.join(::Packages::Tag::NUGET_TAGS_SEPARATOR)
end
end
end
end
|