Skip to content

Commit

Permalink
Merge pull request #5 from cpageler93/async-http-client
Browse files Browse the repository at this point in the history
Update to Async HTTP Client
  • Loading branch information
cpageler93 authored Oct 1, 2019
2 parents 4a69d52 + 61ea904 commit 6e8a5be
Show file tree
Hide file tree
Showing 33 changed files with 966 additions and 727 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

# ignore xcode project for Swift Package
*.xcodeproj
.swiftpm

## Build generated
build/
Expand Down Expand Up @@ -70,4 +71,4 @@ fastlane/screenshots
fastlane/test_output


.DS_Store
.DS_Store
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM swift:4.1
FROM swift:5.1

MAINTAINER Christoph Pageler

Expand All @@ -8,4 +8,4 @@ COPY . ./

RUN swift package resolve
RUN swift build
CMD swift test
CMD swift test
48 changes: 24 additions & 24 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,57 @@
"object": {
"pins": [
{
"package": "Alamofire",
"repositoryURL": "https://github.com/Alamofire/Alamofire",
"package": "async-http-client",
"repositoryURL": "https://github.com/swift-server/async-http-client",
"state": {
"branch": null,
"revision": "2fb881a1702cb1976c36192aceb54dcedab6fdc2",
"version": "4.7.2"
"revision": "d84a1da59e0fa879cde27e01cdf9f079208cc0cc",
"version": "1.0.0-alpha.4"
}
},
{
"package": "Commander",
"repositoryURL": "https://github.com/kylef/Commander",
"package": "console-kit",
"repositoryURL": "https://github.com/vapor/console-kit",
"state": {
"branch": null,
"revision": "e5b50ad7b2e91eeb828393e89b03577b16be7db9",
"version": "0.8.0"
"revision": "00ce1abaac919593897b6c60cecdbd4d6290b1f9",
"version": "4.0.0-alpha.2.1"
}
},
{
"package": "Quack",
"repositoryURL": "https://github.com/cpageler93/Quack",
"package": "swift-log",
"repositoryURL": "https://github.com/apple/swift-log.git",
"state": {
"branch": null,
"revision": "0694f6a3c4f965e4bcc7414f5d168dca5c426e01",
"version": "1.6.0"
"revision": "e8aabbe95db22e064ad42f1a4a9f8982664c70ed",
"version": "1.1.1"
}
},
{
"package": "Result",
"repositoryURL": "https://github.com/antitypical/Result.git",
"package": "swift-nio",
"repositoryURL": "https://github.com/apple/swift-nio.git",
"state": {
"branch": null,
"revision": "7477584259bfce2560a19e06ad9f71db441fff11",
"version": "3.2.4"
"revision": "9201908b54578aa33f1d1826a5a680aca8991843",
"version": "2.8.0"
}
},
{
"package": "Spectre",
"repositoryURL": "https://github.com/kylef/Spectre.git",
"package": "swift-nio-ssl",
"repositoryURL": "https://github.com/apple/swift-nio-ssl.git",
"state": {
"branch": null,
"revision": "e34d5687e1e9d865e3527dd58bc2f7464ef6d936",
"version": "0.8.0"
"revision": "f5dd7a60ff56f501ff7bf9be753e4b1875bfaf20",
"version": "2.4.0"
}
},
{
"package": "SwiftyJSON",
"repositoryURL": "https://github.com/IBM-Swift/SwiftyJSON.git",
"package": "SwiftyTextTable",
"repositoryURL": "https://github.com/scottrhoyt/SwiftyTextTable.git",
"state": {
"branch": null,
"revision": "7eb6c83f91c519c19e6a507d604c9176d5ae5b15",
"version": "17.0.1"
"revision": "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3",
"version": "0.9.0"
}
}
]
Expand Down
13 changes: 7 additions & 6 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:4.0
// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription
Expand All @@ -7,15 +7,16 @@ let package = Package(
name: "JiraSwift",
products: [
.library(name: "JiraSwift", targets: ["JiraSwift"]),
.executable(name: "JiraSwiftCLI", targets: ["JiraSwiftCLI"])
.executable(name: "jira", targets: ["JiraSwiftCLI"])
],
dependencies: [
.package(url: "https://github.com/cpageler93/Quack", from: "1.6.0"),
.package(url: "https://github.com/kylef/Commander", from: "0.8.0")
.package(url: "https://github.com/swift-server/async-http-client", from: "1.0.0-alpha.4"),
.package(url: "https://github.com/vapor/console-kit", from: "4.0.0-alpha.2.1"),
.package(url: "https://github.com/scottrhoyt/SwiftyTextTable.git", from: "0.9.0")
],
targets: [
.target(name: "JiraSwift", dependencies: ["Quack"]),
.target(name: "JiraSwiftCLI", dependencies: ["JiraSwift", "Commander"]),
.target(name: "JiraSwift", dependencies: ["AsyncHTTPClient"]),
.target(name: "JiraSwiftCLI", dependencies: ["JiraSwift", "ConsoleKit", "SwiftyTextTable"]),
.testTarget(name: "JiraSwiftTests", dependencies: ["JiraSwift"])
]
)
84 changes: 57 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,80 @@
# JiraSwift

![Platforms](https://img.shields.io/badge/Platforms-iOS|macOS|tvOS|watchOS|Linux-yellow.svg?style=flat)
![Swift](https://img.shields.io/badge/Swift-5.1-orange.svg?style=flat)
![Platforms](https://img.shields.io/badge/Platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-lightgrey.svg?style=flat)
![Xcode](https://img.shields.io/badge/Xcode-11-blue.svg?style=flat)
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/cpageler93/JiraSwift/blob/master/LICENSE)
[![Twitter: @cpageler93](https://img.shields.io/badge/contact-@cpageler93-lightgrey.svg?style=flat)](https://twitter.com/cpageler93)
[![Twitter: @cpageler93](https://img.shields.io/badge/contact-@cpageler93-blue.svg?style=flat)](https://twitter.com/cpageler93)

Jira Client for Swift
`JiraSwift` is a HTTP client for Jira implemented in swift based on [swift-server/async-http-client](https://github.com/swift-server/async-http-client).

# Framework Usage

## Usage


### Framework

#### JQL Search
## JQL Search

```swift
let jiraClient = Jira.Client(url: URL(string: "https://your_jira_url")!,
username: "your_username",
password: "your_password")
jiraClient.search(jql: "key in (XXX027-65, XXX038-3, XXX027-58)") { result in
switch result {
case .success(let result):
for issue in result.issues {
print("issue: \(issue.key)")
}
case .failure:
break
let client = Jira.Client(baseURL: "https://jira.tinyspeck.com",
username: "your_username",
password: "your_password")

do {
let searchResult = try client.search(jql: "key in (XXX027-65, XXX038-3, XXX027-58)").wait()
for issue in searchResult.issues {
print("\(issue.key): \(issue.fields.assignee?.name ?? "NONE" )")
}
} catch Jira.ClientError.jiraError(let error) {
print(error.errorMessages)
} catch {
print(error)
}

```

### CLI
## Implemented Methods

| Implemented | Method | Route |
|:----------- |:---------------- |:-------------------------- |
|| getMyself() | [`/rest/api/2/myself`](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1/#api/2/myself) |
|| search() | [`/rest/api/2/search`](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1/#api/2/search) |
|| getServerInfo() | [`/rest/api/2/serverInfo`](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1/#api/2/serverInfo) |
|| projects() | [`/rest/api/2/project`](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1/#api/2/project) |
|| projectTypes() | [`/rest/api/2/project/type`](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1/#api/2/project/type) |

# Command Line Interface

## Environment

#### JQL Search
You can either setup your environment

```shell
# setup environment
JIRA_URL=https://your_jira_url
JIRA_USERNAME=your_username
JIRA_PASSWORd=your_password #or leave it blank and get prompted from JiraSwiftCLI
JIRA_PASSWORD=your_password

./JiraSwiftCLI search "key in (XYZ027-65, XYZ038-3, XYZ027-58)"
jira search --jql "key in (XYZ027-65, XYZ038-3, XYZ027-58)"
```

Or pass all values as options to JiraSwiftCLI
Or pass all values as options to jira the command

```shell
.build/debug/JiraSwiftCLI search "key in (XYZ027-65, XYZ038-3, XYZ027-58)" --url "https://your_jira_url" --username "your_username" --password "your_password"
```
jira search --url "https://your_jira_url" \
--username "your_username" \
--password "your_password" \
--jql "key in (XYZ027-65, XYZ038-3, XYZ027-58)"
```

## Commands

| Command | Description |
| --------------- | -------------------------- |
| `search` | Search for Issues with JQL |
| `projects` | List all projects |
| `project-types` | List all project types |


# Contribute

Feel free to add a missing REST API method or create an issue if you want me to implement it!

[Jira REST API Documentation](https://docs.atlassian.com/software/jira/docs/api/REST/8.4.1)
27 changes: 27 additions & 0 deletions Sources/JiraSwift/Codables/AvatarURLs.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// AvatarURLs.swift
// AsyncHTTPClient
//
// Created by Christoph Pageler on 30.09.19.
//


public extension Jira {

class AvatarURLs: Codable {

public let sixteen: String
public let twentyFour: String
public let thirtyTwo: String
public let fortyEight: String

enum CodingKeys: String, CodingKey {
case sixteen = "16x16"
case twentyFour = "24x24"
case thirtyTwo = "32x32"
case fortyEight = "48x48"
}

}

}
118 changes: 118 additions & 0 deletions Sources/JiraSwift/Codables/Issue-Codable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
//
// JiraIssue.swift
// JiraSwift
//
// Created by Christoph Pageler on 17.11.17.
//


import Foundation


public extension Jira {

class Issue: Codable {

public let id: String
public let key: String
public let fields: Fields

}


class Fields: Codable {

public let summary: String?
public let project: Jira.Project?
public let status: Status?
public let description: String?
public let issuetype: IssueType?
public let components: [Component]?
public let assignee: Jira.User?
public let creator: Jira.User?
public let reporter: Jira.User?
public let lastViewed: Date?
public let created: Date?
public let updated: Date?
public let duedate: Date?
public let resolution: Resolution?
public let resolutiondate: Date?
public let timespent: Int?
public let timeestimate: Int?
public let watches: Watches?
public let versions: [Version]?
public let fixVersions: [Version]?
public let priority: Priority?

}

class Status: Codable {

public let id: String
public let name: String
public let iconUrl: String
public let description: String
public let statusCategory: StatusCategory

public class StatusCategory: Codable {

public let id: Int
public let key: String
public let name: String
public let colorName: String

}
}

class Component: Codable {

public let id: String
public let name: String

}

class IssueType: Codable {

public let id: String
public let description: String
public let iconUrl: String
public let name: String
public let subtask: Bool

}

class Resolution: Codable {

public let id: String
public let name: String
public let description: String

}

class Watches: Codable {

public let watchCount: Int
public let isWatching: Bool

}

class Version: Codable {

public let id: String
public let description: String
public let name: String
public let archived: Bool
public let released: Bool

// TODO: Implement date parser without time
// public let releaseDate: Date?

}

class Priority: Codable {

public let id: String
public let name: String
public let iconUrl: String
}
}
Loading

0 comments on commit 6e8a5be

Please sign in to comment.