Hue Preserving Color Blending
PackageInfo.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using Semver;
5 
7 {
8  [Serializable]
9  internal class PackageInfo : IEquatable<PackageInfo>
10  {
11  // Module package.json files contain a documentation url embedded in the description.
12  // We parse that to have the "View Documentation" button direct to it, instead of showing
13  // the link in the description text.
14  private const string builtinPackageDocsUrlKey = "Scripting API: ";
15 
16  public string Name;
17  public string DisplayName;
18  private string _PackageId;
19  public SemVersion Version;
20  public string Description;
21  public string Category;
22  public PackageState State;
23  public bool IsCurrent;
24  public bool IsLatest;
25  public string Group;
26  public PackageSource Origin;
27  public List<Error> Errors;
28  public bool IsVerified;
29  public string Author;
30 
31  public PackageManager.PackageInfo Info { get; set; }
32 
33  public string PackageId {
34  get
35  {
36  if (!string.IsNullOrEmpty(_PackageId ))
37  return _PackageId;
38  return string.Format("{0}@{1}", Name.ToLower(), Version);
39  }
40  set
41  {
42  _PackageId = value;
43  }
44  }
45 
46  // This will always be <name>@<version>, even for an embedded package.
47  public string VersionId { get { return string.Format("{0}@{1}", Name.ToLower(), Version); } }
48  public string ShortVersionId { get { return string.Format("{0}@{1}", Name.ToLower(), Version.ShortVersion()); } }
49 
50  public string BuiltInDescription { get {
51  if (IsBuiltIn)
52  return string.Format("This built in package controls the presence of the {0} module.", DisplayName);
53  else
54  return Description.Split(new[] {builtinPackageDocsUrlKey}, StringSplitOptions.None)[0];
55  } }
56 
57  private static Version ParseShortVersion(string shortVersionId)
58  {
59  try
60  {
61  var versionToken = shortVersionId.Split('@')[1];
62  return new Version(versionToken);
63  }
64  catch (Exception)
65  {
66  // Keep default version 0.0 on exception
67  return new Version();
68  }
69  }
70 
71  // Method content must be matched in package manager UI
72  public static string GetPackageUrlRedirect(string packageName, string shortVersionId)
73  {
74  var redirectUrl = "";
75  if (packageName == "com.unity.ads")
76  redirectUrl = "https://docs.unity3d.com/Manual/UnityAds.html";
77  else if (packageName == "com.unity.analytics")
78  {
79  if (ParseShortVersion(shortVersionId) < new Version(3, 2))
80  redirectUrl = "https://docs.unity3d.com/Manual/UnityAnalytics.html";
81  }
82  else if (packageName == "com.unity.purchasing")
83  redirectUrl = "https://docs.unity3d.com/Manual/UnityIAP.html";
84  else if (packageName == "com.unity.standardevents")
85  redirectUrl = "https://docs.unity3d.com/Manual/UnityAnalyticsStandardEvents.html";
86  else if (packageName == "com.unity.xiaomi")
87  redirectUrl = "https://unity3d.com/cn/partners/xiaomi/guide";
88  else if (packageName == "com.unity.shadergraph")
89  {
90  if (ParseShortVersion(shortVersionId) < new Version(4, 1))
91  redirectUrl = "https://github.com/Unity-Technologies/ShaderGraph/wiki";
92  }
93 
94  return redirectUrl;
95  }
96 
97  public bool RedirectsToManual(PackageInfo packageInfo)
98  {
99  return !string.IsNullOrEmpty(GetPackageUrlRedirect(packageInfo.Name, packageInfo.ShortVersionId));
100  }
101 
102  public bool HasChangelog(PackageInfo packageInfo)
103  {
104  // Packages with no docs have no third party notice
105  return !RedirectsToManual(packageInfo);
106  }
107 
108  public string GetDocumentationUrl()
109  {
110  if (IsBuiltIn)
111  {
112  if (!string.IsNullOrEmpty(Description))
113  {
114  var split = Description.Split(new[] {builtinPackageDocsUrlKey}, StringSplitOptions.None);
115  if (split.Length > 1)
116  return split[1];
117  }
118  }
119  return string.Format("http://docs.unity3d.com/Packages/{0}/index.html", ShortVersionId);
120  }
121 
122  public string GetChangelogUrl()
123  {
124  return string.Format("http://docs.unity3d.com/Packages/{0}/changelog/CHANGELOG.html", ShortVersionId);
125  }
126 
127  public string GetLicensesUrl()
128  {
129  var url = string.Format("http://docs.unity3d.com/Packages/{0}/license/index.html", ShortVersionId);
130  if (RedirectsToManual(this))
131  url = "https://unity3d.com/legal/licenses/Unity_Companion_License";
132 
133  return url;
134  }
135 
136  public bool Equals(PackageInfo other)
137  {
138  if (other == null)
139  return false;
140  if (other == this)
141  return true;
142 
143  return Name == other.Name && Version == other.Version;
144  }
145 
146  public override int GetHashCode()
147  {
148  return PackageId.GetHashCode();
149  }
150 
151  public bool HasVersionTag(string tag)
152  {
153  if (string.IsNullOrEmpty(Version.Prerelease))
154  return false;
155 
156  return String.Equals(Version.Prerelease.Split('.').First(), tag, StringComparison.CurrentCultureIgnoreCase);
157  }
158 
159  public bool HasVersionTag(PackageTag tag)
160  {
161  return HasVersionTag(tag.ToString());
162  }
163 
164  // Is it a pre-release (alpha/beta/experimental/preview)?
165  // Current logic is any tag is considered pre-release, except recommended
166  public bool IsPreRelease
167  {
168  get { return !string.IsNullOrEmpty(Version.Prerelease) || Version.Major == 0; }
169  }
170 
171  public bool IsPreview
172  {
173  get { return HasVersionTag(PackageTag.preview) || Version.Major == 0; }
174  }
175 
176  // A version is user visible if it has a supported tag (or no tag at all)
177  public bool IsUserVisible
178  {
179  get { return IsCurrent || string.IsNullOrEmpty(Version.Prerelease) || HasVersionTag(PackageTag.preview) || IsVerified; }
180  }
181 
182  public bool IsInDevelopment { get { return Origin == PackageSource.Embedded; } }
183  public bool IsLocal { get { return Origin == PackageSource.Local; } }
184  public bool IsBuiltIn { get { return Origin == PackageSource.BuiltIn; } }
185 
186  public string VersionWithoutTag { get { return Version.VersionOnly(); } }
187 
188  public bool IsVersionLocked
189  {
190  get { return Origin == PackageSource.Embedded || Origin == PackageSource.Git || Origin == PackageSource.BuiltIn; }
191  }
192 
193  public bool CanBeRemoved
194  {
195  get { return Origin == PackageSource.Registry || Origin == PackageSource.BuiltIn || Origin == PackageSource.Local; }
196  }
197  }
198 }
A semantic version implementation. Conforms to v2.0.0 of http://semver.org/
Definition: SemVersion.cs:43
int Major
Gets the major version.
Definition: SemVersion.cs:258
string Prerelease
Gets the pre-release version.
Definition: SemVersion.cs:282