Skip to content

Commit

Permalink
Merge branch 'release/3.2.1' into versions
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeehut committed Oct 3, 2020
2 parents 80a9697 + 7afa2d1 commit 4f1f96b
Show file tree
Hide file tree
Showing 14 changed files with 766 additions and 96 deletions.
113 changes: 113 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: CI

on:
push:
branches: [main, versions]

pull_request:
branches: [main]

jobs:
cancel-previous-runs:
runs-on: ubuntu-latest

steps:
- name: Cancel previous runs of this workflow on same branch
uses: rokroskar/[email protected]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

anylint:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Export latest tool versions
run: |
latest_version() {
curl --silent "https://api.github.com/repos/$1/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'
}
echo "::set-env name=ANYLINT_LATEST_VERSION::$( latest_version Flinesoft/AnyLint )"
echo "::set-env name=SWIFT_SH_LATEST_VERSION::$( latest_version mxcl/swift-sh )"
- name: AnyLint Cache
uses: actions/cache@v1
id: anylint-cache
with:
path: anylint-cache
key: ${{ runner.os }}-v1-anylint-${{ env.ANYLINT_LATEST_VERSION }}-swift-sh-${{ env.SWIFT_SH_LATEST_VERSION }}

- name: Copy from cache
if: steps.anylint-cache.outputs.cache-hit
run: |
sudo cp -f anylint-cache/anylint /usr/local/bin/anylint
sudo cp -f anylint-cache/swift-sh /usr/local/bin/swift-sh
- name: Install AnyLint
if: steps.anylint-cache.outputs.cache-hit != 'true'
run: |
git clone https://github.com/Flinesoft/AnyLint.git
cd AnyLint
swift build -c release
sudo cp -f .build/release/anylint /usr/local/bin/anylint
- name: Install swift-sh
if: steps.anylint-cache.outputs.cache-hit != 'true'
run: |
git clone https://github.com/mxcl/swift-sh.git
cd swift-sh
swift build -c release
sudo cp -f .build/release/swift-sh /usr/local/bin/swift-sh
- name: Copy to cache
if: steps.anylint-cache.outputs.cache-hit != 'true'
run: |
mkdir -p anylint-cache
cp -f /usr/local/bin/anylint anylint-cache/anylint
cp -f /usr/local/bin/swift-sh anylint-cache/swift-sh
- name: Cleanup checkouts
run: rm -rf AnyLint && rm -rf swift-sh

- name: Run AnyLint
run: anylint

swiftlint:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Run SwiftLint
uses: norio-nomura/[email protected]
with:
args: --strict

test-linux:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Run tests
run: swift test -v

test-macos:
runs-on: macOS-latest

steps:
- uses: actions/checkout@v2

- name: Run tests
run: swift test -v --enable-code-coverage

- name: Export coverage Data
run: xcrun llvm-cov export -format="lcov" .build/debug/${{ env.PACKAGE_NAME }}PackageTests.xctest/Contents/MacOS/${{ env.PACKAGE_NAME }}PackageTests -instr-profile .build/debug/codecov/default.profdata > coverage.lcov
env:
PACKAGE_NAME: HandySwift

- name: Upload Coverage to Codecov
uses: codecov/[email protected]
with:
token: ${{ secrets.CODECOV_TOKEN }}
42 changes: 26 additions & 16 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ If needed, pluralize to `Tasks`, `PRs` or `Authors` and list multiple entries se
### Security
- None.

