diff --git a/Gemfile b/Gemfile index ed964db6..2199ed9b 100644 --- a/Gemfile +++ b/Gemfile @@ -5,5 +5,5 @@ source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem 'cocoapods', '~> 1.9' -gem 'fastlane', '~> 2.151' +gem 'fastlane', '~> 2.163' gem 'xcov' diff --git a/Gemfile.lock b/Gemfile.lock index 9193cbb5..3ea8616a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,22 +14,22 @@ GEM json (>= 1.5.1) atomos (0.1.3) aws-eventstream (1.1.0) - aws-partitions (1.341.0) - aws-sdk-core (3.103.0) + aws-partitions (1.382.0) + aws-sdk-core (3.109.1) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.36.0) - aws-sdk-core (~> 3, >= 3.99.0) + aws-sdk-kms (1.39.0) + aws-sdk-core (~> 3, >= 3.109.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.74.0) - aws-sdk-core (~> 3, >= 3.102.1) + aws-sdk-s3 (1.83.0) + aws-sdk-core (~> 3, >= 3.109.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.1) + aws-sigv4 (1.2.2) aws-eventstream (~> 1, >= 1.0.2) - babosa (1.0.3) + babosa (1.0.4) claide (1.0.3) cocoapods (1.9.3) activesupport (>= 4.0.2, < 5) @@ -79,21 +79,21 @@ GEM rake (~> 13.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.5) + dotenv (2.7.6) emoji_regex (3.0.0) escape (0.0.4) ethon (0.12.0) ffi (>= 1.3.0) - excon (0.75.0) + excon (0.76.0) faraday (1.0.1) multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday_middleware (1.0.0) faraday (~> 1.0) - fastimage (2.1.7) - fastlane (2.151.2) + fastimage (2.2.0) + fastlane (2.163.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) aws-sdk-s3 (~> 1.0) @@ -104,9 +104,9 @@ GEM dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) excon (>= 0.71.0, < 1.0.0) - faraday (>= 0.17, < 2.0) + faraday (~> 1.0) faraday-cookie_jar (~> 0.0.6) - faraday_middleware (>= 0.13.1, < 2.0) + faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-api-client (>= 0.37.0, < 0.39.0) @@ -144,17 +144,17 @@ GEM google-cloud-core (1.5.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.2) + google-cloud-env (1.4.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.1) - google-cloud-storage (1.26.2) + google-cloud-storage (1.29.1) addressable (~> 2.5) digest-crc (~> 0.4) google-api-client (~> 0.33) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.13.0) + googleauth (0.14.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -169,7 +169,7 @@ GEM concurrent-ruby (~> 1.0) jmespath (1.4.0) json (2.3.1) - jwt (2.2.1) + jwt (2.2.2) memoist (0.16.2) mini_magick (4.10.1) mini_mime (1.0.2) @@ -177,13 +177,13 @@ GEM molinillo (0.6.6) multi_json (1.15.0) multipart-post (2.0.0) - nanaimo (0.2.6) + nanaimo (0.3.0) nap (1.1.0) naturally (2.2.0) netrc (0.11.0) - os (1.1.0) + os (1.1.1) plist (3.5.0) - public_suffix (4.0.5) + public_suffix (4.0.6) rake (13.0.1) representable (3.0.4) declarative (< 0.1.0) @@ -208,7 +208,7 @@ GEM unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) tty-cursor (0.7.1) - tty-screen (0.8.0) + tty-screen (0.8.1) tty-spinner (0.9.3) tty-cursor (~> 0.7) typhoeus (1.4.0) @@ -221,12 +221,12 @@ GEM unf_ext (0.0.7.7) unicode-display_width (1.7.0) word_wrap (1.0.0) - xcodeproj (1.17.0) + xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.2.6) + nanaimo (~> 0.3.0) xcov (1.7.3) fastlane (>= 2.141.0, < 3.0.0) multipart-post @@ -245,7 +245,7 @@ PLATFORMS DEPENDENCIES cocoapods (~> 1.9) - fastlane (~> 2.151) + fastlane (~> 2.163) xcov BUNDLED WITH diff --git a/Sources/InstantSearch/AdvancedConnectors/MultiIndexSearchConnector+UIKit.swift b/Sources/InstantSearch/AdvancedConnectors/MultiIndexSearchConnector+UIKit.swift index 200ea9ac..087d4008 100644 --- a/Sources/InstantSearch/AdvancedConnectors/MultiIndexSearchConnector+UIKit.swift +++ b/Sources/InstantSearch/AdvancedConnectors/MultiIndexSearchConnector+UIKit.swift @@ -12,7 +12,7 @@ import InstantSearchCore import UIKit public extension MultiIndexSearchConnector { - + @available(iOS 13.0, *) init(searcher: MultiIndexSearcher, indexModules: [MultiIndexHitsConnector.IndexModule], @@ -26,7 +26,7 @@ public extension MultiIndexSearchConnector { queryInputInteractor: queryInputInteractor, queryInputController: textFieldController) } - + @available(iOS 13.0, *) init(appID: ApplicationID, apiKey: APIKey, @@ -41,7 +41,7 @@ public extension MultiIndexSearchConnector { searchController: searchController, hitsController: hitsController) } - + } #endif diff --git a/Sources/InstantSearch/AdvancedConnectors/SingleIndexSearchConnector+UIKit.swift b/Sources/InstantSearch/AdvancedConnectors/SingleIndexSearchConnector+UIKit.swift index 1c55ad0d..a16ca306 100644 --- a/Sources/InstantSearch/AdvancedConnectors/SingleIndexSearchConnector+UIKit.swift +++ b/Sources/InstantSearch/AdvancedConnectors/SingleIndexSearchConnector+UIKit.swift @@ -12,7 +12,7 @@ import InstantSearchCore import UIKit public extension SingleIndexSearchConnector { - + @available(iOS 13.0, *) init(searcher: SingleIndexSearcher, searchController: UISearchController, @@ -28,7 +28,7 @@ public extension SingleIndexSearchConnector { hitsController: hitsController, filterState: filterState) } - + @available(iOS 13.0, *) init(appID: ApplicationID, apiKey: APIKey, @@ -46,6 +46,6 @@ public extension SingleIndexSearchConnector { hitsController: hitsController, filterState: filterState) } - + } #endif diff --git a/Sources/InstantSearch/Hits/CollectionView/HitsCollectionViewController.swift b/Sources/InstantSearch/Hits/CollectionView/HitsCollectionViewController.swift index 0284abd7..aa583af9 100644 --- a/Sources/InstantSearch/Hits/CollectionView/HitsCollectionViewController.swift +++ b/Sources/InstantSearch/Hits/CollectionView/HitsCollectionViewController.swift @@ -13,32 +13,32 @@ import InstantSearchCore import UIKit open class HitsCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, HitsController { - + public var hitsSource: HitsInteractor? open override func viewDidLoad() { super.viewDidLoad() collectionView.register(CellConfigurator.Cell.self, forCellWithReuseIdentifier: CellConfigurator.cellIdentifier) } - + open override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return hitsSource?.numberOfHits() ?? 0 } - + open override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { return collectionView.dequeueReusableCell(withReuseIdentifier: CellConfigurator.cellIdentifier, for: indexPath) } - + open override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { guard let cell = cell as? CellConfigurator.Cell else { return } guard let model = hitsSource?.hit(atIndex: indexPath.row) else { return } CellConfigurator(model: model, indexPath: indexPath).configure(cell) } - + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { guard let model = hitsSource?.hit(atIndex: indexPath.row) else { return .zero } return CellConfigurator(model: model, indexPath: indexPath).cellSize } - + } #endif diff --git a/Sources/InstantSearch/Hits/TableView/HitsTableViewController.swift b/Sources/InstantSearch/Hits/TableView/HitsTableViewController.swift index 8f783592..1e2574be 100644 --- a/Sources/InstantSearch/Hits/TableView/HitsTableViewController.swift +++ b/Sources/InstantSearch/Hits/TableView/HitsTableViewController.swift @@ -13,9 +13,9 @@ import InstantSearchCore import UIKit open class HitsTableViewController: UITableViewController, HitsController { - + public var hitsSource: HitsInteractor? - + open override func viewDidLoad() { super.viewDidLoad() tableView.register(CellConfigurator.Cell.self, forCellReuseIdentifier: CellConfigurator.cellIdentifier) @@ -24,21 +24,21 @@ open class HitsTableViewController: open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return hitsSource?.numberOfHits() ?? 0 } - + open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return tableView.dequeueReusableCell(withIdentifier: CellConfigurator.cellIdentifier, for: indexPath) } - + open override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { guard let cell = cell as? CellConfigurator.Cell else { return } guard let model = hitsSource?.hit(atIndex: indexPath.row) else { return } CellConfigurator(model: model, indexPath: indexPath).configure(cell) } - + open override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { guard let model = hitsSource?.hit(atIndex: indexPath.row) else { return 0 } return CellConfigurator(model: model, indexPath: indexPath).cellHeight } - + } #endif diff --git a/Sources/InstantSearchCore/AdvancedConnectors/MultiIndexSearchConnector.swift b/Sources/InstantSearchCore/AdvancedConnectors/MultiIndexSearchConnector.swift index 2c269e90..a63dffe4 100644 --- a/Sources/InstantSearchCore/AdvancedConnectors/MultiIndexSearchConnector.swift +++ b/Sources/InstantSearchCore/AdvancedConnectors/MultiIndexSearchConnector.swift @@ -21,19 +21,19 @@ Connector encapsulating basic search experience within multiple indices Most of the components associated by this connector are created and connected automatically, it's only required to provide a proper `Controller` implementations. */ public struct MultiIndexSearchConnector: Connection { - + /// Connector establishing the linkage between searcher, hits interactor and optionally filter state public let hitsConnector: MultiIndexHitsConnector - + /// Connection between hits interactor of hits connector and provided hits controller public let hitsControllerConnection: Connection - + /// Connector establishing the linkage between searcher and query input interactor public let queryInputConnector: QueryInputConnector - + /// Connection between query input interactor of query input connector and provided query input controller public let queryInputControllerConnection: Connection - + /** - Parameters: - searcher: External multi index sercher @@ -55,7 +55,7 @@ public struct MultiIndexSearchConnector: Connection { queryInputControllerConnection = queryInputInteractor.connectController(queryInputController) searcher.search() } - + /** - Parameters: - appID: Application ID @@ -80,7 +80,7 @@ public struct MultiIndexSearchConnector: Connection { queryInputInteractor: queryInputInteractor, queryInputController: queryInputController) } - + public func connect() { disconnect() hitsConnector.connect() @@ -88,12 +88,12 @@ public struct MultiIndexSearchConnector: Connection { queryInputConnector.connect() queryInputControllerConnection.connect() } - + public func disconnect() { hitsConnector.disconnect() hitsControllerConnection.disconnect() queryInputConnector.disconnect() queryInputControllerConnection.disconnect() } - + } diff --git a/Sources/InstantSearchCore/AdvancedConnectors/SingleIndexSearchConnector.swift b/Sources/InstantSearchCore/AdvancedConnectors/SingleIndexSearchConnector.swift index dd0245d2..4c2c1c89 100644 --- a/Sources/InstantSearchCore/AdvancedConnectors/SingleIndexSearchConnector.swift +++ b/Sources/InstantSearchCore/AdvancedConnectors/SingleIndexSearchConnector.swift @@ -22,25 +22,25 @@ import Foundation Most of the components associated by this connector are created and connected automatically, it's only required to provide a proper `Controller` implementations. */ public struct SingleIndexSearchConnector: Connection { - + /// Connector establishing the linkage between searcher, hits interactor and optionally filter state public let hitsConnector: HitsConnector - + /// Connection between hits interactor of hits connector and provided hits controller public let hitsControllerConnection: Connection - + /// Connector establishing the linkage between searcher and query input interactor public let queryInputConnector: QueryInputConnector - + /// Connection between query input interactor of query input connector and provided query input controller public let queryInputControllerConnection: Connection - + /// Connection between filter state and hits interactor of hits connector public let filterStateHitsInteractorConnection: Connection? - + /// Connection between filter state and searcher public let filterStateSearcherConnection: Connection? - + /** - Parameters: - searcher: External single index sercher @@ -58,10 +58,10 @@ public struct SingleIndexSearchConnector: Connection { filterState: FilterState? = nil) where HC.DataSource == HitsInteractor { hitsConnector = .init(searcher: searcher, interactor: hitsInteractor, filterState: filterState) queryInputConnector = .init(searcher: searcher, interactor: queryInputInteractor) - + queryInputControllerConnection = queryInputInteractor.connectController(queryInputController) hitsControllerConnection = hitsInteractor.connectController(hitsController) - + if let filterState = filterState { filterStateHitsInteractorConnection = hitsInteractor.connectFilterState(filterState) filterStateSearcherConnection = searcher.connectFilterState(filterState) @@ -69,9 +69,9 @@ public struct SingleIndexSearchConnector: Connection { filterStateHitsInteractorConnection = nil filterStateSearcherConnection = nil } - + } - + /** - Parameters: - appID: Application ID @@ -101,7 +101,7 @@ public struct SingleIndexSearchConnector: Connection { hitsController: hitsController, filterState: filterState) } - + public func connect() { disconnect() queryInputConnector.connect() @@ -111,7 +111,7 @@ public struct SingleIndexSearchConnector: Connection { filterStateSearcherConnection?.connect() filterStateHitsInteractorConnection?.connect() } - + public func disconnect() { queryInputConnector.disconnect() queryInputControllerConnection.disconnect() @@ -120,5 +120,5 @@ public struct SingleIndexSearchConnector: Connection { filterStateSearcherConnection?.disconnect() filterStateHitsInteractorConnection?.disconnect() } - + } diff --git a/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector+Controller.swift b/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector+Controller.swift index 15ef198b..41f2fc13 100644 --- a/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector+Controller.swift +++ b/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension CurrentFiltersConnector { - + /** Initalizer with an immediate controller connection - Parameters: @@ -28,7 +28,7 @@ public extension CurrentFiltersConnector { connectController(controller, presenter: presenter) } } - + /** Establishes a connection with the controller using the provided presentation logic - Parameters: diff --git a/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector.swift b/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector.swift index e9988f4c..815a935c 100644 --- a/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector.swift +++ b/Sources/InstantSearchCore/CurrentFilters/Connector/CurrentFiltersConnector.swift @@ -15,16 +15,16 @@ public class CurrentFiltersConnector { /// FilterState that holds your filters public let filterState: FilterState - + /// When specified, only display current filters matching these filter group ids public let groupIDs: Set? - + /// Logic applied to the current filters public let interactor: CurrentFiltersInteractor /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -43,11 +43,11 @@ public class CurrentFiltersConnector { self.filterStateConnection = interactor.connectFilterState(filterState, filterGroupIDs: groupIDs) self.controllerConnections = [] } - + } extension CurrentFiltersConnector: Connection { - + public func connect() { filterStateConnection.connect() controllerConnections.forEach { $0.connect() } @@ -57,5 +57,5 @@ extension CurrentFiltersConnector: Connection { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/CurrentFilters/CurrentFiltersInteractor.swift b/Sources/InstantSearchCore/CurrentFilters/CurrentFiltersInteractor.swift index 63d71f14..178952d9 100644 --- a/Sources/InstantSearchCore/CurrentFilters/CurrentFiltersInteractor.swift +++ b/Sources/InstantSearchCore/CurrentFilters/CurrentFiltersInteractor.swift @@ -13,13 +13,13 @@ public typealias CurrentFiltersInteractor = ItemsListInteractor /// Union of a filter and its group in a filter state public struct FilterAndID: Hashable { - + /// Stored filter public let filter: Filter - + /// Identifier of a group in a filter state public let id: FilterGroup.ID - + public var text: String public init(filter: Filter, id: FilterGroup.ID, text: String = "") { diff --git a/Sources/InstantSearchCore/CurrentFilters/ItemsListInteractor.swift b/Sources/InstantSearchCore/CurrentFilters/ItemsListInteractor.swift index 65b0c8eb..5ea8aae5 100644 --- a/Sources/InstantSearchCore/CurrentFilters/ItemsListInteractor.swift +++ b/Sources/InstantSearchCore/CurrentFilters/ItemsListInteractor.swift @@ -22,7 +22,7 @@ public class ItemsListInteractor { /// Event triggered when items list has been changed externally public let onItemsChanged: Observer> - + /// Event triggered when items list has been changed by business logic public let onItemsComputed: Observer> diff --git a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+Controller.swift b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+Controller.swift index 3048b04e..4b7d04c4 100644 --- a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+Controller.swift +++ b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+Controller.swift @@ -7,10 +7,10 @@ import Foundation -//MARK: - Convenient controller connectivity +// MARK: - Convenient controller connectivity public extension FacetListConnector { - + internal convenience init(searcher: Searcher, filterState: FilterState = .init(), interactor: FacetListInteractor = .init(), @@ -27,7 +27,7 @@ public extension FacetListConnector { groupName: groupName) connectController(controller, with: presenter) } - + /** Establishes a connection with the controller using the provided presentation logic - Parameters: @@ -43,5 +43,5 @@ public extension FacetListConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+FacetSearcher.swift b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+FacetSearcher.swift index 4e7a3228..56cb5bff 100644 --- a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+FacetSearcher.swift +++ b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+FacetSearcher.swift @@ -10,7 +10,7 @@ import Foundation /// Initializers with FacetSearcher public extension FacetListConnector { - + /** Init with explicit interactor - Parameters: @@ -34,7 +34,7 @@ public extension FacetListConnector { operator: `operator`, groupName: groupName) } - + /** Init with explicit interactor & controller - Parameters: @@ -64,7 +64,7 @@ public extension FacetListConnector { operator: `operator`, groupName: groupName) } - + /** Init with implicit interactor - Parameters: @@ -124,5 +124,5 @@ public extension FacetListConnector { operator: `operator`, groupName: groupName) } - + } diff --git a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+SingleIndexSearcher.swift b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+SingleIndexSearcher.swift index 768d3f71..427c6bd2 100644 --- a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+SingleIndexSearcher.swift +++ b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector+SingleIndexSearcher.swift @@ -33,7 +33,7 @@ public extension FacetListConnector { operator: `operator`, groupName: groupName) } - + /** Init with an explicit interactor & controller - Parameters: @@ -63,7 +63,7 @@ public extension FacetListConnector { operator: `operator`, groupName: groupName) } - + /** Init with implicit interactor - Parameters: diff --git a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector.swift b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector.swift index f59962a6..6cc2bb42 100644 --- a/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector.swift +++ b/Sources/InstantSearchCore/FacetList/Connector/FacetListConnector.swift @@ -12,28 +12,28 @@ import Foundation /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/refinement-list/ios/) public class FacetListConnector { - + /// Searcher that handles your searches. public let searcher: Searcher - + /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to the facets public let interactor: FacetListInteractor - + /// Attribute to filter public let attribute: Attribute - + /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connection between interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + internal init(searcher: Searcher, filterState: FilterState = .init(), interactor: FacetListInteractor = .init(), @@ -44,34 +44,34 @@ public class FacetListConnector { self.searcher = searcher self.interactor = interactor self.attribute = attribute - + self.filterStateConnection = interactor.connectFilterState(filterState, with: attribute, operator: `operator`, groupName: groupName) - + self.controllerConnections = [] - + switch searcher { case .facet(let facetSearcher): searcherConnection = interactor.connectFacetSearcher(facetSearcher) - + case .singleIndex(let singleIndexSearcher): searcherConnection = interactor.connectSearcher(singleIndexSearcher, with: attribute) } - + } - + } extension FacetListConnector: Connection { - + public func connect() { filterStateConnection.connect() searcherConnection.connect() controllerConnections.forEach { $0.connect() } } - + public func disconnect() { filterStateConnection.disconnect() searcherConnection.disconnect() @@ -81,10 +81,10 @@ extension FacetListConnector: Connection { } extension FacetListConnector { - + public enum Searcher { case singleIndex(SingleIndexSearcher) case facet(FacetSearcher) } - + } diff --git a/Sources/InstantSearchCore/FacetList/FacetListInteractor+Controller.swift b/Sources/InstantSearchCore/FacetList/FacetListInteractor+Controller.swift index dcd84019..43bbe72a 100644 --- a/Sources/InstantSearchCore/FacetList/FacetListInteractor+Controller.swift +++ b/Sources/InstantSearchCore/FacetList/FacetListInteractor+Controller.swift @@ -30,7 +30,7 @@ extension FacetList { public func connect() { ControllerConnection.setControllerItemsWith(facets: facetListInteractor.items, selections: facetListInteractor.selections, controller: controller, presenter: presenter) - + controller.onClick = { [weak facetListInteractor] facet in facetListInteractor?.computeSelections(selectingItemForKey: facet.value) } @@ -78,7 +78,7 @@ public extension FacetListInteractor { @discardableResult func connectController(_ controller: C, with presenter: SelectableListPresentable? = nil, externalReload: Bool = false) -> FacetList.ControllerConnection { - + let connection = FacetList.ControllerConnection(facetListInteractor: self, controller: controller, presenter: presenter, diff --git a/Sources/InstantSearchCore/FacetList/FacetListInteractor+FilterState.swift b/Sources/InstantSearchCore/FacetList/FacetListInteractor+FilterState.swift index 24847e9e..fb3cde8f 100644 --- a/Sources/InstantSearchCore/FacetList/FacetListInteractor+FilterState.swift +++ b/Sources/InstantSearchCore/FacetList/FacetListInteractor+FilterState.swift @@ -53,13 +53,13 @@ public enum FacetList { filterState.addAll(filters: filters, toGroupWithID: groupID) filterState.notifyChange() } - + } private func whenFilterStateChangedThenUpdateSelections(interactor: FacetListInteractor, filterState: FilterState, via groupID: FilterGroup.ID) { - + func extractString(from filter: Filter.Facet) -> String? { if case .string(let stringValue) = filter.value { return stringValue @@ -67,7 +67,7 @@ public enum FacetList { return nil } } - + filterState.onChange.subscribePast(with: interactor) { interactor, filterState in let filters: [Filter.Facet] switch groupID { diff --git a/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector+Controller.swift b/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector+Controller.swift index a0879a41..43bc3373 100644 --- a/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector+Controller.swift +++ b/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension FilterClearConnector { - + /** - Parameters: - filterState: FilterState that holds your filters diff --git a/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector.swift b/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector.swift index ed6b5ed8..41d3c35a 100644 --- a/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector.swift +++ b/Sources/InstantSearchCore/FilterClear/Connector/FilterClearConnector.swift @@ -12,19 +12,19 @@ import Foundation /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/clear-refinements/ios/) public class FilterClearConnector { - + /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to Clear Filters public let interactor: FilterClearInteractor - + /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + /** - Parameters: - filterState: FilterState that holds your filters @@ -43,19 +43,19 @@ public class FilterClearConnector { clearMode: clearMode) self.controllerConnections = [] } - + } extension FilterClearConnector: Connection { - + public func connect() { filterStateConnection.connect() controllerConnections.forEach { $0.connect() } } - + public func disconnect() { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/FilterList/Connector/FacetFilterListConnector.swift b/Sources/InstantSearchCore/FilterList/Connector/FacetFilterListConnector.swift index 648a47ab..9c869a23 100644 --- a/Sources/InstantSearchCore/FilterList/Connector/FacetFilterListConnector.swift +++ b/Sources/InstantSearchCore/FilterList/Connector/FacetFilterListConnector.swift @@ -14,7 +14,7 @@ import Foundation public typealias FacetFilterListConnector = FilterListConnector public extension FacetFilterListConnector { - + /** - Parameters: - facetFilters: Facet filters to display @@ -35,7 +35,7 @@ public extension FacetFilterListConnector { operator: `operator`, groupName: groupName) } - + /** - Parameters: - facetFilters: Facet filters to display. diff --git a/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector+Controller.swift b/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector+Controller.swift index 9e19a7c9..58d5d230 100644 --- a/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector+Controller.swift +++ b/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector+Controller.swift @@ -9,7 +9,7 @@ import Foundation public extension FilterListConnector { - + /** Init with explicit interactor and controller - Parameters: @@ -30,7 +30,7 @@ extension FilterListConnector { groupName: groupName) connectController(controller) } - + /** Init with implicit interactor and controller - Parameters: @@ -55,7 +55,7 @@ extension FilterListConnector { groupName: groupName) connectController(controller) } - + /** Establishes a connection with the controller - Parameters: @@ -67,5 +67,5 @@ extension FilterListConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector.swift b/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector.swift index 0bde2f0b..5d061a95 100644 --- a/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector.swift +++ b/Sources/InstantSearchCore/FilterList/Connector/FilterListConnector.swift @@ -13,13 +13,13 @@ public class FilterListConnector { /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to the filters public let interactor: FilterListInteractor - + /// Connection between interactor and filter state public let connectionFilterState: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -42,7 +42,7 @@ public class FilterListConnector { groupName: groupName) self.controllerConnections = [] } - + /** Init with implicit interactor - Parameters: @@ -64,11 +64,11 @@ public class FilterListConnector { operator: `operator`, groupName: groupName) } - + } extension FilterListConnector: Connection { - + public func connect() { connectionFilterState.connect() controllerConnections.forEach { $0.connect() } @@ -78,5 +78,5 @@ extension FilterListConnector: Connection { connectionFilterState.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/FilterList/Connector/NumericFilterListConnector.swift b/Sources/InstantSearchCore/FilterList/Connector/NumericFilterListConnector.swift index d732a746..7a318f57 100644 --- a/Sources/InstantSearchCore/FilterList/Connector/NumericFilterListConnector.swift +++ b/Sources/InstantSearchCore/FilterList/Connector/NumericFilterListConnector.swift @@ -35,7 +35,7 @@ public extension NumericFilterListConnector { operator: `operator`, groupName: groupName) } - + /** - Parameters: - numericFilters: Numeric filters to display diff --git a/Sources/InstantSearchCore/FilterList/Connector/TagFilterListConnector.swift b/Sources/InstantSearchCore/FilterList/Connector/TagFilterListConnector.swift index 065973cf..dca35448 100644 --- a/Sources/InstantSearchCore/FilterList/Connector/TagFilterListConnector.swift +++ b/Sources/InstantSearchCore/FilterList/Connector/TagFilterListConnector.swift @@ -14,7 +14,7 @@ import Foundation public typealias TagFilterListConnector = FilterListConnector public extension TagFilterListConnector { - + /** - Parameters: - tagFilters: Tag filters to display @@ -35,7 +35,7 @@ public extension TagFilterListConnector { operator: `operator`, groupName: groupName) } - + /** - Parameters: - tagFilters: Tag filters to display @@ -59,5 +59,5 @@ public extension TagFilterListConnector { groupName: groupName, controller: controller) } - + } diff --git a/Sources/InstantSearchCore/FilterState/Accessors/GroupAccessor.swift b/Sources/InstantSearchCore/FilterState/Accessors/GroupAccessor.swift index c4ad708f..48b24342 100644 --- a/Sources/InstantSearchCore/FilterState/Accessors/GroupAccessor.swift +++ b/Sources/InstantSearchCore/FilterState/Accessors/GroupAccessor.swift @@ -33,7 +33,7 @@ extension FiltersContainer { } public class ReadOnlyFiltersContainer { - + class StorageContainer: FiltersContainer { var filters: FilterState.Storage init(filterState: FilterState) { diff --git a/Sources/InstantSearchCore/FilterState/FilterState.swift b/Sources/InstantSearchCore/FilterState/FilterState.swift index a4c7f1f8..fa776f48 100644 --- a/Sources/InstantSearchCore/FilterState/FilterState.swift +++ b/Sources/InstantSearchCore/FilterState/FilterState.swift @@ -12,7 +12,7 @@ import Foundation Encapsulates search filters providing a convenient interface to manage them */ public class FilterState { - + typealias Storage = FiltersReadable & FiltersWritable & FilterGroupsConvertible & HierarchicalManageable /// Filters container diff --git a/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector+Controller.swift b/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector+Controller.swift index 558ddf05..8a9c87a6 100644 --- a/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector+Controller.swift +++ b/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector+Controller.swift @@ -8,9 +8,9 @@ import Foundation public extension HierarchicalConnector { - + typealias HierarchicalPresenter = ([HierarchicalFacet]) -> Output - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -33,7 +33,6 @@ public extension HierarchicalConnector { connectController(controller, presenter: presenter) } - /** Establishes a connection with the controller - Parameters: @@ -47,5 +46,5 @@ public extension HierarchicalConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector.swift b/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector.swift index 1a111154..a34fa581 100644 --- a/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector.swift +++ b/Sources/InstantSearchCore/Hierarchical/Connector/HierarchicalConnector.swift @@ -15,22 +15,22 @@ public class HierarchicalConnector { /// Searcher that handles your searches public let searcher: SingleIndexSearcher - + /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to the hierarchical facets. public let interactor: HierarchicalInteractor /// Connection between searcher and interactor public let searcherConnection: Connection - + /// Connection between filter state and interactor public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -53,7 +53,7 @@ public class HierarchicalConnector { } extension HierarchicalConnector: Connection { - + public func connect() { searcherConnection.connect() filterStateConnection.connect() @@ -65,5 +65,5 @@ extension HierarchicalConnector: Connection { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/Hierarchical/HierarchicalInteractor.swift b/Sources/InstantSearchCore/Hierarchical/HierarchicalInteractor.swift index 548dd377..679aa569 100644 --- a/Sources/InstantSearchCore/Hierarchical/HierarchicalInteractor.swift +++ b/Sources/InstantSearchCore/Hierarchical/HierarchicalInteractor.swift @@ -15,7 +15,7 @@ public class HierarchicalInteractor: ItemInteractor<[[Facet]]> { /// The names of the hierarchical attributes that we need to target, in ascending order. let hierarchicalAttributes: [Attribute] - + /// The string separating the facets in the hierarchical facets. Usually something like " > ". /// /// Note that you should not forget the spaces in between if there are some in your separator. diff --git a/Sources/InstantSearchCore/Hits/Connector/HitsConnector+Controller.swift b/Sources/InstantSearchCore/Hits/Connector/HitsConnector+Controller.swift index 9f65c3ba..db25d912 100644 --- a/Sources/InstantSearchCore/Hits/Connector/HitsConnector+Controller.swift +++ b/Sources/InstantSearchCore/Hits/Connector/HitsConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension HitsConnector { - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -18,10 +18,10 @@ public extension HitsConnector { - externalReload: Defines if controller will be updated automatically by the events or manually */ convenience init(searcher: SingleIndexSearcher, - interactor: HitsInteractor = .init(), - filterState: FilterState? = .none, - controller: Controller, - externalReload: Bool = false) where Controller.DataSource == HitsInteractor { + interactor: HitsInteractor = .init(), + filterState: FilterState? = .none, + controller: Controller, + externalReload: Bool = false) where Controller.DataSource == HitsInteractor { self.init(searcher: searcher, interactor: interactor, filterState: filterState, @@ -29,7 +29,7 @@ public extension HitsConnector { controller: controller, externalReload: externalReload) } - + /** - Parameters: - appID: ID of your application diff --git a/Sources/InstantSearchCore/Hits/Connector/HitsConnector+GeoSearch.swift b/Sources/InstantSearchCore/Hits/Connector/HitsConnector+GeoSearch.swift index 55bac310..8c2cecc5 100644 --- a/Sources/InstantSearchCore/Hits/Connector/HitsConnector+GeoSearch.swift +++ b/Sources/InstantSearchCore/Hits/Connector/HitsConnector+GeoSearch.swift @@ -25,7 +25,7 @@ public extension HitsConnector where Hit == PlaceHit { filterState: nil, connectSearcher: interactor.connectPlacesSearcher) } - + /** Convenient initializer for Places search - Parameters: @@ -59,14 +59,14 @@ public extension HitsConnector where Hit == PlaceHit { */ convenience init(searcher: PlacesSearcher, interactor: HitsInteractor, - controller: Controller) where Controller.DataSource == HitsInteractor { + controller: Controller) where Controller.DataSource == HitsInteractor { self.init(searcher: searcher, interactor: interactor, filterState: nil, connectSearcher: interactor.connectPlacesSearcher) connectController(controller) } - + /** Convenient initializer for Places search - Parameters: @@ -89,7 +89,7 @@ public extension HitsConnector where Hit == PlaceHit { connectSearcher: interactor.connectPlacesSearcher) connectController(controller) } - + /** Establishes a connection with the controller - Parameters: diff --git a/Sources/InstantSearchCore/Hits/Connector/HitsConnector.swift b/Sources/InstantSearchCore/Hits/Connector/HitsConnector.swift index 20d2db83..ea097d1d 100644 --- a/Sources/InstantSearchCore/Hits/Connector/HitsConnector.swift +++ b/Sources/InstantSearchCore/Hits/Connector/HitsConnector.swift @@ -15,19 +15,19 @@ public class HitsConnector { /// Searcher that handles your searches public let searcher: Searcher - + /// Logic applied to the hits public let interactor: HitsInteractor - + /// FilterState that holds your filters public let filterState: FilterState? /// Connection between hits interactor and filter state public let filterStateConnection: Connection? - + /// Connection between hits interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -42,7 +42,7 @@ public class HitsConnector { self.searcherConnection = connectSearcher(searcher) self.controllerConnections = [] } - + internal convenience init(searcher: S, interactor: HitsInteractor, filterState: FilterState? = .none, @@ -55,11 +55,11 @@ public class HitsConnector { connectSearcher: connectSearcher) connectController(controller, externalReload: externalReload) } - + } extension HitsConnector: Connection { - + public func connect() { filterStateConnection?.connect() searcherConnection.connect() @@ -74,7 +74,7 @@ extension HitsConnector: Connection { } -//MARK: - Convenient initializers +// MARK: - Convenient initializers public extension HitsConnector { @@ -92,7 +92,7 @@ public extension HitsConnector { filterState: filterState, connectSearcher: interactor.connectSearcher) } - + /** - Parameters: - appID: ID of your application. diff --git a/Sources/InstantSearchCore/Hits/HitsInteractor.swift b/Sources/InstantSearchCore/Hits/HitsInteractor.swift index 06f87134..db7f2771 100644 --- a/Sources/InstantSearchCore/Hits/HitsInteractor.swift +++ b/Sources/InstantSearchCore/Hits/HitsInteractor.swift @@ -23,10 +23,10 @@ public class HitsInteractor: AnyHitsInteractor { /// Event triggered when a search request has changed public let onRequestChanged: Observer - + /// Event triggered when a new search result received public let onResultsUpdated: Observer - + /// Event triggered when an error occured in hits public let onError: Observer diff --git a/Sources/InstantSearchCore/Loading/Connector/LoadingConnector+Controller.swift b/Sources/InstantSearchCore/Loading/Connector/LoadingConnector+Controller.swift index d522336c..a35240ae 100644 --- a/Sources/InstantSearchCore/Loading/Connector/LoadingConnector+Controller.swift +++ b/Sources/InstantSearchCore/Loading/Connector/LoadingConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension LoadingConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -33,5 +33,5 @@ public extension LoadingConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/Loading/Connector/LoadingConnector.swift b/Sources/InstantSearchCore/Loading/Connector/LoadingConnector.swift index 954e14c9..b8fb315e 100644 --- a/Sources/InstantSearchCore/Loading/Connector/LoadingConnector.swift +++ b/Sources/InstantSearchCore/Loading/Connector/LoadingConnector.swift @@ -15,13 +15,13 @@ public class LoadingConnector { /// Searcher that handles your searches public let searcher: S - + /// Logic that handles showing a loading indicator public let interactor: LoadingInteractor - + /// Connection between searcher and interactor public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -41,7 +41,7 @@ public class LoadingConnector { } extension LoadingConnector: Connection { - + public func connect() { searcherConnection.connect() controllerConnections.forEach { $0.connect() } @@ -51,5 +51,5 @@ extension LoadingConnector: Connection { searcherConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+Controller.swift b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+Controller.swift index 6d9ed6de..461e94eb 100644 --- a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+Controller.swift +++ b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension MultiIndexHitsConnector { - + /** - Parameters: - appID: ID of your application @@ -30,7 +30,6 @@ public extension MultiIndexHitsConnector { connectController(controller) } - /** Establishes a connection with the controller - Parameters: @@ -42,5 +41,5 @@ public extension MultiIndexHitsConnector { connection.connect() return connection } - + } diff --git a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+IndexModule.swift b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+IndexModule.swift index 846102e4..76dee34b 100644 --- a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+IndexModule.swift +++ b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector+IndexModule.swift @@ -14,10 +14,10 @@ public extension MultiIndexHitsConnector { /// Name of the index public let indexName: IndexName - + /// Logic applied to the hits public let hitsInteractor: AnyHitsInteractor - + /// FilterState that holds your filters public let filterState: FilterState? @@ -56,5 +56,3 @@ public extension MultiIndexHitsConnector { } } - - diff --git a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector.swift b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector.swift index db8212ff..a6b2b25e 100644 --- a/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector.swift +++ b/Sources/InstantSearchCore/MultiIndexHits/Connector/MultiIndexHitsConnector.swift @@ -15,19 +15,19 @@ public class MultiIndexHitsConnector { /// Searcher that handles your searches public let searcher: MultiIndexSearcher - + /// Logic applied to the hits public let interactor: MultiIndexHitsInteractor - + /// List of FilterStates that will hold your filters separately for each index public let filterStates: [FilterState?] - + /// Connections between hits interactors and filter states public let filterStatesConnections: [Connection] - + /// Connection between hits interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -51,7 +51,6 @@ public class MultiIndexHitsConnector { self.controllerConnections = [] } - } extension MultiIndexHitsConnector: Connection { @@ -67,13 +66,13 @@ extension MultiIndexHitsConnector: Connection { filterStatesConnections.forEach { $0.disconnect() } controllerConnections.forEach { $0.disconnect() } } - + } -//MARK: - Convenient initializers +// MARK: - Convenient initializers public extension MultiIndexHitsConnector { - + /** - Parameters: - appID: ID of your application @@ -91,5 +90,5 @@ public extension MultiIndexHitsConnector { interactor: interactor, filterStates: indexModules.map { $0.filterState }) } - + } diff --git a/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector+Controller.swift b/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector+Controller.swift index 67ab9569..d23076ec 100644 --- a/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector+Controller.swift +++ b/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension FilterComparisonConnector { - + /** - Parameters: - filterState: FilterState that holds your filters diff --git a/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector.swift b/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector.swift index c00f618d..19eb8442 100644 --- a/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector.swift +++ b/Sources/InstantSearchCore/Number/Connector/FilterComparisonConnector.swift @@ -13,25 +13,25 @@ public class FilterComparisonConnector /// Logic applied to comparison public let interactor: NumberInteractor - + /// FilterState that holds your filters public let filterState: FilterState - + /// Attribute to filter with a numeric comparison public let attribute: Attribute - + /// Comparison operator to apply public let numericOperator: Filter.Numeric.Operator - + /// Whether the filter is added to a conjuncitve(`and`) or a disjuncitve (`or`) group in the filter state public let `operator`: RefinementOperator - + /// Filter group name in the filter state public let groupName: String /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -73,7 +73,7 @@ public class FilterComparisonConnector } extension FilterComparisonConnector: Connection { - + public func connect() { filterStateConnection.connect() controllerConnections.forEach { $0.connect() } @@ -83,5 +83,5 @@ extension FilterComparisonConnector: Connection { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector+Controller.swift b/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector+Controller.swift index 963e3be2..63985534 100644 --- a/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector+Controller.swift +++ b/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension NumberRangeConnector { - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -50,5 +50,5 @@ public extension NumberRangeConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector.swift b/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector.swift index 1b865c64..81cdc5db 100644 --- a/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector.swift +++ b/Sources/InstantSearchCore/NumberRange/Connector/NumberRangeConnector.swift @@ -12,28 +12,28 @@ import Foundation /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/filter-list-numeric/ios/) public class NumberRangeConnector { - + /// Searcher that handles your searches. public let searcher: SingleIndexSearcher - + /// FilterState that holds your filters public let filterState: FilterState - + /// Attribute to filter public let attribute: Attribute - + /// Logic applied to the numeric range public let interactor: NumberRangeInteractor - + /// Connection between interactor and searcher public let searcherConnection: Connection /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -43,7 +43,7 @@ public class NumberRangeConnector { - operator: Whether the filter is added to a conjuncitve(and) or a disjuncitve (or) group in the filter state. Default value: .and - groupName: Filter group name in the filter state. Default value: The value of the `attribute` parameter */ - + public init(searcher: SingleIndexSearcher, filterState: FilterState, attribute: Attribute, @@ -61,13 +61,13 @@ public class NumberRangeConnector { groupName: groupName) self.controllerConnections = [] } - + } -//MARK: - Convenient initializers +// MARK: - Convenient initializers public extension NumberRangeConnector { - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -94,20 +94,19 @@ public extension NumberRangeConnector { operator: `operator`, groupName: groupName) } - -} +} extension NumberRangeConnector: Connection { - + public func connect() { filterStateConnection.connect() controllerConnections.forEach { $0.connect() } } - + public func disconnect() { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/NumberRange/NumberRangeInteractor.swift b/Sources/InstantSearchCore/NumberRange/NumberRangeInteractor.swift index 09815166..5db4c80c 100644 --- a/Sources/InstantSearchCore/NumberRange/NumberRangeInteractor.swift +++ b/Sources/InstantSearchCore/NumberRange/NumberRangeInteractor.swift @@ -25,7 +25,7 @@ public class NumberRangeInteractor: It public convenience init() { self.init(item: nil) } - + /** - Parameters: - item: Initial range value @@ -48,12 +48,12 @@ public class NumberRangeInteractor: It let limitedRange = limitRange(numberRange, limitedBy: bounds) onNumberRangeComputed.fire(limitedRange) } - + private func limitRange(_ range: ClosedRange?, limitedBy bounds: ClosedRange?) -> ClosedRange? { guard let bounds = bounds else { return range } return range?.clamped(to: bounds) } - + } diff --git a/Sources/InstantSearchCore/QueryBuilder/QueryBuilder+DisjunctiveFaceting.swift b/Sources/InstantSearchCore/QueryBuilder/QueryBuilder+DisjunctiveFaceting.swift index 7d265e39..cfe742f9 100644 --- a/Sources/InstantSearchCore/QueryBuilder/QueryBuilder+DisjunctiveFaceting.swift +++ b/Sources/InstantSearchCore/QueryBuilder/QueryBuilder+DisjunctiveFaceting.swift @@ -155,6 +155,7 @@ extension Collection { extension Collection { func anySatisfy(_ predicate: (Element) -> Bool) -> Bool { + // swiftlint:disable reduce_boolean return reduce(false) { $0 || predicate($1) } } diff --git a/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector+Controller.swift b/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector+Controller.swift index 280b61cd..6be26e98 100644 --- a/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector+Controller.swift +++ b/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation extension QueryInputConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -17,15 +17,15 @@ extension QueryInputConnector { - controller: Controller interfacing with a concrete query input view */ public convenience init(searcher: S, - interactor: QueryInputInteractor = .init(), - searchTriggeringMode: SearchTriggeringMode = .searchAsYouType, - controller: Controller) { + interactor: QueryInputInteractor = .init(), + searchTriggeringMode: SearchTriggeringMode = .searchAsYouType, + controller: Controller) { self.init(searcher: searcher, interactor: interactor, searchTriggeringMode: searchTriggeringMode) connectController(controller) } - + /** Establishes a connection with the controller - Parameters: @@ -37,5 +37,5 @@ extension QueryInputConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector.swift b/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector.swift index 11b0df77..a6d8409b 100644 --- a/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector.swift +++ b/Sources/InstantSearchCore/QueryInput/Connector/QueryInputConnector.swift @@ -15,13 +15,13 @@ public class QueryInputConnector { /// Searcher that handles your searches public let searcher: S - + /// Business logic that handles new search inputs public let interactor: QueryInputInteractor /// Connection between query input interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -43,7 +43,7 @@ public class QueryInputConnector { } extension QueryInputConnector: Connection { - + public func connect() { searcherConnection.connect() controllerConnections.forEach { $0.connect() } @@ -53,5 +53,5 @@ extension QueryInputConnector: Connection { searcherConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector+Controller.swift b/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector+Controller.swift index 17f81f0a..5ec5b0b7 100644 --- a/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector+Controller.swift +++ b/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension QueryRuleCustomDataConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -20,12 +20,12 @@ public extension QueryRuleCustomDataConnector { interactor: Interactor = .init(), controller: Controller, presenter: @escaping (Model?) -> Output) where Controller.Item == Output { - + self.init(searcher: searcher, interactor: interactor) let controllerConnection = interactor.connectController(controller, presenter: presenter) controllerConnections.append(controllerConnection) } - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -39,11 +39,11 @@ public extension QueryRuleCustomDataConnector { let controllerConnection = interactor.connectController(controller, presenter: { $0 }) controllerConnections.append(controllerConnection) } - + } public extension QueryRuleCustomDataConnector { - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -57,12 +57,12 @@ public extension QueryRuleCustomDataConnector { interactor: Interactor = .init(), controller: Controller, presenter: @escaping (Model?) -> Output) where Controller.Item == Output { - + self.init(searcher: searcher, queryIndex: queryIndex, interactor: interactor) let controllerConnection = interactor.connectController(controller, presenter: presenter) controllerConnections = [controllerConnection] } - + /** - Parameters: - searcher: Searcher that handles your searches. @@ -78,11 +78,11 @@ public extension QueryRuleCustomDataConnector { let controllerConnection = interactor.connectController(controller, presenter: { $0 }) controllerConnections.append(controllerConnection) } - + } public extension QueryRuleCustomDataConnector { - + /** Establishes a connection with the controller - Parameters: @@ -96,7 +96,7 @@ public extension QueryRuleCustomDataConnector { controllerConnections.append(connection) return connection } - + /** Establishes a connection with the controller - Parameters: @@ -108,5 +108,5 @@ public extension QueryRuleCustomDataConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector.swift b/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector.swift index baebc4bf..e376a39e 100644 --- a/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector.swift +++ b/Sources/InstantSearchCore/QueryRuleCustomData/Connector/QueryRuleCustomDataConnector.swift @@ -11,18 +11,18 @@ import Foundation /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/query-rule-custom-data/ios/) public class QueryRuleCustomDataConnector { - + public typealias Interactor = QueryRuleCustomDataInteractor - + /// Logic applied to the custom model public let interactor: Interactor - + /// Connection between hits interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + internal init(interactor: Interactor, connectSearcher: (Interactor) -> Connection) { self.interactor = interactor @@ -30,11 +30,11 @@ public class QueryRuleCustomDataConnector { controllerConnections = [] searcherConnection.connect() } - + } public extension QueryRuleCustomDataConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -46,7 +46,7 @@ public extension QueryRuleCustomDataConnector { QueryRuleCustomDataInteractor.SingleIndexSearcherConnection(interactor: $0, searcher: searcher) } } - + /** - Parameters: - searcher: Searcher that handles your searches @@ -60,19 +60,19 @@ public extension QueryRuleCustomDataConnector { QueryRuleCustomDataInteractor.MultiIndexSearcherConnection(interactor: $0, searcher: searcher, queryIndex: queryIndex) } } - + } extension QueryRuleCustomDataConnector: Connection { - + public func connect() { searcherConnection.connect() controllerConnections.forEach { $0.connect() } } - + public func disconnect() { searcherConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+MultiIndexSearcher.swift b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+MultiIndexSearcher.swift index f4b2e4d0..c184c931 100644 --- a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+MultiIndexSearcher.swift +++ b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+MultiIndexSearcher.swift @@ -8,19 +8,19 @@ import Foundation extension QueryRuleCustomDataInteractor { - + /// Connection between a rule custom data logic and a multi-index searcher public struct MultiIndexSearcherConnection: Connection { - + /// Logic applied to the custom model public let interactor: QueryRuleCustomDataInteractor - + /// Searcher that handles your searches public let searcher: MultiIndexSearcher - + /// Index of query from response of which the user data will be extracted public let queryIndex: Int - + /** - Parameters: - interactor: Interactor to connect @@ -34,23 +34,23 @@ extension QueryRuleCustomDataInteractor { self.queryIndex = queryIndex self.interactor = interactor } - + public func connect() { searcher.onResults.subscribe(with: interactor) { (interactor, searchResponse) in interactor.extractModel(from: searchResponse.results[queryIndex]) } } - + public func disconnect() { searcher.onResults.cancelSubscription(for: interactor) } } - + } public extension QueryRuleCustomDataInteractor { - + /** - Parameters: - searcher: Searcher to connect @@ -62,6 +62,5 @@ public extension QueryRuleCustomDataInteractor { connection.connect() return connection } - -} +} diff --git a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+SingleIndexSearcher.swift b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+SingleIndexSearcher.swift index 8ab1d3e7..d759235a 100644 --- a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+SingleIndexSearcher.swift +++ b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor+SingleIndexSearcher.swift @@ -8,16 +8,16 @@ import Foundation extension QueryRuleCustomDataInteractor { - + /// Connection between a rule custom data logic and a single index searcher public struct SingleIndexSearcherConnection: Connection { - + /// Logic applied to the custom model public let interactor: QueryRuleCustomDataInteractor - + /// Searcher that handles your searches public let searcher: SingleIndexSearcher - + /** - Parameters: - interactor: Interactor to connect @@ -28,23 +28,23 @@ extension QueryRuleCustomDataInteractor { self.searcher = searcher self.interactor = interactor } - + public func connect() { searcher.onResults.subscribe(with: interactor) { (interactor, searchResponse) in interactor.extractModel(from: searchResponse) } } - + public func disconnect() { searcher.onResults.cancelSubscription(for: interactor) } } - + } public extension QueryRuleCustomDataInteractor { - + /** - Parameters: - searcher: Searcher to connect diff --git a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor.swift b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor.swift index 070e78ed..1d56c042 100644 --- a/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor.swift +++ b/Sources/InstantSearchCore/QueryRuleCustomData/QueryRuleCustomDataInteractor.swift @@ -13,11 +13,11 @@ public class QueryRuleCustomDataInteractor: ItemInteractor(_ controller: Controller) -> ItemInteractor.ControllerConnection { super.connectController(controller, presenter: { $0 }) } - + } diff --git a/Sources/InstantSearchCore/Searcher/Facet/FacetSearcher.swift b/Sources/InstantSearchCore/Searcher/Facet/FacetSearcher.swift index 28586d8d..ee08381a 100644 --- a/Sources/InstantSearchCore/Searcher/Facet/FacetSearcher.swift +++ b/Sources/InstantSearchCore/Searcher/Facet/FacetSearcher.swift @@ -28,9 +28,9 @@ public class FacetSearcher: Searcher, SequencerDelegate, SearchResultObservable public var indexQueryState: IndexQueryState public let isLoading: Observer - + public var onQueryChanged: Observer - + public let onSearch: Observer public let onResults: Observer @@ -107,7 +107,7 @@ public class FacetSearcher: Searcher, SequencerDelegate, SearchResultObservable public func search() { onSearch.fire(()) - + let query = self.query ?? "" let indexName = indexQueryState.indexName diff --git a/Sources/InstantSearchCore/Searcher/MultiIndex/MultiIndexSearcher.swift b/Sources/InstantSearchCore/Searcher/MultiIndex/MultiIndexSearcher.swift index 561b97f3..ede10ef4 100644 --- a/Sources/InstantSearchCore/Searcher/MultiIndex/MultiIndexSearcher.swift +++ b/Sources/InstantSearchCore/Searcher/MultiIndex/MultiIndexSearcher.swift @@ -15,6 +15,10 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv public var query: String? { + get { + return indexQueryStates.first?.query.query + } + set { let oldValue = indexQueryStates.first?.query.query guard oldValue != newValue else { return } @@ -25,10 +29,6 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv onQueryChanged.fire(newValue) } - get { - return indexQueryStates.first?.query.query - } - } /// `Client` instance containing indices in which search will be performed @@ -47,7 +47,7 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv public let isLoading: Observer public let onQueryChanged: Observer - + public let onSearch: Observer public let onResults: Observer @@ -55,11 +55,11 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv /// Triggered when an error occured during search query execution /// - Parameter: a tuple of query and error public let onError: Observer<([Query], Error)> - + /// Triggered when an index of a query changed /// - Parameter: a tuple of a index of query for which the indexName has changed and the new indexName public let onIndexChanged: Observer<(Int, IndexName)> - + /// Custom request options public var requestOptions: RequestOptions? @@ -68,7 +68,7 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv /// Helpers for separate pagination management internal var pageLoaders: [PageLoaderProxy] - + /// Closure defining the condition under which the search operation should be triggered /// /// Example: if you don't want search operation triggering in case the query for the first index is empty, you should set this value @@ -151,17 +151,17 @@ public class MultiIndexSearcher: Searcher, SequencerDelegate, SearchResultObserv processingQueue.qualityOfService = .userInitiated self.pageLoaders = indexQueryStates.enumerated().map { [weak self] (index, _) in - return PageLoaderProxy(setPage: { self?.indexQueryStates[index].query.page = $0 }, launchSearch: { self?.search() }) + return PageLoaderProxy(setPage: { self?.indexQueryStates[index].query.page = $0 }, launchSearch: { self?.search() }) } } public func search() { - + if let shouldTriggerSearch = shouldTriggerSearchForQueries, !shouldTriggerSearch(indexQueryStates.map(\.query)) { return } - + onSearch.fire(()) let queries = indexQueryStates.map { IndexedQuery(indexName: $0.indexName, query: $0.query) } diff --git a/Sources/InstantSearchCore/Searcher/Places/PlacesSearcher.swift b/Sources/InstantSearchCore/Searcher/Places/PlacesSearcher.swift index ec6b54bf..dce2de70 100644 --- a/Sources/InstantSearchCore/Searcher/Places/PlacesSearcher.swift +++ b/Sources/InstantSearchCore/Searcher/Places/PlacesSearcher.swift @@ -27,15 +27,15 @@ public class PlacesSearcher: Searcher, SequencerDelegate, SearchResultObservable } public var placesQuery: PlacesQuery - + public let isLoading: Observer public var onQueryChanged: Observer - + public let onSearch: Observer public let onResults: Observer - + /// Triggered when an error occured during search query execution /// - Parameter: a tuple of query text and error public let onError: Observer<(String, Error)> @@ -68,7 +68,7 @@ public class PlacesSearcher: Searcher, SequencerDelegate, SearchResultObservable } public func search() { - + onSearch.fire(()) let operation = placesClient.search(query: placesQuery, language: .english) { [weak self] result in diff --git a/Sources/InstantSearchCore/Searcher/Searcher.swift b/Sources/InstantSearchCore/Searcher/Searcher.swift index 8d30eda0..1b37d00e 100644 --- a/Sources/InstantSearchCore/Searcher/Searcher.swift +++ b/Sources/InstantSearchCore/Searcher/Searcher.swift @@ -21,7 +21,7 @@ public protocol Searcher: class { /// Triggered when query text changed /// - Parameter: a new query text value var onQueryChanged: Observer { get } - + /// Triggered when a search operation launched var onSearch: Observer { get } diff --git a/Sources/InstantSearchCore/Searcher/SingleIndex/SingleIndexSearcher.swift b/Sources/InstantSearchCore/Searcher/SingleIndex/SingleIndexSearcher.swift index 15e36e44..f32a5c77 100644 --- a/Sources/InstantSearchCore/Searcher/SingleIndex/SingleIndexSearcher.swift +++ b/Sources/InstantSearchCore/Searcher/SingleIndex/SingleIndexSearcher.swift @@ -16,6 +16,10 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser public var query: String? { + get { + return indexQueryState.query.query + } + set { let oldValue = indexQueryState.query.query guard oldValue != newValue else { return } @@ -25,10 +29,6 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser onQueryChanged.fire(newValue) } - get { - return indexQueryState.query.query - } - } public let client: SearchClient @@ -43,9 +43,9 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser } public let isLoading: Observer - + public let onQueryChanged: Observer - + public let onSearch: Observer public let onResults: Observer @@ -57,7 +57,7 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser /// Triggered when an index of Searcher changed /// - Parameter: equals to a new index value public let onIndexChanged: Observer - + /// Custom request options public var requestOptions: RequestOptions? @@ -70,11 +70,11 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser /// Flag defining if disjunctive faceting is enabled /// - Default value: true public var isDisjunctiveFacetingEnabled = true - + /// Flag defining if the selected query facet must be kept even if it does not match current results anymore /// - Default value: true public var keepSelectedEmptyFacets: Bool = true - + /// Closure defining the condition under which the search operation should be triggered /// /// Example: if you don't want search operation triggering in case of empty query, you should set this value @@ -151,11 +151,11 @@ public class SingleIndexSearcher: Searcher, SequencerDelegate, SearchResultObser } public func search() { - + if let shouldTriggerSearch = shouldTriggerSearchForQuery, !shouldTriggerSearch(indexQueryState.query) { return } - + onSearch.fire(()) let query = indexQueryState.query diff --git a/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector+Controller.swift b/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector+Controller.swift index 171507a3..429ed1db 100644 --- a/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector+Controller.swift +++ b/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension SelectableFilterConnector { - + /** Init with implicit interactor & controller - Parameters: diff --git a/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector.swift b/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector.swift index 85734952..fba8d0df 100644 --- a/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector.swift +++ b/Sources/InstantSearchCore/Segmented/Connector/SelectableFilterConnector.swift @@ -12,28 +12,28 @@ public class SelectableFilterConnector { /// Searcher that handles your searches public let searcher: SingleIndexSearcher - + /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to the filters public let interactor: SelectableSegmentInteractor - + /// Attribute to filter public let attribute: Attribute - + /// Whether we apply an `and` or `or` behavior to the filters in the filter state public let `operator`: RefinementOperator - + /// Filter group name public let groupName: String /// Connection between interactor and searcher public let searcherConnection: SelectableFilterInteractorSearcherConnection - + /// Connection between interactor and filterState public let filterStateConnection: SelectableFilterInteractorFilterStateConnection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -74,7 +74,7 @@ public class SelectableFilterConnector { } extension SelectableFilterConnector: Connection { - + public func connect() { searcherConnection.connect() filterStateConnection.connect() @@ -86,5 +86,5 @@ extension SelectableFilterConnector: Connection { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/Sequencer/Sequencer.swift b/Sources/InstantSearchCore/Sequencer/Sequencer.swift index 4d93a30e..8b7d36ff 100644 --- a/Sources/InstantSearchCore/Sequencer/Sequencer.swift +++ b/Sources/InstantSearchCore/Sequencer/Sequencer.swift @@ -64,7 +64,7 @@ class Sequencer: Sequencable { } } } - + /// Indicates whether there are any pending operations. var hasPendingOperations: Bool { syncQueue.sync { @@ -83,7 +83,7 @@ class Sequencer: Sequencable { var maxConcurrentCompletionOperationsCount: Int = 5 weak var delegate: SequencerDelegate? - + /// Queue containing SequencerCompletion operations private let sequencerQueue: OperationQueue @@ -98,20 +98,20 @@ class Sequencer: Sequencable { func orderOperation(operationLauncher: @escaping Sequencable.OperationLauncher) { syncQueue.async { [weak self] in guard let sequencer = self else { return } - + // Increase sequence number sequencer.nextSeqNo += 1 let currentSeqNo = sequencer.nextSeqNo - + // Launch sequenced operation let operation = operationLauncher() sequencer.pendingOperations[currentSeqNo] = operation - + // Create and launch completion operation let sequencingOperation = SequencerCompletionOperation(sequenceNo: currentSeqNo, sequencer: sequencer, correspondingOperation: operation) sequencingOperation.addDependency(operation) sequencer.sequencerQueue.addOperation(sequencingOperation) - + // Cancel obsolete operations let obsoleteOperations = sequencer.pendingOperations.filter { $0.0 <= currentSeqNo - sequencer.maxPendingOperationsCount } for (operationNo, operation) in obsoleteOperations { @@ -135,7 +135,7 @@ class Sequencer: Sequencable { } } } - + /// Clean-up after a succesful completion of a sequenced operation /// /// - parameter seqNo: The operation's sequence number. @@ -143,9 +143,9 @@ class Sequencer: Sequencable { private func dismissOperation(forSeqNo seqNo: Int) { syncQueue.async { [weak self] in guard let sequencer = self else { return } - + Logger.trace("Sequencer: Dismiss \(seqNo)") - + // Cancel all preceding operations (as this one is deemed more recent). let precedingOperations = sequencer.pendingOperations.filter { $0.0 < seqNo } for (operationNo, operation) in precedingOperations { @@ -153,14 +153,14 @@ class Sequencer: Sequencable { operation.cancel() sequencer.pendingOperations.removeValue(forKey: operationNo) } - + // Remove the current operation. sequencer.pendingOperations.removeValue(forKey: seqNo) // Update last received response. sequencer.lastReceivedSeqNo = seqNo } - + } } diff --git a/Sources/InstantSearchCore/SortBy/Connector/SortByConnector+Controller.swift b/Sources/InstantSearchCore/SortBy/Connector/SortByConnector+Controller.swift index b510cd66..70ea2a34 100644 --- a/Sources/InstantSearchCore/SortBy/Connector/SortByConnector+Controller.swift +++ b/Sources/InstantSearchCore/SortBy/Connector/SortByConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension SortByConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -21,7 +21,7 @@ public extension SortByConnector { indicesNames: [IndexName], selected: Int? = nil, controller: Controller, - presenter: @escaping IndexPresenter = DefaultPresenter.Index.present) where Controller.SegmentKey == Int { + presenter: @escaping IndexPresenter = DefaultPresenter.Index.present) where Controller.SegmentKey == Int { let enumeratedIndices = indicesNames .map(searcher.client.index(withName:)) .enumerated() @@ -32,7 +32,7 @@ public extension SortByConnector { self.init(searcher: searcher, interactor: interactor) connectController(controller, presenter: presenter) } - + /** Establishes a connection with the controller using the provided presentation logic - Parameters: diff --git a/Sources/InstantSearchCore/SortBy/Connector/SortByConnector.swift b/Sources/InstantSearchCore/SortBy/Connector/SortByConnector.swift index 0d19c810..5db8d223 100644 --- a/Sources/InstantSearchCore/SortBy/Connector/SortByConnector.swift +++ b/Sources/InstantSearchCore/SortBy/Connector/SortByConnector.swift @@ -13,19 +13,19 @@ import AlgoliaSearchClient /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/sort-by/ios/) public class SortByConnector { - + /// Searcher that handles your searches public let searcher: SingleIndexSearcher - + /// Logic applied to the indices public let interactor: IndexSegmentInteractor - + /// Connection between interactor and searcher public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + /** - Parameters: - searcher: Searcher that handles your searches @@ -61,7 +61,7 @@ public class SortByConnector { } extension SortByConnector: Connection { - + public func connect() { searcherConnection.connect() controllerConnections.forEach { $0.connect() } @@ -71,5 +71,5 @@ extension SortByConnector: Connection { searcherConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/Stats/Connector/StatsConnector+Controller.swift b/Sources/InstantSearchCore/Stats/Connector/StatsConnector+Controller.swift index 0dd3b07b..b25c7142 100644 --- a/Sources/InstantSearchCore/Stats/Connector/StatsConnector+Controller.swift +++ b/Sources/InstantSearchCore/Stats/Connector/StatsConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension StatsConnector { - + /** - Parameters: - searcher: Searcher that handles your searches @@ -17,14 +17,14 @@ public extension StatsConnector { - presenter: Presenter defining how stats appear in the controller */ convenience init(searcher: SingleIndexSearcher, - interactor: StatsInteractor = .init(), - controller: Controller, - presenter: @escaping Presenter) where Controller.Item == Output { + interactor: StatsInteractor = .init(), + controller: Controller, + presenter: @escaping Presenter) where Controller.Item == Output { self.init(searcher: searcher, interactor: interactor) connectController(controller, presenter: presenter) } - + /** Establishes a connection with the controller using the provided presentation logic - Parameters: @@ -37,5 +37,5 @@ public extension StatsConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/Stats/Connector/StatsConnector.swift b/Sources/InstantSearchCore/Stats/Connector/StatsConnector.swift index f1433a60..2045c5f4 100644 --- a/Sources/InstantSearchCore/Stats/Connector/StatsConnector.swift +++ b/Sources/InstantSearchCore/Stats/Connector/StatsConnector.swift @@ -15,13 +15,13 @@ public class StatsConnector { /// Searcher that handles your searches public let searcher: SingleIndexSearcher - + /// Logic applied to Stats public let interactor: StatsInteractor /// Connection between searcher and interactor public let searcherConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] @@ -41,7 +41,7 @@ public class StatsConnector { } extension StatsConnector: Connection { - + public func connect() { searcherConnection.connect() controllerConnections.forEach { $0.connect() } @@ -51,5 +51,5 @@ extension StatsConnector: Connection { searcherConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - + } diff --git a/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector+Controller.swift b/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector+Controller.swift index 2fe2c378..e6e096d4 100644 --- a/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector+Controller.swift +++ b/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector+Controller.swift @@ -8,7 +8,7 @@ import Foundation public extension FilterToggleConnector { - + /** - Parameters: - filterState: FilterState that holds your filters @@ -32,7 +32,7 @@ public extension FilterToggleConnector { groupName: groupName) connectController(controller) } - + /** Establishes a connection with the controller - Parameters: @@ -44,5 +44,5 @@ public extension FilterToggleConnector { controllerConnections.append(connection) return connection } - + } diff --git a/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector.swift b/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector.swift index 733b30cb..454cbc23 100644 --- a/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector.swift +++ b/Sources/InstantSearchCore/Toggle/Connector/FilterToggleConnector.swift @@ -12,19 +12,19 @@ import Foundation /// /// [Documentation](https://www.algolia.com/doc/api-reference/widgets/toggle-refinement/ios/) public class FilterToggleConnector { - + /// FilterState that holds your filters public let filterState: FilterState - + /// Logic applied to Filter Toggle public let interactor: SelectableInteractor - + /// Connection between interactor and filter state public let filterStateConnection: Connection - + /// Connections between interactor and controllers public var controllerConnections: [Connection] - + /** - Parameters: - filterState: FilterState that holds your filters @@ -43,7 +43,7 @@ public class FilterToggleConnector { groupName: groupName ?? interactor.item.attribute.rawValue) controllerConnections = [] } - + /** - Parameters: - filterState: FilterState that holds your filters @@ -64,20 +64,19 @@ public class FilterToggleConnector { operator: `operator`, groupName: groupName) } - + } extension FilterToggleConnector: Connection { - + public func connect() { filterStateConnection.connect() controllerConnections.forEach { $0.connect() } } - + public func disconnect() { filterStateConnection.disconnect() controllerConnections.forEach { $0.disconnect() } } - -} +} diff --git a/Tests/InstantSearchTests/Snippets/RedirectGuideSnippets.swift b/Tests/InstantSearchTests/Snippets/RedirectGuideSnippets.swift index c4ce21e6..0b1c951a 100644 --- a/Tests/InstantSearchTests/Snippets/RedirectGuideSnippets.swift +++ b/Tests/InstantSearchTests/Snippets/RedirectGuideSnippets.swift @@ -45,6 +45,8 @@ class RedirectGuideSnippets { queryRuleCustomDataConnector.interactor.onItemChanged.subscribe(with: self) { (_, redirect) in if let redirectURL = redirect?.url { /// perform redirect with URL + + _ = redirectURL // To supress warning } } diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 6c2932c7..9e282c9a 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -51,11 +51,6 @@ lane :deploy do |options| branch = options[:branch] || "master" prepare_git(branch) - pod_lib_lint( - verbose: true, - allow_warnings: true - ) - new_build_number = version_bump_podspec( bump_type: options[:type], path: "InstantSearch.podspec" @@ -66,10 +61,9 @@ lane :deploy do |options| branchName = "version-#{new_build_number}" sh("git checkout -b #{branchName}") - #puts changelog_from_git_commits git_commit( path: ["InstantSearch.podspec", "./Sources/InstantSearchCore/Helper/Version+Current.swift"], - message: "Version #{new_build_number}" + message: "chore: Version #{new_build_number}" ) add_git_tag( build_number: new_build_number, @@ -78,13 +72,11 @@ lane :deploy do |options| push_to_git_remote(remote: "origin") create_pull_request( - # api_token: "secret", # optional, defaults to ENV["GITHUB_API_TOKEN"] repo: "algolia/instantsearch-ios", - title: "Deploying new #{options[:type]} version #{new_build_number}", + title: "chore: Deploying new #{options[:type]} version #{new_build_number}", head: "#{branchName}", # optional, defaults to current branch name base: "master", # optional, defaults to "master" body: "Please check the files before merging in case I've overidden something accidentally.", # optional - # api_url: "http://yourdomain/api/v3" # optional, for GitHub Enterprise, defaults to "https://api.github.com" ) pod_push(