Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replaced default remote repo provider #67

Merged
merged 3 commits into from
Jan 14, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
35 changes: 15 additions & 20 deletions Sources/AnalyticsGen/Commands/GenerateCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import PromiseKit
import AnalyticsGenTools

final class GenerateCommand: AsyncExecutableCommand {

// MARK: - Instance Properties

let name = "generate"
let shortDescription = "Generate analytics events from schemas"

let configurationPath = Key<String>(
"--config",
"-c",
Expand All @@ -19,15 +19,15 @@ final class GenerateCommand: AsyncExecutableCommand {
Defaults to '\(String.defaultConfigurationPath)'.
"""
)

let force = Flag(
"--force",
description: """
Regenerate all analytics events ignoring last commit in lock file.
By default, generation will perform only if has new commits.
"""
)

let debug = Flag(
"--debug",
description: "Enable debug logging."
Expand All @@ -38,43 +38,38 @@ final class GenerateCommand: AsyncExecutableCommand {
"-p",
description: "Enter custom remote repository provider. Default - Forgejo"
)

var generator: EventGenerator?

let dependeciesGenerator: DependenciesGenerator
private(set) var generator: EventGenerator?
private let fileProvider: FileProvider = YAMLFileProvider()

init(
dependeciesGenerator: DependenciesGenerator = DefaultDependeciesGenerator()
) {
self.dependeciesGenerator = dependeciesGenerator
}

// MARK: - AsyncExecutableCommand

func executeAsyncAndExit() throws {

let configurationPath = self.configurationPath.value ?? .defaultConfigurationPath

let selectedRemoteRepoProvider = self.provider.value ?? .defaultRemoteRepoProvider

do {
self.generator = try dependeciesGenerator.createGenerator(for: selectedRemoteRepoProvider)
} catch {
self.fail(message: "Failed create generator: \(error)")
}
let configuration = try fileProvider.readFile(at: configurationPath, type: Configuration.self)
generator = try dependeciesGenerator.createGenerator(for: selectedRemoteRepoProvider, remoteHost: configuration.remoteHost)

Log.isDebugLoggingEnabled = debug.value

guard let generator = generator else {
self.fail(message: "Failed to setup generator")
self.fail(message: "No generator setted up")
}

firstly {
generator.generate(configurationPath: configurationPath, force: force.value)
generator.generate(configuration: configuration, force: force.value)
}.done { result in
switch result {
case .success:
self.succeed(message: "Generation completed successfully!")

case .upToDate:
self.succeed(message: "Analytic events is up to date!")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,29 @@ final class DefaultDependeciesGenerator: DependenciesGenerator {
)
}

func createGenerator(for provider: String) throws -> EventGenerator {
let repoProviderType = RemoteRepoProviderType.from(string: provider)
func createGenerator(for provider: String, remoteHost: String) throws -> EventGenerator {

guard let baseURL = URL(string: remoteHost) else {
throw DependeciesGeneratorError.missingRemoteHostURI
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Скорее не missing, а не валидный URL?

}

let repoProviderType = try RemoteRepoProviderType.from(string: provider)

var remoteRepoProvider: RemoteRepoProvider?

switch repoProviderType {
case .forgejo:
remoteRepoProvider = ForgejoRemoteRepoProvider(httpService: httpService)
remoteRepoProvider = ForgejoRemoteRepoProvider(baseURL: baseURL, httpService: httpService)
case .github:
remoteRepoProvider = GitHubRemoteRepoProvider(httpService: httpService)
case .unknown:
throw DependeciesGeneratorError.unknownProvider
remoteRepoProvider = GitHubRemoteRepoProvider(baseURL: baseURL, httpService: httpService)
}

guard let remoteRepoProvider = remoteRepoProvider else {
throw DependeciesGeneratorError.unknownProvider
}

let remoteRepoReferenceFinder = RemoteRepoReferenceFinder(remoteRepoProvider: remoteRepoProvider)

return DefaultEventGenerator(
fileProvider: yamlFileProvider,
remoteRepoProvider: remoteRepoProvider,
Expand All @@ -54,14 +57,3 @@ final class DefaultDependeciesGenerator: DependenciesGenerator {
)
}
}

enum DependeciesGeneratorError: Error {
case unknownProvider

var errorDescription: String {
switch self {
case .unknownProvider:
"The specified remote repository provider is unknown"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Foundation

enum DependeciesGeneratorError: Error {
case unknownProvider
case missingRemoteHostURI

var errorDescription: String {
switch self {
case .unknownProvider:
"The specified remote repository provider is unknown"
case .missingRemoteHostURI:
"The remote repository URI is not specified or incorrect"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is not specified

По идее он должен быть дефолтный, если его не указали

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ protocol DependenciesGenerator {
var stencilExtensions: [StencilExtension] { get }
var templateRenderer: TemplateRenderer { get }

func createGenerator(for provider: String) throws -> EventGenerator
func createGenerator(for provider: String, remoteHost: String) throws -> EventGenerator
}
Original file line number Diff line number Diff line change
Expand Up @@ -433,9 +433,9 @@ final class DefaultEventGenerator: EventGenerator {

// MARK: - EventGenerator

func generate(configurationPath: String, force: Bool) -> Promise<EventGenerationResult> {
func generate(configuration: Configuration, force: Bool) -> Promise<EventGenerationResult> {
firstly {
Promise.value(try fileProvider.readFile(at: configurationPath, type: Configuration.self))
Promise.value(configuration)
}.map { configuration in
configuration.configurations.reversed()
}.get { configurations in
Expand Down
2 changes: 1 addition & 1 deletion Sources/AnalyticsGen/Generators/Event/EventGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ protocol EventGenerator {

// MARK: - Instance Methods

func generate(configurationPath: String, force: Bool) -> Promise<EventGenerationResult>
func generate(configuration: Configuration, force: Bool) -> Promise<EventGenerationResult>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import AnalyticsGenTools

struct Configuration: Decodable, Equatable {
let source: SourceConfiguration
let remoteHost: String
let destination: String?
let platform: EventPlatform?
let template: TemplateConfiguration?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ enum SourceConfiguration: Decodable, Equatable {

init(from decoder: Decoder) throws {
if let container = try? decoder.container(keyedBy: CodingKeys.self) {
//TODO: -
self = .remoteRepo(configuration: try container.decode(forKey: .remoteRepo))
} else {
self = .local(path: try String(from: decoder))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// RemoteRepoCommit.swift
// AnalyticsGen
//
// Created by v.barabanov on 10.01.2025.
//

import Foundation

struct ForgejoCommit: Decodable, Equatable {
Expand Down
7 changes: 0 additions & 7 deletions Sources/AnalyticsGen/Providers/Forgejo/DTOs/ForgejoRef.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// File.swift
// AnalyticsGen
//
// Created by v.barabanov on 10.01.2025.
//

import Foundation

struct ForgejoRef: Decodable, Equatable {
Expand Down
9 changes: 1 addition & 8 deletions Sources/AnalyticsGen/Providers/Forgejo/DTOs/QueryCount.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// QueryCount.swift
// AnalyticsGen
//
// Created by v.barabanov on 13.01.2025.
//

struct QueryCount: Encodable {
struct ForgejoQueryCount: Encodable {
let limit: Int
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ import ZIPFoundation
struct ForgejoRemoteRepoProvider: RemoteRepoProvider {

// MARK: - Instance Properties
private let baseURL = URL(string: "https://forgejo.pyn.ru/api/v1")!


let baseURL: URL
let httpService: HTTPService

init(
baseURL: URL,
httpService: HTTPService
) {
self.baseURL = baseURL
self.httpService = httpService
}

// MARK: - RemoteRepoProvider

Expand Down Expand Up @@ -109,7 +115,7 @@ struct ForgejoRemoteRepoProvider: RemoteRepoProvider {
method: .get,
url: requestURL,
headers: [.authorization(bearerToken: token)],
queryParameters: QueryCount(limit: count)
queryParameters: ForgejoQueryCount(limit: count)
)
)
.responseDecodable(type: [ForgejoRef].self) { httpResponse in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@ struct GitHubRemoteRepoProvider: RemoteRepoProvider {

// MARK: - Instance Properties

private let baseURL = URL(string: "https://api.github.com")!

// MARK: -

let baseURL: URL
let httpService: HTTPService

init(
baseURL: URL,
httpService: HTTPService
) {
self.baseURL = baseURL
self.httpService = httpService
}

// MARK: - RemoteRepoProvider

func fetchRepo(owner: String, repo: String, ref: String, token: String, key: String) -> Promise<URL> {
Expand Down
9 changes: 4 additions & 5 deletions Sources/AnalyticsGen/Providers/RemoteRepoProviderType.swift
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
enum RemoteRepoProviderType: String {
case forgejo = "forgejo"
case github = "github"
case unknown
case forgejo
case github

static func from(string: String) -> Self {
static func from(string: String) throws -> Self {
switch string.lowercased() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А можно же просто?

RemoteRepoProviderType(rawValue: string.lowercased())

case "forgejo":
return .forgejo
case "github":
return .github
default:
return .unknown
throw DependeciesGeneratorError.unknownProvider
}
}
}