## [3.2.1] - 2020-10-03
### Changed
- `Withable` doesn't require an empty `init()` method anymore. Instead, it can be combined with any initializer. If you used the `Foo { $0.bar = 5 }` type of initializer, you will need to add `().with` behind the type like so: `Foo().with { $0.bar = 5 }`.
Issue: [#49](https://github.com/Flinesoft/HandySwift/issues/49) | PR: [#50](https://github.com/Flinesoft/HandySwift/pull/50) | Author: [Cihat Gündüz](https://github.com/Jeehut)
- Improved with new `removeAll` method, conformance to `BidirectionalCollection`, `ExpressibleByArrayLiteral` and removal of `newElement` label on `insert.
Author: [Cihat Gündüz](https://github.com/Jeehut)
### Fixed
- Made all functions accept throwing closures to allow wider usage cases for helper functions like `.times` etc.
Author: [Cihat Gündüz](https://github.com/Jeehut)

## [3.2.0] - 2020-03-27
### Added
- New `DivisibleArithmetic` protocol which easily extends `average()` to Collections of `Double`, `Float` and `CGFloat`.
Expand All @@ -43,31 +53,31 @@ If needed, pluralize to `Tasks`, `PRs` or `Authors` and list multiple entries se

## [3.1.0] - 2019-09-01
### Added
- New `Comparable.clamped(to:)` and `Comparable.clamp(to:)` interfaces for any `Comparable`, e. g. `Int`.

- New `Comparable.clamped(to:)` and `Comparable.clamp(to:)` interfaces for any `Comparable`, e. g. `Int`.
## [3.0.0] - 2019-04-30
### Added
- New `Withable` protocol to init/copy objects and set properties in a convenient way on a single line.
- New `Withable` protocol to init/copy objects and set properties in a convenient way on a single line.
### Changed
- Upgraded to Swift 5 & Xcode 10.2.
- Upgraded to Swift 5 & Xcode 10.2.
### Removed
- Remove `ExpressibleByStringLiteral` conformance of `Regex` type to only allow initialization via `init(_:options:) throws` interface.

- Remove `ExpressibleByStringLiteral` conformance of `Regex` type to only allow initialization via `init(_:options:) throws` interface.
## [2.8.0] - 2019-02-11
### Added
- New `NSRange(_:in:)` initializer for converting from `Range<String.Index>`
- New `sum` computed property on `Sequence` types like `Array`
- New `average` computed property on `Collection` types with `Int` or `Double` elements like `[Int]`
- New `fullRange` and `fullNSRange` computed properties on `String`
- New `NSRange(_:in:)` initializer for converting from `Range<String.Index>`
- New `sum` computed property on `Sequence` types like `Array`
- New `average` computed property on `Collection` types with `Int` or `Double` elements like `[Int]`
- New `fullRange` and `fullNSRange` computed properties on `String`
### Changed
- Made some APIs available in wider contexts (like `sample` in `RandomAccessCollection` instead of `Array`)

- Made some APIs available in wider contexts (like `sample` in `RandomAccessCollection` instead of `Array`)
## [2.7.0] - 2018-09-27
### Added
- Official support for Linux & Swift Package Manager.
- Official support for Linux & Swift Package Manager.
### Removed
- Support for Swift 4.1 and lower was dropped.

- Support for Swift 4.1 and lower was dropped.
## [2.6.0] - 2018-04-22
### Added
- New swifty `Regex` type built on top of the NSRegularExpression API.
- New swifty `Regex` type built on top of the NSRegularExpression API.
2 changes: 1 addition & 1 deletion HandySwift.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = "HandySwift"
s.version = "3.2.0"
s.version = "3.2.1"
s.summary = "Handy Swift features that didn't make it into the Swift standard library"

s.description = <<-DESC
Expand Down
32 changes: 16 additions & 16 deletions HandySwift.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
2E18B296242DF436000C7776 /* NSObjectExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E18B295242DF436000C7776 /* NSObjectExtTests.swift */; };
2E18B297242DF436000C7776 /* NSObjectExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E18B295242DF436000C7776 /* NSObjectExtTests.swift */; };
2E18B298242DF436000C7776 /* NSObjectExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E18B295242DF436000C7776 /* NSObjectExtTests.swift */; };
2E61DF7A249E1CA9000AF3C5 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF79249E1CA9000AF3C5 /* Withable.swift */; };
2E61DF7B249E1CA9000AF3C5 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF79249E1CA9000AF3C5 /* Withable.swift */; };
2E61DF7C249E1CA9000AF3C5 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF79249E1CA9000AF3C5 /* Withable.swift */; };
2E61DF7E249E1D37000AF3C5 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF7D249E1D37000AF3C5 /* WithableTests.swift */; };
2E61DF7F249E1D37000AF3C5 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF7D249E1D37000AF3C5 /* WithableTests.swift */; };
2E61DF80249E1D37000AF3C5 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E61DF7D249E1D37000AF3C5 /* WithableTests.swift */; };
3F95C8D220F22A3C0045AFD0 /* CollectionExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F95C8D120F22A3C0045AFD0 /* CollectionExt.swift */; };
3F95C8D520F22DEE0045AFD0 /* CollectionExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F95C8D320F22DC60045AFD0 /* CollectionExtTests.swift */; };
3F95C8D620F22DEF0045AFD0 /* CollectionExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F95C8D320F22DC60045AFD0 /* CollectionExtTests.swift */; };
Expand All @@ -30,12 +36,6 @@
823B2B3C1C24AAB7007B3CDD /* HandySwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 823B2B311C24AAB6007B3CDD /* HandySwift.framework */; };
823B2B4D1C24ABA4007B3CDD /* IntExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823B2B4C1C24ABA4007B3CDD /* IntExt.swift */; };
823B2B501C24AC00007B3CDD /* IntExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823B2B4F1C24AC00007B3CDD /* IntExtTests.swift */; };
8251AA2022786D460022B277 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA1F22786D460022B277 /* Withable.swift */; };
8251AA2122786D460022B277 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA1F22786D460022B277 /* Withable.swift */; };
8251AA2222786D460022B277 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA1F22786D460022B277 /* Withable.swift */; };
8251AA25227875C00022B277 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA24227875C00022B277 /* WithableTests.swift */; };
8251AA26227875C00022B277 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA24227875C00022B277 /* WithableTests.swift */; };
8251AA27227875C00022B277 /* WithableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8251AA24227875C00022B277 /* WithableTests.swift */; };
8258E4561C2E0C140031CBFF /* SortedArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8258E4551C2E0C140031CBFF /* SortedArray.swift */; };
8258E4591C2E1ACE0031CBFF /* SortedArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8258E4581C2E1ACE0031CBFF /* SortedArrayTests.swift */; };
825EFDD41C3333B000558497 /* HandySwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825EFDCA1C3333B000558497 /* HandySwift.framework */; };
Expand Down Expand Up @@ -142,6 +142,8 @@
2E18B291242DECCA000C7776 /* NSObjectExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSObjectExt.swift; sourceTree = "<group>"; };
2E18B295242DF436000C7776 /* NSObjectExtTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSObjectExtTests.swift; sourceTree = "<group>"; };
2E4189DB231B971E00C65B81 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
2E61DF79249E1CA9000AF3C5 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = "<group>"; };
2E61DF7D249E1D37000AF3C5 /* WithableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithableTests.swift; sourceTree = "<group>"; };
3F95C8D120F22A3C0045AFD0 /* CollectionExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExt.swift; sourceTree = "<group>"; };
3F95C8D320F22DC60045AFD0 /* CollectionExtTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExtTests.swift; sourceTree = "<group>"; };
63651F8F231BFF2000E022DA /* DivisibleArithmetic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DivisibleArithmetic.swift; sourceTree = "<group>"; };
Expand All @@ -157,8 +159,6 @@
823B2B421C24AAB7007B3CDD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
823B2B4C1C24ABA4007B3CDD /* IntExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntExt.swift; sourceTree = "<group>"; };
823B2B4F1C24AC00007B3CDD /* IntExtTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntExtTests.swift; sourceTree = "<group>"; };
8251AA1F22786D460022B277 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = "<group>"; };
8251AA24227875C00022B277 /* WithableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithableTests.swift; sourceTree = "<group>"; };
8258E4551C2E0C140031CBFF /* SortedArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortedArray.swift; sourceTree = "<group>"; };
8258E4581C2E1ACE0031CBFF /* SortedArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortedArrayTests.swift; sourceTree = "<group>"; };
825EFDCA1C3333B000558497 /* HandySwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HandySwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -325,15 +325,15 @@
isa = PBXGroup;
children = (
63651F8F231BFF2000E022DA /* DivisibleArithmetic.swift */,
8251AA1F22786D460022B277 /* Withable.swift */,
2E61DF79249E1CA9000AF3C5 /* Withable.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
8251AA23227875A10022B277 /* Protocols */ = {
isa = PBXGroup;
children = (
8251AA24227875C00022B277 /* WithableTests.swift */,
2E61DF7D249E1D37000AF3C5 /* WithableTests.swift */,
);
path = Protocols;
sourceTree = "<group>";
Expand Down Expand Up @@ -774,9 +774,9 @@
823B2B4D1C24ABA4007B3CDD /* IntExt.swift in Sources */,
CC66E047228199A0007ABF61 /* ComparableExt.swift in Sources */,
C5C89B9420B0A0C10048B07C /* Weak.swift in Sources */,
8251AA2022786D460022B277 /* Withable.swift in Sources */,
82CAE2921C2ED1A200F934A7 /* StringExt.swift in Sources */,
82CAE2961C2EE64900F934A7 /* ArrayExt.swift in Sources */,
2E61DF7A249E1CA9000AF3C5 /* Withable.swift in Sources */,
C5CFB6AC20B0A70300830511 /* Unowned.swift in Sources */,
82812A9B1D06877B00CD5B6C /* Globals.swift in Sources */,
63651F90231BFF2000E022DA /* DivisibleArithmetic.swift in Sources */,
Expand All @@ -792,8 +792,8 @@
826F69B01C389DB800B2CC6B /* FrequencyTableTests.swift in Sources */,
827599641E520FB800787F99 /* DispatchTimeIntervalExtTests.swift in Sources */,
8258E4591C2E1ACE0031CBFF /* SortedArrayTests.swift in Sources */,
2E61DF7E249E1D37000AF3C5 /* WithableTests.swift in Sources */,
A11830D71E58A11D00CBE087 /* TimeIntervalExtTests.swift in Sources */,
8251AA25227875C00022B277 /* WithableTests.swift in Sources */,
823B2B501C24AC00007B3CDD /* IntExtTests.swift in Sources */,
82CAE2941C2ED5E000F934A7 /* StringExtTests.swift in Sources */,
82CAE2981C2EE95200F934A7 /* ArrayExtTests.swift in Sources */,
Expand Down Expand Up @@ -821,9 +821,9 @@
82E21E8E211AF9960061EB1B /* CollectionExt.swift in Sources */,
CC66E048228199DE007ABF61 /* ComparableExt.swift in Sources */,
C5CFB6AF20B0A78F00830511 /* Weak.swift in Sources */,
8251AA2122786D460022B277 /* Withable.swift in Sources */,
A1F221651E3CC05100419B06 /* DispatchTimeIntervalExt.swift in Sources */,
825EFE021C33358400558497 /* SortedArray.swift in Sources */,
2E61DF7B249E1CA9000AF3C5 /* Withable.swift in Sources */,
825EFE031C33358400558497 /* IntExt.swift in Sources */,
82812A9C1D06877B00CD5B6C /* Globals.swift in Sources */,
63651F91231BFF2000E022DA /* DivisibleArithmetic.swift in Sources */,
Expand All @@ -839,8 +839,8 @@
826F69B11C389DB800B2CC6B /* FrequencyTableTests.swift in Sources */,
827599651E520FB800787F99 /* DispatchTimeIntervalExtTests.swift in Sources */,
825EFE111C3335A400558497 /* StringExtTests.swift in Sources */,
2E61DF7F249E1D37000AF3C5 /* WithableTests.swift in Sources */,
A11830D81E58A11D00CBE087 /* TimeIntervalExtTests.swift in Sources */,
8251AA26227875C00022B277 /* WithableTests.swift in Sources */,
825EFE0E1C3335A400558497 /* SortedArrayTests.swift in Sources */,
825EFE121C3335A400558497 /* ArrayExtTests.swift in Sources */,
825EFE0F1C3335A400558497 /* IntExtTests.swift in Sources */,
Expand Down Expand Up @@ -868,9 +868,9 @@
82E21E8F211AF9970061EB1B /* CollectionExt.swift in Sources */,
CC66E049228199DF007ABF61 /* ComparableExt.swift in Sources */,
C5CFB6B020B0A79000830511 /* Weak.swift in Sources */,
8251AA2222786D460022B277 /* Withable.swift in Sources */,
A1F221661E3CC05100419B06 /* DispatchTimeIntervalExt.swift in Sources */,
825EFE081C33358500558497 /* SortedArray.swift in Sources */,
2E61DF7C249E1CA9000AF3C5 /* Withable.swift in Sources */,
825EFE091C33358500558497 /* IntExt.swift in Sources */,
82812A9D1D06877B00CD5B6C /* Globals.swift in Sources */,
63651F92231BFF2800E022DA /* DivisibleArithmetic.swift in Sources */,
Expand All @@ -886,8 +886,8 @@
826F69B21C389DB800B2CC6B /* FrequencyTableTests.swift in Sources */,
827599661E520FB800787F99 /* DispatchTimeIntervalExtTests.swift in Sources */,
825EFE171C3335A500558497 /* StringExtTests.swift in Sources */,
2E61DF80249E1D37000AF3C5 /* WithableTests.swift in Sources */,
A11830D91E58A11D00CBE087 /* TimeIntervalExtTests.swift in Sources */,
8251AA27227875C00022B277 /* WithableTests.swift in Sources */,
825EFE141C3335A500558497 /* SortedArrayTests.swift in Sources */,
825EFE181C3335A500558497 /* ArrayExtTests.swift in Sources */,
825EFE151C3335A500558497 /* IntExtTests.swift in Sources */,
Expand Down
33 changes: 13 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,17 @@
</p>

<p align="center">
<a href="https://app.bitrise.io/app/cbc4cab821708298">
<img src="https://app.bitrise.io/app/cbc4cab821708298/status.svg?token=1fWFE7UCuTBoYTGf4StnFQ&branch=main"
alt="Build Status">
<a href="https://github.com/Flinesoft/HandySwift/actions?query=branch%3Amain">
<img src="https://github.com/Flinesoft/HandySwift/workflows/CI/badge.svg"
alt="CI">
</a>
<a href="https://www.codacy.com/gh/Flinesoft/HandySwift">
<img src="https://api.codacy.com/project/badge/Grade/f15d85eb68244c8f8c35af88ace3cdd0"
alt="Code Quality"/>
</a>
<a href="https://www.codacy.com/gh/Flinesoft/HandySwift">
<img src="https://api.codacy.com/project/badge/Coverage/f15d85eb68244c8f8c35af88ace3cdd0"
<a href="https://codecov.io/gh/Flinesoft/HandySwift">
<img src="https://codecov.io/gh/Flinesoft/HandySwift/branch/main/graph/badge.svg"
alt="Coverage"/>
</a>
<a href="https://github.com/Flinesoft/HandySwift/releases">
<img src="https://img.shields.io/badge/Version-3.2.0-blue.svg"
alt="Version: 3.2.0">
<img src="https://img.shields.io/badge/Version-3.2.1-blue.svg"
alt="Version: 3.2.1">
</a>
<img src="https://img.shields.io/badge/Swift-5.1-FFAC45.svg" alt="Swift: 5.1">
<img src="https://img.shields.io/badge/Platforms-iOS%20%7C%20tvOS%20%7C%20macOS%20%7C%20Linux-FF69B4.svg"
Expand Down Expand Up @@ -573,18 +569,15 @@ Simple protocol to make constructing and modifying objects with multiple propert

``` swift
struct Foo: Withable {
var bar: Int = 0
var baz: Bool = false
var bar: Int
var isEasy: Bool = false
}

// Construct a foo, setting an arbitrary subset of properties
let foo = Foo { $0.bar = 5 }

// Make a copy of foo, overriding an arbitrary subset of properties
let foo2 = foo.with { $0.bar = 7; $0.baz = true }
let defaultFoo = Foo(bar: 5)
let customFoo = Foo(bar: 5).with { $0.isEasy = true }

foo.bar // => 5
foo2.bar // => 7
foo.isEasy // => false
foo2.isEasy // => true
```


Expand Down
Loading

0 comments on commit 4f1f96b

Please sign in to comment.