Skip to content

Commit 8cad2b0

Browse files
committed
Internet points
1 parent 06c7429 commit 8cad2b0

File tree

3 files changed

+99
-49
lines changed

3 files changed

+99
-49
lines changed

src/packages/router.gleam

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,9 @@ pub fn package_to_json(
133133
json.object(fields)
134134
}
135135

136-
fn internet_points(context: Context) -> Response {
137-
let assert Ok(package_counts) = storage.new_package_count_per_day(context.db)
138-
let assert Ok(release_counts) = storage.new_release_count_per_day(context.db)
139-
let stats =
140-
page.Stats(package_counts: package_counts, release_counts: release_counts)
141-
page.internet_points(stats)
136+
fn internet_points(ctx: Context) -> Response {
137+
let assert Ok(internet_points) = storage.internet_points(ctx.db)
138+
page.internet_points(internet_points)
142139
|> wisp.html_response(200)
143140
}
144141

src/packages/storage.gleam

Lines changed: 82 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -474,54 +474,100 @@ pub fn try_fold_packages(
474474

475475
fn try_fold_releases(
476476
database: Database,
477+
package: String,
477478
initial: acc,
478479
folder: fn(acc, Release) -> Result(acc, Error),
479480
) -> Result(acc, Error) {
480-
try_fold_packages(database, initial, fn(acc, package) {
481-
use releases <- result.try(list_releases(database, package.name))
482-
list.try_fold(releases, acc, fn(acc, version) {
483-
use release <- result.try(get_release(database, package.name, version))
484-
folder(acc, release)
485-
})
481+
use releases <- result.try(list_releases(database, package))
482+
list.try_fold(releases, initial, fn(acc, version) {
483+
use release <- result.try(get_release(database, package, version))
484+
folder(acc, release)
486485
})
487486
}
488487

489-
pub fn new_package_count_per_day(
490-
database: Database,
491-
) -> Result(List(#(String, Int)), Error) {
492-
use packages <- result.try(
493-
try_fold_packages(database, dict.new(), fn(counts, package) {
494-
package.inserted_in_hex_at
495-
|> date_string
496-
|> dict.upsert(counts, _, fn(c) { option.unwrap(c, 0) + 1 })
497-
|> Ok
488+
pub type InternetPoints {
489+
InternetPoints(
490+
package_counts: List(#(String, Int)),
491+
release_counts: List(#(String, Int)),
492+
owner_download_counts: List(#(String, Int)),
493+
owner_package_counts: List(#(String, Int)),
494+
)
495+
}
496+
497+
type InternetPointsAcc {
498+
InternetPointsAcc(
499+
package_counts: dict.Dict(String, Int),
500+
release_counts: dict.Dict(String, Int),
501+
owner_download_counts: dict.Dict(String, Int),
502+
owner_package_counts: dict.Dict(String, Int),
503+
)
504+
}
505+
506+
pub fn internet_points(database: Database) -> Result(InternetPoints, Error) {
507+
let acc = InternetPointsAcc(dict.new(), dict.new(), dict.new(), dict.new())
508+
509+
use acc <- result.try(
510+
try_fold_packages(database, acc, fn(acc, package) {
511+
let count_for_owners = fn(counts, amount) {
512+
list.fold(package.owners, counts, fn(counts, owner) {
513+
dict.upsert(counts, owner, fn(c) { option.unwrap(c, 0) + amount })
514+
})
515+
}
516+
let count_for_dates = fn(counts, date) {
517+
date
518+
|> date_string
519+
|> dict.upsert(counts, _, fn(c) { option.unwrap(c, 0) + 1 })
520+
}
521+
522+
let owner_package_counts = count_for_owners(acc.owner_package_counts, 1)
523+
let owner_download_counts =
524+
count_for_owners(acc.owner_download_counts, package.downloads_all)
525+
let package_counts =
526+
count_for_dates(acc.package_counts, package.inserted_in_hex_at)
527+
528+
use release_counts <- result.try(
529+
try_fold_releases(
530+
database,
531+
package.name,
532+
acc.release_counts,
533+
fn(counts, release) {
534+
release.inserted_in_hex_at
535+
|> date_string
536+
|> dict.upsert(counts, _, fn(c) { option.unwrap(c, 0) + 1 })
537+
|> Ok
538+
},
539+
),
540+
)
541+
542+
let acc =
543+
InternetPointsAcc(
544+
release_counts:,
545+
package_counts:,
546+
owner_download_counts:,
547+
owner_package_counts:,
548+
)
549+
Ok(acc)
498550
}),
499551
)
500-
packages
501-
|> dict.to_list
502-
|> list.sort(fn(a, b) { int.compare(a.1, b.1) })
503-
|> Ok
552+
553+
Ok(InternetPoints(
554+
package_counts: acc.package_counts
555+
|> dict.to_list
556+
|> list.sort(fn(a, b) { string.compare(a.0, b.0) }),
557+
release_counts: acc.package_counts
558+
|> dict.to_list
559+
|> list.sort(fn(a, b) { string.compare(a.0, b.0) }),
560+
owner_download_counts: acc.owner_download_counts
561+
|> dict.to_list
562+
|> list.sort(fn(a, b) { int.compare(b.1, a.1) }),
563+
owner_package_counts: acc.owner_package_counts
564+
|> dict.to_list
565+
|> list.sort(fn(a, b) { int.compare(b.1, a.1) }),
566+
))
504567
}
505568

506569
fn date_string(timestamp: Timestamp) -> String {
507570
timestamp
508571
|> timestamp.to_rfc3339(calendar.utc_offset)
509572
|> string.slice(0, 10)
510573
}
511-
512-
pub fn new_release_count_per_day(
513-
database: Database,
514-
) -> Result(List(#(String, Int)), Error) {
515-
use releases <- result.try(
516-
try_fold_releases(database, dict.new(), fn(counts, release) {
517-
release.inserted_in_hex_at
518-
|> date_string
519-
|> dict.upsert(counts, _, fn(c) { option.unwrap(c, 0) + 1 })
520-
|> Ok
521-
}),
522-
)
523-
releases
524-
|> dict.to_list
525-
|> list.sort(fn(a, b) { int.compare(a.1, b.1) })
526-
|> Ok
527-
}

src/packages/web/page.gleam

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,22 @@ pub fn packages_list(
2323
|> layout
2424
}
2525

26-
pub type Stats {
27-
Stats(
28-
package_counts: List(#(String, Int)),
29-
release_counts: List(#(String, Int)),
30-
)
31-
}
26+
pub fn internet_points(stats: storage.InternetPoints) -> String {
27+
let count_list = fn(rows) {
28+
rows
29+
|> list.take(50)
30+
|> list.map(fn(row) {
31+
let #(name, count) = row
32+
html.li([], [html.text(name <> ": " <> int.to_string(count))])
33+
})
34+
|> html.ol([], _)
35+
}
3236

33-
pub fn internet_points(stats: Stats) -> String {
3437
html.div([], [
38+
html.h2([], [html.text("Package owners total downloads")]),
39+
count_list(stats.owner_download_counts),
40+
html.h2([], [html.text("Package owners number of packages")]),
41+
count_list(stats.owner_package_counts),
3542
html.script([attribute.src("https://cdn.plot.ly/plotly-2.30.0.min.js")], ""),
3643
line_chart("Package count", stats.package_counts),
3744
line_chart("Release count", stats.release_counts),

0 commit comments

Comments
 (0)