Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion WordPressKit.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "WordPressKit"
s.version = "4.1.2-beta.1"
s.version = "4.1.2-beta.2"
s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API."

s.description = <<-DESC
Expand Down
124 changes: 111 additions & 13 deletions WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {

public static func queryProperties(with date: Date, period: StatsPeriodUnit, maxCount: Int) -> [String : String] {
return ["unit": period.stringValue,
"quantity": String(maxCount)]
"quantity": String(maxCount),
"stat_fields": "views,visitors,comments"]
}

public init?(date: Date, period: StatsPeriodUnit, jsonDictionary: [String : AnyObject]) {
Expand All @@ -69,7 +70,6 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {
let periodIndex = fieldsArray.firstIndex(of: "period"),
let viewsIndex = fieldsArray.firstIndex(of: "views"),
let visitorsIndex = fieldsArray.firstIndex(of: "visitors"),
let likesIndex = fieldsArray.firstIndex(of: "likes"),
let commentsIndex = fieldsArray.firstIndex(of: "comments")
else {
return nil
Expand All @@ -82,7 +82,7 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {
periodIndex: periodIndex,
viewsIndex: viewsIndex,
visitorsIndex: visitorsIndex,
likesIndex: likesIndex,
likesIndex: nil,
commentsIndex: commentsIndex) }
}
}
Expand All @@ -91,23 +91,61 @@ private extension StatsSummaryData {
init?(dataArray: [Any],
period: StatsPeriodUnit,
periodIndex: Int,
viewsIndex: Int,
visitorsIndex: Int,
likesIndex: Int,
commentsIndex: Int) {
viewsIndex: Int?,
visitorsIndex: Int?,
likesIndex: Int?,
commentsIndex: Int?) {

guard
let periodString = dataArray[periodIndex] as? String,
let periodStart = type(of: self).parsedDate(from: periodString, for: period),
let viewsCount = dataArray[viewsIndex] as? Int,
let visitorsCount = dataArray[visitorsIndex] as? Int,
let likesCount = dataArray[likesIndex] as? Int,
let commentsCount = dataArray[commentsIndex] as? Int
else {
let periodStart = type(of: self).parsedDate(from: periodString, for: period) else {
return nil
}

let viewsCount: Int
let visitorsCount: Int
let likesCount: Int
let commentsCount: Int

if let viewsIndex = viewsIndex {
guard let count = dataArray[viewsIndex] as? Int else {
return nil
}
viewsCount = count
} else {
viewsCount = 0
}

if let visitorsIndex = visitorsIndex {
guard let count = dataArray[visitorsIndex] as? Int else {
return nil
}
visitorsCount = count
} else {
visitorsCount = 0
}

if let likesIndex = likesIndex {
guard let count = dataArray[likesIndex] as? Int else {
return nil
}
likesCount = count
} else {
likesCount = 0
}

if let commentsIndex = commentsIndex {
guard let count = dataArray[commentsIndex] as? Int else {
return nil
}
commentsCount = count
} else {
commentsCount = 0
}

self.period = period
self.periodStartDate = periodStart

self.viewsCount = viewsCount
self.visitorsCount = visitorsCount
self.likesCount = likesCount
Expand Down Expand Up @@ -146,3 +184,63 @@ private extension StatsSummaryData {
return df
}
}


/// So this is very awkward and neccessiated by our API. Turns out, calculating likes
/// for long periods of times (months/years) on large sites takes _ages_ (up to a minute sometimes).
/// Thankfully, calculating views/visitors/comments takes a much shorter time. (~2s, which is still suuuuuper long, but acceptable.)
/// We don't want to wait a whole minute to display the rest of the data, so we fetch the likes separately.
public struct StatsLikesSummaryTimeIntervalData {

public let period: StatsPeriodUnit
public let periodEndDate: Date

public let summaryData: [StatsSummaryData]

public init(period: StatsPeriodUnit,
periodEndDate: Date,
summaryData: [StatsSummaryData]) {
self.period = period
self.periodEndDate = periodEndDate
self.summaryData = summaryData
}
}

extension StatsLikesSummaryTimeIntervalData: StatsTimeIntervalData {

public static var pathComponent: String {
return "stats/visits"
}

public static func queryProperties(with date: Date, period: StatsPeriodUnit, maxCount: Int) -> [String : String] {
return ["unit": period.stringValue,
"quantity": String(maxCount),
"stat_fields": "likes"]
}

public init?(date: Date, period: StatsPeriodUnit, jsonDictionary: [String : AnyObject]) {
guard
let fieldsArray = jsonDictionary["fields"] as? [String],
let data = jsonDictionary["data"] as? [[Any]]
else {
return nil
}

guard
let periodIndex = fieldsArray.firstIndex(of: "period"),
let likesIndex = fieldsArray.firstIndex(of: "likes") else {
return nil
}

self.period = period
self.periodEndDate = date
self.summaryData = data.compactMap { StatsSummaryData(dataArray: $0,
period: period,
periodIndex: periodIndex,
viewsIndex: nil,
visitorsIndex: nil,
likesIndex: likesIndex,
commentsIndex: nil) }
}
}

51 changes: 45 additions & 6 deletions WordPressKitTests/StatsRemoteV2Tests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -381,15 +381,15 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

XCTAssertEqual(summary?.summaryData[0].viewsCount, 5140)
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 3560)
XCTAssertEqual(summary?.summaryData[0].likesCount, 70)
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
XCTAssertEqual(summary?.summaryData[0].commentsCount, 1)

let nineDaysAgo = Calendar.autoupdatingCurrent.date(byAdding: .day, value: -9, to: date)!
XCTAssertEqual(summary?.summaryData[0].periodStartDate, nineDaysAgo)

XCTAssertEqual(summary?.summaryData[9].viewsCount, 3244)
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 2127)
XCTAssertEqual(summary?.summaryData[9].likesCount, 25)
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)
XCTAssertEqual(summary?.summaryData[9].periodStartDate, date)

