feat: moves swift abstractions to microsoft/kiota-swift for sanity

This commit is contained in:
Vincent Biret 2024-07-23 09:22:01 -04:00
Родитель 11d8349e1f
Коммит 8436281c56
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 32426322EDFFB7E3
28 изменённых файлов: 5 добавлений и 463 удалений

26
.github/workflows/abstractions-swift.yml поставляемый
Просмотреть файл

@ -1,26 +0,0 @@
name: Swift abstractions
on:
workflow_dispatch:
push:
branches: [ main ]
paths: ['abstractions/swift/**', '.github/workflows/**']
pull_request:
paths: ['abstractions/swift/**', '.github/workflows/**']
jobs:
build:
runs-on: ubuntu-latest
env:
relativePath: ./abstractions/swift
steps:
- uses: actions/checkout@v4
- uses: swift-actions/setup-swift@v2
with:
swift-version: '5.7'
- name: Build SDK project
run: swift build
working-directory: ${{ env.relativePath }}
- name: Run unit tests
run: swift test
working-directory: ${{ env.relativePath }}

Просмотреть файл

@ -3,10 +3,11 @@
The Kiota abstractions are language specific libraries defining the basic constructs Kiota projects need once an SDK has been generated from an OpenAPI definition.
Your project will need a reference to the abstraction package to build and run, the following languages are currently supported:
- [Dotnet](https://github.com/microsoft/kiota-abstractions-dotnet)
- [Java](https://github.com/microsoft/kiota-java/tree/main/components/abstractions)
- [Dotnet](https://github.com/microsoft/kiota-dotnet/tree/main/src/abstractions)
- [Go](https://github.com/microsoft/kiota-abstractions-go)
- [Ruby](https://github.com/microsoft/kiota-abstractions-ruby)
- [TypeScript](https://github.com/microsoft/kiota-typescript/tree/main/packages/abstractions)
- [Java](https://github.com/microsoft/kiota-java/tree/main/components/abstractions)
- [PHP](https://github.com/microsoft/kiota-abstractions-php)
- [Python](https://github.com/microsoft/kiota-abstractions-python)
- [Ruby](https://github.com/microsoft/kiota-abstractions-ruby)
- [Swift](https://github.com/microsoft/kiota-swift/tree/main/abstractions)
- [TypeScript](https://github.com/microsoft/kiota-typescript/tree/main/packages/abstractions)

9
abstractions/swift/.gitignore поставляемый
Просмотреть файл

@ -1,9 +0,0 @@
.DS_Store
/.build
/Packages
/*.xcodeproj
xcuserdata/
DerivedData/
.swiftpm/config/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc

Просмотреть файл

@ -1,20 +0,0 @@
Pod::Spec.new do |s|
s.name = "MicrosoftKiotaAbstractions"
s.version = "1.0.0"
s.summary = "MicrosoftKiotaAbstractions provides the base infrastructure for the Kiota-generated SDKs to function.
It defines multiple concepts related to abstract HTTP requests, serialization, and authentication.
These concepts can then be implemented independently without tying the SDKs to any specific implementation.
Kiota also provides default implementations for these concepts."
s.homepage = "https://github.com/microsoft/kiota"
s.license = { :type => "MIT" }
s.authors = { "Microsoft" => "graphtooling+kiota@service.microsoft.com" }
s.requires_arc = true
s.swift_version = "5.0"
s.osx.deployment_target = "10.9"
s.ios.deployment_target = "9.0"
s.watchos.deployment_target = "3.0"
s.tvos.deployment_target = "9.0"
s.source = { :git => "https://github.com/microsoft/kiota.git", :tag => s.version }
s.source_files = "Source/*.swift"
end

Просмотреть файл

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:MicrosoftKiotaAbstractions.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

Просмотреть файл

@ -1,34 +0,0 @@
{
"object": {
"pins": [
{
"package": "PathKit",
"repositoryURL": "https://github.com/kylef/PathKit.git",
"state": {
"branch": null,
"revision": "3bfd2737b700b9a36565a8c94f4ad2b050a5e574",
"version": "1.0.1"
}
},
{
"package": "Spectre",
"repositoryURL": "https://github.com/kylef/Spectre.git",
"state": {
"branch": null,
"revision": "26cc5e9ae0947092c7139ef7ba612e34646086c7",
"version": "0.10.1"
}
},
{
"package": "URITemplate",
"repositoryURL": "https://github.com/kylef/URITemplate.swift.git",
"state": {
"branch": null,
"revision": "a309673fdf86e4919a0250730e461ac533a03b3a",
"version": "3.0.1"
}
}
]
},
"version": 1
}

Просмотреть файл

@ -1,17 +0,0 @@
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "MicrosoftKiotaAbstractions",
products: [
.library(name: "MicrosoftKiotaAbstractions", targets: ["MicrosoftKiotaAbstractions"])
],
dependencies: [
.package(url: "https://github.com/kylef/URITemplate.swift.git", from: "3.0.0")
],
targets: [
.target(name: "MicrosoftKiotaAbstractions", dependencies: ["URITemplate"]),
.testTarget(name: "MicrosoftKiotaAbstractionsTests", dependencies: ["MicrosoftKiotaAbstractions"])
],
swiftLanguageVersions: [.v5]
)

Просмотреть файл

@ -1,23 +0,0 @@
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
target 'MicrosoftKiotaAbstractions' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for MicrosoftKiotaAbstractions
pod 'URITemplate'
target 'MicrosoftKiotaAbstractionsTests' do
# Pods for testing
end
end
target 'MicrosoftKiotaAbstractionsPackageDescription' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for MicrosoftKiotaAbstractionsPackageDescription
end

Просмотреть файл

@ -1,33 +0,0 @@
public class ApiClientBuilder {
private init() {
}
private static let defaultSerializationWriterFactoryInstanceIntl = SerializationWriterFactoryRegistry()
public static var defaultSerializationWriterFactoryInstance: SerializationWriterFactory {
get {
return defaultSerializationWriterFactoryInstanceIntl
}
}
public static func registerDefaultSerializer(metaFactory: () -> SerializationWriterFactory) {
let factory = metaFactory()
if let contentType = try? factory.getValidContentType() {
if contentType != "" {
defaultSerializationWriterFactoryInstanceIntl.contentTypeAssociatedFactories[contentType] = factory
}
}
}
private static let defaultParseNodeFactoryInstanceIntl = ParseNodeFactoryRegistry()
public static var defaultParseNodeFactoryInstance: ParseNodeFactory {
get {
return defaultParseNodeFactoryInstanceIntl
}
}
public static func registerDefaultParser(metaFactory: () -> ParseNodeFactory) {
let factory = metaFactory()
if let contentType = try? factory.getValidContentType() {
if contentType != "" {
defaultParseNodeFactoryInstanceIntl.contentTypeAssociatedFactories[contentType] = factory
}
}
}
}

Просмотреть файл

@ -1,3 +0,0 @@
public enum ApiError: Error {
case unknownError(String, Any? = nil)
}

Просмотреть файл

@ -1,6 +0,0 @@
import Foundation
public protocol AccessTokenProvider {
func getAuthenticationToken(url: URL) async throws -> String?
var allowedHostsValidator: AllowedHostsValidator { get }
}

Просмотреть файл

@ -1,25 +0,0 @@
import Foundation
public class AllowedHostsValidator {
private var validHostsIntl = Set<String>()
public init(validHosts: [String]) {
self.validHosts = validHosts;
}
public var validHosts: [String] { get {
return Array(validHostsIntl)
} set (validHosts) {
self.validHostsIntl = Set(validHosts.map { $0.lowercased() })
}}
public func isUrlHostValid(url: URL) -> Bool {
if let host = url.host {
return validHostsIntl.contains(host.lowercased())
}
return false
}
}
public let isSchemeHttps = { (url: URL) -> Bool in
if let scheme = url.scheme {
return scheme.lowercased() == "https"
}
return false
}

Просмотреть файл

@ -1,5 +0,0 @@
public class AnonymousAuthenticationProvider : AuthenticationProvider {
public func authenticateRequest(request: RequestInformation) async throws {
// Do nothing
}
}

Просмотреть файл

@ -1,3 +0,0 @@
public protocol AuthenticationProvider {
func authenticateRequest(request: RequestInformation) async throws
}

Просмотреть файл

@ -1,22 +0,0 @@
public class BaseBearerAuthenticationProvider : AuthenticationProvider {
public init (accessTokenProvider: AccessTokenProvider) {
accessTokenProviderIntl = accessTokenProvider
}
private var accessTokenProviderIntl: AccessTokenProvider
public var accessTokenProvider: AccessTokenProvider {
get {
return accessTokenProviderIntl
}
}
public let authorizationHeaderKey = "Authorization"
public let authorizationHeaderValuePrefix = "Bearer "
public func authenticateRequest(request: RequestInformation) async throws {
if request.headers[authorizationHeaderKey] == nil {
let url = try request.getUri()
let tokenResult = try? await accessTokenProvider.getAuthenticationToken(url: url)
if let token = tokenResult {
request.headers[authorizationHeaderKey] = authorizationHeaderValuePrefix + token
}
}
}
}

Просмотреть файл

@ -1,11 +0,0 @@
public enum HttpMethod {
case get
case post
case patch
case delete
case options
case connect
case put
case trace
case head
}

Просмотреть файл

@ -1,11 +0,0 @@
public typealias ErrorMappings = [String:ParsableFactory]
public typealias ResponseHandler<DeserializationType> = (Any, ErrorMappings) async throws -> DeserializationType
public protocol RequestAdapter {
func send<T:Parsable>(request: RequestInformation, ctor: ParsableFactory, responseHandler: ResponseHandler<T>?, errorMappings: ErrorMappings?) async throws -> T?
func sendCollection<T:Parsable>(request: RequestInformation, ctor: ParsableFactory, responseHandler: ResponseHandler<T>?, errorMappings: ErrorMappings?) async throws -> [T]?
func sendPrimitive<T>(request: RequestInformation, responseHandler: ResponseHandler<T>?, errorMappings: ErrorMappings?) async throws -> T?
func sendNoContent(request: RequestInformation, responseHandler: ResponseHandler<Void>?, errorMappings: ErrorMappings?) async throws -> Void
func enableBackingStore() throws
var baseUrl: String { get set }
var serializationWriterFactory: SerializationWriterFactory { get }
}

Просмотреть файл

@ -1,96 +0,0 @@
import Foundation
import URITemplate
public enum RequestInformationErrors : Error {
case emptyUrlTemplate
case emptyContentType
case unableToExpandUriTemplate
case invalidRawUrl
}
public class RequestInformation {
public var method: HttpMethod = HttpMethod.get
public var urlTemplate = ""
public var queryParameters = [String:String]()
public var pathParameters = [String:String]()
public var headers = [String:String]()
var contentInternal: Data?
public var content: Data? {
get {
return contentInternal
}
set(newContent) {
contentInternal = newContent
if newContent != nil {
headers[contentTypeHeaderKey] = binaryContentType
}
}
}
var uriInternal: URL?
public func getUri() throws -> URL {
if let uriInternalValue = uriInternal {
return uriInternalValue
}
guard !urlTemplate.isEmpty else {
throw RequestInformationErrors.emptyUrlTemplate
}
if let rawUrl = pathParameters[rawUrlKey] {
if rawUrl != "" {
let newValue = URL(string: rawUrl)
if let url = newValue {
setUri(newUri: url)
return url
}
}
throw RequestInformationErrors.invalidRawUrl
} else {
let urlTemplate = URITemplate(template: self.urlTemplate)
let merged = pathParameters.merging(queryParameters)
{ (first, _) in first }
let url = urlTemplate.expand(merged)
if let newValue = URL(string: url) {
return newValue
} else {
throw RequestInformationErrors.unableToExpandUriTemplate
}
}
}
public func setUri(newUri: URL) {
uriInternal = newUri
pathParameters.removeAll()
queryParameters.removeAll()
}
var options = [String:RequestOption]()
let rawUrlKey = "request-raw-url"
let contentTypeHeaderKey = "Content-Type"
let binaryContentType = "application/octet-stream"
public func addRequestOption(options:RequestOption...) {
for option in options {
self.options[option.key] = option
}
}
public func getRequestOptions() -> [RequestOption] {
return [RequestOption](options.values)
}
public func setContentFromParsable<T: Parsable>(requestAdapter: RequestAdapter, contentType: String, item: T) throws {
guard contentType != "" else {
throw RequestInformationErrors.emptyContentType
}
if let writer = try? requestAdapter.serializationWriterFactory.getSerializationWriter(contentType: contentType) {
try writer.writeObjectValue(key: "", value: item)
self.content = try? writer.getSerializedContent()
self.headers[contentTypeHeaderKey] = contentType
}
}
public func setContentFromParsableCollection<T: Parsable>(requestAdapter: RequestAdapter, contentType: String, items: [T]) throws {
guard contentType != "" else {
throw RequestInformationErrors.emptyContentType
}
if let writer = try? requestAdapter.serializationWriterFactory.getSerializationWriter(contentType: contentType) {
try writer.writeCollectionOfObjectValues(key: "", value: items)
self.content = try? writer.getSerializedContent()
self.headers[contentTypeHeaderKey] = contentType
}
}
//TODO add query parameters from object by reflection
}

Просмотреть файл

@ -1,3 +0,0 @@
public protocol RequestOption {
var key: String { get }
}

Просмотреть файл

@ -1,3 +0,0 @@
public protocol AdditionalDataHolder {
var additionalData : [String:Any] { get set }
}

Просмотреть файл

@ -1,6 +0,0 @@
public typealias FieldDeserializer<T> = (T, ParseNode) throws -> Void
public typealias ParsableFactory = (ParseNode) throws -> Parsable
public protocol Parsable {
func serialize(writer: SerializationWriter) throws
func getFieldDeserializers<T>() -> [String:FieldDeserializer<T>]
}

Просмотреть файл

@ -1,23 +0,0 @@
import Foundation
public protocol ParseNode {
func getChileNode(key: String) throws -> ParseNode?
func getObjectValue<T:Parsable>(ctor: ParsableFactory) throws -> T?
func getCollectionOfObjectValues<T:Parsable>(ctor: ParsableFactory) throws -> [T]?
func getCollectionOfPrimitiveValues<T>() throws -> [T]?
func getStringValue() throws -> String?
func getBoolValue() throws -> Bool?
func getUint8Value() throws -> UInt8?
func getInt8Value() throws -> Int8?
func getInt32Value() throws -> Int32?
func getInt64Value() throws -> Int64?
func getFloat32Value() throws -> Float32?
func getFloat64Value() throws -> Float64?
func getByteArrayValue() throws -> [UInt8]?
func getDateValue() throws -> Date? //TODO
func getTimeOnlyValue() throws -> Date? //TODO
func getDateOnlyValue() throws -> Date?
func getDurationValue() throws -> Date? //TODO
func getUUIDValue() throws -> UUID?
func getAdditionalData() throws -> [String:Any]?
//TODO get enum value & get collection of enum values
}

Просмотреть файл

@ -1,5 +0,0 @@
import Foundation
public protocol ParseNodeFactory {
func getValidContentType() throws -> String
func getRootParseNode(contentType: String, content: Data?) throws -> ParseNode
}

Просмотреть файл

@ -1,21 +0,0 @@
import Foundation
public enum ParseNodeFactoryRegistryErrors : Error {
case registrySupportsMultipleTypesGetOneFactory
case factoryNotFoundForContentType
case contentCannotBeNil
}
public class ParseNodeFactoryRegistry : ParseNodeFactory {
public var contentTypeAssociatedFactories = [String:ParseNodeFactory]()
public func getValidContentType() throws -> String {
throw ParseNodeFactoryRegistryErrors.registrySupportsMultipleTypesGetOneFactory
}
public func getRootParseNode(contentType: String, content: Data?) throws -> ParseNode {
guard let factory = contentTypeAssociatedFactories[contentType] else {
throw ParseNodeFactoryRegistryErrors.factoryNotFoundForContentType
}
guard content != nil else {
throw ParseNodeFactoryRegistryErrors.contentCannotBeNil
}
return try factory.getRootParseNode(contentType: contentType, content: content)
}
}

Просмотреть файл

@ -1,24 +0,0 @@
import Foundation
public protocol SerializationWriter {
func writeStringValue(key : String, value : String?) throws
func writeBoolValue(key : String, value : Bool?) throws
func writeUint8Value(key : String, value : UInt8?) throws
func writeInt8Value(key : String, value : Int8?) throws
func writeInt32Value(key : String, value : Int32?) throws
func writeInt64Value(key : String, value : Int64?) throws
func writeFloat32Value(key : String, value : Float32?) throws
func writeFloat64Value(key : String, value : Float64?) throws
func writeByteArrayValue(key : String, value : [UInt8]) throws
func writeDateValue(key : String, value : Date?) throws //TODO
func writeTimeOnlyValue(key : String, value : Date?) throws //TODO
func writeDateOnlyValue(key : String, value : Date?) throws
func writeDurationValue(key : String, value : Date?) throws //TODO
func writeUUIDValue(key : String, value : UUID?) throws
func writeObjectValue<T: Parsable>(key: String, value: T) throws
func writeCollectionOfObjectValues<T: Parsable>(key: String, value: [T]) throws
func writeCollectionOfPrimitiveValues<T>(key: String, value: [T]) throws
func getSerializedContent() throws -> Data?
func writeAdditionalData(value: [String:Any]?) throws
//TODO write enum value & write collection of enum values
}

Просмотреть файл

@ -1,4 +0,0 @@
public protocol SerializationWriterFactory {
func getValidContentType() throws -> String
func getSerializationWriter(contentType: String) throws -> SerializationWriter
}

Просмотреть файл

@ -1,16 +0,0 @@
public enum SerializationWriterFactoryRegistryErrors : Error {
case registrySupportsMultipleTypesGetOneFactory
case factoryNotFoundForContentType
}
public class SerializationWriterFactoryRegistry : SerializationWriterFactory {
public var contentTypeAssociatedFactories = [String:SerializationWriterFactory]()
public func getValidContentType() throws -> String {
throw SerializationWriterFactoryRegistryErrors.registrySupportsMultipleTypesGetOneFactory
}
public func getSerializationWriter(contentType: String) throws -> SerializationWriter {
guard let factory = contentTypeAssociatedFactories[contentType] else {
throw SerializationWriterFactoryRegistryErrors.factoryNotFoundForContentType
}
return try factory.getSerializationWriter(contentType: contentType)
}
}