-
Notifications
You must be signed in to change notification settings - Fork 1
/
lib.jl
138 lines (116 loc) · 4.95 KB
/
lib.jl
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#######################################################################
# Functions for processing information about packages
# and sorting them by the number of stars
#######################################################################
#--------------------------------------------------
# Data
#--------------------------------------------------
# Expected format of JSON data: `{packages: [...]}`
const PKGS_KEY = "packages"
# Expected format of a single package:
# `{name: ..., metadata: {repo:..., starcount: ...}}`
const NAME_KEY = "name"
const UUID_KEY = "uuid"
const METADATA_KEY = "metadata"
const REPO_KEY = "repo"
const STARTCOUNT_KEY = "starcount"
const VERSIONS_KEY = "versions"
# Placeholders if data is not available
const NAME_NA = "<NA-name>"
const UUID_NA = "<NA-uuid>"
const REPO_NA = "<NA-repo>"
const VERSION_NA = "<NA-version>"
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Extracting list of packages
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# (Vector{PackageInfo}, Bool, Vector{String}; [Bool, Bool]) → Vector{String}
# Returns the list of package repos or package names depending on `showName`,
# sorted from the most to least starred packages,
# excluding packages with repos listed in `excludedRepos`.
getSortedPkgs(
pkgs :: Vector, showName :: Bool = false;
excludedRepos :: Vector{String} = String[],
includeVersion :: Bool = false, includeUUID :: Bool = false
) :: Vector{String} = getSortedPkgsInfo(
pkgs, showName ?
(includeVersion ?
(includeUUID ? getNameUUIDVersion : getNameAndVersion) :
(includeUUID ? getNameAndUUID : getName)) :
(includeVersion ?
(includeUUID ? getRepoUUIDVersion : getRepoAndVersion) :
(includeUUID ? getRepoAndUUID : getRepo));
excludedRepos=excludedRepos
)
# (Vector{PackageInfo}, PackageInfo→Any, Vector{String}) → Vector{Any}
# Returns the list of package information
# sorted from the most to least starred packages,
# excluding packages with repos listed in `excludedRepos`
getSortedPkgsInfo(
pkgs :: Vector, getInfo :: Function;
excludedRepos :: Vector{String} = String[]
) :: Vector = begin
if !isempty(excludedRepos)
@status "Cleaning packages..."
pkgs = filter(pkg -> !in(getRepo(pkg), excludedRepos), pkgs)
end
@status "Sorting packages..."
sorted = sortStarred(pkgs)
@status "Extracting information..."
unique(map(getInfo, sorted))
end
# (Vector{PackageInfo}, String) → Vector{PackageInfo}
# Sorts packages from the most starred to least starred
sortStarred(pkgs :: Vector) = sort(pkgs, by=getStarCount, rev=true)
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Utilitites for working with packages info
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Retrieves the list of packages from file `pkgsInfoFilePath`
# ASSUMPTION: the file has the expected JSON format
loadPkgsData(pkgsInfoFilePath :: String) :: Vector = begin
data = JSON.parsefile(pkgsInfoFilePath)
data[PKGS_KEY]
end
# (PackageInfo, String) → Any
# Retrieves the value of `key` from `pkgInfo` metadata
# or returns `default` value
# ASSUMPTION: `pkgInfo` contains metadata
getMetaDataValue(pkgInfo :: Dict, key :: String, default :: Any) :: Any = begin
metaData = pkgInfo[METADATA_KEY]
val = get(metaData, key, default)
# in case the value of the element is `null` in JSON
val !== nothing ? val : default
end
# (PackageInfo, String) → String
getName(pkgInfo :: Dict) :: String = get(pkgInfo, NAME_KEY, NAME_NA)
# (PackageInfo, String) → String
getUUID(pkgInfo :: Dict) :: String = get(pkgInfo, UUID_KEY, UUID_NA)
# (PackageInfo, String) → String
getRepo(pkgInfo :: Dict) :: String =
getMetaDataValue(pkgInfo, REPO_KEY, REPO_NA)
# (PackageInfo, String) → Int
getStarCount(pkgInfo :: Dict) :: Int =
getMetaDataValue(pkgInfo, STARTCOUNT_KEY, 0)
# (PackageInfo, String) → String
# List of versions is sorted from the latest version
getLatestVersion(pkgInfo :: Dict) :: String = begin
versions = getMetaDataValue(pkgInfo, VERSIONS_KEY, [])
isempty(versions) ? VERSION_NA : versions[1]
end
# PackageInfo → String
getNameAndVersion(pkgInfo :: Dict) :: String =
"$(getName(pkgInfo)),$(getLatestVersion(pkgInfo))"
# PackageInfo → String
getRepoAndVersion(pkgInfo :: Dict) :: String =
"$(getRepo(pkgInfo)),$(getLatestVersion(pkgInfo))"
# PackageInfo → String
getNameAndUUID(pkgInfo :: Dict) :: String =
"$(getName(pkgInfo)),$(getUUID(pkgInfo))"
# PackageInfo → String
getRepoAndUUID(pkgInfo :: Dict) :: String =
"$(getRepo(pkgInfo)),$(getUUID(pkgInfo))"
# PackageInfo → String
getNameUUIDVersion(pkgInfo :: Dict) :: String =
"$(getName(pkgInfo)),$(getUUID(pkgInfo)),$(getLatestVersion(pkgInfo))"
# PackageInfo → String
getRepoUUIDVersion(pkgInfo :: Dict) :: String =
"$(getRepo(pkgInfo)),$(getUUID(pkgInfo)),$(getLatestVersion(pkgInfo))"