Expand Down Expand Up @@ -490,7 +490,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

XCTAssertEqual(summary?.summaryData[0].viewsCount, 32603)
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 23205)
XCTAssertEqual(summary?.summaryData[0].likesCount, 855)
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
XCTAssertEqual(summary?.summaryData[0].commentsCount, 44)

let dec17 = DateComponents(year: 2018, month: 12, day: 17)
Expand All @@ -499,7 +499,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

XCTAssertEqual(summary?.summaryData[9].viewsCount, 17162)
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 11490)
XCTAssertEqual(summary?.summaryData[9].likesCount, 126)
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)

XCTAssertEqual(summary?.summaryData[9].periodStartDate, Calendar.autoupdatingCurrent.date(byAdding: .day,
Expand Down Expand Up @@ -529,7 +529,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

XCTAssertEqual(summary?.summaryData[0].viewsCount, 3496)
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 398)
XCTAssertEqual(summary?.summaryData[0].likesCount, 72)
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
XCTAssertEqual(summary?.summaryData[0].commentsCount, 0)

let may1 = DateComponents(year: 2018, month: 5, day: 1)
Expand All @@ -538,7 +538,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

XCTAssertEqual(summary?.summaryData[9].viewsCount, 2569)
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 334)
XCTAssertEqual(summary?.summaryData[9].likesCount, 116)
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)

let nineMonthsFromMay1 = Calendar.autoupdatingCurrent.date(byAdding: .month, value: 9, to: may1Date)!
Expand All @@ -550,4 +550,43 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {

waitForExpectations(timeout: timeout, handler: nil)
}

func testLikesForMonth() {
let expect = expectation(description: "It should return likes data for a month")

stubRemoteResponse(siteVisitsDataEndpoint, filename: getVisitsMonthMockFilename, contentType: .ApplicationJSON)

let feb21 = DateComponents(year: 2019, month: 2, day: 21)
let date = Calendar.autoupdatingCurrent.date(from: feb21)!


remote.getData(for: .month, endingOn: date) { (summary: StatsLikesSummaryTimeIntervalData?, error: Error?) in
XCTAssertNil(error)
XCTAssertNotNil(summary)

XCTAssertEqual(summary?.summaryData.count, 10)

XCTAssertEqual(summary?.summaryData[0].viewsCount, 0)
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 0)
XCTAssertEqual(summary?.summaryData[0].likesCount, 72)
XCTAssertEqual(summary?.summaryData[0].commentsCount, 0)

let may1 = DateComponents(year: 2018, month: 5, day: 1)
let may1Date = Calendar.autoupdatingCurrent.date(from: may1)!
XCTAssertEqual(summary?.summaryData[0].periodStartDate, may1Date)

XCTAssertEqual(summary?.summaryData[9].viewsCount, 0)
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 0)
XCTAssertEqual(summary?.summaryData[9].likesCount, 116)
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)

let nineMonthsFromMay1 = Calendar.autoupdatingCurrent.date(byAdding: .month, value: 9, to: may1Date)!

XCTAssertEqual(summary?.summaryData[9].periodStartDate, nineMonthsFromMay1)

expect.fulfill()
}

waitForExpectations(timeout: timeout, handler: nil)
}
}