feat(nuget): add missing nuget V2 properties (#7102)
- Add several missing nuget V2 properties to the API. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7102 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: jwolvers <jwolvers@noreply.codeberg.org> Co-committed-by: jwolvers <jwolvers@noreply.codeberg.org>
This commit is contained in:
parent
a9303901cf
commit
3fdc3b6f82
|
@ -57,12 +57,21 @@ type Package struct {
|
|||
|
||||
// Metadata represents the metadata of a Nuget package
|
||||
type Metadata struct {
|
||||
Title string `json:"title,omitempty"`
|
||||
Language string `json:"language,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
ReleaseNotes string `json:"release_notes,omitempty"`
|
||||
Readme string `json:"readme,omitempty"`
|
||||
Authors string `json:"authors,omitempty"`
|
||||
Owners string `json:"owners,omitempty"`
|
||||
Copyright string `json:"copyright,omitempty"`
|
||||
ProjectURL string `json:"project_url,omitempty"`
|
||||
RepositoryURL string `json:"repository_url,omitempty"`
|
||||
LicenseURL string `json:"license_url,omitempty"`
|
||||
IconURL string `json:"icon_url,omitempty"`
|
||||
MinClientVersion string `json:"min_client_version,omitempty"`
|
||||
Tags string `json:"tags,omitempty"`
|
||||
DevelopmentDependency bool `json:"development_dependency,omitempty"`
|
||||
RequireLicenseAcceptance bool `json:"require_license_acceptance"`
|
||||
Dependencies map[string][]Dependency `json:"dependencies,omitempty"`
|
||||
}
|
||||
|
@ -77,13 +86,22 @@ type Dependency struct {
|
|||
type nuspecPackage struct {
|
||||
Metadata struct {
|
||||
ID string `xml:"id"`
|
||||
Title string `xml:"title"`
|
||||
Language string `xml:"language"`
|
||||
Version string `xml:"version"`
|
||||
Authors string `xml:"authors"`
|
||||
Owners string `xml:"owners"`
|
||||
Copyright string `xml:"copyright"`
|
||||
DevelopmentDependency bool `xml:"developmentDependency"`
|
||||
RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance"`
|
||||
ProjectURL string `xml:"projectUrl"`
|
||||
LicenseURL string `xml:"licenseUrl"`
|
||||
IconURL string `xml:"iconUrl"`
|
||||
Description string `xml:"description"`
|
||||
ReleaseNotes string `xml:"releaseNotes"`
|
||||
Readme string `xml:"readme"`
|
||||
Tags string `xml:"tags"`
|
||||
MinClientVersion string `xml:"minClientVersion,attr"`
|
||||
PackageTypes struct {
|
||||
PackageType []struct {
|
||||
Name string `xml:"name,attr"`
|
||||
|
@ -167,11 +185,20 @@ func ParseNuspecMetaData(archive *zip.Reader, r io.Reader) (*Package, error) {
|
|||
}
|
||||
|
||||
m := &Metadata{
|
||||
Title: p.Metadata.Title,
|
||||
Language: p.Metadata.Language,
|
||||
Description: p.Metadata.Description,
|
||||
ReleaseNotes: p.Metadata.ReleaseNotes,
|
||||
Authors: p.Metadata.Authors,
|
||||
Owners: p.Metadata.Owners,
|
||||
Copyright: p.Metadata.Copyright,
|
||||
ProjectURL: p.Metadata.ProjectURL,
|
||||
RepositoryURL: p.Metadata.Repository.URL,
|
||||
LicenseURL: p.Metadata.LicenseURL,
|
||||
IconURL: p.Metadata.IconURL,
|
||||
MinClientVersion: p.Metadata.MinClientVersion,
|
||||
Tags: p.Metadata.Tags,
|
||||
DevelopmentDependency: p.Metadata.DevelopmentDependency,
|
||||
RequireLicenseAcceptance: p.Metadata.RequireLicenseAcceptance,
|
||||
Dependencies: make(map[string][]Dependency),
|
||||
}
|
||||
|
|
|
@ -13,14 +13,22 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
id = "System.Gitea"
|
||||
id = "System.Forgejo"
|
||||
title = "Package Title"
|
||||
language = "Package Language"
|
||||
semver = "1.0.1"
|
||||
authors = "Gitea Authors"
|
||||
projectURL = "https://gitea.io"
|
||||
authors = "Forgejo Authors"
|
||||
owners = "Package Owners"
|
||||
copyright = "Package Copyright"
|
||||
projectURL = "https://forgejo.org"
|
||||
licenseURL = "https://forgejo.org/docs/latest/license/"
|
||||
iconURL = "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png"
|
||||
description = "Package Description"
|
||||
releaseNotes = "Package Release Notes"
|
||||
readme = "Readme"
|
||||
repositoryURL = "https://gitea.io/gitea/gitea"
|
||||
tags = "tag_1 tag_2 tag_3"
|
||||
minClientVersion = "1.0.0.0"
|
||||
repositoryURL = "https://codeberg.org/forgejo"
|
||||
targetFramework = ".NETStandard2.1"
|
||||
dependencyID = "System.Text.Json"
|
||||
dependencyVersion = "5.0.0"
|
||||
|
@ -28,16 +36,24 @@ const (
|
|||
|
||||
const nuspecContent = `<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
|
||||
<metadata>
|
||||
<metadata minClientVersion="` + minClientVersion + `">
|
||||
<id>` + id + `</id>
|
||||
<title>` + title + `</title>
|
||||
<language>` + language + `</language>
|
||||
<version>` + semver + `</version>
|
||||
<authors>` + authors + `</authors>
|
||||
<owners>` + owners + `</owners>
|
||||
<copyright>` + copyright + `</copyright>
|
||||
<developmentDependency>true</developmentDependency>
|
||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||
<projectUrl>` + projectURL + `</projectUrl>
|
||||
<licenseUrl>` + licenseURL + `</licenseUrl>
|
||||
<iconUrl>` + iconURL + `</iconUrl>
|
||||
<description>` + description + `</description>
|
||||
<releaseNotes>` + releaseNotes + `</releaseNotes>
|
||||
<repository url="` + repositoryURL + `" />
|
||||
<readme>README.md</readme>
|
||||
<tags>` + tags + `</tags>
|
||||
<dependencies>
|
||||
<group targetFramework="` + targetFramework + `">
|
||||
<dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" />
|
||||
|
@ -142,12 +158,22 @@ func TestParsePackageMetaData(t *testing.T) {
|
|||
assert.Equal(t, DependencyPackage, np.PackageType)
|
||||
|
||||
assert.Equal(t, id, np.ID)
|
||||
assert.Equal(t, title, np.Metadata.Title)
|
||||
assert.Equal(t, language, np.Metadata.Language)
|
||||
assert.Equal(t, semver, np.Version)
|
||||
assert.Equal(t, authors, np.Metadata.Authors)
|
||||
assert.Equal(t, owners, np.Metadata.Owners)
|
||||
assert.Equal(t, copyright, np.Metadata.Copyright)
|
||||
assert.True(t, np.Metadata.DevelopmentDependency)
|
||||
assert.True(t, np.Metadata.RequireLicenseAcceptance)
|
||||
assert.Equal(t, projectURL, np.Metadata.ProjectURL)
|
||||
assert.Equal(t, licenseURL, np.Metadata.LicenseURL)
|
||||
assert.Equal(t, iconURL, np.Metadata.IconURL)
|
||||
assert.Equal(t, description, np.Metadata.Description)
|
||||
assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes)
|
||||
assert.Equal(t, readme, np.Metadata.Readme)
|
||||
assert.Equal(t, tags, np.Metadata.Tags)
|
||||
assert.Equal(t, minClientVersion, np.Metadata.MinClientVersion)
|
||||
assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL)
|
||||
assert.Len(t, np.Metadata.Dependencies, 1)
|
||||
assert.Contains(t, np.Metadata.Dependencies, targetFramework)
|
||||
|
|
|
@ -249,6 +249,9 @@ type FeedEntryProperties struct {
|
|||
Version string `xml:"d:Version"`
|
||||
NormalizedVersion string `xml:"d:NormalizedVersion"`
|
||||
Authors string `xml:"d:Authors"`
|
||||
Owners string `xml:"d:Owners,omitempty"`
|
||||
Copyright string `xml:"d:Copyright,omitempty"`
|
||||
Language string `xml:"d:Language,omitempty"`
|
||||
Dependencies string `xml:"d:Dependencies"`
|
||||
Description string `xml:"d:Description"`
|
||||
VersionDownloadCount TypedValue[int64] `xml:"d:VersionDownloadCount"`
|
||||
|
@ -258,9 +261,15 @@ type FeedEntryProperties struct {
|
|||
LastUpdated TypedValue[time.Time] `xml:"d:LastUpdated"`
|
||||
Published TypedValue[time.Time] `xml:"d:Published"`
|
||||
ProjectURL string `xml:"d:ProjectUrl,omitempty"`
|
||||
LicenseURL string `xml:"d:LicenseUrl,omitempty"`
|
||||
IconURL string `xml:"d:IconUrl,omitempty"`
|
||||
ReleaseNotes string `xml:"d:ReleaseNotes,omitempty"`
|
||||
RequireLicenseAcceptance TypedValue[bool] `xml:"d:RequireLicenseAcceptance"`
|
||||
Title string `xml:"d:Title"`
|
||||
DevelopmentDependency TypedValue[bool] `xml:"d:DevelopmentDependency"`
|
||||
Title string `xml:"d:Title,omitempty"`
|
||||
MinClientVersion string `xml:"d:MinClientVersion,omitempty"`
|
||||
Tags string `xml:"d:Tags,omitempty"`
|
||||
ID string `xml:"d:Id,omitempty"`
|
||||
}
|
||||
|
||||
type FeedEntry struct {
|
||||
|
@ -356,6 +365,9 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames
|
|||
Version: pd.Version.Version,
|
||||
NormalizedVersion: pd.Version.Version,
|
||||
Authors: metadata.Authors,
|
||||
Owners: metadata.Owners,
|
||||
Copyright: metadata.Copyright,
|
||||
Language: metadata.Language,
|
||||
Dependencies: buildDependencyString(metadata),
|
||||
Description: metadata.Description,
|
||||
VersionDownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount},
|
||||
|
@ -365,9 +377,15 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames
|
|||
LastUpdated: createdValue,
|
||||
Published: createdValue,
|
||||
ProjectURL: metadata.ProjectURL,
|
||||
LicenseURL: metadata.LicenseURL,
|
||||
IconURL: metadata.IconURL,
|
||||
ReleaseNotes: metadata.ReleaseNotes,
|
||||
RequireLicenseAcceptance: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.RequireLicenseAcceptance},
|
||||
Title: pd.Package.Name,
|
||||
DevelopmentDependency: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.DevelopmentDependency},
|
||||
Title: metadata.Title,
|
||||
MinClientVersion: metadata.MinClientVersion,
|
||||
Tags: metadata.Tags,
|
||||
ID: pd.Package.Name,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -49,6 +49,9 @@ func TestPackageNuGet(t *testing.T) {
|
|||
Version string `xml:"Version"`
|
||||
NormalizedVersion string `xml:"NormalizedVersion"`
|
||||
Authors string `xml:"Authors"`
|
||||
Owners string `xml:"Owners,omitempty"`
|
||||
Copyright string `xml:"Copyright,omitempty"`
|
||||
Language string `xml:"Language,omitempty"`
|
||||
Dependencies string `xml:"Dependencies"`
|
||||
Description string `xml:"Description"`
|
||||
VersionDownloadCount nuget.TypedValue[int64] `xml:"VersionDownloadCount"`
|
||||
|
@ -58,9 +61,15 @@ func TestPackageNuGet(t *testing.T) {
|
|||
LastUpdated nuget.TypedValue[time.Time] `xml:"LastUpdated"`
|
||||
Published nuget.TypedValue[time.Time] `xml:"Published"`
|
||||
ProjectURL string `xml:"ProjectUrl,omitempty"`
|
||||
LicenseURL string `xml:"LicenseUrl,omitempty"`
|
||||
IconURL string `xml:"IconUrl,omitempty"`
|
||||
ReleaseNotes string `xml:"ReleaseNotes,omitempty"`
|
||||
RequireLicenseAcceptance nuget.TypedValue[bool] `xml:"RequireLicenseAcceptance"`
|
||||
DevelopmentDependency nuget.TypedValue[bool] `xml:"DevelopmentDependency"`
|
||||
Title string `xml:"Title"`
|
||||
MinClientVersion string `xml:"MinClientVersion,omitempty"`
|
||||
Tags string `xml:"Tags,omitempty"`
|
||||
ID string `xml:"Id,omitempty"`
|
||||
}
|
||||
|
||||
type FeedEntry struct {
|
||||
|
@ -87,21 +96,43 @@ func TestPackageNuGet(t *testing.T) {
|
|||
packageName := "test.package"
|
||||
packageVersion := "1.0.3"
|
||||
packageAuthors := "KN4CK3R"
|
||||
packageDescription := "Gitea Test Package"
|
||||
packageDescription := "Forgejo Test Package"
|
||||
symbolFilename := "test.pdb"
|
||||
symbolID := "d910bb6948bd4c6cb40155bcf52c3c94"
|
||||
|
||||
packageTitle := "Package Title"
|
||||
packageLanguage := "Package Language"
|
||||
packageOwners := "Package Owners"
|
||||
packageCopyright := "Package Copyright"
|
||||
packageProjectURL := "https://forgejo.org"
|
||||
packageLicenseURL := "https://forgejo.org/docs/latest/license/"
|
||||
packageIconURL := "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png"
|
||||
packageReleaseNotes := "Package Release Notes"
|
||||
packageTags := "tag_1 tag_2 tag_3"
|
||||
packageMinClientVersion := "1.0.0.0"
|
||||
|
||||
createPackage := func(id, version string) io.Reader {
|
||||
var buf bytes.Buffer
|
||||
archive := zip.NewWriter(&buf)
|
||||
w, _ := archive.Create("package.nuspec")
|
||||
w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
|
||||
<metadata>
|
||||
<metadata minClientVersion="` + packageMinClientVersion + `">
|
||||
<id>` + id + `</id>
|
||||
<title>` + packageTitle + `</title>
|
||||
<language>` + packageLanguage + `</language>
|
||||
<version>` + version + `</version>
|
||||
<authors>` + packageAuthors + `</authors>
|
||||
<owners>` + packageOwners + `</owners>
|
||||
<copyright>` + packageCopyright + `</copyright>
|
||||
<developmentDependency>true</developmentDependency>
|
||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||
<projectUrl>` + packageProjectURL + `</projectUrl>
|
||||
<licenseUrl>` + packageLicenseURL + `</licenseUrl>
|
||||
<iconUrl>` + packageIconURL + `</iconUrl>
|
||||
<description>` + packageDescription + `</description>
|
||||
<releaseNotes>` + packageReleaseNotes + `</releaseNotes>
|
||||
<tags>` + packageTags + `</tags>
|
||||
<dependencies>
|
||||
<group targetFramework=".NETStandard2.0">
|
||||
<dependency id="Microsoft.CSharp" version="4.5.0" />
|
||||
|
@ -115,11 +146,22 @@ func TestPackageNuGet(t *testing.T) {
|
|||
|
||||
nuspec := `<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
|
||||
<metadata>
|
||||
<metadata minClientVersion="` + packageMinClientVersion + `">
|
||||
<id>` + packageName + `</id>
|
||||
<title>` + packageTitle + `</title>
|
||||
<language>` + packageLanguage + `</language>
|
||||
<version>` + packageVersion + `</version>
|
||||
<authors>` + packageAuthors + `</authors>
|
||||
<owners>` + packageOwners + `</owners>
|
||||
<copyright>` + packageCopyright + `</copyright>
|
||||
<developmentDependency>true</developmentDependency>
|
||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||
<projectUrl>` + packageProjectURL + `</projectUrl>
|
||||
<licenseUrl>` + packageLicenseURL + `</licenseUrl>
|
||||
<iconUrl>` + packageIconURL + `</iconUrl>
|
||||
<description>` + packageDescription + `</description>
|
||||
<releaseNotes>` + packageReleaseNotes + `</releaseNotes>
|
||||
<tags>` + packageTags + `</tags>
|
||||
<dependencies>
|
||||
<group targetFramework=".NETStandard2.0">
|
||||
<dependency id="Microsoft.CSharp" version="4.5.0" />
|
||||
|
@ -325,7 +367,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
|
|||
|
||||
pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, int64(414), pb.Size)
|
||||
assert.Equal(t, int64(len(content)), pb.Size)
|
||||
case fmt.Sprintf("%s.%s.snupkg", packageName, packageVersion):
|
||||
assert.False(t, pf.IsLead)
|
||||
|
||||
|
@ -337,7 +379,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
|
|||
|
||||
pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, int64(453), pb.Size)
|
||||
assert.Equal(t, int64(len([]byte(nuspec))), pb.Size)
|
||||
case symbolFilename:
|
||||
assert.False(t, pf.IsLead)
|
||||
|
||||
|
@ -668,10 +710,22 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
|
|||
var result FeedEntry
|
||||
decodeXML(t, resp, &result)
|
||||
|
||||
assert.Equal(t, packageName, result.Properties.Title)
|
||||
assert.Equal(t, packageName, result.Properties.ID)
|
||||
assert.Equal(t, packageVersion, result.Properties.Version)
|
||||
assert.Equal(t, packageAuthors, result.Properties.Authors)
|
||||
assert.Equal(t, packageDescription, result.Properties.Description)
|
||||
assert.Equal(t, packageTitle, result.Properties.Title)
|
||||
assert.Equal(t, packageLanguage, result.Properties.Language)
|
||||
assert.Equal(t, packageOwners, result.Properties.Owners)
|
||||
assert.Equal(t, packageCopyright, result.Properties.Copyright)
|
||||
assert.Equal(t, packageProjectURL, result.Properties.ProjectURL)
|
||||
assert.Equal(t, packageLicenseURL, result.Properties.LicenseURL)
|
||||
assert.Equal(t, packageIconURL, result.Properties.IconURL)
|
||||
assert.Equal(t, packageReleaseNotes, result.Properties.ReleaseNotes)
|
||||
assert.Equal(t, packageTags, result.Properties.Tags)
|
||||
assert.Equal(t, packageMinClientVersion, result.Properties.MinClientVersion)
|
||||
assert.True(t, result.Properties.DevelopmentDependency.Value)
|
||||
assert.True(t, result.Properties.RequireLicenseAcceptance.Value)
|
||||
assert.Equal(t, "Microsoft.CSharp:4.5.0:.NETStandard2.0", result.Properties.Dependencies)
|
||||
})
|
||||
|
||||
|
|
Loading…
Reference in New Issue