From 21509ea9634891a77937b67fdc798a9d1a08a994 Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 15:37:00 +0900 Subject: [PATCH 1/9] add swiftpm example project --- .../.gitignore | 0 .../{tutorial4-completed => swiftpm}/Podfile | 0 .../Podfile.lock | 0 .../README.md | 0 .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/swiftpm/Package.resolved | 16 + .../LoggedInActionableItem.swift | 0 .../ActionableItems/RootActionableItem.swift | 0 .../TicTacToe/AppStart/AppComponent.swift | 0 .../TicTacToe/AppStart/AppDelegate.swift | 0 .../TicTacToe/Info.plist | 0 .../TicTacToe/LoggedIn/Game.swift | 0 .../TicTacToe/LoggedIn/LoggedInBuilder.swift | 0 .../LoggedIn/LoggedInComponent+OffGame.swift | 0 .../LoggedInComponent+RandomWin.swift | 0 .../LoggedInComponent+TicTacToe.swift | 0 .../LoggedIn/LoggedInInteractor.swift | 0 .../TicTacToe/LoggedIn/LoggedInRouter.swift | 0 .../TicTacToe/LoggedIn/RandomWinAdapter.swift | 0 .../TicTacToe/LoggedIn/TicTacToeAdapter.swift | 0 .../LoggedOut/LoggedOutBuilder.swift | 0 .../LoggedOut/LoggedOutInteractor.swift | 0 .../TicTacToe/LoggedOut/LoggedOutRouter.swift | 0 .../LoggedOut/LoggedOutViewController.swift | 0 .../TicTacToe/Models/PlayerType.swift | 0 .../TicTacToe/Models/ScoreStream.swift | 0 .../TicTacToe/OffGame/OffGameBuilder.swift | 0 .../TicTacToe/OffGame/OffGameInteractor.swift | 0 .../TicTacToe/OffGame/OffGameRouter.swift | 0 .../OffGame/OffGameViewController.swift | 0 .../TicTacToe/Promo/LaunchGameWorkflow.swift | 0 .../RandomWin/RandomWinBuilder.swift | 0 .../RandomWin/RandomWinInteractor.swift | 0 .../TicTacToe/RandomWin/RandomWinRouter.swift | 0 .../RandomWin/RandomWinViewController.swift | 0 .../TicTacToe/Resources/Default-568h@2x.png | Bin .../TicTacToe/Root/RootBuilder.swift | 0 .../Root/RootComponent+LoggedIn.swift | 0 .../Root/RootComponent+LoggedOut.swift | 0 .../TicTacToe/Root/RootInteractor.swift | 0 .../TicTacToe/Root/RootRouter.swift | 0 .../TicTacToe/Root/RootViewController.swift | 0 .../ScoreBoard/BasicScoreBoardBuilder.swift | 0 .../BasicScoreBoardInteractor.swift | 0 .../ScoreBoard/BasicScoreBoardRouter.swift | 0 .../BasicScoreBoardViewController.swift | 0 .../TicTacToe/TicTacToeBuilder.swift | 0 .../TicTacToe/TicTacToeInteractor.swift | 0 .../TicTacToe/TicTacToe/TicTacToeRouter.swift | 0 .../TicTacToe/TicTacToeViewController.swift | 0 .../TicTacToe.xcodeproj/project.pbxproj | 655 ------------------ .../contents.xcworkspacedata | 7 - Example/xcframework/.gitignore | 1 + Example/xcframework/Podfile | 10 + Example/xcframework/Podfile.lock | 44 ++ Example/xcframework/README.md | 3 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/swiftpm/Package.resolved | 16 + .../LoggedInActionableItem.swift | 21 + .../ActionableItems/RootActionableItem.swift | 21 + .../TicTacToe/AppStart/AppComponent.swift | 24 + .../TicTacToe/AppStart/AppDelegate.swift | 83 +++ Example/xcframework/TicTacToe/Info.plist | 56 ++ .../xcframework/TicTacToe/LoggedIn/Game.swift | 31 + .../TicTacToe/LoggedIn/LoggedInBuilder.swift | 78 +++ .../LoggedIn/LoggedInComponent+OffGame.swift | 30 + .../LoggedInComponent+RandomWin.swift | 20 + .../LoggedInComponent+TicTacToe.swift | 30 + .../LoggedIn/LoggedInInteractor.swift | 85 +++ .../TicTacToe/LoggedIn/LoggedInRouter.swift | 81 +++ .../TicTacToe/LoggedIn/RandomWinAdapter.swift | 43 ++ .../TicTacToe/LoggedIn/TicTacToeAdapter.swift | 41 ++ .../LoggedOut/LoggedOutBuilder.swift | 48 ++ .../LoggedOut/LoggedOutInteractor.swift | 72 ++ .../TicTacToe/LoggedOut/LoggedOutRouter.swift | 35 + .../LoggedOut/LoggedOutViewController.swift | 90 +++ .../TicTacToe/Models/PlayerType.swift | 31 + .../TicTacToe/Models/ScoreStream.swift | 64 ++ .../TicTacToe/OffGame/OffGameBuilder.swift | 64 ++ .../TicTacToe/OffGame/OffGameInteractor.swift | 61 ++ .../TicTacToe/OffGame/OffGameRouter.swift | 53 ++ .../OffGame/OffGameViewController.swift | 94 +++ .../TicTacToe/Promo/LaunchGameWorkflow.swift | 48 ++ .../RandomWin/RandomWinBuilder.swift | 61 ++ .../RandomWin/RandomWinInteractor.swift | 70 ++ .../TicTacToe/RandomWin/RandomWinRouter.swift | 35 + .../RandomWin/RandomWinViewController.swift | 93 +++ .../TicTacToe/Resources/Default-568h@2x.png | Bin 0 -> 18594 bytes .../TicTacToe/Root/RootBuilder.swift | 62 ++ .../Root/RootComponent+LoggedIn.swift | 32 + .../Root/RootComponent+LoggedOut.swift | 30 + .../TicTacToe/Root/RootInteractor.swift | 86 +++ .../TicTacToe/Root/RootRouter.swift | 72 ++ .../TicTacToe/Root/RootViewController.swift | 87 +++ .../ScoreBoard/BasicScoreBoardBuilder.swift | 61 ++ .../BasicScoreBoardInteractor.swift | 63 ++ .../ScoreBoard/BasicScoreBoardRouter.swift | 35 + .../BasicScoreBoardViewController.swift | 114 +++ .../TicTacToe/TicTacToeBuilder.swift | 61 ++ .../TicTacToe/TicTacToeInteractor.swift | 182 +++++ .../TicTacToe/TicTacToe/TicTacToeRouter.swift | 35 + .../TicTacToe/TicTacToeViewController.swift | 140 ++++ LICENSE | 21 - LICENSE.txt | 21 + Package.swift | 10 +- 107 files changed, 2761 insertions(+), 686 deletions(-) rename Example/{tutorial4-completed => swiftpm}/.gitignore (100%) rename Example/{tutorial4-completed => swiftpm}/Podfile (100%) rename Example/{tutorial4-completed => swiftpm}/Podfile.lock (100%) rename Example/{tutorial4-completed => swiftpm}/README.md (100%) create mode 100644 Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata rename Example/{tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace => swiftpm/TicTacToe.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ActionableItems/LoggedInActionableItem.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ActionableItems/RootActionableItem.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/AppStart/AppComponent.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/AppStart/AppDelegate.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Info.plist (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/Game.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/LoggedInRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/RandomWinAdapter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedIn/TicTacToeAdapter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedOut/LoggedOutBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedOut/LoggedOutInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedOut/LoggedOutRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/LoggedOut/LoggedOutViewController.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Models/PlayerType.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Models/ScoreStream.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/OffGame/OffGameBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/OffGame/OffGameInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/OffGame/OffGameRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/OffGame/OffGameViewController.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Promo/LaunchGameWorkflow.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/RandomWin/RandomWinBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/RandomWin/RandomWinInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/RandomWin/RandomWinRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/RandomWin/RandomWinViewController.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Resources/Default-568h@2x.png (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootComponent+LoggedIn.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootComponent+LoggedOut.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/Root/RootViewController.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/TicTacToe/TicTacToeBuilder.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/TicTacToe/TicTacToeInteractor.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/TicTacToe/TicTacToeRouter.swift (100%) rename Example/{tutorial4-completed => swiftpm}/TicTacToe/TicTacToe/TicTacToeViewController.swift (100%) delete mode 100644 Example/tutorial4-completed/TicTacToe.xcodeproj/project.pbxproj delete mode 100644 Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/xcframework/.gitignore create mode 100644 Example/xcframework/Podfile create mode 100644 Example/xcframework/Podfile.lock create mode 100644 Example/xcframework/README.md create mode 100644 Example/xcframework/TicTacToe.xcworkspace/contents.xcworkspacedata rename Example/{tutorial4-completed => xcframework}/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Example/xcframework/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Example/xcframework/TicTacToe/ActionableItems/LoggedInActionableItem.swift create mode 100644 Example/xcframework/TicTacToe/ActionableItems/RootActionableItem.swift create mode 100644 Example/xcframework/TicTacToe/AppStart/AppComponent.swift create mode 100644 Example/xcframework/TicTacToe/AppStart/AppDelegate.swift create mode 100644 Example/xcframework/TicTacToe/Info.plist create mode 100644 Example/xcframework/TicTacToe/LoggedIn/Game.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInBuilder.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInInteractor.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/LoggedInRouter.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/RandomWinAdapter.swift create mode 100644 Example/xcframework/TicTacToe/LoggedIn/TicTacToeAdapter.swift create mode 100644 Example/xcframework/TicTacToe/LoggedOut/LoggedOutBuilder.swift create mode 100644 Example/xcframework/TicTacToe/LoggedOut/LoggedOutInteractor.swift create mode 100644 Example/xcframework/TicTacToe/LoggedOut/LoggedOutRouter.swift create mode 100644 Example/xcframework/TicTacToe/LoggedOut/LoggedOutViewController.swift create mode 100644 Example/xcframework/TicTacToe/Models/PlayerType.swift create mode 100644 Example/xcframework/TicTacToe/Models/ScoreStream.swift create mode 100644 Example/xcframework/TicTacToe/OffGame/OffGameBuilder.swift create mode 100644 Example/xcframework/TicTacToe/OffGame/OffGameInteractor.swift create mode 100644 Example/xcframework/TicTacToe/OffGame/OffGameRouter.swift create mode 100644 Example/xcframework/TicTacToe/OffGame/OffGameViewController.swift create mode 100644 Example/xcframework/TicTacToe/Promo/LaunchGameWorkflow.swift create mode 100644 Example/xcframework/TicTacToe/RandomWin/RandomWinBuilder.swift create mode 100644 Example/xcframework/TicTacToe/RandomWin/RandomWinInteractor.swift create mode 100644 Example/xcframework/TicTacToe/RandomWin/RandomWinRouter.swift create mode 100644 Example/xcframework/TicTacToe/RandomWin/RandomWinViewController.swift create mode 100644 Example/xcframework/TicTacToe/Resources/Default-568h@2x.png create mode 100644 Example/xcframework/TicTacToe/Root/RootBuilder.swift create mode 100644 Example/xcframework/TicTacToe/Root/RootComponent+LoggedIn.swift create mode 100644 Example/xcframework/TicTacToe/Root/RootComponent+LoggedOut.swift create mode 100644 Example/xcframework/TicTacToe/Root/RootInteractor.swift create mode 100644 Example/xcframework/TicTacToe/Root/RootRouter.swift create mode 100644 Example/xcframework/TicTacToe/Root/RootViewController.swift create mode 100644 Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift create mode 100644 Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift create mode 100644 Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift create mode 100644 Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift create mode 100644 Example/xcframework/TicTacToe/TicTacToe/TicTacToeBuilder.swift create mode 100644 Example/xcframework/TicTacToe/TicTacToe/TicTacToeInteractor.swift create mode 100644 Example/xcframework/TicTacToe/TicTacToe/TicTacToeRouter.swift create mode 100644 Example/xcframework/TicTacToe/TicTacToe/TicTacToeViewController.swift delete mode 100644 LICENSE diff --git a/Example/tutorial4-completed/.gitignore b/Example/swiftpm/.gitignore similarity index 100% rename from Example/tutorial4-completed/.gitignore rename to Example/swiftpm/.gitignore diff --git a/Example/tutorial4-completed/Podfile b/Example/swiftpm/Podfile similarity index 100% rename from Example/tutorial4-completed/Podfile rename to Example/swiftpm/Podfile diff --git a/Example/tutorial4-completed/Podfile.lock b/Example/swiftpm/Podfile.lock similarity index 100% rename from Example/tutorial4-completed/Podfile.lock rename to Example/swiftpm/Podfile.lock diff --git a/Example/tutorial4-completed/README.md b/Example/swiftpm/README.md similarity index 100% rename from Example/tutorial4-completed/README.md rename to Example/swiftpm/README.md diff --git a/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata b/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ff1c005 --- /dev/null +++ b/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..4fca9f2 --- /dev/null +++ b/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "RIBsTreeViewerClient", + "repositoryURL": "https://github.com/srea/RIBsTreeViewerClient.git", + "state": { + "branch": "master", + "revision": "d8ceb216c7e836e2a8effaf2b71fe72e78181da3", + "version": null + } + } + ] + }, + "version": 1 +} diff --git a/Example/tutorial4-completed/TicTacToe/ActionableItems/LoggedInActionableItem.swift b/Example/swiftpm/TicTacToe/ActionableItems/LoggedInActionableItem.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ActionableItems/LoggedInActionableItem.swift rename to Example/swiftpm/TicTacToe/ActionableItems/LoggedInActionableItem.swift diff --git a/Example/tutorial4-completed/TicTacToe/ActionableItems/RootActionableItem.swift b/Example/swiftpm/TicTacToe/ActionableItems/RootActionableItem.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ActionableItems/RootActionableItem.swift rename to Example/swiftpm/TicTacToe/ActionableItems/RootActionableItem.swift diff --git a/Example/tutorial4-completed/TicTacToe/AppStart/AppComponent.swift b/Example/swiftpm/TicTacToe/AppStart/AppComponent.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/AppStart/AppComponent.swift rename to Example/swiftpm/TicTacToe/AppStart/AppComponent.swift diff --git a/Example/tutorial4-completed/TicTacToe/AppStart/AppDelegate.swift b/Example/swiftpm/TicTacToe/AppStart/AppDelegate.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/AppStart/AppDelegate.swift rename to Example/swiftpm/TicTacToe/AppStart/AppDelegate.swift diff --git a/Example/tutorial4-completed/TicTacToe/Info.plist b/Example/swiftpm/TicTacToe/Info.plist similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Info.plist rename to Example/swiftpm/TicTacToe/Info.plist diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/Game.swift b/Example/swiftpm/TicTacToe/LoggedIn/Game.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/Game.swift rename to Example/swiftpm/TicTacToe/LoggedIn/Game.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInBuilder.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInBuilder.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInInteractor.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInInteractor.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInRouter.swift b/Example/swiftpm/TicTacToe/LoggedIn/LoggedInRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/LoggedInRouter.swift rename to Example/swiftpm/TicTacToe/LoggedIn/LoggedInRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/RandomWinAdapter.swift b/Example/swiftpm/TicTacToe/LoggedIn/RandomWinAdapter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/RandomWinAdapter.swift rename to Example/swiftpm/TicTacToe/LoggedIn/RandomWinAdapter.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedIn/TicTacToeAdapter.swift b/Example/swiftpm/TicTacToe/LoggedIn/TicTacToeAdapter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedIn/TicTacToeAdapter.swift rename to Example/swiftpm/TicTacToe/LoggedIn/TicTacToeAdapter.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutBuilder.swift b/Example/swiftpm/TicTacToe/LoggedOut/LoggedOutBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutBuilder.swift rename to Example/swiftpm/TicTacToe/LoggedOut/LoggedOutBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutInteractor.swift b/Example/swiftpm/TicTacToe/LoggedOut/LoggedOutInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutInteractor.swift rename to Example/swiftpm/TicTacToe/LoggedOut/LoggedOutInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutRouter.swift b/Example/swiftpm/TicTacToe/LoggedOut/LoggedOutRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutRouter.swift rename to Example/swiftpm/TicTacToe/LoggedOut/LoggedOutRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutViewController.swift b/Example/swiftpm/TicTacToe/LoggedOut/LoggedOutViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/LoggedOut/LoggedOutViewController.swift rename to Example/swiftpm/TicTacToe/LoggedOut/LoggedOutViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe/Models/PlayerType.swift b/Example/swiftpm/TicTacToe/Models/PlayerType.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Models/PlayerType.swift rename to Example/swiftpm/TicTacToe/Models/PlayerType.swift diff --git a/Example/tutorial4-completed/TicTacToe/Models/ScoreStream.swift b/Example/swiftpm/TicTacToe/Models/ScoreStream.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Models/ScoreStream.swift rename to Example/swiftpm/TicTacToe/Models/ScoreStream.swift diff --git a/Example/tutorial4-completed/TicTacToe/OffGame/OffGameBuilder.swift b/Example/swiftpm/TicTacToe/OffGame/OffGameBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/OffGame/OffGameBuilder.swift rename to Example/swiftpm/TicTacToe/OffGame/OffGameBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/OffGame/OffGameInteractor.swift b/Example/swiftpm/TicTacToe/OffGame/OffGameInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/OffGame/OffGameInteractor.swift rename to Example/swiftpm/TicTacToe/OffGame/OffGameInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/OffGame/OffGameRouter.swift b/Example/swiftpm/TicTacToe/OffGame/OffGameRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/OffGame/OffGameRouter.swift rename to Example/swiftpm/TicTacToe/OffGame/OffGameRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/OffGame/OffGameViewController.swift b/Example/swiftpm/TicTacToe/OffGame/OffGameViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/OffGame/OffGameViewController.swift rename to Example/swiftpm/TicTacToe/OffGame/OffGameViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe/Promo/LaunchGameWorkflow.swift b/Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Promo/LaunchGameWorkflow.swift rename to Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift diff --git a/Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinBuilder.swift b/Example/swiftpm/TicTacToe/RandomWin/RandomWinBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinBuilder.swift rename to Example/swiftpm/TicTacToe/RandomWin/RandomWinBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinInteractor.swift b/Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinInteractor.swift rename to Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinRouter.swift b/Example/swiftpm/TicTacToe/RandomWin/RandomWinRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinRouter.swift rename to Example/swiftpm/TicTacToe/RandomWin/RandomWinRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinViewController.swift b/Example/swiftpm/TicTacToe/RandomWin/RandomWinViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/RandomWin/RandomWinViewController.swift rename to Example/swiftpm/TicTacToe/RandomWin/RandomWinViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe/Resources/Default-568h@2x.png b/Example/swiftpm/TicTacToe/Resources/Default-568h@2x.png similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Resources/Default-568h@2x.png rename to Example/swiftpm/TicTacToe/Resources/Default-568h@2x.png diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootBuilder.swift b/Example/swiftpm/TicTacToe/Root/RootBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootBuilder.swift rename to Example/swiftpm/TicTacToe/Root/RootBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootComponent+LoggedIn.swift b/Example/swiftpm/TicTacToe/Root/RootComponent+LoggedIn.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootComponent+LoggedIn.swift rename to Example/swiftpm/TicTacToe/Root/RootComponent+LoggedIn.swift diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootComponent+LoggedOut.swift b/Example/swiftpm/TicTacToe/Root/RootComponent+LoggedOut.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootComponent+LoggedOut.swift rename to Example/swiftpm/TicTacToe/Root/RootComponent+LoggedOut.swift diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootInteractor.swift b/Example/swiftpm/TicTacToe/Root/RootInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootInteractor.swift rename to Example/swiftpm/TicTacToe/Root/RootInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootRouter.swift b/Example/swiftpm/TicTacToe/Root/RootRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootRouter.swift rename to Example/swiftpm/TicTacToe/Root/RootRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/Root/RootViewController.swift b/Example/swiftpm/TicTacToe/Root/RootViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/Root/RootViewController.swift rename to Example/swiftpm/TicTacToe/Root/RootViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift b/Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift rename to Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift b/Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift rename to Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift b/Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift rename to Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift b/Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift rename to Example/swiftpm/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeBuilder.swift b/Example/swiftpm/TicTacToe/TicTacToe/TicTacToeBuilder.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeBuilder.swift rename to Example/swiftpm/TicTacToe/TicTacToe/TicTacToeBuilder.swift diff --git a/Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeInteractor.swift b/Example/swiftpm/TicTacToe/TicTacToe/TicTacToeInteractor.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeInteractor.swift rename to Example/swiftpm/TicTacToe/TicTacToe/TicTacToeInteractor.swift diff --git a/Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeRouter.swift b/Example/swiftpm/TicTacToe/TicTacToe/TicTacToeRouter.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeRouter.swift rename to Example/swiftpm/TicTacToe/TicTacToe/TicTacToeRouter.swift diff --git a/Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeViewController.swift b/Example/swiftpm/TicTacToe/TicTacToe/TicTacToeViewController.swift similarity index 100% rename from Example/tutorial4-completed/TicTacToe/TicTacToe/TicTacToeViewController.swift rename to Example/swiftpm/TicTacToe/TicTacToe/TicTacToeViewController.swift diff --git a/Example/tutorial4-completed/TicTacToe.xcodeproj/project.pbxproj b/Example/tutorial4-completed/TicTacToe.xcodeproj/project.pbxproj deleted file mode 100644 index 82a53b3..0000000 --- a/Example/tutorial4-completed/TicTacToe.xcodeproj/project.pbxproj +++ /dev/null @@ -1,655 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 7EDD59501FA13579005EC8B2 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7EDD594F1FA13579005EC8B2 /* Default-568h@2x.png */; }; - E90A68681FB7069A00D303EE /* LoggedInActionableItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90A68671FB7069A00D303EE /* LoggedInActionableItem.swift */; }; - E90A686A1FB7074400D303EE /* LaunchGameWorkflow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90A68691FB7074400D303EE /* LaunchGameWorkflow.swift */; }; - E9C86DA01FA38A0A00B61DF6 /* RandomWinBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D9A1FA389EC00B61DF6 /* RandomWinBuilder.swift */; }; - E9C86DA11FA38A0A00B61DF6 /* RandomWinInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D9B1FA389EC00B61DF6 /* RandomWinInteractor.swift */; }; - E9C86DA21FA38A0A00B61DF6 /* RandomWinRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D9C1FA389EC00B61DF6 /* RandomWinRouter.swift */; }; - E9C86DA31FA38A0A00B61DF6 /* RandomWinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D9D1FA389EC00B61DF6 /* RandomWinViewController.swift */; }; - E9C86DA81FA38AD600B61DF6 /* ScoreStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DA71FA38AD000B61DF6 /* ScoreStream.swift */; }; - E9C86DA91FA38AEC00B61DF6 /* PlayerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DA61FA38AD000B61DF6 /* PlayerType.swift */; }; - E9C86DB01FA38B7D00B61DF6 /* BasicScoreBoardBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D951FA389E000B61DF6 /* BasicScoreBoardBuilder.swift */; }; - E9C86DB11FA38B7D00B61DF6 /* BasicScoreBoardInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D961FA389E000B61DF6 /* BasicScoreBoardInteractor.swift */; }; - E9C86DB21FA38B7D00B61DF6 /* BasicScoreBoardRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D971FA389E000B61DF6 /* BasicScoreBoardRouter.swift */; }; - E9C86DB31FA38B7D00B61DF6 /* BasicScoreBoardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86D981FA389E000B61DF6 /* BasicScoreBoardViewController.swift */; }; - E9C86DB91FA38D5400B61DF6 /* RootActionableItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DB81FA38D4700B61DF6 /* RootActionableItem.swift */; }; - E9C86DBD1FA3AD6400B61DF6 /* Game.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DBC1FA3AD6400B61DF6 /* Game.swift */; }; - E9C86DBF1FA3AE3700B61DF6 /* RandomWinAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DBE1FA3AE3700B61DF6 /* RandomWinAdapter.swift */; }; - E9C86DC11FA3AE6E00B61DF6 /* TicTacToeAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DC01FA3AE6E00B61DF6 /* TicTacToeAdapter.swift */; }; - E9C86DC31FA3B5EC00B61DF6 /* LoggedInComponent+RandomWin.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C86DC21FA3B5EC00B61DF6 /* LoggedInComponent+RandomWin.swift */; }; - E9CB1D521F97303800D84847 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D351F972FD500D84847 /* AppDelegate.swift */; }; - E9CB1D531F97305A00D84847 /* AppComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D341F972FD500D84847 /* AppComponent.swift */; }; - E9CB1D541F9730E400D84847 /* LoggedInBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D481F972FE500D84847 /* LoggedInBuilder.swift */; }; - E9CB1D551F9730E400D84847 /* LoggedInComponent+OffGame.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D491F972FE500D84847 /* LoggedInComponent+OffGame.swift */; }; - E9CB1D561F9730E400D84847 /* LoggedInComponent+TicTacToe.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D4A1F972FE500D84847 /* LoggedInComponent+TicTacToe.swift */; }; - E9CB1D571F9730E400D84847 /* LoggedInInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D4B1F972FE500D84847 /* LoggedInInteractor.swift */; }; - E9CB1D581F9730E400D84847 /* LoggedInRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D4C1F972FE500D84847 /* LoggedInRouter.swift */; }; - E9CB1D591F9730E700D84847 /* LoggedOutBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D431F972FE400D84847 /* LoggedOutBuilder.swift */; }; - E9CB1D5A1F9730E700D84847 /* LoggedOutInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D441F972FE400D84847 /* LoggedOutInteractor.swift */; }; - E9CB1D5B1F9730E700D84847 /* LoggedOutRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D451F972FE400D84847 /* LoggedOutRouter.swift */; }; - E9CB1D5C1F9730E700D84847 /* LoggedOutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D461F972FE400D84847 /* LoggedOutViewController.swift */; }; - E9CB1D5D1F9730EB00D84847 /* OffGameBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D4E1F972FE500D84847 /* OffGameBuilder.swift */; }; - E9CB1D5E1F9730EB00D84847 /* OffGameInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D4F1F972FE500D84847 /* OffGameInteractor.swift */; }; - E9CB1D5F1F9730EB00D84847 /* OffGameRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D501F972FE500D84847 /* OffGameRouter.swift */; }; - E9CB1D601F9730EB00D84847 /* OffGameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D511F972FE500D84847 /* OffGameViewController.swift */; }; - E9CB1D611F9730EF00D84847 /* RootBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D371F972FE400D84847 /* RootBuilder.swift */; }; - E9CB1D621F9730EF00D84847 /* RootComponent+LoggedIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D381F972FE400D84847 /* RootComponent+LoggedIn.swift */; }; - E9CB1D631F9730EF00D84847 /* RootComponent+LoggedOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D391F972FE400D84847 /* RootComponent+LoggedOut.swift */; }; - E9CB1D641F9730EF00D84847 /* RootInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D3A1F972FE400D84847 /* RootInteractor.swift */; }; - E9CB1D651F9730EF00D84847 /* RootRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D3B1F972FE400D84847 /* RootRouter.swift */; }; - E9CB1D661F9730EF00D84847 /* RootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D3C1F972FE400D84847 /* RootViewController.swift */; }; - E9CB1D671F9730F300D84847 /* TicTacToeBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D3E1F972FE400D84847 /* TicTacToeBuilder.swift */; }; - E9CB1D681F9730F300D84847 /* TicTacToeInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D3F1F972FE400D84847 /* TicTacToeInteractor.swift */; }; - E9CB1D691F9730F300D84847 /* TicTacToeRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D401F972FE400D84847 /* TicTacToeRouter.swift */; }; - E9CB1D6A1F9730F300D84847 /* TicTacToeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CB1D411F972FE400D84847 /* TicTacToeViewController.swift */; }; - FE46D96424B5832900AD7D0E /* Pods_TicTacToe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B99EABB5C8D25341027C05C5 /* Pods_TicTacToe.framework */; }; - FE46D96524B5832900AD7D0E /* Pods_TicTacToe.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B99EABB5C8D25341027C05C5 /* Pods_TicTacToe.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FE46D96C24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE46D96B24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework */; }; - FE46D96D24B5857A00AD7D0E /* RIBsTreeViewerClient.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FE46D96B24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - FE46D96624B5832900AD7D0E /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - FE46D96D24B5857A00AD7D0E /* RIBsTreeViewerClient.xcframework in Embed Frameworks */, - FE46D96524B5832900AD7D0E /* Pods_TicTacToe.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 7EDD594F1FA13579005EC8B2 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 833B15CABE3CBE09720A0409 /* Pods-TicTacToe.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TicTacToe.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TicTacToe/Pods-TicTacToe.debug.xcconfig"; sourceTree = ""; }; - A791EBDAD202886E66137B9C /* Pods-TicTacToe.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TicTacToe.release.xcconfig"; path = "Pods/Target Support Files/Pods-TicTacToe/Pods-TicTacToe.release.xcconfig"; sourceTree = ""; }; - B99EABB5C8D25341027C05C5 /* Pods_TicTacToe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TicTacToe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E90A68671FB7069A00D303EE /* LoggedInActionableItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedInActionableItem.swift; sourceTree = ""; }; - E90A68691FB7074400D303EE /* LaunchGameWorkflow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchGameWorkflow.swift; sourceTree = ""; }; - E9894B4A1F972CC500688FCB /* TicTacToe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TicTacToe.app; sourceTree = BUILT_PRODUCTS_DIR; }; - E9894B591F972CC500688FCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E9C86D951FA389E000B61DF6 /* BasicScoreBoardBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicScoreBoardBuilder.swift; sourceTree = ""; }; - E9C86D961FA389E000B61DF6 /* BasicScoreBoardInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicScoreBoardInteractor.swift; sourceTree = ""; }; - E9C86D971FA389E000B61DF6 /* BasicScoreBoardRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicScoreBoardRouter.swift; sourceTree = ""; }; - E9C86D981FA389E000B61DF6 /* BasicScoreBoardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicScoreBoardViewController.swift; sourceTree = ""; }; - E9C86D9A1FA389EC00B61DF6 /* RandomWinBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomWinBuilder.swift; sourceTree = ""; }; - E9C86D9B1FA389EC00B61DF6 /* RandomWinInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomWinInteractor.swift; sourceTree = ""; }; - E9C86D9C1FA389EC00B61DF6 /* RandomWinRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomWinRouter.swift; sourceTree = ""; }; - E9C86D9D1FA389EC00B61DF6 /* RandomWinViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomWinViewController.swift; sourceTree = ""; }; - E9C86DA61FA38AD000B61DF6 /* PlayerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerType.swift; sourceTree = ""; }; - E9C86DA71FA38AD000B61DF6 /* ScoreStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScoreStream.swift; sourceTree = ""; }; - E9C86DB81FA38D4700B61DF6 /* RootActionableItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootActionableItem.swift; sourceTree = ""; }; - E9C86DBC1FA3AD6400B61DF6 /* Game.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Game.swift; sourceTree = ""; }; - E9C86DBE1FA3AE3700B61DF6 /* RandomWinAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomWinAdapter.swift; sourceTree = ""; }; - E9C86DC01FA3AE6E00B61DF6 /* TicTacToeAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TicTacToeAdapter.swift; sourceTree = ""; }; - E9C86DC21FA3B5EC00B61DF6 /* LoggedInComponent+RandomWin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LoggedInComponent+RandomWin.swift"; sourceTree = ""; }; - E9CB1D341F972FD500D84847 /* AppComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppComponent.swift; sourceTree = ""; }; - E9CB1D351F972FD500D84847 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - E9CB1D371F972FE400D84847 /* RootBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootBuilder.swift; sourceTree = ""; }; - E9CB1D381F972FE400D84847 /* RootComponent+LoggedIn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RootComponent+LoggedIn.swift"; sourceTree = ""; }; - E9CB1D391F972FE400D84847 /* RootComponent+LoggedOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RootComponent+LoggedOut.swift"; sourceTree = ""; }; - E9CB1D3A1F972FE400D84847 /* RootInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootInteractor.swift; sourceTree = ""; }; - E9CB1D3B1F972FE400D84847 /* RootRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootRouter.swift; sourceTree = ""; }; - E9CB1D3C1F972FE400D84847 /* RootViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootViewController.swift; sourceTree = ""; }; - E9CB1D3E1F972FE400D84847 /* TicTacToeBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TicTacToeBuilder.swift; sourceTree = ""; }; - E9CB1D3F1F972FE400D84847 /* TicTacToeInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TicTacToeInteractor.swift; sourceTree = ""; }; - E9CB1D401F972FE400D84847 /* TicTacToeRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TicTacToeRouter.swift; sourceTree = ""; }; - E9CB1D411F972FE400D84847 /* TicTacToeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TicTacToeViewController.swift; sourceTree = ""; }; - E9CB1D431F972FE400D84847 /* LoggedOutBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedOutBuilder.swift; sourceTree = ""; }; - E9CB1D441F972FE400D84847 /* LoggedOutInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedOutInteractor.swift; sourceTree = ""; }; - E9CB1D451F972FE400D84847 /* LoggedOutRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedOutRouter.swift; sourceTree = ""; }; - E9CB1D461F972FE400D84847 /* LoggedOutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedOutViewController.swift; sourceTree = ""; }; - E9CB1D481F972FE500D84847 /* LoggedInBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedInBuilder.swift; sourceTree = ""; }; - E9CB1D491F972FE500D84847 /* LoggedInComponent+OffGame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LoggedInComponent+OffGame.swift"; sourceTree = ""; }; - E9CB1D4A1F972FE500D84847 /* LoggedInComponent+TicTacToe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LoggedInComponent+TicTacToe.swift"; sourceTree = ""; }; - E9CB1D4B1F972FE500D84847 /* LoggedInInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedInInteractor.swift; sourceTree = ""; }; - E9CB1D4C1F972FE500D84847 /* LoggedInRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedInRouter.swift; sourceTree = ""; }; - E9CB1D4E1F972FE500D84847 /* OffGameBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OffGameBuilder.swift; sourceTree = ""; }; - E9CB1D4F1F972FE500D84847 /* OffGameInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OffGameInteractor.swift; sourceTree = ""; }; - E9CB1D501F972FE500D84847 /* OffGameRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OffGameRouter.swift; sourceTree = ""; }; - E9CB1D511F972FE500D84847 /* OffGameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OffGameViewController.swift; sourceTree = ""; }; - FE46D96B24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = RIBsTreeViewerClient.xcframework; path = ../../Products/RIBsTreeViewerClient.xcframework; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - E9894B471F972CC500688FCB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FE46D96C24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework in Frameworks */, - FE46D96424B5832900AD7D0E /* Pods_TicTacToe.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 59F943336420DE07CA779F6F /* Pods */ = { - isa = PBXGroup; - children = ( - 833B15CABE3CBE09720A0409 /* Pods-TicTacToe.debug.xcconfig */, - A791EBDAD202886E66137B9C /* Pods-TicTacToe.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 7EDD59511FA135E9005EC8B2 /* Resources */ = { - isa = PBXGroup; - children = ( - 7EDD594F1FA13579005EC8B2 /* Default-568h@2x.png */, - ); - path = Resources; - sourceTree = ""; - }; - E9894B411F972CC500688FCB = { - isa = PBXGroup; - children = ( - E9894B4C1F972CC500688FCB /* TicTacToe */, - E9894B4B1F972CC500688FCB /* Products */, - 59F943336420DE07CA779F6F /* Pods */, - F5205CCF508911BE388D8406 /* Frameworks */, - ); - sourceTree = ""; - }; - E9894B4B1F972CC500688FCB /* Products */ = { - isa = PBXGroup; - children = ( - E9894B4A1F972CC500688FCB /* TicTacToe.app */, - ); - name = Products; - sourceTree = ""; - }; - E9894B4C1F972CC500688FCB /* TicTacToe */ = { - isa = PBXGroup; - children = ( - 7EDD59511FA135E9005EC8B2 /* Resources */, - E9C86DB71FA38D4700B61DF6 /* ActionableItems */, - E9CB1D331F972FD500D84847 /* AppStart */, - E9CB1D471F972FE500D84847 /* LoggedIn */, - E9CB1D421F972FE400D84847 /* LoggedOut */, - E9C86DA41FA38AD000B61DF6 /* Models */, - E9CB1D4D1F972FE500D84847 /* OffGame */, - E9C86D9E1FA389F400B61DF6 /* Promo */, - E9C86D991FA389EC00B61DF6 /* RandomWin */, - E9CB1D361F972FE400D84847 /* Root */, - E9C86D931FA389E000B61DF6 /* ScoreBoard */, - E9CB1D3D1F972FE400D84847 /* TicTacToe */, - E9894B591F972CC500688FCB /* Info.plist */, - ); - path = TicTacToe; - sourceTree = ""; - }; - E9C86D931FA389E000B61DF6 /* ScoreBoard */ = { - isa = PBXGroup; - children = ( - E9C86D951FA389E000B61DF6 /* BasicScoreBoardBuilder.swift */, - E9C86D961FA389E000B61DF6 /* BasicScoreBoardInteractor.swift */, - E9C86D971FA389E000B61DF6 /* BasicScoreBoardRouter.swift */, - E9C86D981FA389E000B61DF6 /* BasicScoreBoardViewController.swift */, - ); - path = ScoreBoard; - sourceTree = ""; - }; - E9C86D991FA389EC00B61DF6 /* RandomWin */ = { - isa = PBXGroup; - children = ( - E9C86D9A1FA389EC00B61DF6 /* RandomWinBuilder.swift */, - E9C86D9B1FA389EC00B61DF6 /* RandomWinInteractor.swift */, - E9C86D9C1FA389EC00B61DF6 /* RandomWinRouter.swift */, - E9C86D9D1FA389EC00B61DF6 /* RandomWinViewController.swift */, - ); - path = RandomWin; - sourceTree = ""; - }; - E9C86D9E1FA389F400B61DF6 /* Promo */ = { - isa = PBXGroup; - children = ( - E90A68691FB7074400D303EE /* LaunchGameWorkflow.swift */, - ); - path = Promo; - sourceTree = ""; - }; - E9C86DA41FA38AD000B61DF6 /* Models */ = { - isa = PBXGroup; - children = ( - E9C86DA61FA38AD000B61DF6 /* PlayerType.swift */, - E9C86DA71FA38AD000B61DF6 /* ScoreStream.swift */, - ); - path = Models; - sourceTree = ""; - }; - E9C86DB71FA38D4700B61DF6 /* ActionableItems */ = { - isa = PBXGroup; - children = ( - E9C86DB81FA38D4700B61DF6 /* RootActionableItem.swift */, - E90A68671FB7069A00D303EE /* LoggedInActionableItem.swift */, - ); - path = ActionableItems; - sourceTree = ""; - }; - E9CB1D331F972FD500D84847 /* AppStart */ = { - isa = PBXGroup; - children = ( - E9CB1D341F972FD500D84847 /* AppComponent.swift */, - E9CB1D351F972FD500D84847 /* AppDelegate.swift */, - ); - path = AppStart; - sourceTree = ""; - }; - E9CB1D361F972FE400D84847 /* Root */ = { - isa = PBXGroup; - children = ( - E9CB1D371F972FE400D84847 /* RootBuilder.swift */, - E9CB1D381F972FE400D84847 /* RootComponent+LoggedIn.swift */, - E9CB1D391F972FE400D84847 /* RootComponent+LoggedOut.swift */, - E9CB1D3A1F972FE400D84847 /* RootInteractor.swift */, - E9CB1D3B1F972FE400D84847 /* RootRouter.swift */, - E9CB1D3C1F972FE400D84847 /* RootViewController.swift */, - ); - path = Root; - sourceTree = ""; - }; - E9CB1D3D1F972FE400D84847 /* TicTacToe */ = { - isa = PBXGroup; - children = ( - E9CB1D3E1F972FE400D84847 /* TicTacToeBuilder.swift */, - E9CB1D3F1F972FE400D84847 /* TicTacToeInteractor.swift */, - E9CB1D401F972FE400D84847 /* TicTacToeRouter.swift */, - E9CB1D411F972FE400D84847 /* TicTacToeViewController.swift */, - ); - path = TicTacToe; - sourceTree = ""; - }; - E9CB1D421F972FE400D84847 /* LoggedOut */ = { - isa = PBXGroup; - children = ( - E9CB1D431F972FE400D84847 /* LoggedOutBuilder.swift */, - E9CB1D441F972FE400D84847 /* LoggedOutInteractor.swift */, - E9CB1D451F972FE400D84847 /* LoggedOutRouter.swift */, - E9CB1D461F972FE400D84847 /* LoggedOutViewController.swift */, - ); - path = LoggedOut; - sourceTree = ""; - }; - E9CB1D471F972FE500D84847 /* LoggedIn */ = { - isa = PBXGroup; - children = ( - E9C86DBC1FA3AD6400B61DF6 /* Game.swift */, - E9CB1D481F972FE500D84847 /* LoggedInBuilder.swift */, - E9CB1D491F972FE500D84847 /* LoggedInComponent+OffGame.swift */, - E9CB1D4A1F972FE500D84847 /* LoggedInComponent+TicTacToe.swift */, - E9C86DC21FA3B5EC00B61DF6 /* LoggedInComponent+RandomWin.swift */, - E9CB1D4B1F972FE500D84847 /* LoggedInInteractor.swift */, - E9CB1D4C1F972FE500D84847 /* LoggedInRouter.swift */, - E9C86DBE1FA3AE3700B61DF6 /* RandomWinAdapter.swift */, - E9C86DC01FA3AE6E00B61DF6 /* TicTacToeAdapter.swift */, - ); - path = LoggedIn; - sourceTree = ""; - }; - E9CB1D4D1F972FE500D84847 /* OffGame */ = { - isa = PBXGroup; - children = ( - E9CB1D4E1F972FE500D84847 /* OffGameBuilder.swift */, - E9CB1D4F1F972FE500D84847 /* OffGameInteractor.swift */, - E9CB1D501F972FE500D84847 /* OffGameRouter.swift */, - E9CB1D511F972FE500D84847 /* OffGameViewController.swift */, - ); - path = OffGame; - sourceTree = ""; - }; - F5205CCF508911BE388D8406 /* Frameworks */ = { - isa = PBXGroup; - children = ( - FE46D96B24B5857900AD7D0E /* RIBsTreeViewerClient.xcframework */, - B99EABB5C8D25341027C05C5 /* Pods_TicTacToe.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - E9894B491F972CC500688FCB /* TicTacToe */ = { - isa = PBXNativeTarget; - buildConfigurationList = E9894B671F972CC600688FCB /* Build configuration list for PBXNativeTarget "TicTacToe" */; - buildPhases = ( - 64CF0EF6C16C782FD4AF3F3C /* [CP] Check Pods Manifest.lock */, - E9894B461F972CC500688FCB /* Sources */, - E9894B471F972CC500688FCB /* Frameworks */, - E9894B481F972CC500688FCB /* Resources */, - 01C0219C62DB08840E36B78D /* [CP] Embed Pods Frameworks */, - FE46D96624B5832900AD7D0E /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TicTacToe; - productName = TicTacToe; - productReference = E9894B4A1F972CC500688FCB /* TicTacToe.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - E9894B421F972CC500688FCB /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = Uber; - TargetAttributes = { - E9894B491F972CC500688FCB = { - CreatedOnToolsVersion = 9.0; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = E9894B451F972CC500688FCB /* Build configuration list for PBXProject "TicTacToe" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = E9894B411F972CC500688FCB; - productRefGroup = E9894B4B1F972CC500688FCB /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - E9894B491F972CC500688FCB /* TicTacToe */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - E9894B481F972CC500688FCB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7EDD59501FA13579005EC8B2 /* Default-568h@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 01C0219C62DB08840E36B78D /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-TicTacToe/Pods-TicTacToe-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-TicTacToe/Pods-TicTacToe-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TicTacToe/Pods-TicTacToe-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 64CF0EF6C16C782FD4AF3F3C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-TicTacToe-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - E9894B461F972CC500688FCB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - E9C86DA31FA38A0A00B61DF6 /* RandomWinViewController.swift in Sources */, - E9C86DA21FA38A0A00B61DF6 /* RandomWinRouter.swift in Sources */, - E9CB1D521F97303800D84847 /* AppDelegate.swift in Sources */, - E9CB1D681F9730F300D84847 /* TicTacToeInteractor.swift in Sources */, - E9C86DB01FA38B7D00B61DF6 /* BasicScoreBoardBuilder.swift in Sources */, - E9CB1D5B1F9730E700D84847 /* LoggedOutRouter.swift in Sources */, - E9C86DC31FA3B5EC00B61DF6 /* LoggedInComponent+RandomWin.swift in Sources */, - E9CB1D571F9730E400D84847 /* LoggedInInteractor.swift in Sources */, - E9CB1D5D1F9730EB00D84847 /* OffGameBuilder.swift in Sources */, - E9CB1D641F9730EF00D84847 /* RootInteractor.swift in Sources */, - E9C86DA91FA38AEC00B61DF6 /* PlayerType.swift in Sources */, - E9CB1D631F9730EF00D84847 /* RootComponent+LoggedOut.swift in Sources */, - E9CB1D591F9730E700D84847 /* LoggedOutBuilder.swift in Sources */, - E9CB1D581F9730E400D84847 /* LoggedInRouter.swift in Sources */, - E9CB1D5F1F9730EB00D84847 /* OffGameRouter.swift in Sources */, - E9CB1D611F9730EF00D84847 /* RootBuilder.swift in Sources */, - E9CB1D671F9730F300D84847 /* TicTacToeBuilder.swift in Sources */, - E9C86DB31FA38B7D00B61DF6 /* BasicScoreBoardViewController.swift in Sources */, - E9CB1D6A1F9730F300D84847 /* TicTacToeViewController.swift in Sources */, - E9C86DC11FA3AE6E00B61DF6 /* TicTacToeAdapter.swift in Sources */, - E9C86DBF1FA3AE3700B61DF6 /* RandomWinAdapter.swift in Sources */, - E9CB1D541F9730E400D84847 /* LoggedInBuilder.swift in Sources */, - E9CB1D551F9730E400D84847 /* LoggedInComponent+OffGame.swift in Sources */, - E9C86DB91FA38D5400B61DF6 /* RootActionableItem.swift in Sources */, - E9CB1D531F97305A00D84847 /* AppComponent.swift in Sources */, - E9CB1D621F9730EF00D84847 /* RootComponent+LoggedIn.swift in Sources */, - E90A68681FB7069A00D303EE /* LoggedInActionableItem.swift in Sources */, - E9CB1D5C1F9730E700D84847 /* LoggedOutViewController.swift in Sources */, - E9C86DA81FA38AD600B61DF6 /* ScoreStream.swift in Sources */, - E9CB1D691F9730F300D84847 /* TicTacToeRouter.swift in Sources */, - E9C86DA01FA38A0A00B61DF6 /* RandomWinBuilder.swift in Sources */, - E9CB1D561F9730E400D84847 /* LoggedInComponent+TicTacToe.swift in Sources */, - E9CB1D651F9730EF00D84847 /* RootRouter.swift in Sources */, - E9CB1D661F9730EF00D84847 /* RootViewController.swift in Sources */, - E9C86DB11FA38B7D00B61DF6 /* BasicScoreBoardInteractor.swift in Sources */, - E9C86DB21FA38B7D00B61DF6 /* BasicScoreBoardRouter.swift in Sources */, - E9C86DBD1FA3AD6400B61DF6 /* Game.swift in Sources */, - E90A686A1FB7074400D303EE /* LaunchGameWorkflow.swift in Sources */, - E9C86DA11FA38A0A00B61DF6 /* RandomWinInteractor.swift in Sources */, - E9CB1D5E1F9730EB00D84847 /* OffGameInteractor.swift in Sources */, - E9CB1D5A1F9730E700D84847 /* LoggedOutInteractor.swift in Sources */, - E9CB1D601F9730EB00D84847 /* OffGameViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - E9894B651F972CC600688FCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - }; - name = Debug; - }; - E9894B661F972CC600688FCB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - E9894B681F972CC600688FCB /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 833B15CABE3CBE09720A0409 /* Pods-TicTacToe.debug.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = TicTacToe/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.ubercab.TicTacToe; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - E9894B691F972CC600688FCB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A791EBDAD202886E66137B9C /* Pods-TicTacToe.release.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = TicTacToe/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.ubercab.TicTacToe; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - E9894B451F972CC500688FCB /* Build configuration list for PBXProject "TicTacToe" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E9894B651F972CC600688FCB /* Debug */, - E9894B661F972CC600688FCB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E9894B671F972CC600688FCB /* Build configuration list for PBXNativeTarget "TicTacToe" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E9894B681F972CC600688FCB /* Debug */, - E9894B691F972CC600688FCB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = E9894B421F972CC500688FCB /* Project object */; -} diff --git a/Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Example/tutorial4-completed/TicTacToe.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/xcframework/.gitignore b/Example/xcframework/.gitignore new file mode 100644 index 0000000..389a2b2 --- /dev/null +++ b/Example/xcframework/.gitignore @@ -0,0 +1 @@ +Pods/ diff --git a/Example/xcframework/Podfile b/Example/xcframework/Podfile new file mode 100644 index 0000000..a1030df --- /dev/null +++ b/Example/xcframework/Podfile @@ -0,0 +1,10 @@ +platform :ios, '13.0' + +use_frameworks! +inhibit_all_warnings! + +target 'TicTacToe' do + pod 'RIBs', :git => 'https://github.com/uber/RIBs.git', tag: '0.9.2' + pod 'SnapKit' + pod 'RxCocoa', '~> 5.1.1' +end diff --git a/Example/xcframework/Podfile.lock b/Example/xcframework/Podfile.lock new file mode 100644 index 0000000..9141e11 --- /dev/null +++ b/Example/xcframework/Podfile.lock @@ -0,0 +1,44 @@ +PODS: + - RIBs (0.9.3): + - RxRelay (~> 5.0) + - RxSwift (~> 5.0) + - RxCocoa (5.1.1): + - RxRelay (~> 5) + - RxSwift (~> 5) + - RxRelay (5.1.1): + - RxSwift (~> 5) + - RxSwift (5.1.1) + - SnapKit (5.0.1) + +DEPENDENCIES: + - RIBs (from `https://github.com/uber/RIBs.git`, tag `0.9.2`) + - RxCocoa (~> 5.1.1) + - SnapKit + +SPEC REPOS: + trunk: + - RxCocoa + - RxRelay + - RxSwift + - SnapKit + +EXTERNAL SOURCES: + RIBs: + :git: https://github.com/uber/RIBs.git + :tag: 0.9.2 + +CHECKOUT OPTIONS: + RIBs: + :git: https://github.com/uber/RIBs.git + :tag: 0.9.2 + +SPEC CHECKSUMS: + RIBs: efceda5df20c1a1e05139232a4638a6242caa92a + RxCocoa: 32065309a38d29b5b0db858819b5bf9ef038b601 + RxRelay: d77f7d771495f43c556cbc43eebd1bb54d01e8e9 + RxSwift: 81470a2074fa8780320ea5fe4102807cb7118178 + SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb + +PODFILE CHECKSUM: e098e2fe24385cac086a3d02c55ea1ff45801a95 + +COCOAPODS: 1.9.3 diff --git a/Example/xcframework/README.md b/Example/xcframework/README.md new file mode 100644 index 0000000..15094f4 --- /dev/null +++ b/Example/xcframework/README.md @@ -0,0 +1,3 @@ +# RIBs Tutorial 4: Deep Linking + +This is the finished code for [tutorial 4](https://github.com/uber/RIBs/wiki/iOS-Tutorial-4). diff --git a/Example/xcframework/TicTacToe.xcworkspace/contents.xcworkspacedata b/Example/xcframework/TicTacToe.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ff1c005 --- /dev/null +++ b/Example/xcframework/TicTacToe.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/tutorial4-completed/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/xcframework/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Example/tutorial4-completed/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/xcframework/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/xcframework/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/xcframework/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..4fca9f2 --- /dev/null +++ b/Example/xcframework/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "RIBsTreeViewerClient", + "repositoryURL": "https://github.com/srea/RIBsTreeViewerClient.git", + "state": { + "branch": "master", + "revision": "d8ceb216c7e836e2a8effaf2b71fe72e78181da3", + "version": null + } + } + ] + }, + "version": 1 +} diff --git a/Example/xcframework/TicTacToe/ActionableItems/LoggedInActionableItem.swift b/Example/xcframework/TicTacToe/ActionableItems/LoggedInActionableItem.swift new file mode 100644 index 0000000..df0b1ea --- /dev/null +++ b/Example/xcframework/TicTacToe/ActionableItems/LoggedInActionableItem.swift @@ -0,0 +1,21 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RxSwift + +public protocol LoggedInActionableItem: class { + func launchGame(with id: String?) -> Observable<(LoggedInActionableItem, ())> +} diff --git a/Example/xcframework/TicTacToe/ActionableItems/RootActionableItem.swift b/Example/xcframework/TicTacToe/ActionableItems/RootActionableItem.swift new file mode 100644 index 0000000..4376cd0 --- /dev/null +++ b/Example/xcframework/TicTacToe/ActionableItems/RootActionableItem.swift @@ -0,0 +1,21 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RxSwift + +public protocol RootActionableItem: class { + func waitForLogin() -> Observable<(LoggedInActionableItem, ())> +} diff --git a/Example/xcframework/TicTacToe/AppStart/AppComponent.swift b/Example/xcframework/TicTacToe/AppStart/AppComponent.swift new file mode 100644 index 0000000..cc73b41 --- /dev/null +++ b/Example/xcframework/TicTacToe/AppStart/AppComponent.swift @@ -0,0 +1,24 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +class AppComponent: Component, RootDependency { + + init() { + super.init(dependency: EmptyComponent()) + } +} diff --git a/Example/xcframework/TicTacToe/AppStart/AppDelegate.swift b/Example/xcframework/TicTacToe/AppStart/AppDelegate.swift new file mode 100644 index 0000000..8d8c2c4 --- /dev/null +++ b/Example/xcframework/TicTacToe/AppStart/AppDelegate.swift @@ -0,0 +1,83 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift +import UIKit + +/// Game app delegate. +@UIApplicationMain +public class AppDelegate: UIResponder, UIApplicationDelegate { + + /// The window. + public var window: UIWindow? + + private var ribsTreeViewer: RIBsTreeViewer? = nil + + /// Tells the delegate that the launch process is almost done and the app is almost ready to run. + /// + /// - parameter application: Your singleton app object. + /// - parameter launchOptions: A dictionary indicating the reason the app was launched (if any). The contents of + /// this dictionary may be empty in situations where the user launched the app directly. For information about + /// the possible keys in this dictionary and how to handle them, see Launch Options Keys. + /// - returns: false if the app cannot handle the URL resource or continue a user activity, otherwise return true. + public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + let window = UIWindow(frame: UIScreen.main.bounds) + self.window = window + + let result = RootBuilder(dependency: AppComponent()).build() + let launchRouter = result.launchRouter + self.launchRouter = launchRouter + urlHandler = result.urlHandler + launchRouter.launch(from: window) + startRIBsTreeViewer(launchRouter: launchRouter) + return true + } + + public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { + urlHandler?.handle(url) + return true + } + + // MARK: - Private + + private var launchRouter: LaunchRouting? + private var urlHandler: UrlHandler? +} + +protocol UrlHandler: class { + func handle(_ url: URL) +} + + +// MARK: - RIBsTreeViewer + +#if DEBUG +import RIBsTreeViewerClient + +extension AppDelegate { + private func startRIBsTreeViewer(launchRouter: Routing) { + if #available(iOS 13.0, *) { + ribsTreeViewer = RIBsTreeViewerImpl.init(router: launchRouter, + options: [.webSocketURL("ws://0.0.0.0:8080"), + .monitoringIntervalMillis(1000)]) + ribsTreeViewer?.start() + } else { + // RIBsTreeViewer is not supported OS version. + } + } +} +#endif diff --git a/Example/xcframework/TicTacToe/Info.plist b/Example/xcframework/TicTacToe/Info.plist new file mode 100644 index 0000000..b09efeb --- /dev/null +++ b/Example/xcframework/TicTacToe/Info.plist @@ -0,0 +1,56 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleURLTypes + + + CFBundleURLName + com.ubercab.Game + CFBundleURLSchemes + + ribs-training + + + + + diff --git a/Example/xcframework/TicTacToe/LoggedIn/Game.swift b/Example/xcframework/TicTacToe/LoggedIn/Game.swift new file mode 100644 index 0000000..a4589a9 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/Game.swift @@ -0,0 +1,31 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +public protocol GameListener: class { + func gameDidEnd(with winner: PlayerType?) +} + +public protocol GameBuildable: Buildable { + func build(withListener listener: GameListener) -> ViewableRouting +} + +public protocol Game { + var id: String { get } + var name: String { get } + var builder: GameBuildable { get } +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInBuilder.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInBuilder.swift new file mode 100644 index 0000000..1e9ac50 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInBuilder.swift @@ -0,0 +1,78 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol LoggedInDependency: Dependency { + var loggedInViewController: LoggedInViewControllable { get } +} + +final class LoggedInComponent: Component { + + fileprivate var loggedInViewController: LoggedInViewControllable { + return dependency.loggedInViewController + } + + fileprivate var games: [Game] { + return shared { + return [RandomWinAdapter(dependency: self), TicTacToeAdapter(dependency: self)] + } + } + + var mutableScoreStream: MutableScoreStream { + return shared { ScoreStreamImpl() } + } + + var scoreStream: ScoreStream { + return mutableScoreStream + } + + let player1Name: String + let player2Name: String + + init(dependency: LoggedInDependency, player1Name: String, player2Name: String) { + self.player1Name = player1Name + self.player2Name = player2Name + super.init(dependency: dependency) + } +} + +// MARK: - Builder + +protocol LoggedInBuildable: Buildable { + func build(withListener listener: LoggedInListener, player1Name: String, player2Name: String) -> (router: LoggedInRouting, actionableItem: LoggedInActionableItem) +} + +final class LoggedInBuilder: Builder, LoggedInBuildable { + + override init(dependency: LoggedInDependency) { + super.init(dependency: dependency) + } + + func build(withListener listener: LoggedInListener, player1Name: String, player2Name: String) -> (router: LoggedInRouting, actionableItem: LoggedInActionableItem) { + let component = LoggedInComponent(dependency: dependency, + player1Name: player1Name, + player2Name: player2Name) + let interactor = LoggedInInteractor(games: component.games) + interactor.listener = listener + + let offGameBuilder = OffGameBuilder(dependency: component) + let router = LoggedInRouter(interactor: interactor, + viewController: component.loggedInViewController, + offGameBuilder: offGameBuilder) + return (router, interactor) + } +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift new file mode 100644 index 0000000..b8fbc43 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+OffGame.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +/// The dependencies needed from the parent scope of LoggedIn to provide for the OffGame scope. +// TODO: Update LoggedInDependency protocol to inherit this protocol. +protocol LoggedInDependencyOffGame: Dependency { + + // TODO: Declare dependencies needed from the parent scope of LoggedIn to provide dependencies + // for the OffGame scope. +} + +extension LoggedInComponent: OffGameDependency { + + // TODO: Implement properties to provide for OffGame scope. +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift new file mode 100644 index 0000000..6892dbe --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+RandomWin.swift @@ -0,0 +1,20 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +extension LoggedInComponent: RandomWinDependency { +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift new file mode 100644 index 0000000..daa3c2a --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInComponent+TicTacToe.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +/// The dependencies needed from the parent scope of LoggedIn to provide for the TicTacToe scope. +// TODO: Update LoggedInDependency protocol to inherit this protocol. +protocol LoggedInDependencyTicTacToe: Dependency { + + // TODO: Declare dependencies needed from the parent scope of LoggedIn to provide dependencies + // for the TicTacToe scope. +} + +extension LoggedInComponent: TicTacToeDependency { + + // TODO: Implement properties to provide for TicTacToe scope. +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInInteractor.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInInteractor.swift new file mode 100644 index 0000000..8322b38 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInInteractor.swift @@ -0,0 +1,85 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +protocol LoggedInRouting: Routing { + func cleanupViews() + func routeToOffGame(with games: [Game]) + func routeToGame(with gameBuilder: GameBuildable) +} + +protocol LoggedInListener: class { + // TODO: Declare methods the interactor can invoke to communicate with other RIBs. +} + +final class LoggedInInteractor: Interactor, LoggedInInteractable, LoggedInActionableItem { + + weak var router: LoggedInRouting? + weak var listener: LoggedInListener? + + // TODO: Add additional dependencies to constructor. Do not perform any logic + // in constructor. + init(games: [Game]) { + self.games = games + super.init() + } + + override func didBecomeActive() { + super.didBecomeActive() + + router?.routeToOffGame(with: games) + } + + override func willResignActive() { + super.willResignActive() + + router?.cleanupViews() + // TODO: Pause any business logic. + } + + // MARK: - OffGameListener + + func startGame(with gameBuilder: GameBuildable) { + router?.routeToGame(with: gameBuilder) + } + + // MARK: - TicTacToeListener + + func gameDidEnd(with winner: PlayerType?) { + router?.routeToOffGame(with: games) + } + + // MARK: - LoggedInActionableItem + + func launchGame(with id: String?) -> Observable<(LoggedInActionableItem, ())> { + let game: Game? = games.first { game in + return game.id.lowercased() == id?.lowercased() + } + + if let game = game { + router?.routeToGame(with: game.builder) + } + + return Observable.just((self, ())) + } + + // MARK: - Private + + private var games = [Game]() + +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/LoggedInRouter.swift b/Example/xcframework/TicTacToe/LoggedIn/LoggedInRouter.swift new file mode 100644 index 0000000..33d359a --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/LoggedInRouter.swift @@ -0,0 +1,81 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol LoggedInInteractable: Interactable, OffGameListener, GameListener { + var router: LoggedInRouting? { get set } + var listener: LoggedInListener? { get set } +} + +protocol LoggedInViewControllable: ViewControllable { + func replaceModal(viewController: ViewControllable?) +} + +final class LoggedInRouter: Router, LoggedInRouting { + + init(interactor: LoggedInInteractable, + viewController: LoggedInViewControllable, + offGameBuilder: OffGameBuildable) { + self.viewController = viewController + self.offGameBuilder = offGameBuilder + super.init(interactor: interactor) + interactor.router = self + } + + // MARK: - LoggedInRouting + + func cleanupViews() { + if currentChild != nil { + viewController.replaceModal(viewController: nil) + } + } + + func routeToOffGame(with games: [Game]) { + detachCurrentChild() + attachOffGame(with: games) + } + + func routeToGame(with gameBuilder: GameBuildable) { + detachCurrentChild() + + let game = gameBuilder.build(withListener: interactor) + self.currentChild = game + attachChild(game) + viewController.replaceModal(viewController: game.viewControllable) + } + + // MARK: - Private + + private let viewController: LoggedInViewControllable + private let offGameBuilder: OffGameBuildable + + private var currentChild: ViewableRouting? + + private func attachOffGame(with games: [Game]) { + let offGame = offGameBuilder.build(withListener: interactor, games: games) + self.currentChild = offGame + attachChild(offGame) + viewController.replaceModal(viewController: offGame.viewControllable) + } + + private func detachCurrentChild() { + if let currentChild = currentChild { + detachChild(currentChild) + viewController.replaceModal(viewController: nil) + } + } +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/RandomWinAdapter.swift b/Example/xcframework/TicTacToe/LoggedIn/RandomWinAdapter.swift new file mode 100644 index 0000000..d069e29 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/RandomWinAdapter.swift @@ -0,0 +1,43 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +class RandomWinAdapter: Game, GameBuildable, RandomWinListener { + + let id = "randomwin" + let name = "Random Win" + var builder: GameBuildable { + return self + } + + private let randomWinBuilder: RandomWinBuilder + + private weak var listener: GameListener? + + init(dependency: RandomWinDependency) { + randomWinBuilder = RandomWinBuilder(dependency: dependency) + } + + func build(withListener listener: GameListener) -> ViewableRouting { + self.listener = listener + return randomWinBuilder.build(withListener: self) + } + + func didRandomlyWin(with player: PlayerType) { + listener?.gameDidEnd(with: player) + } +} diff --git a/Example/xcframework/TicTacToe/LoggedIn/TicTacToeAdapter.swift b/Example/xcframework/TicTacToe/LoggedIn/TicTacToeAdapter.swift new file mode 100644 index 0000000..3a1daf2 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedIn/TicTacToeAdapter.swift @@ -0,0 +1,41 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +class TicTacToeAdapter: Game, GameBuildable, TicTacToeListener { + let id = "tictactoe" + let name = "Tic Tac Toe" + let ticTacToeBuilder: TicTacToeBuilder + var builder: GameBuildable { + return self + } + + weak var gameListener: GameListener? + + init(dependency: TicTacToeDependency) { + ticTacToeBuilder = TicTacToeBuilder(dependency: dependency) + } + + func build(withListener listener: GameListener) -> ViewableRouting { + gameListener = listener + return ticTacToeBuilder.build(withListener: self) + } + + func ticTacToeDidEnd(with winner: PlayerType?) { + gameListener?.gameDidEnd(with: winner) + } +} diff --git a/Example/xcframework/TicTacToe/LoggedOut/LoggedOutBuilder.swift b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutBuilder.swift new file mode 100644 index 0000000..f023e78 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutBuilder.swift @@ -0,0 +1,48 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol LoggedOutDependency: Dependency { + // TODO: Declare the set of dependencies required by this RIB, but cannot be + // created by this RIB. +} + +final class LoggedOutComponent: Component { + + // TODO: Declare 'fileprivate' dependencies that are only used by this RIB. +} + +// MARK: - Builder + +protocol LoggedOutBuildable: Buildable { + func build(withListener listener: LoggedOutListener) -> LoggedOutRouting +} + +final class LoggedOutBuilder: Builder, LoggedOutBuildable { + + override init(dependency: LoggedOutDependency) { + super.init(dependency: dependency) + } + + func build(withListener listener: LoggedOutListener) -> LoggedOutRouting { + _ = LoggedOutComponent(dependency: dependency) + let viewController = LoggedOutViewController() + let interactor = LoggedOutInteractor(presenter: viewController) + interactor.listener = listener + return LoggedOutRouter(interactor: interactor, viewController: viewController) + } +} diff --git a/Example/xcframework/TicTacToe/LoggedOut/LoggedOutInteractor.swift b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutInteractor.swift new file mode 100644 index 0000000..0c50903 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutInteractor.swift @@ -0,0 +1,72 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +protocol LoggedOutRouting: ViewableRouting { + // TODO: Declare methods the interactor can invoke to manage sub-tree via the router. +} + +protocol LoggedOutPresentable: Presentable { + var listener: LoggedOutPresentableListener? { get set } + // TODO: Declare methods the interactor can invoke the presenter to present data. +} + +protocol LoggedOutListener: class { + func didLogin(withPlayer1Name player1Name: String, player2Name: String) +} + +final class LoggedOutInteractor: PresentableInteractor, LoggedOutInteractable, LoggedOutPresentableListener { + + weak var router: LoggedOutRouting? + + weak var listener: LoggedOutListener? + + // TODO: Add additional dependencies to constructor. Do not perform any logic + // in constructor. + override init(presenter: LoggedOutPresentable) { + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + // TODO: Implement business logic here. + } + + override func willResignActive() { + super.willResignActive() + // TODO: Pause any business logic. + } + + // MARK: - LoggedOutPresentableListener + + func login(withPlayer1Name player1Name: String?, player2Name: String?) { + let player1NameWithDefault = playerName(player1Name, withDefaultName: "Player 1") + let player2NameWithDefault = playerName(player2Name, withDefaultName: "Player 2") + + listener?.didLogin(withPlayer1Name: player1NameWithDefault, player2Name: player2NameWithDefault) + } + + private func playerName(_ name: String?, withDefaultName defaultName: String) -> String { + if let name = name { + return name.isEmpty ? defaultName : name + } else { + return defaultName + } + } +} diff --git a/Example/xcframework/TicTacToe/LoggedOut/LoggedOutRouter.swift b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutRouter.swift new file mode 100644 index 0000000..c9cadb4 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutRouter.swift @@ -0,0 +1,35 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol LoggedOutInteractable: Interactable { + var router: LoggedOutRouting? { get set } + var listener: LoggedOutListener? { get set } +} + +protocol LoggedOutViewControllable: ViewControllable { + // TODO: Declare methods the router invokes to manipulate the view hierarchy. +} + +final class LoggedOutRouter: ViewableRouter, LoggedOutRouting { + + // TODO: Constructor inject child builder protocols to allow building children. + override init(interactor: LoggedOutInteractable, viewController: LoggedOutViewControllable) { + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } +} diff --git a/Example/xcframework/TicTacToe/LoggedOut/LoggedOutViewController.swift b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutViewController.swift new file mode 100644 index 0000000..b834927 --- /dev/null +++ b/Example/xcframework/TicTacToe/LoggedOut/LoggedOutViewController.swift @@ -0,0 +1,90 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +protocol LoggedOutPresentableListener: class { + func login(withPlayer1Name: String?, player2Name: String?) +} + +final class LoggedOutViewController: UIViewController, LoggedOutPresentable, LoggedOutViewControllable { + + weak var listener: LoggedOutPresentableListener? + + init() { + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.white + let playerFields = buildPlayerFields() + buildLoginButton(withPlayer1Field: playerFields.player1Field, player2Field: playerFields.player2Field) + } + + // MARK: - Private + + private func buildPlayerFields() -> (player1Field: UITextField, player2Field: UITextField) { + let player1Field = UITextField() + player1Field.borderStyle = UITextBorderStyle.line + view.addSubview(player1Field) + player1Field.placeholder = "Player 1 name" + player1Field.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(self.view).offset(100) + maker.leading.trailing.equalTo(self.view).inset(40) + maker.height.equalTo(40) + } + + let player2Field = UITextField() + player2Field.borderStyle = UITextBorderStyle.line + view.addSubview(player2Field) + player2Field.placeholder = "Player 2 name" + player2Field.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(player1Field.snp.bottom).offset(20) + maker.left.right.height.equalTo(player1Field) + } + + return (player1Field, player2Field) + } + + private func buildLoginButton(withPlayer1Field player1Field: UITextField, player2Field: UITextField) { + let loginButton = UIButton() + view.addSubview(loginButton) + loginButton.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(player2Field.snp.bottom).offset(20) + maker.left.right.height.equalTo(player1Field) + } + loginButton.setTitle("Login", for: .normal) + loginButton.setTitleColor(UIColor.white, for: .normal) + loginButton.backgroundColor = UIColor.black + loginButton.rx.tap + .subscribe(onNext: { [weak self] in + self?.listener?.login(withPlayer1Name: player1Field.text, player2Name: player2Field.text) + }) + .disposed(by: disposeBag) + } + + private let disposeBag = DisposeBag() +} diff --git a/Example/xcframework/TicTacToe/Models/PlayerType.swift b/Example/xcframework/TicTacToe/Models/PlayerType.swift new file mode 100644 index 0000000..783eba6 --- /dev/null +++ b/Example/xcframework/TicTacToe/Models/PlayerType.swift @@ -0,0 +1,31 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +public enum PlayerType: Int { + case player1 = 1 + case player2 + + var color: UIColor { + switch self { + case .player1: + return UIColor.red + case .player2: + return UIColor.blue + } + } +} diff --git a/Example/xcframework/TicTacToe/Models/ScoreStream.swift b/Example/xcframework/TicTacToe/Models/ScoreStream.swift new file mode 100644 index 0000000..6679448 --- /dev/null +++ b/Example/xcframework/TicTacToe/Models/ScoreStream.swift @@ -0,0 +1,64 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RxSwift + +public struct Score { + public let player1Score: Int + public let player2Score: Int + + public static func equals(lhs: Score, rhs: Score) -> Bool { + return lhs.player1Score == rhs.player1Score && lhs.player2Score == rhs.player2Score + } +} + +public protocol ScoreStream: class { + var score: Observable { get } +} + +public protocol MutableScoreStream: ScoreStream { + func updateScore(with winner: PlayerType) +} + +public class ScoreStreamImpl: MutableScoreStream { + + public init() {} + + public var score: Observable { + return variable + .asObservable() + .distinctUntilChanged { (lhs: Score, rhs: Score) -> Bool in + Score.equals(lhs: lhs, rhs: rhs) + } + } + + public func updateScore(with winner: PlayerType) { + let newScore: Score = { + let currentScore = variable.value + switch winner { + case .player1: + return Score(player1Score: currentScore.player1Score + 1, player2Score: currentScore.player2Score) + case .player2: + return Score(player1Score: currentScore.player1Score, player2Score: currentScore.player2Score + 1) + } + }() + variable.value = newScore + } + + // MARK: - Private + + private let variable = Variable(Score(player1Score: 0, player2Score: 0)) +} diff --git a/Example/xcframework/TicTacToe/OffGame/OffGameBuilder.swift b/Example/xcframework/TicTacToe/OffGame/OffGameBuilder.swift new file mode 100644 index 0000000..a38aa6d --- /dev/null +++ b/Example/xcframework/TicTacToe/OffGame/OffGameBuilder.swift @@ -0,0 +1,64 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +public protocol OffGameDependency: Dependency { + var player1Name: String { get } + var player2Name: String { get } + var scoreStream: ScoreStream { get } +} + +final class OffGameComponent: Component, BasicScoreBoardDependency { + + var player1Name: String { + return dependency.player1Name + } + + var player2Name: String { + return dependency.player2Name + } + + var scoreStream: ScoreStream { + return dependency.scoreStream + } +} + +// MARK: - Builder + +protocol OffGameBuildable: Buildable { + func build(withListener listener: OffGameListener, games: [Game]) -> OffGameRouting +} + +final class OffGameBuilder: Builder, OffGameBuildable { + + override init(dependency: OffGameDependency) { + super.init(dependency: dependency) + } + + func build(withListener listener: OffGameListener, games: [Game]) -> OffGameRouting { + let component = OffGameComponent(dependency: dependency) + let viewController = OffGameViewController(games: games) + let interactor = OffGameInteractor(presenter: viewController) + interactor.listener = listener + + let scoreBoardBuilder = BasicScoreBoardBuilder(dependency: component) + let router = OffGameRouter(interactor: interactor, + viewController: viewController, + scoreBoardBuilder: scoreBoardBuilder) + return router + } +} diff --git a/Example/xcframework/TicTacToe/OffGame/OffGameInteractor.swift b/Example/xcframework/TicTacToe/OffGame/OffGameInteractor.swift new file mode 100644 index 0000000..5864d3c --- /dev/null +++ b/Example/xcframework/TicTacToe/OffGame/OffGameInteractor.swift @@ -0,0 +1,61 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +protocol OffGameRouting: ViewableRouting { + // TODO: Declare methods the interactor can invoke to manage sub-tree via the router. +} + +protocol OffGamePresentable: Presentable { + var listener: OffGamePresentableListener? { get set } + // TODO: Declare methods the interactor can invoke the presenter to present data. +} + +protocol OffGameListener: class { + func startGame(with gameBuilder: GameBuildable) +} + +final class OffGameInteractor: PresentableInteractor, OffGameInteractable, OffGamePresentableListener { + + weak var router: OffGameRouting? + + weak var listener: OffGameListener? + + // TODO: Add additional dependencies to constructor. Do not perform any logic + // in constructor. + override init(presenter: OffGamePresentable) { + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + // TODO: Implement business logic here. + } + + override func willResignActive() { + super.willResignActive() + // TODO: Pause any business logic. + } + + // MARK: - OffGamePresentableListener + + func start(_ game: Game) { + listener?.startGame(with: game.builder) + } +} diff --git a/Example/xcframework/TicTacToe/OffGame/OffGameRouter.swift b/Example/xcframework/TicTacToe/OffGame/OffGameRouter.swift new file mode 100644 index 0000000..f8b3e72 --- /dev/null +++ b/Example/xcframework/TicTacToe/OffGame/OffGameRouter.swift @@ -0,0 +1,53 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol OffGameInteractable: Interactable, BasicScoreBoardListener { + var router: OffGameRouting? { get set } + var listener: OffGameListener? { get set } +} + +protocol OffGameViewControllable: ViewControllable { + func show(scoreBoardView: ViewControllable) +} + +final class OffGameRouter: ViewableRouter, OffGameRouting { + + init(interactor: OffGameInteractable, + viewController: OffGameViewControllable, + scoreBoardBuilder: BasicScoreBoardBuildable) { + self.scoreBoardBuilder = scoreBoardBuilder + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } + + override func didLoad() { + super.didLoad() + + attachScoreBoard() + } + + // MARK: - Private + + private var scoreBoardBuilder: BasicScoreBoardBuildable + + private func attachScoreBoard() { + let scoreBoard = scoreBoardBuilder.build(withListener: interactor) + attachChild(scoreBoard) + viewController.show(scoreBoardView: scoreBoard.viewControllable) + } +} diff --git a/Example/xcframework/TicTacToe/OffGame/OffGameViewController.swift b/Example/xcframework/TicTacToe/OffGame/OffGameViewController.swift new file mode 100644 index 0000000..286608d --- /dev/null +++ b/Example/xcframework/TicTacToe/OffGame/OffGameViewController.swift @@ -0,0 +1,94 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +protocol OffGamePresentableListener: class { + func start(_ game: Game) +} + +final class OffGameViewController: UIViewController, OffGamePresentable, OffGameViewControllable { + + weak var listener: OffGamePresentableListener? + + init(games: [Game]) { + self.games = games + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.yellow + buildStartButtons() + } + + func show(scoreBoardView: ViewControllable) { + addChildViewController(scoreBoardView.uiviewController) + view.addSubview(scoreBoardView.uiviewController.view) + scoreBoardView.uiviewController.view.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(self.view).offset(70) + maker.leading.trailing.equalTo(self.view).inset(20) + maker.height.equalTo(120) + } + } + + // MARK: - Private + + private let games: [Game] + + private func buildStartButtons() { + var previousButton: UIView? + for game in games { + previousButton = buildStartButton(with: game, previousButton: previousButton) + } + } + + private func buildStartButton(with game: Game, previousButton: UIView?) -> UIButton { + let startButton = UIButton() + view.addSubview(startButton) + startButton.accessibilityIdentifier = game.name + startButton.snp.makeConstraints { (maker: ConstraintMaker) in + if let previousButton = previousButton { + maker.bottom.equalTo(previousButton.snp.top).offset(-20) + } else { + maker.bottom.equalTo(self.view.snp.bottom).inset(30) + } + maker.leading.trailing.equalTo(self.view).inset(40) + maker.height.equalTo(50) + } + startButton.setTitle(game.name, for: .normal) + startButton.setTitleColor(UIColor.white, for: .normal) + startButton.backgroundColor = UIColor.black + startButton.rx.tap + .subscribe(onNext: { [weak self] in + self?.listener?.start(game) + }) + .disposed(by: disposeBag) + + return startButton + } + + private let disposeBag = DisposeBag() +} diff --git a/Example/xcframework/TicTacToe/Promo/LaunchGameWorkflow.swift b/Example/xcframework/TicTacToe/Promo/LaunchGameWorkflow.swift new file mode 100644 index 0000000..986e2f8 --- /dev/null +++ b/Example/xcframework/TicTacToe/Promo/LaunchGameWorkflow.swift @@ -0,0 +1,48 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +public class LaunchGameWorkflow: Workflow { + public init(url: URL) { + super.init() + + let gameId = parseGameId(from: url) + + self + .onStep { (rootItem: RootActionableItem) -> Observable<(LoggedInActionableItem, ())> in + rootItem.waitForLogin() + } + .onStep { (loggedInItem: LoggedInActionableItem, _) -> Observable<(LoggedInActionableItem, ())> in + loggedInItem.launchGame(with: gameId) + } + .commit() + } + + private func parseGameId(from url: URL) -> String? { + let components = URLComponents(string: url.absoluteString) + let items = components?.queryItems ?? [] + for item in items { + if item.name == "gameId" { + return item.value + } + } + + return nil + } +} + diff --git a/Example/xcframework/TicTacToe/RandomWin/RandomWinBuilder.swift b/Example/xcframework/TicTacToe/RandomWin/RandomWinBuilder.swift new file mode 100644 index 0000000..3e9a205 --- /dev/null +++ b/Example/xcframework/TicTacToe/RandomWin/RandomWinBuilder.swift @@ -0,0 +1,61 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +public protocol RandomWinDependency: Dependency { + var player1Name: String { get } + var player2Name: String { get } + var mutableScoreStream: MutableScoreStream { get } +} + +final class RandomWinComponent: Component { + + fileprivate var player1Name: String { + return dependency.player1Name + } + + fileprivate var player2Name: String { + return dependency.player2Name + } + + fileprivate var mutableScoreStream: MutableScoreStream { + return dependency.mutableScoreStream + } +} + +// MARK: - Builder + +protocol RandomWinBuildable: Buildable { + func build(withListener listener: RandomWinListener) -> RandomWinRouting +} + +public final class RandomWinBuilder: Builder, RandomWinBuildable { + + public override init(dependency: RandomWinDependency) { + super.init(dependency: dependency) + } + + public func build(withListener listener: RandomWinListener) -> RandomWinRouting { + let component = RandomWinComponent(dependency: dependency) + let viewController = RandomWinViewController(player1Name: component.player1Name, + player2Name: component.player2Name) + let interactor = RandomWinInteractor(presenter: viewController, + mutableScoreStream: component.mutableScoreStream) + interactor.listener = listener + return RandomWinRouter(interactor: interactor, viewController: viewController) + } +} diff --git a/Example/xcframework/TicTacToe/RandomWin/RandomWinInteractor.swift b/Example/xcframework/TicTacToe/RandomWin/RandomWinInteractor.swift new file mode 100644 index 0000000..318d0d8 --- /dev/null +++ b/Example/xcframework/TicTacToe/RandomWin/RandomWinInteractor.swift @@ -0,0 +1,70 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +public protocol RandomWinRouting: ViewableRouting { + // TODO: Declare methods the interactor can invoke to manage sub-tree via the router. +} + +protocol RandomWinPresentable: Presentable { + var listener: RandomWinPresentableListener? { get set } + func announce(winner: PlayerType, withCompletionHandler handler: @escaping () -> ()) +} + +public protocol RandomWinListener: class { + func didRandomlyWin(with player: PlayerType) +} + +final class RandomWinInteractor: PresentableInteractor, RandomWinInteractable, RandomWinPresentableListener { + + weak var router: RandomWinRouting? + + weak var listener: RandomWinListener? + + init(presenter: RandomWinPresentable, + mutableScoreStream: MutableScoreStream) { + self.mutableScoreStream = mutableScoreStream + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + // TODO: Implement business logic here. + } + + override func willResignActive() { + super.willResignActive() + // TODO: Pause any business logic. + } + + // MARK: - RandomWinPresentableListener + + func determineWinner() { + let random = arc4random_uniform(100) + let winner = random > 50 ? PlayerType.player1 : PlayerType.player2 + presenter.announce(winner: winner) { + self.mutableScoreStream.updateScore(with: winner) + self.listener?.didRandomlyWin(with: winner) + } + } + + // MARK: - Private + + private let mutableScoreStream: MutableScoreStream +} diff --git a/Example/xcframework/TicTacToe/RandomWin/RandomWinRouter.swift b/Example/xcframework/TicTacToe/RandomWin/RandomWinRouter.swift new file mode 100644 index 0000000..759b8f0 --- /dev/null +++ b/Example/xcframework/TicTacToe/RandomWin/RandomWinRouter.swift @@ -0,0 +1,35 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol RandomWinInteractable: Interactable { + var router: RandomWinRouting? { get set } + var listener: RandomWinListener? { get set } +} + +protocol RandomWinViewControllable: ViewControllable { + // TODO: Declare methods the router invokes to manipulate the view hierarchy. +} + +final class RandomWinRouter: ViewableRouter, RandomWinRouting { + + // TODO: Constructor inject child builder protocols to allow building children. + override init(interactor: RandomWinInteractable, viewController: RandomWinViewControllable) { + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } +} diff --git a/Example/xcframework/TicTacToe/RandomWin/RandomWinViewController.swift b/Example/xcframework/TicTacToe/RandomWin/RandomWinViewController.swift new file mode 100644 index 0000000..edf886f --- /dev/null +++ b/Example/xcframework/TicTacToe/RandomWin/RandomWinViewController.swift @@ -0,0 +1,93 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +protocol RandomWinPresentableListener: class { + func determineWinner() +} + +final class RandomWinViewController: UIViewController, RandomWinPresentable, RandomWinViewControllable { + + weak var listener: RandomWinPresentableListener? + + init(player1Name: String, + player2Name: String) { + self.player1Name = player1Name + self.player2Name = player2Name + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.cyan + buildGoButton() + } + + // MARK: - RandomWinPresentable + + func announce(winner: PlayerType, withCompletionHandler handler: @escaping () -> ()) { + let winnerString: String = { + switch winner { + case .player1: + return "\(player1Name) Won!" + case .player2: + return "\(player2Name) Won!" + } + }() + let alert = UIAlertController(title: winnerString, message: nil, preferredStyle: .alert) + let closeAction = UIAlertAction(title: "That was random...", style: UIAlertActionStyle.default) { _ in + handler() + } + alert.addAction(closeAction) + present(alert, animated: true, completion: nil) + } + + // MARK: - Private + + private let player1Name: String + private let player2Name: String + + private func buildGoButton() { + let button = UIButton() + button.setTitle("Magic", for: .normal) + button.backgroundColor = UIColor.purple + button.setTitleColor(UIColor.white, for: .normal) + view.addSubview(button) + button.snp.makeConstraints { (maker: ConstraintMaker) in + maker.center.equalTo(self.view.snp.center) + maker.leading.trailing.equalTo(self.view).inset(20) + maker.height.equalTo(100) + } + + button.rx.tap + .subscribe(onNext: { [weak self] in + self?.listener?.determineWinner() + }) + .disposed(by: disposeBag) + } + + private let disposeBag = DisposeBag() +} diff --git a/Example/xcframework/TicTacToe/Resources/Default-568h@2x.png b/Example/xcframework/TicTacToe/Resources/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Example/xcframework/TicTacToe/Root/RootBuilder.swift b/Example/xcframework/TicTacToe/Root/RootBuilder.swift new file mode 100644 index 0000000..8f27755 --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootBuilder.swift @@ -0,0 +1,62 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol RootDependency: Dependency { + // TODO: Declare the set of dependencies required by this RIB, but cannot be + // created by this RIB. +} + +final class RootComponent: Component { + + let rootViewController: RootViewController + + init(dependency: RootDependency, + rootViewController: RootViewController) { + self.rootViewController = rootViewController + super.init(dependency: dependency) + } +} + +// MARK: - Builder + +protocol RootBuildable: Buildable { + func build() -> (launchRouter: LaunchRouting, urlHandler: UrlHandler) +} + +final class RootBuilder: Builder, RootBuildable { + + override init(dependency: RootDependency) { + super.init(dependency: dependency) + } + + func build() -> (launchRouter: LaunchRouting, urlHandler: UrlHandler) { + let viewController = RootViewController() + let component = RootComponent(dependency: dependency, + rootViewController: viewController) + let interactor = RootInteractor(presenter: viewController) + + let loggedOutBuilder = LoggedOutBuilder(dependency: component) + let loggedInBuilder = LoggedInBuilder(dependency: component) + let router = RootRouter(interactor: interactor, + viewController: viewController, + loggedOutBuilder: loggedOutBuilder, + loggedInBuilder: loggedInBuilder) + + return (router, interactor) + } +} diff --git a/Example/xcframework/TicTacToe/Root/RootComponent+LoggedIn.swift b/Example/xcframework/TicTacToe/Root/RootComponent+LoggedIn.swift new file mode 100644 index 0000000..2351441 --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootComponent+LoggedIn.swift @@ -0,0 +1,32 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +/// The dependencies needed from the parent scope of Root to provide for the LoggedIn scope. +// TODO: Update RootDependency protocol to inherit this protocol. +protocol RootDependencyLoggedIn: Dependency { + + // TODO: Declare dependencies needed from the parent scope of Root to provide dependencies + // for the LoggedIn scope. +} + +extension RootComponent: LoggedInDependency { + + var loggedInViewController: LoggedInViewControllable { + return rootViewController + } +} diff --git a/Example/xcframework/TicTacToe/Root/RootComponent+LoggedOut.swift b/Example/xcframework/TicTacToe/Root/RootComponent+LoggedOut.swift new file mode 100644 index 0000000..a2f32f5 --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootComponent+LoggedOut.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +/// The dependencies needed from the parent scope of Root to provide for the LoggedOut scope. +// TODO: Update RootDependency protocol to inherit this protocol. +protocol RootDependencyLoggedOut: Dependency { + + // TODO: Declare dependencies needed from the parent scope of Root to provide dependencies + // for the LoggedOut scope. +} + +extension RootComponent: LoggedOutDependency { + + // TODO: Implement properties to provide for LoggedOut scope. +} diff --git a/Example/xcframework/TicTacToe/Root/RootInteractor.swift b/Example/xcframework/TicTacToe/Root/RootInteractor.swift new file mode 100644 index 0000000..23bab63 --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootInteractor.swift @@ -0,0 +1,86 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +protocol RootRouting: ViewableRouting { + func routeToLoggedIn(withPlayer1Name player1Name: String, player2Name: String) -> LoggedInActionableItem +} + +protocol RootPresentable: Presentable { + var listener: RootPresentableListener? { get set } + // TODO: Declare methods the interactor can invoke the presenter to present data. +} + +protocol RootListener: class { + // TODO: Declare methods the interactor can invoke to communicate with other RIBs. +} + +final class RootInteractor: PresentableInteractor, RootInteractable, RootPresentableListener, RootActionableItem, UrlHandler { + + weak var router: RootRouting? + + weak var listener: RootListener? + + // TODO: Add additional dependencies to constructor. Do not perform any logic + // in constructor. + override init(presenter: RootPresentable) { + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + // TODO: Implement business logic here. + } + + override func willResignActive() { + super.willResignActive() + // TODO: Pause any business logic. + } + + // MARK: - LoggedOutListener + + func didLogin(withPlayer1Name player1Name: String, player2Name: String) { + let loggedInActionableItem = router?.routeToLoggedIn(withPlayer1Name: player1Name, player2Name: player2Name) + if let loggedInActionableItem = loggedInActionableItem { + loggedInActionableItemSubject.onNext(loggedInActionableItem) + } + } + + // MARK: - UrlHandler + + func handle(_ url: URL) { + let launchGameWorkflow = LaunchGameWorkflow(url: url) + launchGameWorkflow + .subscribe(self) + .disposeOnDeactivate(interactor: self) + } + + // MARK: - RootActionableItem + + func waitForLogin() -> Observable<(LoggedInActionableItem, ())> { + return loggedInActionableItemSubject + .map { (loggedInItem: LoggedInActionableItem) -> (LoggedInActionableItem, ()) in + (loggedInItem, ()) + } + } + + // MARK: - Private + + private let loggedInActionableItemSubject = ReplaySubject.create(bufferSize: 1) +} diff --git a/Example/xcframework/TicTacToe/Root/RootRouter.swift b/Example/xcframework/TicTacToe/Root/RootRouter.swift new file mode 100644 index 0000000..a5aba8a --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootRouter.swift @@ -0,0 +1,72 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol RootInteractable: Interactable, LoggedOutListener, LoggedInListener { + var router: RootRouting? { get set } + var listener: RootListener? { get set } +} + +protocol RootViewControllable: ViewControllable { + func replaceModal(viewController: ViewControllable?) +} + +final class RootRouter: LaunchRouter, RootRouting { + + init(interactor: RootInteractable, + viewController: RootViewControllable, + loggedOutBuilder: LoggedOutBuildable, + loggedInBuilder: LoggedInBuildable) { + self.loggedOutBuilder = loggedOutBuilder + self.loggedInBuilder = loggedInBuilder + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } + + override func didLoad() { + super.didLoad() + + routeToLoggedOut() + } + + func routeToLoggedIn(withPlayer1Name player1Name: String, player2Name: String) -> LoggedInActionableItem { + // Detach logged out. + if let loggedOut = self.loggedOut { + detachChild(loggedOut) + viewController.replaceModal(viewController: nil) + self.loggedOut = nil + } + + let loggedIn = loggedInBuilder.build(withListener: interactor, player1Name: player1Name, player2Name: player2Name) + attachChild(loggedIn.router) + return loggedIn.actionableItem + } + + // MARK: - Private + + private let loggedOutBuilder: LoggedOutBuildable + private let loggedInBuilder: LoggedInBuildable + + private var loggedOut: ViewableRouting? + + private func routeToLoggedOut() { + let loggedOut = loggedOutBuilder.build(withListener: interactor) + self.loggedOut = loggedOut + attachChild(loggedOut) + viewController.replaceModal(viewController: loggedOut.viewControllable) + } +} diff --git a/Example/xcframework/TicTacToe/Root/RootViewController.swift b/Example/xcframework/TicTacToe/Root/RootViewController.swift new file mode 100644 index 0000000..ad6643e --- /dev/null +++ b/Example/xcframework/TicTacToe/Root/RootViewController.swift @@ -0,0 +1,87 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import SnapKit +import UIKit + +protocol RootPresentableListener: class { + // TODO: Declare properties and methods that the view controller can invoke to perform + // business logic, such as signIn(). This protocol is implemented by the corresponding + // interactor class. +} + +final class RootViewController: UIViewController, RootPresentable, RootViewControllable { + + weak var listener: RootPresentableListener? + + init() { + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.white + } + + // MARK: - RootViewControllable + + func replaceModal(viewController: ViewControllable?) { + targetViewController = viewController + + guard !animationInProgress else { + return + } + + if presentedViewController != nil { + animationInProgress = true + dismiss(animated: true) { [weak self] in + if self?.targetViewController != nil { + self?.presentTargetViewController() + } else { + self?.animationInProgress = false + } + } + } else { + presentTargetViewController() + } + } + + // MARK: - Private + + private var targetViewController: ViewControllable? + private var animationInProgress = false + + private func presentTargetViewController() { + if let targetViewController = targetViewController { + animationInProgress = true + present(targetViewController.uiviewController, animated: true) { [weak self] in + self?.animationInProgress = false + } + } + } +} + +// MARK: LoggedInViewControllable + +extension RootViewController: LoggedInViewControllable { + +} diff --git a/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift new file mode 100644 index 0000000..4fe9b7c --- /dev/null +++ b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardBuilder.swift @@ -0,0 +1,61 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +public protocol BasicScoreBoardDependency: Dependency { + var player1Name: String { get } + var player2Name: String { get } + var scoreStream: ScoreStream { get } +} + +final class BasicScoreBoardComponent: Component { + + fileprivate var player1Name: String { + return dependency.player1Name + } + + fileprivate var player2Name: String { + return dependency.player2Name + } + + fileprivate var scoreStream: ScoreStream { + return dependency.scoreStream + } +} + +// MARK: - Builder + +protocol BasicScoreBoardBuildable: Buildable { + func build(withListener listener: BasicScoreBoardListener) -> BasicScoreBoardRouting +} + +public final class BasicScoreBoardBuilder: Builder, BasicScoreBoardBuildable { + + public override init(dependency: BasicScoreBoardDependency) { + super.init(dependency: dependency) + } + + public func build(withListener listener: BasicScoreBoardListener) -> BasicScoreBoardRouting { + let component = BasicScoreBoardComponent(dependency: dependency) + let viewController = BasicScoreBoardViewController(player1Name: component.player1Name, + player2Name: component.player2Name) + let interactor = BasicScoreBoardInteractor(presenter: viewController, + scoreStream: component.scoreStream) + interactor.listener = listener + return BasicScoreBoardRouter(interactor: interactor, viewController: viewController) + } +} diff --git a/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift new file mode 100644 index 0000000..07778a7 --- /dev/null +++ b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardInteractor.swift @@ -0,0 +1,63 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +public protocol BasicScoreBoardRouting: ViewableRouting { + // TODO: Declare methods the interactor can invoke to manage sub-tree via the router. +} + +protocol BasicScoreBoardPresentable: Presentable { + var listener: BasicScoreBoardPresentableListener? { get set } + func set(score: Score) +} + +public protocol BasicScoreBoardListener: class { + // TODO: Declare methods the interactor can invoke to communicate with other RIBs. +} + +final class BasicScoreBoardInteractor: PresentableInteractor, BasicScoreBoardInteractable, BasicScoreBoardPresentableListener { + + weak var router: BasicScoreBoardRouting? + + weak var listener: BasicScoreBoardListener? + + init(presenter: BasicScoreBoardPresentable, + scoreStream: ScoreStream) { + self.scoreStream = scoreStream + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + + updateScore() + } + + // MARK: - Private + + private let scoreStream: ScoreStream + + private func updateScore() { + scoreStream.score + .subscribe(onNext: { (score: Score) in + self.presenter.set(score: score) + }) + .disposeOnDeactivate(interactor: self) + } +} diff --git a/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift new file mode 100644 index 0000000..1a14d8a --- /dev/null +++ b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardRouter.swift @@ -0,0 +1,35 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol BasicScoreBoardInteractable: Interactable { + var router: BasicScoreBoardRouting? { get set } + var listener: BasicScoreBoardListener? { get set } +} + +protocol BasicScoreBoardViewControllable: ViewControllable { + // TODO: Declare methods the router invokes to manipulate the view hierarchy. +} + +final class BasicScoreBoardRouter: ViewableRouter, BasicScoreBoardRouting { + + // TODO: Constructor inject child builder protocols to allow building children. + override init(interactor: BasicScoreBoardInteractable, viewController: BasicScoreBoardViewControllable) { + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } +} diff --git a/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift new file mode 100644 index 0000000..08cbd57 --- /dev/null +++ b/Example/xcframework/TicTacToe/ScoreBoard/BasicScoreBoardViewController.swift @@ -0,0 +1,114 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import SnapKit +import UIKit + +protocol BasicScoreBoardPresentableListener: class { + // TODO: Declare properties and methods that the view controller can invoke to perform + // business logic, such as signIn(). This protocol is implemented by the corresponding + // interactor class. +} + +final class BasicScoreBoardViewController: UIViewController, BasicScoreBoardPresentable, BasicScoreBoardViewControllable { + + weak var listener: BasicScoreBoardPresentableListener? + + init(player1Name: String, + player2Name: String) { + self.player1Name = player1Name + self.player2Name = player2Name + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.clear + buildPlayerLabels() + } + + // MARK: - OffGamePresentable + + func set(score: Score) { + self.score = score + } + + // MARK: - Private + + private let player1Name: String + private let player2Name: String + + private var score: Score? + + private var player1Label: UILabel? + private var player2Label: UILabel? + + private func buildPlayerLabels() { + let labelBuilder: (UIColor) -> UILabel = { (color: UIColor) in + let label = UILabel() + label.font = UIFont.boldSystemFont(ofSize: 35) + label.backgroundColor = UIColor.clear + label.textColor = color + label.textAlignment = .center + return label + } + + let player1Label = labelBuilder(PlayerType.player1.color) + self.player1Label = player1Label + view.addSubview(player1Label) + player1Label.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.leading.trailing.equalTo(self.view) + maker.height.equalTo(40) + } + + let vsLabel = UILabel() + vsLabel.font = UIFont.systemFont(ofSize: 25) + vsLabel.backgroundColor = UIColor.clear + vsLabel.textColor = UIColor.darkGray + vsLabel.textAlignment = .center + vsLabel.text = "vs" + view.addSubview(vsLabel) + vsLabel.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(player1Label.snp.bottom).offset(10) + maker.leading.trailing.equalTo(player1Label) + maker.height.equalTo(20) + } + + let player2Label = labelBuilder(PlayerType.player2.color) + self.player2Label = player2Label + view.addSubview(player2Label) + player2Label.snp.makeConstraints { (maker: ConstraintMaker) in + maker.top.equalTo(vsLabel.snp.bottom).offset(10) + maker.height.leading.trailing.equalTo(player1Label) + } + + updatePlayerLabels() + } + + private func updatePlayerLabels() { + let player1Score = score?.player1Score ?? 0 + player1Label?.text = "\(player1Name) (\(player1Score))" + + let player2Score = score?.player2Score ?? 0 + player2Label?.text = "\(player2Name) (\(player2Score))" + } +} diff --git a/Example/xcframework/TicTacToe/TicTacToe/TicTacToeBuilder.swift b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeBuilder.swift new file mode 100644 index 0000000..7b1e242 --- /dev/null +++ b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeBuilder.swift @@ -0,0 +1,61 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs + +protocol TicTacToeDependency: Dependency { + var player1Name: String { get } + var player2Name: String { get } + var mutableScoreStream: MutableScoreStream { get } +} + +final class TicTacToeComponent: Component { + + fileprivate var player1Name: String { + return dependency.player1Name + } + + fileprivate var player2Name: String { + return dependency.player2Name + } + + fileprivate var mutableScoreStream: MutableScoreStream { + return dependency.mutableScoreStream + } +} + +// MARK: - Builder + +protocol TicTacToeBuildable: Buildable { + func build(withListener listener: TicTacToeListener) -> TicTacToeRouting +} + +final class TicTacToeBuilder: Builder, TicTacToeBuildable { + + override init(dependency: TicTacToeDependency) { + super.init(dependency: dependency) + } + + func build(withListener listener: TicTacToeListener) -> TicTacToeRouting { + let component = TicTacToeComponent(dependency: dependency) + let viewController = TicTacToeViewController(player1Name: component.player1Name, + player2Name: component.player2Name) + let interactor = TicTacToeInteractor(presenter: viewController, + mutableScoreStream: component.mutableScoreStream) + interactor.listener = listener + return TicTacToeRouter(interactor: interactor, viewController: viewController) + } +} diff --git a/Example/xcframework/TicTacToe/TicTacToe/TicTacToeInteractor.swift b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeInteractor.swift new file mode 100644 index 0000000..0fad19d --- /dev/null +++ b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeInteractor.swift @@ -0,0 +1,182 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import RxSwift + +public protocol TicTacToeRouting: ViewableRouting { + // TODO: Delcare methods the interactor can invoke to manage sub-tree via the router. +} + +protocol TicTacToePresentable: Presentable { + var listener: TicTacToePresentableListener? { get set } + func setCell(atRow row: Int, col: Int, withPlayerType playerType: PlayerType) + func announce(winner: PlayerType?, withCompletionHandler handler: @escaping () -> ()) +} + +public protocol TicTacToeListener: class { + func ticTacToeDidEnd(with winner: PlayerType?) +} + +final class TicTacToeInteractor: PresentableInteractor, TicTacToeInteractable, TicTacToePresentableListener { + + weak var router: TicTacToeRouting? + + weak var listener: TicTacToeListener? + + init(presenter: TicTacToePresentable, + mutableScoreStream: MutableScoreStream) { + self.mutableScoreStream = mutableScoreStream + super.init(presenter: presenter) + presenter.listener = self + } + + override func didBecomeActive() { + super.didBecomeActive() + + initBoard() + } + + override func willResignActive() { + super.willResignActive() + // TODO: Pause any business logic. + } + + // MARK: - TicTacToePresentableListener + + func placeCurrentPlayerMark(atRow row: Int, col: Int) { + guard board[row][col] == nil else { + return + } + + let currentPlayer = getAndFlipCurrentPlayer() + board[row][col] = currentPlayer + presenter.setCell(atRow: row, col: col, withPlayerType: currentPlayer) + + let endGame = checkEndGame() + if endGame.didEnd { + if let winner = endGame.winner { + mutableScoreStream.updateScore(with: winner) + } + + presenter.announce(winner: endGame.winner) { + self.listener?.ticTacToeDidEnd(with: endGame.winner) + } + } + } + + // MARK: - Private + + private let mutableScoreStream: MutableScoreStream + + private var currentPlayer = PlayerType.player1 + private var board = [[PlayerType?]]() + + private func initBoard() { + for _ in 0.. PlayerType { + let currentPlayer = self.currentPlayer + self.currentPlayer = currentPlayer == .player1 ? .player2 : .player1 + return currentPlayer + } + + private func checkEndGame() -> (winner: PlayerType?, didEnd: Bool) { + let winner = checkWinner() + if let winner = winner { + return (winner, true) + } + let isDraw = checkDraw() + if isDraw { + return (nil, true) + } + + return (nil, false) + } + + private func checkWinner() -> PlayerType? { + // Rows. + for row in 0.. Bool { + for row in 0.., TicTacToeRouting { + + // TODO: Constructor inject child builder protocols to allow building children. + override init(interactor: TicTacToeInteractable, viewController: TicTacToeViewControllable) { + super.init(interactor: interactor, viewController: viewController) + interactor.router = self + } +} diff --git a/Example/xcframework/TicTacToe/TicTacToe/TicTacToeViewController.swift b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeViewController.swift new file mode 100644 index 0000000..b6bef30 --- /dev/null +++ b/Example/xcframework/TicTacToe/TicTacToe/TicTacToeViewController.swift @@ -0,0 +1,140 @@ +// +// Copyright (c) 2017. Uber Technologies +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import RIBs +import SnapKit +import UIKit + +protocol TicTacToePresentableListener: class { + func placeCurrentPlayerMark(atRow row: Int, col: Int) +} + +final class TicTacToeViewController: UIViewController, TicTacToePresentable, TicTacToeViewControllable { + + weak var listener: TicTacToePresentableListener? + + init(player1Name: String, + player2Name: String) { + self.player1Name = player1Name + self.player2Name = player2Name + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("Method is not supported") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.yellow + buildCollectionView() + } + + // MARK: - TicTacToePresentable + + func setCell(atRow row: Int, col: Int, withPlayerType playerType: PlayerType) { + let indexPathRow = row * GameConstants.colCount + col + let cell = collectionView.cellForItem(at: IndexPath(row: indexPathRow, section: Constants.sectionCount - 1)) + cell?.backgroundColor = playerType.color + } + + func announce(winner: PlayerType?, withCompletionHandler handler: @escaping () -> ()) { + let winnerString: String = { + if let winner = winner { + switch winner { + case .player1: + return "\(player1Name) Won!" + case .player2: + return "\(player2Name) Won!" + } + } else { + return "It's a Tie" + } + }() + let alert = UIAlertController(title: winnerString, message: nil, preferredStyle: .alert) + let closeAction = UIAlertAction(title: "Close Game", style: UIAlertActionStyle.default) { _ in + handler() + } + alert.addAction(closeAction) + present(alert, animated: true, completion: nil) + } + + // MARK: - Private + + private let player2Name: String + private let player1Name: String + + private lazy var collectionView: UICollectionView = { + let layout = UICollectionViewFlowLayout() + layout.minimumLineSpacing = 0 + layout.minimumInteritemSpacing = 0 + layout.itemSize = CGSize(width: Constants.cellSize, height: Constants.cellSize) + return UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) + }() + + private func buildCollectionView() { + collectionView.dataSource = self + collectionView.delegate = self + collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: Constants.cellIdentifier) + view.addSubview(collectionView) + collectionView.snp.makeConstraints { (maker: ConstraintMaker) in + maker.center.equalTo(self.view.snp.center) + maker.size.equalTo(CGSize(width: CGFloat(GameConstants.colCount) * Constants.cellSize, height: CGFloat(GameConstants.rowCount) * Constants.cellSize)) + } + } +} + +fileprivate struct Constants { + static let sectionCount = 1 + static let cellSize: CGFloat = UIScreen.main.bounds.width / CGFloat(GameConstants.colCount) + static let cellIdentifier = "TicTacToeCell" + static let defaultColor = UIColor.white +} + +extension TicTacToeViewController: UICollectionViewDataSource { + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return Constants.sectionCount + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return GameConstants.rowCount * GameConstants.colCount + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let reusedCell = collectionView.dequeueReusableCell(withReuseIdentifier: Constants.cellIdentifier, for: indexPath) + reset(cell: reusedCell) + return reusedCell + } + + private func reset(cell: UICollectionViewCell) { + cell.backgroundColor = Constants.defaultColor + cell.contentView.layer.borderWidth = 2 + cell.contentView.layer.borderColor = UIColor.lightGray.cgColor + } +} + +// MARK: - UICollectionViewDelegate + +extension TicTacToeViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let row = indexPath.row / GameConstants.colCount + let col = indexPath.row - row * GameConstants.rowCount + listener?.placeCurrentPlayerMark(atRow: row, col: col) + } +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 2d88a4d..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Yuki Tamazawa - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.txt b/LICENSE.txt index e69de29..2d88a4d 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Yuki Tamazawa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Package.swift b/Package.swift index 8ef7bd3..f797d11 100644 --- a/Package.swift +++ b/Package.swift @@ -5,9 +5,13 @@ let package = Package( name: "RIBsTreeViewerClient", platforms: [.iOS(.v13)], products: [ - .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), - ], - targets: [ + .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), + ], + dependencies: [ + .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.0"), + .package(url: "https://github.com/uber/RIBs.git", from: "0.9.2"), + ], + targets: [ .target( name: "RIBsTreeViewerClient", path: "./RIBsTreeViewerClient/Sources" From f4a622eddace3c94540bc998909088393c531120 Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 15:42:27 +0900 Subject: [PATCH 2/9] update package.swift --- Example/swiftpm/Podfile | 10 ----- Example/swiftpm/Podfile.lock | 44 ------------------- .../contents.xcworkspacedata | 10 ----- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ---- .../xcshareddata/swiftpm/Package.resolved | 16 ------- Package.swift | 3 +- 6 files changed, 2 insertions(+), 89 deletions(-) delete mode 100644 Example/swiftpm/Podfile delete mode 100644 Example/swiftpm/Podfile.lock delete mode 100644 Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/Example/swiftpm/Podfile b/Example/swiftpm/Podfile deleted file mode 100644 index a1030df..0000000 --- a/Example/swiftpm/Podfile +++ /dev/null @@ -1,10 +0,0 @@ -platform :ios, '13.0' - -use_frameworks! -inhibit_all_warnings! - -target 'TicTacToe' do - pod 'RIBs', :git => 'https://github.com/uber/RIBs.git', tag: '0.9.2' - pod 'SnapKit' - pod 'RxCocoa', '~> 5.1.1' -end diff --git a/Example/swiftpm/Podfile.lock b/Example/swiftpm/Podfile.lock deleted file mode 100644 index 9141e11..0000000 --- a/Example/swiftpm/Podfile.lock +++ /dev/null @@ -1,44 +0,0 @@ -PODS: - - RIBs (0.9.3): - - RxRelay (~> 5.0) - - RxSwift (~> 5.0) - - RxCocoa (5.1.1): - - RxRelay (~> 5) - - RxSwift (~> 5) - - RxRelay (5.1.1): - - RxSwift (~> 5) - - RxSwift (5.1.1) - - SnapKit (5.0.1) - -DEPENDENCIES: - - RIBs (from `https://github.com/uber/RIBs.git`, tag `0.9.2`) - - RxCocoa (~> 5.1.1) - - SnapKit - -SPEC REPOS: - trunk: - - RxCocoa - - RxRelay - - RxSwift - - SnapKit - -EXTERNAL SOURCES: - RIBs: - :git: https://github.com/uber/RIBs.git - :tag: 0.9.2 - -CHECKOUT OPTIONS: - RIBs: - :git: https://github.com/uber/RIBs.git - :tag: 0.9.2 - -SPEC CHECKSUMS: - RIBs: efceda5df20c1a1e05139232a4638a6242caa92a - RxCocoa: 32065309a38d29b5b0db858819b5bf9ef038b601 - RxRelay: d77f7d771495f43c556cbc43eebd1bb54d01e8e9 - RxSwift: 81470a2074fa8780320ea5fe4102807cb7118178 - SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb - -PODFILE CHECKSUM: e098e2fe24385cac086a3d02c55ea1ff45801a95 - -COCOAPODS: 1.9.3 diff --git a/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata b/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ff1c005..0000000 --- a/Example/swiftpm/TicTacToe.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 4fca9f2..0000000 --- a/Example/swiftpm/TicTacToe.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,16 +0,0 @@ -{ - "object": { - "pins": [ - { - "package": "RIBsTreeViewerClient", - "repositoryURL": "https://github.com/srea/RIBsTreeViewerClient.git", - "state": { - "branch": "master", - "revision": "d8ceb216c7e836e2a8effaf2b71fe72e78181da3", - "version": null - } - } - ] - }, - "version": 1 -} diff --git a/Package.swift b/Package.swift index f797d11..0877af4 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,8 @@ let package = Package( targets: [ .target( name: "RIBsTreeViewerClient", - path: "./RIBsTreeViewerClient/Sources" + path: "./RIBsTreeViewerClient/Sources", + dependencies: ["RxSwift", "RIBs"] ), ] ) From fc7c6f2fea9262d4635b902543f611c40ba34ab0 Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 15:49:32 +0900 Subject: [PATCH 3/9] update package.swift --- Package.swift | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Package.swift b/Package.swift index 0877af4..502e4ce 100644 --- a/Package.swift +++ b/Package.swift @@ -5,17 +5,17 @@ let package = Package( name: "RIBsTreeViewerClient", platforms: [.iOS(.v13)], products: [ - .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), - ], - dependencies: [ - .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.0"), - .package(url: "https://github.com/uber/RIBs.git", from: "0.9.2"), - ], - targets: [ + .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), + ], + dependencies: [ + .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.0"), + .package(url: "https://github.com/uber/RIBs.git", from: "master"), + ], + targets: [ .target( name: "RIBsTreeViewerClient", - path: "./RIBsTreeViewerClient/Sources", - dependencies: ["RxSwift", "RIBs"] - ), + dependencies: ["RxSwift", "RIBs"], + path: "./RIBsTreeViewerClient/Sources" + ) ] ) From 9f1aa91b34fb4e177036bffaf72119f5b2719906 Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 16:07:40 +0900 Subject: [PATCH 4/9] update Package.swift --- Package.resolved | 25 +++++++++++++++++++++++++ Package.swift | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Package.resolved diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..5e6df81 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,25 @@ +{ + "object": { + "pins": [ + { + "package": "RIBs", + "repositoryURL": "https://github.com/uber/RIBs.git", + "state": { + "branch": "master", + "revision": "ffc489f00db785c8c0051678393f7aba0d52f1a4", + "version": null + } + }, + { + "package": "RxSwift", + "repositoryURL": "https://github.com/ReactiveX/RxSwift.git", + "state": { + "branch": null, + "revision": "002d325b0bdee94e7882e1114af5ff4fe1e96afa", + "version": "5.1.1" + } + } + ] + }, + "version": 1 +} diff --git a/Package.swift b/Package.swift index 502e4ce..dbf93aa 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.2 +// swift-tools-version:5.1 import PackageDescription let package = Package( @@ -9,7 +9,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.0"), - .package(url: "https://github.com/uber/RIBs.git", from: "master"), + .package(url: "https://github.com/uber/RIBs.git", .branch("master")), ], targets: [ .target( From dcfb2dcb493974b8448d9169aae1b0a49eb59bcb Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 16:18:06 +0900 Subject: [PATCH 5/9] [ci skip] fix Package.swift --- Package.swift | 2 +- RIBsTreeViewerClient/Sources/RIBsTreeViewer.swift | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index dbf93aa..567fad5 100644 --- a/Package.swift +++ b/Package.swift @@ -3,7 +3,7 @@ import PackageDescription let package = Package( name: "RIBsTreeViewerClient", - platforms: [.iOS(.v13)], + platforms: [.iOS(.v8)], products: [ .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), ], diff --git a/RIBsTreeViewerClient/Sources/RIBsTreeViewer.swift b/RIBsTreeViewerClient/Sources/RIBsTreeViewer.swift index 99462b0..957c0a4 100644 --- a/RIBsTreeViewerClient/Sources/RIBsTreeViewer.swift +++ b/RIBsTreeViewerClient/Sources/RIBsTreeViewer.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit import RxSwift import RIBs From 2813e5057b275e2aac5d25486ba2372a0afbff9b Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 16:30:54 +0900 Subject: [PATCH 6/9] update Package.swift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 567fad5..35449a1 100644 --- a/Package.swift +++ b/Package.swift @@ -8,7 +8,7 @@ let package = Package( .library(name: "RIBsTreeViewerClient", targets: ["RIBsTreeViewerClient"]), ], dependencies: [ - .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.0"), + .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.1"), .package(url: "https://github.com/uber/RIBs.git", .branch("master")), ], targets: [ From 0715a315116ffde4018bd37df0461fc8967729ab Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 16:41:51 +0900 Subject: [PATCH 7/9] add RxCocoa --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 35449a1..4b45b45 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,7 @@ let package = Package( targets: [ .target( name: "RIBsTreeViewerClient", - dependencies: ["RxSwift", "RIBs"], + dependencies: ["RxSwift", "RxCocoa", "RIBs"], path: "./RIBsTreeViewerClient/Sources" ) ] From afba54a9e0e2754105f3f4efd00ad26c2b76e5f8 Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 17:52:58 +0900 Subject: [PATCH 8/9] compatible SwiftPM --- .../TicTacToe/Promo/LaunchGameWorkflow.swift | 1 + .../RandomWin/RandomWinInteractor.swift | 1 + .../TicTacToe/Root/RootInteractor.swift | 1 + .../arm.swiftinterface | 1 + .../arm64-apple-ios.swiftinterface | 1 + .../arm64.swiftinterface | 1 + .../armv7-apple-ios.swiftinterface | 1 + .../armv7.swiftinterface | 1 + .../RIBsTreeViewerClient | Bin 679060 -> 679060 bytes .../i386-apple-ios-simulator.swiftinterface | 1 + .../i386.swiftinterface | 1 + .../x86_64-apple-ios-simulator.swiftinterface | 1 + .../x86_64.swiftinterface | 1 + .../RIBsTreeViewerClient | Bin 189056 -> 189056 bytes .../_CodeSignature/CodeResources | 48 +++++++++--------- 15 files changed, 36 insertions(+), 24 deletions(-) diff --git a/Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift b/Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift index 986e2f8..229fc0a 100644 --- a/Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift +++ b/Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift @@ -14,6 +14,7 @@ // limitations under the License. // +import Foundation import RIBs import RxSwift diff --git a/Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift b/Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift index 318d0d8..0b1e39c 100644 --- a/Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift +++ b/Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift @@ -14,6 +14,7 @@ // limitations under the License. // +import Foundation import RIBs import RxSwift diff --git a/Example/swiftpm/TicTacToe/Root/RootInteractor.swift b/Example/swiftpm/TicTacToe/Root/RootInteractor.swift index 23bab63..3800daa 100644 --- a/Example/swiftpm/TicTacToe/Root/RootInteractor.swift +++ b/Example/swiftpm/TicTacToe/Root/RootInteractor.swift @@ -14,6 +14,7 @@ // limitations under the License. // +import Foundation import RIBs import RxSwift diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm.swiftinterface index cd6029e..7740ca7 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64-apple-ios.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64-apple-ios.swiftinterface index 8812c51..05b510e 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64-apple-ios.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64-apple-ios.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64.swiftinterface index 8812c51..05b510e 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/arm64.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7-apple-ios.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7-apple-ios.swiftinterface index cd6029e..7740ca7 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7-apple-ios.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7-apple-ios.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7.swiftinterface index cd6029e..7740ca7 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/armv7.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/RIBsTreeViewerClient b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/RIBsTreeViewerClient index 29ff3c69f2d15d09d6db6fa90fd5e4ce8cb01091..eb6196bc8db48ad838a77adc603a7e3c9129144a 100755 GIT binary patch delta 9033 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

OFnbwfjVnxi%K`Y65SLdKK;Emtp zAOg1VwOzDjeXwUPnnu>$oQq}wV|*-^cw7U6JamK5nT$y~GwFA7MI9qI&k3R}LTC7s z+|c0VQ0_MHE!k*blFoSlH=TJ#(;4lRG@bcE(;1a~bPk-w?fJ+Xwh(^5n|N_4p1T`0 z5I23>jkXZiM(;sZU^_0`Lu@sUTlXL}dGTd>Ba>}B5NQZ*{!_SM@;>-w57Gro1?mN8 zCyi$^Ch^RFN|fLk;XXv;85yH$oU|X6vN{`Cozxj@T!@swYV1*nbVwT(RfwhnJ)ByI zM#&Dg9U%VE!lw?P>EzSR11OHPVeSW!EAh+jgUCd_+tJsIG7j~Q&=h5DnJNJ4r1P%C zy$4Y?sKl#_&0^`(=BY#lZ~g!IV$B=8W@2J3L*A(T!? zjo4x2O~A{F!^HXGIOi~#1UaP#0AF$k@jb+yhlx@81n3C*I*D0&{=qEWbNW?^UUf zHCmv@pmvJo5hiHl{r9hv6gZJEmN)q~SogCX07bsPC~_;?VOWBQ^j`p`C%=RBfcz0( zJB_v|^ck1X2UK|{lNRh9&f@COeQAoo_Y8UhfGjpGL)M^Q5Lt$LA#t1Q?`S5>j26WF zPJF76YZycWm>xQ({TqNeS&nD`(?SE7;}s|ZCgc`mOahpH)a^>tT_Qa^31I#+)(LuhqA7cyYNJX5kH~FskVplGpz=)*+1k=uc)a_ z=!TW;mi{5b6x#E&gLn*`K8ms+d*rVW%i9hXN9g2bUnd{G%O0J3opMf|Dn**;E%^6K z$cV--eU}hTV-zaUB#jBGL^O@rRf!zP&|QffK`@?Dh1QXq0>26w6Z}IqHAR~!y0?$Pk=00%1Bphg`$Nu8>^sj2*8K-Iw6@E2y1ZeD>C$a1t!vYS1*L6c=C9X^d<|86LTV z$F*%F7xJMLP)zeTn_6^kTCp1L1s)=M00%k~L8#W^v%nVF| znaMOvi?M`=vDmqm1~Y%x_2En-?>p_2k}b8^oIsN|cz-L>*B}Ju zDGeEKw4O#Y1X0yEBu%23 z?ZY&h8KcomFguT+nZ!vn6IMb*HzFs}{)`43mV`&~CEFf|F^cz?O6qfuhmq{njaOYq z^^%pho=H&8_^kvURpFWKXb;SMfE(LMUKPiK?dS^;>A(%NmYuI0mS;qDb7Z=UN9ZH^ zcc3yF#fWv1GE{+mI!WNy;60s0n02_i6M2EF7PCABmdPMkrlcF4qOpwoEz|`> zju{S|z$&-VG<3$$@dML)HJ*Q)lq*s%Z=)!JVwxvWOfmhx!+%FH%@1SFZ#WYW{nE#si*_%wP6Fk3zY$jQZ_Fd!%ht&jY?jlbb#$<2= z)gRF$j3N3T9YF-fIM>oJ=5MK=J>F!$m^GApF=G}ZMKp|gG)nrRMlAUmog{X<_?g%?9FKfPr@&fVG={=qrX?2nf_#a9mwh4O zp^0O@pep%1#=6y1a4%m}1kypk5xGZT9d;NejjDs-;yAiYQj8sQNV-6gnxg7gI40@EKT&Wuo)3_@WlOhsu5^U74TkKmUZW}-BO zd2S}U12_x9%tdnmJF}pV5YKVgsM!1{+u_!}*`gOfzu@9*(FSp*Yech01l~A-6s8j9 oGT!);x!C@Txg2v4^(F2cbr78g3ev3|MFrN5V$F4z#0vuc5B)2_rvLx| diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftinterface index ef60926..f8b6593 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftinterface index ef60926..f8b6593 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftinterface index ea8410c..0fcf01f 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftinterface b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftinterface index ea8410c..0fcf01f 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftinterface +++ b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftinterface @@ -6,6 +6,7 @@ import RIBs @_exported import RIBsTreeViewerClient import RxSwift import Swift +import UIKit public protocol RIBsTreeViewer { init(router: RIBs.Routing, options: [RIBsTreeViewerClient.RIBsTreeViewerOption]?) func start() diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/RIBsTreeViewerClient b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/RIBsTreeViewerClient index 60d8cc1e03e2d825a53d050718443a2aacaaec56..cc1533e1327cbf992855818eb46ba61bdbbef5f4 100755 GIT binary patch delta 461 zcmZoT%H433dxL?jfLf=*Cxe@YD<^H~?!J!Yxm;^noH%2S=}!IB=^Y@M)BVe*N9)RK zr2FUd>6;m>UYIdMe)|zw#vVq6*!6bl_cdOwz9OvMbxl}m@w55QRvc&WPHsuEuv&Rq zN^yFDJfnj`-%FpY&DWbQDSDPoHef8;ti1+g%tlfRLUzyIdfLKqKcL>fsof*OC@LSMw;_N_&u=qmF>GUr%nH&^cS3c`IXji`WaS{K=mzx95vbwTGANt+Cu%`6AX@~X8E!#t8G3j^! E08M1cSO5S3 delta 461 zcmZoT%H433dxL?jKx1B4P4Hzymfl4N3XTXCe%tIIJ3)={?&gcm={H4WGZwk8p7?Ce zrmb_QXl`)-_xsPl3elfCw2oZYo!$YG>Ev6x>Su)X zZzG91wFNy#6Xq5PC~iL@%hAJSno|x~bpuzq(Od4nFRhX}*@@t?r)bGo~|Xh}5sR zqnY+DUNL|zve^EX?|HTwk&WB0OlMj^tS8%8UWv;u@mLl=qgEz8Z%)KnX|cHhiTBMdDFPq)g4eJr94-=CEkD)C{Ma|W?IE+6 GbUXl}YtwT8 diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/_CodeSignature/CodeResources b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/_CodeSignature/CodeResources index 5d6e1ce..76cd46b 100644 --- a/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/_CodeSignature/CodeResources +++ b/Products/RIBsTreeViewerClient.xcframework/ios-x86_64_i386-simulator/RIBsTreeViewerClient.framework/_CodeSignature/CodeResources @@ -22,11 +22,11 @@ Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftinterface - NJb7OPpTWvUVQD7PqpOrOzb+nsw= + rbKUEeVokFpHbMaPBJLQnrsqiKE= Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftmodule - 2BqPl1UNpmF/Ncs0bzjmE12HvSc= + W3M6JJ5yjwQAyqHesbnLdfhIPKk= Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftdoc @@ -34,11 +34,11 @@ Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftinterface - NJb7OPpTWvUVQD7PqpOrOzb+nsw= + rbKUEeVokFpHbMaPBJLQnrsqiKE= Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftmodule - 2BqPl1UNpmF/Ncs0bzjmE12HvSc= + W3M6JJ5yjwQAyqHesbnLdfhIPKk= Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftdoc @@ -46,11 +46,11 @@ Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftinterface - zeX1E4Grwsx5SFl05rxFh4YNRSs= + AI8DGGBTZVsYJNtLsIc5MLzh230= Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftmodule - eSqkNLORYWTN0OZQ6AmtlEPkxgQ= + RrM5kvZdeSDpQfoMsvTwFAbN16Y= Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftdoc @@ -58,11 +58,11 @@ Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftinterface - zeX1E4Grwsx5SFl05rxFh4YNRSs= + AI8DGGBTZVsYJNtLsIc5MLzh230= Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftmodule - eSqkNLORYWTN0OZQ6AmtlEPkxgQ= + RrM5kvZdeSDpQfoMsvTwFAbN16Y= Modules/module.modulemap @@ -108,22 +108,22 @@ hash - NJb7OPpTWvUVQD7PqpOrOzb+nsw= + rbKUEeVokFpHbMaPBJLQnrsqiKE= hash2 - Ysz2dm2EKzz3bybZdY7FuBFpoaQ/KScEEIk18n1RrtE= + mTG4q/hbdmHzcj0TvfCmSNh6n95TiiK06z8n2nmXA44= Modules/RIBsTreeViewerClient.swiftmodule/i386-apple-ios-simulator.swiftmodule hash - 2BqPl1UNpmF/Ncs0bzjmE12HvSc= + W3M6JJ5yjwQAyqHesbnLdfhIPKk= hash2 - 16p7lVIbcOuXpWCJP4OuBH9zVShFF9drQuuxYBK7R2w= + XI8raODVJiAkT3hOGCEQ9LDCdMcFNEL0IXrhQIJtrKg= Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftdoc @@ -141,22 +141,22 @@ hash - NJb7OPpTWvUVQD7PqpOrOzb+nsw= + rbKUEeVokFpHbMaPBJLQnrsqiKE= hash2 - Ysz2dm2EKzz3bybZdY7FuBFpoaQ/KScEEIk18n1RrtE= + mTG4q/hbdmHzcj0TvfCmSNh6n95TiiK06z8n2nmXA44= Modules/RIBsTreeViewerClient.swiftmodule/i386.swiftmodule hash - 2BqPl1UNpmF/Ncs0bzjmE12HvSc= + W3M6JJ5yjwQAyqHesbnLdfhIPKk= hash2 - 16p7lVIbcOuXpWCJP4OuBH9zVShFF9drQuuxYBK7R2w= + XI8raODVJiAkT3hOGCEQ9LDCdMcFNEL0IXrhQIJtrKg= Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftdoc @@ -174,22 +174,22 @@ hash - zeX1E4Grwsx5SFl05rxFh4YNRSs= + AI8DGGBTZVsYJNtLsIc5MLzh230= hash2 - iINWobxFk6V71oZPm/tLA9lU7fx6UvM5/PM29XTqUMM= + SBAWg8BmoiTx6ZN8COUpVxcwG1PFgDpfpw8U7oTJ8eI= Modules/RIBsTreeViewerClient.swiftmodule/x86_64-apple-ios-simulator.swiftmodule hash - eSqkNLORYWTN0OZQ6AmtlEPkxgQ= + RrM5kvZdeSDpQfoMsvTwFAbN16Y= hash2 - DGTbck4e9OLPyHQRFun+vEev6IFzW+U6dktAwRT7WPA= + 50GQMKLuNgNU8qGQ5x3HfgX+EmNom5Ca75GZfHda1T4= Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftdoc @@ -207,22 +207,22 @@ hash - zeX1E4Grwsx5SFl05rxFh4YNRSs= + AI8DGGBTZVsYJNtLsIc5MLzh230= hash2 - iINWobxFk6V71oZPm/tLA9lU7fx6UvM5/PM29XTqUMM= + SBAWg8BmoiTx6ZN8COUpVxcwG1PFgDpfpw8U7oTJ8eI= Modules/RIBsTreeViewerClient.swiftmodule/x86_64.swiftmodule hash - eSqkNLORYWTN0OZQ6AmtlEPkxgQ= + RrM5kvZdeSDpQfoMsvTwFAbN16Y= hash2 - DGTbck4e9OLPyHQRFun+vEev6IFzW+U6dktAwRT7WPA= + 50GQMKLuNgNU8qGQ5x3HfgX+EmNom5Ca75GZfHda1T4= Modules/module.modulemap From 1ce147c9e59936092d54d6bba959fdeac563dc6d Mon Sep 17 00:00:00 2001 From: Yuki Tamazawa Date: Wed, 8 Jul 2020 17:55:08 +0900 Subject: [PATCH 9/9] add generate xcframework scripts --- Makefile | 11 +++++ .../Info.plist | 16 +++---- .../RIBsTreeViewerClient | Bin 679060 -> 679060 bytes scripts/generate_xcframeworks.sh | 41 ++++++++++++++++++ 4 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 Makefile create mode 100755 scripts/generate_xcframeworks.sh diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2be9b5c --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +.PHONY: help +.DEFAULT_GOAL := help + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +setup: ## setup + @carthage update --platform iOS --no-use-binaries + +generate_xcframeworks: ## Generate XCFrameworks. + @./scripts/generate_xcframeworks.sh diff --git a/Products/RIBsTreeViewerClient.xcframework/Info.plist b/Products/RIBsTreeViewerClient.xcframework/Info.plist index c77ebed..394bbb8 100644 --- a/Products/RIBsTreeViewerClient.xcframework/Info.plist +++ b/Products/RIBsTreeViewerClient.xcframework/Info.plist @@ -6,31 +6,31 @@ LibraryIdentifier - ios-armv7_arm64 + ios-x86_64_i386-simulator LibraryPath RIBsTreeViewerClient.framework SupportedArchitectures - armv7 - arm64 + x86_64 + i386 SupportedPlatform ios + SupportedPlatformVariant + simulator LibraryIdentifier - ios-x86_64_i386-simulator + ios-armv7_arm64 LibraryPath RIBsTreeViewerClient.framework SupportedArchitectures - x86_64 - i386 + armv7 + arm64 SupportedPlatform ios - SupportedPlatformVariant - simulator CFBundlePackageType diff --git a/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/RIBsTreeViewerClient b/Products/RIBsTreeViewerClient.xcframework/ios-armv7_arm64/RIBsTreeViewerClient.framework/RIBsTreeViewerClient index eb6196bc8db48ad838a77adc603a7e3c9129144a..bc0cace93f7f09aed9bf1df82ee140ba0a4371fb 100755 GIT binary patch delta 1592 zcmV-82FLl7xha&nDX^?b0Zp^5Nn-X9%>V!Z0000NQUCw|0eIT%RhJ+@0WyDvA#&#M z%xLC}n7z4gYHI~tu&$j>TpLd;XlYlnb~c@Sy}m@rEiz}Y?fU-eo0 z#Uidz<1}y&bSX(u!*i*erQm-~%?d}{u}VJnwCmg9s3WoQsGWVj8jrE4iL5%_+zbsG ze{YkC^X0>ZxaI)g7~BDWS2Jj(U2RG*>K+fuS|LeYo9>RkpN;$9_<6eIT#=v6**$r< zYt-AYg4Il}&r+artva;p%A7+9W(G5;QLS>l(=EO1mTgHi&Xz@~4;FvNp!ZCuT zb@lIq*cbLt+8>|jiodD-_6PXWxsT?3GG{H}L(~0LKcRy)bG9ANOoz~*p**xYZmD?! zo;mv-gDr12+kSj^4BAk?nZ$lpA9mU`XC)x9Zi=oJxtlqAdkr9*&Y1)%mmG4!n^l}S zdo~Svh^{AN8(Ae{zO{NO&BMwl2U8v-Sp&I;J&bUSaB_{4*J1EFP}%RdAVLA70UPT3 zPnY=5M|h6JgYy#iPfA?;A0!^w{-MPG1GnEp0SEyYmA+0Uf01&_CsJiopiBW>)xvvI zr(xRchyO$YhyO$ZhyO$axBo;00lSC({{*-G{{=0;fA-CVtWMJ+n4$$bXwtq0++=e? zNd`$Lb_etCLsC+_$!@dsX$r#-d3WA(E?K-;*W9_ILbA4*O#;`SIJChnVaRk4PmeB~5!g-DB??sLm5XH zGOEa3e^kysUybKja;U0S)Hgjq|TqNX_?YAs3%_U(4!kn(=go!yGOfAGT?1etd)Q|6anM(Az>O#D-@w9PGFW3 znm~yBDw$G}h0~B!c?k0~(m{_SfAuNsAl$t`hND1z;~#oi*#4SM7v8qj=9Me;#MrN8 zxv|)1c=DU!zno?_{_8m&O_T7&DDJ00I7aa<$s-sJ35u#JG09M>S(ipA zi%~>!lqbHXUIs~?WO0aa^mK;*e1_*RJU-9x=p@7C|A67K8;vpiKLEGY!v+`u7-8l{CU5dr**)R;D=QPrqU@;EKW_#GZP))t-H{Ub&4S3ebIBFyUB_?5 zC>C*z8mEDKpi4=L8lFq#ECqjeYF0Snj#cupr(NF;M;(ccNA2wM)p(3WO=Q*a=4NQn z_v+v`97b*|PzLgRd51t)yHBT47$hmUNxL1zC19-YF@>ud@49VeML zQdj?d5c|R&O8eszUGX=y-~Ir9I``4MPv)#8d}zAA>L+xtX3ncdXE=BxxH)=kmXB6l-qZ?6G_(>aqs<&r~Ac(aN# zXV0cV57G5xY$K~g%(qrArFmEx!G zNIJ1Qn13IVlHyHvo25@v7>3BZ^PY3b{LQ+qoI55YZ=2b~cfEhJjb#^s%%Al(*rbqZd(cb^5H^W3&y^2cF)ASinB(!<|X=NQJ7( zqC0***Xw@c{$wSD4t};~|D(g+|E3SVwXF~wG(FpCTa(GC=+}iYP)T_em45XLs zs-ei(xe8O`h>wllbE#_~i!&zgTERxt|6INQ_}AO(KmUbS8>v_gKXELO*z8aee*N%~ z?*e4^Pl#hm*g4KN;J)HyGh2^aE9vlBvQ>WVf2=>btw z5+@dR*b-%0rZf%e3G5wubp2@(B>Q0ZXm?2lyiJO=5=e)lV4OZQNWy7}LmWmiN;Ar0 zgs@k}Q%2KZ8qhKeP?m%`=y89fK7}2GyBElC6sT|fLoajNU(@LvZd+|$xgyD-{aThA zi+zU2zZw4P8SeYZGS(12Vm;`j1rkU@T9!8WzK0#qg za1y66emcj0KErc39-rrU^qb?qp5x&(4qlAnUg8I16z`Heg5ikbuq-j-6epT>Nr=-3 zhcv@k>}l$yh-Psb1(<|SXZX)&cn-s(^9&D9GF<)-7#_Ld7{mVqx7EW27y%d%Ltn^Q o7z$@@Qd*TOxg;u4Q5wK7!24x~1;qx31;q!41;q%r1;q)Emua~hbpQYW diff --git a/scripts/generate_xcframeworks.sh b/scripts/generate_xcframeworks.sh new file mode 100755 index 0000000..8b58a20 --- /dev/null +++ b/scripts/generate_xcframeworks.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +# Delete existing file + +rm -r ./Products/RIBsTreeViewerClient.xcframework + +# Generate RIBsTreeViewerClient + +xcodebuild \ +'ENABLE_BITCODE=YES' \ +'BITCODE_GENERATION_MODE=bitcode' \ +'OTHER_CFLAGS=-fembed-bitcode' \ +'BUILD_LIBRARY_FOR_DISTRIBUTION=YES' \ +'SKIP_INSTALL=NO' \ +archive \ +-project RIBsTreeViewerClient.xcodeproj \ +-scheme 'RIBsTreeViewerClient' \ +-destination 'generic/platform=iOS Simulator' \ +-configuration 'Release' \ +-archivePath 'build/RIBsTreeViewerClient-iOS-Simulator.xcarchive' + + +xcodebuild \ +'ENABLE_BITCODE=YES' \ +'BITCODE_GENERATION_MODE=bitcode' \ +'OTHER_CFLAGS=-fembed-bitcode' \ +'BUILD_LIBRARY_FOR_DISTRIBUTION=YES' \ +'SKIP_INSTALL=NO' \ +archive \ +-project RIBsTreeViewerClient.xcodeproj \ +-scheme 'RIBsTreeViewerClient' \ +-destination 'generic/platform=iOS' \ +-configuration 'Release' \ +-archivePath 'build/RIBsTreeViewerClient-iOS.xcarchive' + + +xcodebuild \ +-create-xcframework \ +-framework 'build/RIBsTreeViewerClient-iOS-Simulator.xcarchive/Products/Library/Frameworks/RIBsTreeViewerClient.framework' \ +-framework 'build/RIBsTreeViewerClient-iOS.xcarchive/Products/Library/Frameworks/RIBsTreeViewerClient.framework' \ +-output 'Products/RIBsTreeViewerClient.xcframework' \ No newline at end of file