2b01ec14bf
This PR contains the work done to update the live tests to the latest data plus lots of QoL improvements to the library, including: * added test cases to test the ``AmiiboService` locally; * conformed the models to the `Hashable` protocol; * documented the use of caching with the `AmiiboService` service; * updated the reference to the new AmiiboAPI url; * updated the year on the copyrights and header files; * updated the overall documentation of the source code and the package. Reviewed-on: #22 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
1 line
19 KiB
JSON
1 line
19 KiB
JSON
{"kind":"symbol","schemaVersion":{"major":0,"patch":0,"minor":3},"abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"text":"Amiibo API","type":"text"}]},{"type":"text","text":" backend service."}],"primaryContentSections":[{"content":[{"type":"heading","text":"Overview","level":2,"anchor":"Overview"},{"inlineContent":[{"text":"The ","type":"text"},{"type":"codeVoice","code":"amiibo-service"},{"type":"text","text":" library is a package that allows the developer to interact with the "},{"isActive":true,"identifier":"https:\/\/www.amiiboapi.org","type":"reference"},{"text":" backend service seamlessly, by not only providing the ","type":"text"},{"type":"emphasis","inlineContent":[{"text":"service","type":"text"}]},{"type":"text","text":" type but also any possible "},{"type":"emphasis","inlineContent":[{"type":"text","text":"models"}]},{"type":"text","text":", "},{"type":"emphasis","inlineContent":[{"type":"text","text":"filters"}]},{"type":"text","text":", "},{"type":"emphasis","inlineContent":[{"type":"text","text":"errors"}]},{"type":"text","text":" and "},{"type":"emphasis","inlineContent":[{"type":"text","text":"interfaces"}]},{"type":"text","text":" types that might be needed during implementation."}],"type":"paragraph"},{"anchor":"Design","level":2,"type":"heading","text":"Design"},{"inlineContent":[{"type":"text","text":"Although it could have been possible to generate a one-to-one RESTful client based on the Open API specification document that describe the available endpoints of the backend service, it was decided to design a "},{"type":"codeVoice","code":"AmiiboService"},{"type":"text","text":" service type that removes the complexities of the API design imposed by the backend service, and provides the developer with a simple interface, and a seamless experience."}],"type":"paragraph"},{"anchor":"Installation","level":2,"type":"heading","text":"Installation"},{"inlineContent":[{"type":"text","text":"To use the "},{"type":"codeVoice","code":"AmiiboService"},{"type":"text","text":" library with your package, then add it as a dependency in the "},{"type":"codeVoice","code":"Package.swift"},{"type":"text","text":" file:"}],"type":"paragraph"},{"code":["let package = Package("," \/\/ name, platforms, products, etc."," dependencies: ["," .package(url: \"https:\/\/github.com\/rock-n-code\/amiibo-service\", from: \"1.4.0\"),"," \/\/ other dependencies"," ],"," targets: ["," .target("," name: \"SomeTarget\", "," dependencies: ["," .product(name: \"AmiiboService\", package: \"amiibo-service\"),"," ]"," )"," \/\/ other targets"," ]",")"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"type":"text","text":"It is also possible to use the "},{"type":"codeVoice","code":"AmiiboService"},{"type":"text","text":" library with your app in Xcode, then add it as a dependency in your Xcode project."}],"type":"paragraph"},{"style":"important","name":"Important","type":"aside","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Swift 5.10 or higher is required in order to compile this library."}]}]},{"anchor":"Caching","level":2,"type":"heading","text":"Caching"},{"inlineContent":[{"type":"text","text":"The "},{"identifier":"https:\/\/www.amiiboapi.org","overridingTitleInlineContent":[{"type":"text","text":"Amiibo API"}],"type":"reference","isActive":true,"overridingTitle":"Amiibo API"},{"type":"text","text":" recommends that consumers who call the API regularly implement caching on their systems. This library does not include a built-in cache, leaving the choice of caching strategy to the consumer. The following examples show two common approaches."}],"type":"paragraph"},{"anchor":"URLCache-on-the-transport-layer","level":3,"type":"heading","text":"URLCache on the transport layer"},{"inlineContent":[{"type":"text","text":"Pass a custom "},{"type":"codeVoice","code":"URLSessionTransport"},{"type":"text","text":" with a cache-configured "},{"type":"codeVoice","code":"URLSession"},{"type":"text","text":" to "},{"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient","isActive":true},{"type":"text","text":":"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["import OpenAPIURLSession","","let configuration = URLSessionConfiguration.default","","configuration.urlCache = URLCache("," memoryCapacity: 5_000_000,"," diskCapacity: 50_000_000",")","","let transport = URLSessionTransport("," configuration: .init("," session: URLSession(configuration: configuration)"," )",")","","let service = AmiiboService("," client: AmiiboLiveClient(transport: transport)",")"]},{"type":"paragraph","inlineContent":[{"text":"This leverages HTTP cache headers from the server and persists cached responses to disk.","type":"text"}]},{"type":"heading","anchor":"Application-level-caching","level":3,"text":"Application-level caching"},{"type":"paragraph","inlineContent":[{"text":"Alternatively, cache the results returned by ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService"},{"text":" directly in your application using any storage mechanism that fits your needs, such as an in-memory dictionary, a database, or a file-based store.","type":"text"}]},{"type":"heading","anchor":"Testing","level":2,"text":"Testing"},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"},{"text":" protocol enables creating custom mock clients for testing, eliminating the need for network calls in unit tests. Conform to ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"},{"text":" and return stubbed data or throw ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"},{"text":" errors to verify your application’s behavior:","type":"text"}]},{"type":"codeListing","syntax":"swift","code":["import AmiiboService","","struct MyMockClient: AmiiboClient {"," var error: AmiiboServiceError?",""," func getAmiibos("," by filter: AmiiboFilter"," ) async throws(AmiiboServiceError) -> [Amiibo] {"," if let error { throw error }"," return []"," }",""," \/\/ Implement remaining protocol requirements...","}","","let service = AmiiboService(client: MyMockClient())"]},{"inlineContent":[{"type":"text","text":"Inject the mock client into "},{"type":"reference","isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService"},{"type":"text","text":" via its "},{"type":"reference","isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService\/init(client:)"},{"type":"text","text":" initializer to test how your code handles empty results, specific errors, or any other scenario without relying on the live backend."}],"type":"paragraph"},{"level":2,"text":"Tasks","type":"heading","anchor":"Tasks"},{"inlineContent":[{"type":"text","text":"This library offers a set of ready-to-use tasks that simplify the interaction with the library, which the developer can use from any "},{"type":"codeVoice","code":"Terminal"},{"type":"text","text":" application."}],"type":"paragraph"},{"style":"tip","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"To show the available list of tasks, plus display some explanations about each and every one of them; please enter the following command:"}]}],"name":"Tip","type":"aside"},{"type":"codeListing","syntax":"bash","code":["$ make"]}],"kind":"content"}],"hierarchy":{"paths":[[]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice"]}],"topicSections":[{"title":"Service","anchor":"Service","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService"]},{"title":"Clients","anchor":"Clients","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient"]},{"title":"Models","anchor":"Models","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"]},{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacterFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter"],"anchor":"Filters","title":"Filters"},{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"],"title":"Errors","anchor":"Errors"}],"metadata":{"externalID":"AmiiboService","modules":[{"name":"AmiiboService"}],"title":"AmiiboService","role":"collection","roleHeading":"Framework","symbolKind":"module"},"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboSeriesFilter":{"kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboseriesfilter","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboSeriesFilter"}],"navigatorTitle":[{"kind":"identifier","text":"AmiiboSeriesFilter"}],"role":"symbol","type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo series."}],"title":"AmiiboSeriesFilter"},"https://www.amiiboapi.org":{"identifier":"https:\/\/www.amiiboapi.org","titleInlineContent":[{"text":"Amiibo API","type":"text"}],"type":"link","url":"https:\/\/www.amiiboapi.org","title":"Amiibo API"},"doc://AmiiboService/documentation/AmiiboService/AmiiboSeries":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboSeries"}],"title":"AmiiboSeries","navigatorTitle":[{"kind":"identifier","text":"AmiiboSeries"}],"abstract":[{"type":"text","text":"A model that represents an amiibo series."}],"role":"symbol","kind":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiiboseries","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries"},"doc://AmiiboService/documentation/AmiiboService":{"kind":"symbol","url":"\/documentation\/amiiboservice","role":"collection","type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"inlineContent":[{"text":"Amiibo API","type":"text"}],"type":"strong"},{"text":" backend service.","type":"text"}],"title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/AmiiboService":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboService"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","url":"\/documentation\/amiiboservice\/amiiboservice","type":"topic","title":"AmiiboService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboService","kind":"identifier"}],"abstract":[{"text":"A type that implements the service that uses a client to make calls.","type":"text"}]},"doc://AmiiboService/documentation/AmiiboService/AmiiboServiceError":{"abstract":[{"text":"A representation of all the possible errors that the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","type":"reference"},{"type":"text","text":" service could throw."}],"kind":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboServiceError","kind":"identifier"}],"title":"AmiiboServiceError","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AmiiboServiceError"}],"url":"\/documentation\/amiiboservice\/amiiboserviceerror","role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboType":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboType"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","url":"\/documentation\/amiiboservice\/amiibotype","type":"topic","title":"AmiiboType","role":"symbol","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboType"}],"abstract":[{"type":"text","text":"A model that represents an amiibo type."}]},"doc://AmiiboService/documentation/AmiiboService/GameCharacter":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"GameCharacter"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","kind":"symbol","type":"topic","navigatorTitle":[{"text":"GameCharacter","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/gamecharacter","title":"GameCharacter","role":"symbol","abstract":[{"text":"A model that represents a game character.","type":"text"}]},"doc://AmiiboService/documentation/AmiiboService/AmiiboLiveClient":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboLiveClient"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient","url":"\/documentation\/amiiboservice\/amiiboliveclient","type":"topic","title":"AmiiboLiveClient","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboLiveClient","kind":"identifier"}],"abstract":[{"type":"text","text":"A type that implements a live client to the "},{"isActive":true,"identifier":"https:\/\/www.amiiboapi.org","type":"reference"},{"text":" online service.","type":"text"}]},"doc://AmiiboService/documentation/AmiiboService/GameSeries":{"navigatorTitle":[{"text":"GameSeries","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries","url":"\/documentation\/amiiboservice\/gameseries","type":"topic","title":"GameSeries","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"GameSeries","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a game series."}]},"doc://AmiiboService/documentation/AmiiboService/GameCharacterFilter":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"GameCharacterFilter"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacterFilter","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"GameCharacterFilter"}],"url":"\/documentation\/amiiboservice\/gamecharacterfilter","title":"GameCharacterFilter","role":"symbol","abstract":[{"text":"A type that contains values to fine-tune a response when requesting game characters.","type":"text"}]},"doc://AmiiboService/documentation/AmiiboService/GameSeriesFilter":{"abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting game series."}],"kind":"symbol","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"GameSeriesFilter","kind":"identifier"}],"title":"GameSeriesFilter","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter","type":"topic","navigatorTitle":[{"kind":"identifier","text":"GameSeriesFilter"}],"url":"\/documentation\/amiiboservice\/gameseriesfilter","role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboTypeFilter":{"abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo types."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","url":"\/documentation\/amiiboservice\/amiibotypefilter","title":"AmiiboTypeFilter","type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboTypeFilter","kind":"identifier"}],"navigatorTitle":[{"text":"AmiiboTypeFilter","kind":"identifier"}],"kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboFilter"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","type":"topic","navigatorTitle":[{"text":"AmiiboFilter","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibofilter","title":"AmiiboFilter","role":"symbol","abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo items."}]},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"url":"\/documentation\/amiiboservice\/amiibo","kind":"symbol","role":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","abstract":[{"type":"text","text":"A model that represents an amiibo."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"title":"Amiibo","type":"topic"},"doc://AmiiboService/documentation/AmiiboService/AmiiboService/init(client:)":{"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"client","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"some","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboClient","preciseIdentifier":"s:13AmiiboService0A6ClientP","kind":"typeIdentifier"},{"text":")","kind":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService\/init(client:)","kind":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiiboservice\/init(client:)","title":"init(client:)","role":"symbol","abstract":[{"type":"text","text":"Initializes this service with a specific client type."}]},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient":{"fragments":[{"text":"protocol","kind":"keyword"},{"kind":"text","text":" "},{"text":"AmiiboClient","kind":"identifier"}],"title":"AmiiboClient","navigatorTitle":[{"text":"AmiiboClient","kind":"identifier"}],"abstract":[{"type":"text","text":"A protocol that defines API clients containing all available endpoints to interact with."}],"role":"symbol","kind":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiiboclient","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"}}} |