Sources/XCMetricsBackendLib/Common/Models/BuildMetrics.swift (97 lines of code) (raw):

// Copyright (c) 2020 Spotify AB. // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. import Vapor /// Wraps the data of a whole XCMetrics Build final class BuildMetrics: Content { init(build: Build, targets: [Target], steps: [Step], warnings: [BuildWarning]?, errors: [BuildError]?, notes: [BuildNote]?, swiftFunctions: [SwiftFunction]?, swiftTypeChecks: [SwiftTypeChecks]?, host: BuildHost, xcodeVersion: XcodeVersion?, buildMetadata: BuildMetadata?) { self.build = build self.targets = targets self.steps = steps self.warnings = warnings self.errors = errors self.notes = notes self.swiftFunctions = swiftFunctions self.swiftTypeChecks = swiftTypeChecks self.host = host self.xcodeVersion = xcodeVersion self.buildMetadata = buildMetadata } /// Build data, mandatory let build: Build let targets: [Target] let steps: [Step] let warnings: [BuildWarning]? let errors: [BuildError]? let notes: [BuildNote]? let swiftFunctions: [SwiftFunction]? let swiftTypeChecks: [SwiftTypeChecks]? let host: BuildHost let xcodeVersion: XcodeVersion? /// Build metadata, can be nil if the user decided not to collect it let buildMetadata: BuildMetadata? } extension BuildMetrics { func withHost(_ newBuildHost: BuildHost) -> BuildMetrics { return BuildMetrics(build: build, targets: targets, steps: steps, warnings: warnings, errors: errors, notes: notes, swiftFunctions: swiftFunctions, swiftTypeChecks: swiftTypeChecks, host: newBuildHost, xcodeVersion: xcodeVersion, buildMetadata: buildMetadata) } func withXcodeVersion(_ newXcodeVersion: XcodeVersion?) -> BuildMetrics { return BuildMetrics(build: build, targets: targets, steps: steps, warnings: warnings, errors: errors, notes: notes, swiftFunctions: swiftFunctions, swiftTypeChecks: swiftTypeChecks, host: host, xcodeVersion: newXcodeVersion, buildMetadata: buildMetadata) } func withBuildMetadata(_ newBuildMetadata: BuildMetadata?) -> BuildMetrics { return BuildMetrics(build: build, targets: targets, steps: steps, warnings: warnings, errors: errors, notes: notes, swiftFunctions: swiftFunctions, swiftTypeChecks: swiftTypeChecks, host: host, xcodeVersion: xcodeVersion, buildMetadata: newBuildMetadata) } func addDayToMetrics() -> BuildMetrics { let start = self.build.startTimestamp guard let day = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: start) else { return self } let mirror = Mirror.init(reflecting: self) mirror.children.forEach { child in if var p = child.value as? PartitionedByDay { p.day = day } if let list = child.value as? Array<PartitionedByDay> { list.forEach { p in var p = p p.day = day } } } return self } }