Commit e81f9546 authored by Nathan Harris's avatar Nathan Harris

Rename `NIORedis` to `RedisNIO`

Motivation:

The SSWG has identified a fast approaching reality of namespace clashes in SPM within the ecosystem and has proposed a rule on names that `NIORedis` no longer complies with.

Modifications:

All references to `NIORedis` have been switched to `RedisNIO` as this module name is unique (at least within GitHub's public repositories).

The goals for this name are as follows:

1. To indicate that this is a Redis client library that is built with SwiftNIO
2. That it is a lower level library, as it directly exposes SwiftNIO as an implementation detail
    2a. The idea being that a higher level library (`Redis`) will be used, and to "go one level deeper" in the stack, you append the "deeper" `NIO` postfix
3. It follows a naming pattern adopted by Vapor who has expressed their desire to adopt this library as their Redis implementation

Result:

A repository, package name, and module name that are unique across GitHub's public repositories that achives the goals outlined above.
parent 7ae20244
# Code of Conduct
To be a truly great community, NIORedis needs to welcome developers from all walks of life,
To be a truly great community, RedisNIO needs to welcome developers from all walks of life,
with different backgrounds, and with a wide range of experience. A diverse and friendly
community will have more great ideas, more unique perspectives, and produce more great
code. We will work diligently to make the NIORedis community welcoming to everyone.
code. We will work diligently to make the RedisNIO community welcoming to everyone.
To give clarity of what is expected of our members, NIORedis has adopted the code of conduct
To give clarity of what is expected of our members, RedisNIO has adopted the code of conduct
defined by [contributor-covenant.org](https://www.contributor-covenant.org). This document is used across many open source
communities, and we think it articulates our values well. The full text is copied below:
......
......@@ -7,7 +7,7 @@ that your contributions are licensed under the [Apache 2.0 license](https://www.
Please ensure to specify the following:
* NIORedis commit hash
* RedisNIO commit hash
* Simplest possible steps to reproduce
* A pull request with a failing test case is preferred, but it's just as fine to write it in the issue description
* Environment Information
......
For the purpose of tracking copyright, this is the list of individuals and
organizations who have contributed source code to NIORedis.
organizations who have contributed source code to RedisNIO.
For employees of an organization/company where the copyright of work done
by employees of that company is held by the company itself, only the company
......
The NIORedis Project
The RedisNIO Project
====================
Please visit the NIORedis web site for more information:
Please visit the RedisNIO web site for more information:
* https://github.com/mordil/nio-redis
Copyright 2019 The NIORedis Project
Copyright 2019 The RedisNIO Project
The NIORedis Project licenses this file to you under the Apache License,
The RedisNIO Project 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:
......
// swift-tools-version:5.0
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -16,9 +16,9 @@
import PackageDescription
let package = Package(
name: "nio-redis",
name: "redis-nio",
products: [
.library(name: "NIORedis", targets: ["NIORedis"])
.library(name: "RedisNIO", targets: ["RedisNIO"])
],
dependencies: [
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
......@@ -26,7 +26,7 @@ let package = Package(
.package(url: "https://github.com/apple/swift-nio.git", from: "2.0.0")
],
targets: [
.target(name: "NIORedis", dependencies: ["NIO", "Logging", "Metrics"]),
.testTarget(name: "NIORedisTests", dependencies: ["NIORedis", "NIO"])
.target(name: "RedisNIO", dependencies: ["NIO", "Logging", "Metrics"]),
.testTarget(name: "RedisNIOTests", dependencies: ["RedisNIO", "NIO"])
]
)
......@@ -3,9 +3,9 @@
[![Swift](https://img.shields.io/badge/Swift-5.0-brightgreen.svg?colorA=orange&colorB=4E4E4E)](https://swift.org)
[![Redis](https://img.shields.io/badge/Redis-5-brightgreen.svg?colorA=red&colorB=4E4E4E)](https://redis.io/download)
# NIORedis
# Swift Redis NIO Client
A non-blocking Swift driver for [Redis](https://redis.io/) built with [SwiftNIO](https://github.com/apple/swift-nio).
A non-blocking Swift client for [Redis](https://redis.io/) built on top of [SwiftNIO](https://github.com/apple/swift-nio).
This package defines everything you need to work with Redis through the [**Re**dis **S**eralization **P**rotocol (RESP)](https://redis.io/topics/protocol).
......@@ -15,11 +15,11 @@ This package defines everything you need to work with Redis through the [**Re**d
## Installation
To install `NIORedis`, just add the package as a dependency in your [**Package.swift**](https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageDescriptionV4.md#dependencies)
To install `RedisNIO`, just add the package as a dependency in your [**Package.swift**](https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageDescriptionV4.md#dependencies)
```swift
dependencies: [
.package(url: "https://github.com/Mordil/nio-redis.git", .upToNextMinor(from: "0.7.0")
.package(url: "https://github.com/Mordil/swift-redis-nio-client.git", .upToNextMinor(from: "0.8.0")
]
```
......@@ -27,10 +27,10 @@ and run the following command: `swift package resolve`
## Getting Started
`NIORedis` is ready to use right after installation.
`RedisNIO` is ready to use right after installation.
```swift
import NIORedis
import RedisNIO
let connection = Redis.makeConnection(
to: try .init(ipAddress: "127.0.0.1", port: 6379),
......@@ -46,12 +46,12 @@ print(result) // Optional("some value")
## Contributing
Check out [CONTRIBUTING.md](CONTRIBUTING.md) for more information on how to help with NIORedis.
Check out [CONTRIBUTING.md](CONTRIBUTING.md) for more information on how to help with RedisNIO.
It is highly recommended to use [Docker](https://docker.com) to install Redis locally.
```bash
docker run -d -p 6379:6379 --name nioredis redis:5
docker run -d -p 6379:6379 --name redisnio redis:5
```
Otherwise, install Redis directly on your machine from [Redis.io](https://redis.io/download).
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -40,7 +40,7 @@ open class RedisCommandHandler {
logger.warning("Command handler deinit when queue is not empty. Current size: \(commandResponseQueue.count)")
}
public init(logger: Logger = Logger(label: "NIORedis.CommandHandler")) {
public init(logger: Logger = Logger(label: "RedisNIO.CommandHandler")) {
self.commandResponseQueue = []
self.logger = logger
self.logger[metadataKey: "CommandHandler"] = "\(UUID())"
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -25,7 +25,7 @@ public final class RedisMessageEncoder: MessageToByteEncoder {
private let logger: Logger
public init(logger: Logger = Logger(label: "NIORedis.RedisMessageEncoder")) {
public init(logger: Logger = Logger(label: "RedisNIO.RedisMessageEncoder")) {
self.logger = logger
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -148,7 +148,7 @@ extension RedisClient {
let value = result[0].string,
let position = Int(value)
else {
throw NIORedisError.assertionFailure(message: "Unexpected value in response: \(result[0])")
throw RedisNIOError.assertionFailure(message: "Unexpected value in response: \(result[0])")
}
return position
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -380,11 +380,11 @@ extension RedisClient {
.flatMapThrowing {
guard !$0.isNull else { return nil }
guard let response = [RESPValue]($0) else {
throw NIORedisError.responseConversion(to: [RESPValue].self)
throw RedisNIOError.responseConversion(to: [RESPValue].self)
}
assert(response.count == 2, "Unexpected response size returned!")
guard let key = response[0].string else {
throw NIORedisError.assertionFailure(message: "Unexpected structure in response: \(response)")
throw RedisNIOError.assertionFailure(message: "Unexpected structure in response: \(response)")
}
return (key, response[1])
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -31,7 +31,7 @@ extension RedisClient {
let scoreItem = response[scoreIsFirst ? index : index + 1]
guard let score = Double(scoreItem) else {
throw NIORedisError.assertionFailure(message: "Unexpected response: '\(scoreItem)'")
throw RedisNIOError.assertionFailure(message: "Unexpected response: '\(scoreItem)'")
}
let elementIndex = scoreIsFirst ? index + 1 : index
......@@ -62,7 +62,7 @@ extension RedisClient {
options: Set<String> = []
) -> EventLoopFuture<Int> {
guard !options.contains("INCR") else {
return self.eventLoop.makeFailedFuture(NIORedisError.unsupportedOperation(
return self.eventLoop.makeFailedFuture(RedisNIOError.unsupportedOperation(
method: #function,
message: "INCR option is unsupported. Use zincrby(_:element:in:) instead."
))
......@@ -421,14 +421,14 @@ extension RedisClient {
.flatMapThrowing {
guard !$0.isNull else { return nil }
guard let response = [RESPValue]($0) else {
throw NIORedisError.responseConversion(to: [RESPValue].self)
throw RedisNIOError.responseConversion(to: [RESPValue].self)
}
assert(response.count == 3, "Unexpected response size returned!")
guard
let key = response[0].string,
let score = Double(response[1])
else {
throw NIORedisError.assertionFailure(message: "Unexpected structure in response: \(response)")
throw RedisNIOError.assertionFailure(message: "Unexpected structure in response: \(response)")
}
return (key, score, response[2])
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -28,7 +28,7 @@ extension EventLoopFuture where Value == RESPValue {
) -> EventLoopFuture<T> where T: RESPValueConvertible
{
return self.flatMapThrowing {
guard let value = T($0) else { throw NIORedisError.responseConversion(to: type) }
guard let value = T($0) else { throw RedisNIOError.responseConversion(to: type) }
return value
}
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -15,7 +15,7 @@
import struct Logging.Logger
import NIO
/// Top-level namespace for the `NIORedis` package.
/// Top-level namespace for the `RedisNIO` package.
///
/// To avoid a cluttered global namespace, named definitions that do not start with a `Redis` prefix
/// are scoped within this namespace.
......@@ -38,9 +38,9 @@ extension Redis {
)
.channelInitializer { channel in
let handlers: [(ChannelHandler, String)] = [
(MessageToByteHandler(RedisMessageEncoder()), "NIORedis.Outgoing"),
(ByteToMessageHandler(RedisByteDecoder()), "NIORedis.Incoming"),
(RedisCommandHandler(), "NIORedis.Queue")
(MessageToByteHandler(RedisMessageEncoder()), "RedisNIO.Outgoing"),
(ByteToMessageHandler(RedisByteDecoder()), "RedisNIO.Incoming"),
(RedisCommandHandler(), "RedisNIO.Queue")
]
return .andAllSucceed(
handlers.map { channel.pipeline.addHandler($0, name: $1) },
......@@ -79,7 +79,7 @@ extension Redis {
to socket: SocketAddress,
using group: EventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1),
password: String? = nil,
logger: Logger = Logger(label: "NIORedis.RedisConnection")
logger: Logger = Logger(label: "RedisNIO.RedisConnection")
) -> EventLoopFuture<RedisConnection> {
let bootstrap = makeDefaultClientBootstrap(using: group)
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -102,7 +102,7 @@ public final class RedisConnection: RedisClient {
/// - Parameters:
/// - channel: The `Channel` to read and write from.
/// - logger: The `Logger` instance to use for all logging purposes.
public init(channel: Channel, logger: Logger = Logger(label: "NIORedis.RedisConnection")) {
public init(channel: Channel, logger: Logger = Logger(label: "RedisNIO.RedisConnection")) {
self.channel = channel
self.logger = logger
......@@ -157,8 +157,8 @@ public final class RedisConnection: RedisClient {
with arguments: [RESPValueConvertible]
) -> EventLoopFuture<RESPValue> {
guard isConnected else {
logger.error("\(NIORedisError.connectionClosed.localizedDescription)")
return channel.eventLoop.makeFailedFuture(NIORedisError.connectionClosed)
logger.error("\(RedisNIOError.connectionClosed.localizedDescription)")
return channel.eventLoop.makeFailedFuture(RedisNIOError.connectionClosed)
}
let args = arguments.map { $0.convertedToRESPValue() }
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -14,9 +14,9 @@
import protocol Foundation.LocalizedError
/// When working with NIORedis, several errors are thrown to indicate problems
/// When working with RedisNIO, several errors are thrown to indicate problems
/// with state, assertions, or otherwise.
public enum NIORedisError: LocalizedError {
public enum RedisNIOError: LocalizedError {
case connectionClosed
case responseConversion(to: Any.Type)
case unsupportedOperation(method: StaticString, message: String)
......@@ -30,7 +30,7 @@ public enum NIORedisError: LocalizedError {
case let .unsupportedOperation(method, helpText): message = "\(method) - \(helpText)"
case let .assertionFailure(text): message = text
}
return "NIORedis: \(message)"
return "RedisNIO: \(message)"
}
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -25,7 +25,7 @@ public struct RedisMetrics {
/// An enumeration of all the labels used by the Redis library for various `Metrics` data points.
///
/// Each is backed by a raw string, and this type is `CustomStringConvertible` to receive a
/// namespaced description in the form of `"NIORedis.<rawValue>"`.
/// namespaced description in the form of `"RedisNIO.<rawValue>"`.
public enum Label: String, CustomStringConvertible {
case totalConnectionCount
case activeConnectionCount
......@@ -34,7 +34,7 @@ public struct RedisMetrics {
case commandRoundTripTime
public var description: String {
return "NIORedis.\(self.rawValue)"
return "RedisNIO.\(self.rawValue)"
}
}
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
......@@ -14,8 +14,8 @@
import XCTest
import NIORedisTests
import RedisNIOTests
var tests = [XCTestCaseEntry]()
tests += NIORedisTests.allTests()
tests += RedisNIOTests.allTests()
XCTMain(tests)
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIO
@testable import NIORedis
@testable import RedisNIO
import XCTest
final class RedisByteDecoderTests: XCTestCase {
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIO
@testable import NIORedis
@testable import RedisNIO
import XCTest
final class RedisMessageEncoderTests: XCTestCase {
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
@testable import NIORedis
@testable import RedisNIO
import XCTest
final class BasicCommandsTests: XCTestCase {
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project
// This source file is part of the RedisNIO open source project
//
// Copyright (c) 2019 NIORedis project authors
// Copyright (c) 2019 RedisNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of NIORedis project authors
// See CONTRIBUTORS.txt for the list of RedisNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
@testable import NIORedis
@testable import RedisNIO
import XCTest
final class HashCommandsTests: XCTestCase {
......
//===----------------------------------------------------------------------===//
//
// This source file is part of the NIORedis open source project