{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":460597936,"defaultBranch":"master","name":"EssentialFeed","ownerLogin":"nicolocurioni96","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-02-17T20:31:00.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/102799475?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1710508514.0","currentOid":""},"activityList":{"items":[{"before":"70d1a7fe175e8510d49f9ee4007e9fa4a937c243","after":"9a2a97b675fc70ab2fe142f970cbcc0d37b26b67","ref":"refs/heads/master","pushedAt":"2024-05-26T19:12:44.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Develop (#12)\n\n* Added the `Array` extensions for `FeedImage` and `LocalFeedImage` in the `LocalFeedLoader` production in order to succeds on empty cache for `LocalFeedLoader.validateCache`\r\n\r\n* `LocalFeedLoader.validateCache` succeeds on non-expired cache\r\n\r\n* `LocalFeedLoader.validateCache` fails on deletion error of a expired cache\r\n\r\n* Load `NSManagedObjectModel` instance lazily and cache it to prevent multiple `NSEntityDescriptions` claiming the same `NSManagedObject` model subclasses\r\n\r\n* Added `EssentialApp` project to the `EssentialFeed` project workspace\r\n\r\n* Fixed the missing `EssentialApp` project in the `EssentialFeed` project workspace and `FeedLoaderWithFallbackComposite.load` delivers primary feed on primary loader success\r\n\r\n* Extract system under test (SUT) creation into a factory method\r\n\r\n* `FeedLoaderWithFallbackComposite.load` delivers fallback feed on primary loader failure\r\n\r\n* Extract duplicate load logic from test into a helper method\r\n\r\n* `FeedLoaderWithFacllbackComposite.load` delivers error on both primary and fallback failure and removed unused `EssentialAppUITests` test target\r\n\r\n* Move `FeedLoaderWithFallbackComposite` to production\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.init` does not load image data\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` loads from primary loaded first\r\n\r\n* Extract system under test (SUT) creation into a factory method\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` loads from fallback loader on primary loader primary\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` cancels primary loader task on cancel\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` cancels fallback loader task on cancel after a primary loader failure\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` delivers primary data on loader success\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` delivers fallback data on fallback loader success\r\n\r\n* `FeedImageDataLoaderWithFallbackComposite.loadImageData` delivers error on both primary and fallback loader failure\r\n\r\n* Move `FeedImageDataLoaderWithFallbackComposite` to production\r\n\r\n* Extract memory leak tracking helper into a shared scope to remove duplication\r\n\r\n* Extract test helpers into a shared scope to remove duplication\r\n\r\n* `FeedLoaderCacheDecorator.load` delivers decoratee loader result (either success or failure))\r\n\r\n* Extract `FeedLoaderStub` into a shared scope to remove duplication\r\n\r\n* Extract `uniqueFeed` factory helper into a shared scope to remove duplication\r\n\r\n* Extract `FeedLoader` test helpers into a shared protocol extension to remove duplication\r\n\r\n* Extract system under test (SUT) creation into a factory method\r\n\r\n* `FeedLoaderCacheDecorator.load` caches loaded feed on loader success\r\n\r\n* `FeedLoaderCacheDecorator.load` does not cache feed on loader failure\r\n\r\n* Replace if-try-statement with map\r\n\r\n* Move `FeedCache` to production\r\n\r\n* Make the `LocalFeedLoader` implement the `FeedCache` protocol\r\n\r\n* Move `FeedLoaderCacheDecorator` to production\r\n\r\n* Create `saveIgnoringResult` method to clarify intent\r\n\r\n* `FeedImageDataLoaderCacheDecorator.loadImageData` delivers decoratee result (either success or failure)\r\n\r\n* Create `FeedImageDataLoaderSpy` into a shared scope to remove duplications\r\n\r\n* Extract `FeedImageDataLoader` test helpers into a shared protocol extension to remove duplication\r\n\r\n* `FeedImageDataLoaderCacheDecorator.loadImageData` caches loaded data on loader success\r\n\r\n* `FeedImageDataLoaderCacheDecorator.loadImageData` does not cache image data on loader failure\r\n\r\n* Move `FeedImageDataCache` to production\r\n\r\n* Make the `LocalFeedImageDataLoader` implement the `FeedImageDataCache` protocol (so it can be composed)\r\n\r\n* Move `FeedImageDataLoaderCacheDecorator` to production\r\n\r\n* Create `saveIgnoringResult` method to clarify intent\r\n\r\n* Add UI Test target for running high-level acceptance tests\r\n\r\n* Displays remote feed on launch when customer has connectivity\r\n\r\n* Fixed missing accessibility localization on the image and cells on `Feed` storyboard UI file in `EssentialFeediOS` module and make test pass on `EssentialAppUIAcceptanceTests`\r\n\r\n* Improve coverage by using identifiers for finding feed image cells\r\n\r\n* Removed old endpoint (for testing purposes) due to the following commit `https://ile-api.essentialdeveloper.com/essential-feed/v1/feed `, where I thought that the endpoint cause the test to now pass and displays cached feed on launch when customer has no connectivity\r\n\r\n* Displays empty feed when customer has no connectivity and no cache\r\n\r\n* Reset cache in every test run to make sure tests run in a clean state and dont influence the result of other tests\r\n\r\n* Add #if DEBUG compilation directive to prevent test-specific code from being deployed in production\r\n\r\n* Move DEBUG code paths from the main SceneDelegate to a new DebuggingSeneDelegate subclass to separate debug- and test-specific code from production code\r\n\r\n* Intercept HTTP requests with canned responses during UI tests to eliminate network flakiness (we can now run UI tests without internet connection)\r\n\r\n* Configures feed navigation as window root view controller\r\n\r\n* Move Feed UI composition details from the EssentialFeediOS to the EssentialApp module (Composition Root) and fixed some missing files with red flag (red color on folders and files)\r\n\r\n* Displays remote feed on launch when customer has connectivity [test fails] tried different ways to fix but currently didnt work\r\n\r\n* Displays cached feed on launch when customer has no connectivity [test fails] tried different ways to fix but currently didnt work\r\n\r\n* Displays empty feed on launch when customer has no connectivity and no cache\r\n\r\n* Remove `EssentialAppUIAccepttanceTests `in favor of faster and more precise integration tests\r\n\r\n* Removed missing or unused red flag folder\r\n\r\n* Remove unused debugging code that was previously used during UI tests\r\n\r\n* Validate feed cache on entering background and remove unused `EssentialAppUIAcceptanceTests` project scheme\r\n\r\n* Move `HTTPClientStub` to a shared scope in a separate file\r\n\r\n* Move `InMemoryFeedStore` to a shared scope in a separate file\r\n\r\n* Record empty feed snapshot\r\n\r\n* Record feed with content snapshot\r\n\r\n* Fix table header resizing for multi-line label\r\n\r\n* Record feed with error message snapshot\r\n\r\n* Record feed with failed image loading snapshot\r\n\r\n* Assert snapshots match the stored snapshots\r\n\r\n* Add `Dark Mode` support\r\n\r\n* Assert snapshots for light and dark mode using an iPhone 15 Pro configuration\r\n\r\n* Move `UIViewController` snapshot helpers to a separate file\r\n\r\n* Move `XCTestCase` snapshot helpers to a separate file\r\n\r\n* Fix potential bug when cancelling requests in UITableView didEndDisplayingCell method - This method is invoked after `reloadData`, so we'd be cancelling requests in the wrong models or crash in case the model has less items than the previous model\r\n\r\n* Add app icon\r\n\r\n* Embed launch screen into a navigation controller for a smoother initial app transition\r\n\r\n* The initial set up happens in code and added the test `test_configureWindow_setsWindowAsKeyAndVisible` in the SceneDelegateTests and improved the test sceneWillConnectToSession method\r\n\r\n* WIP - Organized the codebase into an independent framework, by creating the new `EssentialFeedAPI` framework, now the `EssentialFeedAPI` depends on `EssentialFeed` main module\r\n\r\n* WIP - Removed unnecessary `Main` storyboard file and improved test naming but I will fix the assertTrue method i the `SceneDelegateTests` to make the test pass in the right way, in the `test_configureWindow_setsWindowAsKeyAndVisible` method\r\n\r\n* Fixed indentation and some comments in the codebase\r\n\r\n* Changed the Bundle ID to `EssentialApp` project\r\n\r\n* Added the `CI-iOS` yml file for the GitHub actions\r\n\r\n* Added the `CI-macOS` yml file for the GitHub actions\r\n\r\n* Fixed the `CI-IOS` yml file `EssentialApp` app\r\n\r\n* Made some directyory improvements to the `CI-IOS` yml file\r\n\r\n* Made some directyory improvements to the `CI-IOS` yml file\r\n\r\n* Make private `UIWindowSpy` class with `makeKeyAndVisibleCallCount` variable by incrementing the count to one in the inherited `makeKeyAndVisible` method\r\n\r\n* Removed Github actions in order to add `Xcode Cloud` as CI CD cloud system\r\n\r\n* Replace FeedLoader composition with Combine operators\r\n\r\n* Replace `FeedImageDataLoader` composition with Combine operators and moved Combine helpers to a new file\r\n\r\n* Move `dispatchOnMainQueue` operator to the point of use (before subscription with `sink`)\r\n\r\n* Duplicate RemoteFeedLoader as RemoteImageCommentsLoader and making test pass, starting with empty requestedURLs in the `LoadImageCommentsFromRemoteUseCaseTests` test class\r\n\r\n* Making test pass with an URL\r\n\r\n* Make the pass by requesting data from url to loading twice\r\n\r\n* Make the test pass when there is no connection with error\r\n\r\n* Make the other test pass and changed the throwing class in the `ImageCommentsMapper` to ImageCommentsMapper in order to make test succeded with the right class for the case\r\n\r\n* Delivers proper results on 2xx response\r\n\r\n* Add `ImageComment` data model and implemented the ImageComment mapping and changed `ImageComment` initialization method public, in order to be public accessible\r\n\r\n* Move `HTTPClient` protocol and implementation, `ImageComments API` to standalone folders representing modules\r\n\r\n* Move `FeedImage` mapping to the FeedItemsMapper\r\n\r\n* Duplicate `RemoteFeedLoader` as RemoteLoader\r\n\r\n* Implement `generic` RemoteLoader\r\n\r\n* Replace RemoteImageCommentsLoader with generic RemoteLoader to remote duplication\r\n\r\n* Replace RemoteFeedLoader with generic RemoteLoader to remove duplication\r\n\r\n* Make RemoteLoader conform to FeedLoader in the Composition Root\r\n\r\n* Test `FeedItemsMapper` in isolation\r\n\r\n* Move test helpers to shared scope\r\n\r\n* Test `ImageCommentsMapper` in isolation\r\n\r\n* Removed unused test helper methods from `FeedItemsMapperTests` test class\r\n\r\n* Move `RemoteLoader` composition to the Composition Root and removed `LoadFeedFromRemoteUseCaseTests` unused file\r\n\r\n* Replace RemoteLoader composition with HTTPClient publisher composed with FeedItemsMapper\r\n\r\n* Remove unused RemoteLoader\r\n\r\n* Remove FeedLoader protocol as we don't need it anymore\r\n\r\n* Test `FeedImageDataMapper` in isolation\r\n\r\n* Replace `RemoteFeedImageDataLoader` with HTTPClient published composed with `FeedImageDataMapper`\r\n\r\n* Removed unused `HTTPClientSpy`\r\n\r\n* Duplicate FeedPresenter as LoadResourcePresenter\r\n\r\n* Remove title from generic presenter\r\n\r\n* Renamed loading method in the `LoadResourcePresenter`\r\n\r\n* Displays mapped resource on successful resource loading\r\n\r\n* Make LoadResourcePresenter generic over the Resource types\r\n\r\n* Replace `FEED_VIEW_CONNECTION_ERROR` localized key with `GENERIC_CONNECTION_ERROR`\r\n\r\n* Move `GENERIC_CONNECTION_ERROR` localization key to new Shared.strings\r\n\r\n* Remove duplication in the localization tests\r\n\r\n* Rename and move ResourceLoadingView and VIewModel to Shared module\r\n\r\n* Rename and move ResourceErrorView and ViewModel to Shared module\r\n\r\n* Add `FeedPresenter` map\r\n\r\n* Replace `FeedPresenter` with generic presenter\r\n\r\n* Remove unused `FeedPresenter` logic\r\n\r\n* Make Presentation Adapter generic so it can be reused\r\n\r\n* Add `FeedImagePresenter` map\r\n\r\n* Display error on mapper error\r\n\r\n* Replace FeedImagePresenter with `LoadResourcePresenter`\r\n\r\n* Remove unused `FeedImagePresenter` logic\r\n\r\n* Add type aliases to shorten type definitions with generics\r\n\r\n* Move UIImage creation to a tryMake extension\r\n\r\n* Add image comments title\r\n\r\n* Localize image comments title\r\n\r\n* Map ImageComments into `ImageCommentsViewModels`\r\n\r\n* Inject currentDate, locale, and calendar to make tests reliable in any locale\r\n\r\n* Inject calendar to make tests reliable\r\n\r\n* Group Feed UI tests in a new folder\r\n\r\n* Add `CellController` protocol in preparation to support any cell controller type\r\n\r\n* Renamed FeedViewController to `ListViewController` since it can now render any collection of cell controllers\r\n\r\n* Replace FeedViewControllerDelegate with a closure\r\n\r\n* Move Shared UI to new folder\r\n\r\n* Extract shared ListViewController snapshot tests\r\n\r\n* Add XCTFail to remind us to call `assert` after recording a snapshot and removed the record method in `FeedSnapshotTests` and `ListSnapshotTests`\r\n\r\n* Implement Image Comments UI\r\n\r\n* Add default implementation for optional methods in the CellController protocol\r\n\r\n* Replace custom CellController protocol with a composition of the UITableViewDataSource/Delegate/Prefetching so we can decouple other modules from the Shared UI module\r\n\r\n* Replace protocol composition in a single type with a struct composition to prevent forcing clients to implement methods they don't care about\r\n\r\n* Weakify self within `onRetry` closure to prevent cell from holding strong references to other components and removed comments\r\n\r\n* Configure `ErrorView` programmatically so we don't duplicate layout logic in storyboards\r\n\r\n* Run `ListSnapshotTests` without storyboard\r\n\r\n* Enable content size category config when taking a snapshot\r\n\r\n* Replace hardcoded fonts with dynamic fonts\r\n\r\n* Use diffable data source to only reload cells when needed\r\n\r\n* Set the data source default row animation to fade, added the `UIView.makeContainer` helper and extracted the tableView configuration into a helper method\r\n\r\n* Replace deprecated `UITraitCollection(traitsFrom:)` with `UITraitCollection(mutations:)`\r\n\r\n* Replace deprecated `traitCollectionDidChange` with `registerForTraitChanges`\r\n\r\n* Configure `ErrorView` with the new UIButton.Configuration APIs\r\n\r\n* Added the `performDynamicSnapshot` method, to handle in one simplest way, the record and assert snapshot operations\r\n\r\n* Made some improvements in the `UIViewController+Snapshot` to safeAreaInsets and traitCollection variables\r\n\r\n* Added `configureTraitCollectionObservers` method in ListViewController in flavor of `traitCollectionDidChange` method replacement\r\n\r\n* Update Feed API URL\r\n\r\n* Renamed file to `ListViewController+TestHelpers`\r\n\r\n* Reorded tests\r\n\r\n* Duplicate FeedUIComposer as `CommentsUIComposer`\r\n\r\n* Set comments title\r\n\r\n* Load actions request comments\r\n\r\n* Loading indicator is visible while loading comments\r\n\r\n* Render comments\r\n\r\n* Dispatches from background to main queue\r\n\r\n* Changed name to avoid errors and to be conformet to the specific case\r\n\r\n* Move localization helpers to shared scope\r\n\r\n* Remove feed references from comments integration tests\r\n\r\n* Proves request is canceled on comments view deinit\r\n\r\n* Notifies selection handler on image selection\r\n\r\n* Show comments on image selection\r\n\r\n* Extract endpoint URL creation to the API modules and moved a Date extensions to `FeedCacheTestHelpers`\r\n\r\n* Added the missing `Info` PLIST file in the EssentialAppTests module\r\n\r\n* Fixed the non-traced `ListViewController+TestHelpers` on github and extracted helper methods to remove duplication\r\n\r\n* Propagate willDisplayCell delegate method calls\r\n\r\n* Merge CellController initializers\r\n\r\n* Improve coverage with distinct image data per index\r\n\r\n* Add `Load more` cell controller with loading indicator\r\n\r\n* Add `Load more` message label\r\n\r\n* Make feed loader closure return Paginated\r\n\r\n* Add default presentation mapper when the Resource type matches the ResourceViewModel type\r\n\r\n* Remove unused code and loaded more items on will display LoadMoreCell\r\n\r\n* Prevent load more action while loading more\r\n\r\n* Does not load more after loading last page\r\n\r\n* Show loading more indicator while loading more\r\n\r\n* Render items from `Load more` action\r\n\r\n* Render load more error message\r\n\r\n* Load more on error tap\r\n\r\n* Set FeedEndpoint limit to 10 and added the feed endpoint with `after_id` param\r\n\r\n* Load more items until last page\r\n\r\n* Cache page results\r\n\r\n* Extract logic into helper methods\r\n\r\n* Remove cell selection style and automatically load more items on scroll after an error\r\n\r\n* Fetch current items from cache when needed instead of keeping them in memory all the time\r\n\r\n* Group `Load more` tests\r\n\r\n* Rename file, setting small window frame to prevent loading content ahead of time during tests and removing duplication\r\n\r\n* Add helper method to find image data for a giver URL\r\n\r\n* Use `NullStore` when we can't create a `CoreDataFeedStore` instance and adding the `assertionFailure` to catch CoreData issues in Debug builds\r\n\r\n* Log fault when we can't create a `CoreDataFeedStore` instance\r\n\r\n* Optimize CoreData implementation to reduce cache misses\r\n\r\n* Prevent loading resources again until a running request completes\r\n\r\n* Reuse existing cell controllers to avoid unnecessary reallocation of resources\r\n\r\n* Set explicit test images scale to 1 to ensure they all have the same scale (so their pngData can be compared pixel by pixel), in order to avoid test to not pass\r\n\r\n* Deprecate async APIs in favor of new sync APIs and removed duplicate Date extensions\r\n\r\n* Save images synchronously\r\n\r\n* Load images synchronously\r\n\r\n* Make `FeedImageDataCache` and `FeedImageDataLoader` sync\r\n\r\n* Rename method to clarify intent with `performAsync`\r\n\r\n* Make CoreData FeedImageDataStore implementation sync and remove unused async methods to avoid tast to not pass\r\n\r\n* Make NullStore FeedImageDataStore implementation sync\r\n\r\n* Make in memory FeedImageDataStore implementation sync\r\n\r\n* Add AnyScheduler\r\n\r\n* Subscribe upstream store subscriptions in a background queue to avoid blocking the main queue (tests still run synchronously in the main queue with the immediate scheduler)\r\n\r\n* Deprecate async APIs in favor of new sync APIs\r\n\r\n* Perform feed cache operations synchronously\r\n\r\n* Make FeedCache sync\r\n\r\n* Make LocalFeedLoader.load sync and fixed some other tests\r\n\r\n* Make LocalFeedLoader.validateCache sync\r\n\r\n* Make CoreData FeedStore implementation sync\r\n\r\n* Make NullStore FeedStore implementation sync\r\n\r\n* Make in memory FeedStore implementation sync\r\n\r\n* Remove unused async methods\r\n\r\n* Subscribe upstream store subscriptions in a background queue to avoid blocking the main queue\r\n\r\n* Increase coverage by checking errors even when `save` method doesn't throw an error\r\n\r\n* Ensures all store operations run in the same scheduler\r\n\r\n* Enable CoreData concurrency debug in EssentialApp scheme\r\n\r\n* Move context.perform call up\r\n\r\n* Run cache integration tests with a Core Data main queue context\r\n\r\n* Enable CoreData concurrency debug in `CI_macOS` scheme\r\n\r\n* Wrap store operations with Core Data store queue context scheduler\r\n\r\n* Enable CoreData concurrency debug in `CI_iOS` scheme\r\n\r\n* Extract reusable FeedImageDataStoreSpecs\r\n\r\n* Promote InMemoryFeedStore to production\r\n\r\n* Delete NullStore and replaced with `InMemoryFeedStore`","shortMessageHtmlLink":"Develop (#12)"}},{"before":"67c7789229375904ad70b600cc8961e414a148fb","after":"9e746c3d63eb7a01439475d459ddf3bf4983b0fe","ref":"refs/heads/develop","pushedAt":"2024-05-26T19:11:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Delete NullStore and replaced with `InMemoryFeedStore`","shortMessageHtmlLink":"Delete NullStore and replaced with InMemoryFeedStore"}},{"before":"67d4958d6e824d38d840cda4e1c8d4b721bb1529","after":"67c7789229375904ad70b600cc8961e414a148fb","ref":"refs/heads/develop","pushedAt":"2024-05-26T18:51:34.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Promote InMemoryFeedStore to production","shortMessageHtmlLink":"Promote InMemoryFeedStore to production"}},{"before":"d9dcfabd24edd0b7223999739976bf6807638e34","after":"67d4958d6e824d38d840cda4e1c8d4b721bb1529","ref":"refs/heads/develop","pushedAt":"2024-05-26T18:42:57.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Extract reusable FeedImageDataStoreSpecs","shortMessageHtmlLink":"Extract reusable FeedImageDataStoreSpecs"}},{"before":"0aad7c8b5291bd401284ad89e3d84258aa31b608","after":"d9dcfabd24edd0b7223999739976bf6807638e34","ref":"refs/heads/develop","pushedAt":"2024-05-26T18:38:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Enable CoreData concurrency debug in `CI_iOS` scheme","shortMessageHtmlLink":"Enable CoreData concurrency debug in CI_iOS scheme"}},{"before":"203dc5725807cdf0252b37269e77314072ddf1a9","after":"0aad7c8b5291bd401284ad89e3d84258aa31b608","ref":"refs/heads/develop","pushedAt":"2024-05-26T18:14:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Wrap store operations with Core Data store queue context scheduler","shortMessageHtmlLink":"Wrap store operations with Core Data store queue context scheduler"}},{"before":"4376a855676ab9e89dddaba92019729437d17a20","after":"203dc5725807cdf0252b37269e77314072ddf1a9","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:57:57.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Enable CoreData concurrency debug in `CI_macOS` scheme","shortMessageHtmlLink":"Enable CoreData concurrency debug in CI_macOS scheme"}},{"before":"bc116da21d3462a454cee5007c818fb790cb7c1e","after":"4376a855676ab9e89dddaba92019729437d17a20","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:56:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Run cache integration tests with a Core Data main queue context","shortMessageHtmlLink":"Run cache integration tests with a Core Data main queue context"}},{"before":"3726faa5974afe8c996328a92c131b8008506cd9","after":"bc116da21d3462a454cee5007c818fb790cb7c1e","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:50:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Move context.perform call up","shortMessageHtmlLink":"Move context.perform call up"}},{"before":"5a5c9fc7624c006fa4882391d046caa5879e93c2","after":"3726faa5974afe8c996328a92c131b8008506cd9","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:45:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Enable CoreData concurrency debug in EssentialApp scheme","shortMessageHtmlLink":"Enable CoreData concurrency debug in EssentialApp scheme"}},{"before":"463d14d5513d9f07c6a560d5fd0cd0072ab7ae31","after":"5a5c9fc7624c006fa4882391d046caa5879e93c2","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:09:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Ensures all store operations run in the same scheduler","shortMessageHtmlLink":"Ensures all store operations run in the same scheduler"}},{"before":"0a378a888c6ca947c20567da640a9ccb53dc8864","after":"463d14d5513d9f07c6a560d5fd0cd0072ab7ae31","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:07:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Increase coverage by checking errors even when `save` method doesn't throw an error","shortMessageHtmlLink":"Increase coverage by checking errors even when save method doesn't …"}},{"before":"6fc37c2c78c413b692af583fd5086d1ff1dba20d","after":"0a378a888c6ca947c20567da640a9ccb53dc8864","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:05:03.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Subscribe upstream store subscriptions in a background queue to avoid blocking the main queue","shortMessageHtmlLink":"Subscribe upstream store subscriptions in a background queue to avoid…"}},{"before":"c03546e5716b0f07d51dbe8d6abd7bc84b4c7280","after":"6fc37c2c78c413b692af583fd5086d1ff1dba20d","ref":"refs/heads/develop","pushedAt":"2024-05-26T17:02:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Remove unused async methods","shortMessageHtmlLink":"Remove unused async methods"}},{"before":"aa1a991bd03c17bdb607fe2588c850ddd728961d","after":"c03546e5716b0f07d51dbe8d6abd7bc84b4c7280","ref":"refs/heads/develop","pushedAt":"2024-05-26T16:59:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make in memory FeedStore implementation sync","shortMessageHtmlLink":"Make in memory FeedStore implementation sync"}},{"before":"7b2db861552135a171c0b99fe70bdeff2b245688","after":"aa1a991bd03c17bdb607fe2588c850ddd728961d","ref":"refs/heads/develop","pushedAt":"2024-05-26T16:57:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make NullStore FeedStore implementation sync","shortMessageHtmlLink":"Make NullStore FeedStore implementation sync"}},{"before":"7d56d47cc8cbf30aed40ec308c7d30131bab65e4","after":"7b2db861552135a171c0b99fe70bdeff2b245688","ref":"refs/heads/develop","pushedAt":"2024-05-26T16:52:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make CoreData FeedStore implementation sync","shortMessageHtmlLink":"Make CoreData FeedStore implementation sync"}},{"before":"cfc6df2aa935d52feb967b247cc621d54339f3b2","after":"7d56d47cc8cbf30aed40ec308c7d30131bab65e4","ref":"refs/heads/develop","pushedAt":"2024-05-26T16:46:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make LocalFeedLoader.validateCache sync","shortMessageHtmlLink":"Make LocalFeedLoader.validateCache sync"}},{"before":"c239ef7e7e328523bc28c314621897acb71e4233","after":"cfc6df2aa935d52feb967b247cc621d54339f3b2","ref":"refs/heads/develop","pushedAt":"2024-05-26T16:18:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make LocalFeedLoader.load sync and fixed some other tests","shortMessageHtmlLink":"Make LocalFeedLoader.load sync and fixed some other tests"}},{"before":"4cbde505dc94e71d5a1b0c122ccc561ad7df0ea7","after":"c239ef7e7e328523bc28c314621897acb71e4233","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:44:06.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make FeedCache sync","shortMessageHtmlLink":"Make FeedCache sync"}},{"before":"6bf912e61493dd0d536c17ac82d7249324a914ac","after":"4cbde505dc94e71d5a1b0c122ccc561ad7df0ea7","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:38:03.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Perform feed cache operations synchronously","shortMessageHtmlLink":"Perform feed cache operations synchronously"}},{"before":"58c704d445bbcd7efab6060b3af94c48507de9e5","after":"6bf912e61493dd0d536c17ac82d7249324a914ac","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:28:52.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Deprecate async APIs in favor of new sync APIs","shortMessageHtmlLink":"Deprecate async APIs in favor of new sync APIs"}},{"before":"0713f8aaf027909bd17719391ae6bfc062b60f71","after":"58c704d445bbcd7efab6060b3af94c48507de9e5","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:26:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Subscribe upstream store subscriptions in a background queue to avoid blocking the main queue (tests still run synchronously in the main queue with the immediate scheduler)","shortMessageHtmlLink":"Subscribe upstream store subscriptions in a background queue to avoid…"}},{"before":"a5cf6fc33266df95904c31779f05430e050bb8e9","after":"0713f8aaf027909bd17719391ae6bfc062b60f71","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:21:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Add AnyScheduler","shortMessageHtmlLink":"Add AnyScheduler"}},{"before":"1fcf2af4482c46ddf64d70df1e4824d42512c864","after":"a5cf6fc33266df95904c31779f05430e050bb8e9","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:17:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make in memory FeedImageDataStore implementation sync","shortMessageHtmlLink":"Make in memory FeedImageDataStore implementation sync"}},{"before":"2f76ef6e8e18c47af08532522861e672c07c7d96","after":"1fcf2af4482c46ddf64d70df1e4824d42512c864","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:16:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make NullStore FeedImageDataStore implementation sync","shortMessageHtmlLink":"Make NullStore FeedImageDataStore implementation sync"}},{"before":"c923cf332d16a85dcb2f3f5939f4de91aa8e4d29","after":"2f76ef6e8e18c47af08532522861e672c07c7d96","ref":"refs/heads/develop","pushedAt":"2024-05-26T09:13:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make CoreData FeedImageDataStore implementation sync and remove unused async methods to avoid tast to not pass","shortMessageHtmlLink":"Make CoreData FeedImageDataStore implementation sync and remove unuse…"}},{"before":"c8160d36177d3416c25d49f5d530e3073580a95e","after":"c923cf332d16a85dcb2f3f5939f4de91aa8e4d29","ref":"refs/heads/develop","pushedAt":"2024-05-26T08:53:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Rename method to clarify intent with `performAsync`","shortMessageHtmlLink":"Rename method to clarify intent with performAsync"}},{"before":"2f302f34fd9114a742a724eed82a80893b6a422e","after":"c8160d36177d3416c25d49f5d530e3073580a95e","ref":"refs/heads/develop","pushedAt":"2024-05-26T08:52:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Make `FeedImageDataCache` and `FeedImageDataLoader` sync","shortMessageHtmlLink":"Make FeedImageDataCache and FeedImageDataLoader sync"}},{"before":"0126d492acdb75f2f8e67dfdddfeb3f565a1c0f4","after":"2f302f34fd9114a742a724eed82a80893b6a422e","ref":"refs/heads/develop","pushedAt":"2024-05-26T08:27:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nicolocurioni96","name":"Nicolò Curioni","path":"/nicolocurioni96","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/102799475?s=80&v=4"},"commit":{"message":"Load images synchronously","shortMessageHtmlLink":"Load images synchronously"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEVEm9xQA","startCursor":null,"endCursor":null}},"title":"Activity · nicolocurioni96/EssentialFeed"}