diff --git a/generators/src/main/java/com/algolia/codegen/cts/guides/GuidesGenerator.java b/generators/src/main/java/com/algolia/codegen/cts/guides/GuidesGenerator.java index a95604e38fa..dfba20f69a5 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/guides/GuidesGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/cts/guides/GuidesGenerator.java @@ -50,6 +50,10 @@ public void addSupportingFiles(List supportingFiles, String outp @Override public void run(Map models, Map operations, Map bundle) throws Exception { + if (this.client.equals("search")) { + bundle.put("isSearchClient", true); + } + bundle.put("isSyncClient", true); // nothing to do here, the mustache uses dynamicSnippets lambda } } diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/SwiftCTSManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/SwiftCTSManager.java index 2b591cf65ca..909a60f342b 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/SwiftCTSManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/SwiftCTSManager.java @@ -42,8 +42,13 @@ public void addDataToBundle(Map bundle) throws GeneratorExceptio @Override public void addSnippetsSupportingFiles(List supportingFiles, String output) { - supportingFiles.add(new SupportingFile("snippets/Package.mustache", output + "/swift", "Package.swift")); supportingFiles.add(new SupportingFile("snippets/.swiftformat.mustache", output + "/swift", ".swiftformat")); supportingFiles.add(new SupportingFile("snippets/.gitignore.mustache", output + "/swift", ".gitignore")); + + if (output.equals("snippets")) { + supportingFiles.add(new SupportingFile("snippets/Package.mustache", output + "/swift", "Package.swift")); + } else if (output.equals("guides")) { + supportingFiles.add(new SupportingFile("guides/Package.mustache", output + "/swift", "Package.swift")); + } } } diff --git a/guides/swift/.gitignore b/guides/swift/.gitignore new file mode 100644 index 00000000000..47bd4c185fd --- /dev/null +++ b/guides/swift/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc +Package.resolved diff --git a/scripts/buildLanguages.ts b/scripts/buildLanguages.ts index bcf9b9bda2e..95ff36babd7 100644 --- a/scripts/buildLanguages.ts +++ b/scripts/buildLanguages.ts @@ -65,7 +65,7 @@ async function buildLanguage(language: Language, gens: Generator[], buildType: B break; case 'swift': // make this work in the playground - if (buildType === 'client') { + if (buildType !== 'playground') { await run('swift build -Xswiftc -suppress-warnings', { cwd, language }); } break; diff --git a/templates/csharp/guides/search/saveObjectsMovies.mustache b/templates/csharp/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..1fe812f13b3 --- /dev/null +++ b/templates/csharp/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,34 @@ +using System; +using System.Text.Json; +using System.Net.Http; +using System.Collections.Generic; + +{{> snippets/import}} + +class Program +{ + public static async Task Main(string[] args) + { + // read json file from url + var url = "https://dashboard.algolia.com/sample_datasets/movie.json"; + var httpClient = new HttpClient(); + var response = await httpClient.GetAsync(url); + var content = await response.Content.ReadAsStringAsync(); + + // parse json + var movies = JsonSerializer.Deserialize>(content); + + // initiate client and index + {{> snippets/init}} + + // push data to algolia + try + { + var result = {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}}; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } +} \ No newline at end of file diff --git a/templates/csharp/snippets/.gitignore.mustache b/templates/csharp/snippets/.gitignore.mustache index 07ec78229d2..1746e3269ed 100644 --- a/templates/csharp/snippets/.gitignore.mustache +++ b/templates/csharp/snippets/.gitignore.mustache @@ -1,365 +1,2 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - - -appsettings.json +bin +obj diff --git a/templates/go/guides/search/saveObjectsMovies.mustache b/templates/go/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..c32efa52878 --- /dev/null +++ b/templates/go/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,43 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" +) + +{{> snippets/import}} + +func main() { + // read json file + url := "https://dashboard.algolia.com/sample_datasets/movie.json" + response, err := http.Get(url) + + if err != nil { + fmt.Println("Could not open url") + return + } + + defer response.Body.Close() + + // parse json file to Movie struct + var movies []map[string]interface{} + err = json.NewDecoder(response.Body).Decode(&movies) + + if err != nil { + fmt.Println("Could not decode body") + return + } + + // initiate client + {{> snippets/init}} + + // push data to algolia + result, err := {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + if err != nil { + fmt.Println(err) + return + } + +fmt.Printf("Done! Uploaded records in %d batches.", len(result)) +} \ No newline at end of file diff --git a/templates/java/guides/search/saveObjectsMovies.mustache b/templates/java/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..8f43008575b --- /dev/null +++ b/templates/java/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,28 @@ +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.List; + +{{> snippets/import}} + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class saveObjectsMovies { + public static void main(String[] args) throws Exception { + // Fetch sample dataset + URL url = new URI("https://dashboard.algolia.com/sample_datasets/movie.json").toURL(); + InputStream stream = url.openStream(); + ObjectMapper mapper = new ObjectMapper(); + List movies = mapper.readValue(stream, new TypeReference>() {}); + stream.close(); + + // Connect and authenticate with your Algolia app + {{> snippets/init}} + + // Save records in Algolia index + {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}}; + client.close(); + } +} \ No newline at end of file diff --git a/templates/kotlin/guides/search/saveObjectsMovies.mustache b/templates/kotlin/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..f6517eda006 --- /dev/null +++ b/templates/kotlin/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,23 @@ +package org.example +{{> snippets/import}} +{{#isSearchClient}} +import com.algolia.client.extensions.* +{{/isSearchClient}} +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import java.net.URI + +suspend fun main() { + val url = URI.create("https://dashboard.algolia.com/sample_datasets/movie.json") + val json = url.toURL().readText() + val movies: List = Json.decodeFromString(ListSerializer(JsonObject.serializer()), json) + + {{> snippets/init}} + + try { + client.{{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + } catch(e: Exception) { + println(e.message) + } +} \ No newline at end of file diff --git a/templates/php/guides/search/saveObjectsMovies.mustache b/templates/php/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..407b1d83577 --- /dev/null +++ b/templates/php/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,16 @@ + snippets/import}} + +// Fetch sample dataset +$url = "https://dashboard.algolia.com/sample_datasets/movie.json"; +$response = file_get_contents($url); +$movies = json_decode($response, true); + +// Connect and authenticate with your Algolia app +{{> snippets/init}} + +// Save records in Algolia index +{{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + +print('Done!'); \ No newline at end of file diff --git a/templates/python/guides/search/saveObjectsMovies.mustache b/templates/python/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..5cc563ce6ca --- /dev/null +++ b/templates/python/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,16 @@ +import asyncio +import requests +{{> snippets/import}} + +async def main(): + # Fetch sample dataset + url = "https://dashboard.algolia.com/sample_datasets/movie.json" + movies = requests.get(url).json() + + # Connect and authenticate with your Algolia app + _{{> snippets/init}} + + # Save records in Algolia index + {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + +asyncio.run(main()) \ No newline at end of file diff --git a/templates/ruby/guides/search/saveObjectsMovies.mustache b/templates/ruby/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..9df784febea --- /dev/null +++ b/templates/ruby/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,15 @@ +require 'uri' +{{> snippets/import}} + +# Fetch sample dataset +uri = URI('https://dashboard.algolia.com/sample_datasets/movie.json') +response = Net::HTTP.get_response(uri) +movies = JSON.parse(response.body) + +# Connect and authenticate with your Algolia app +{{> snippets/init}} + +# Save records in Algolia index +{{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + +puts('Done!') \ No newline at end of file diff --git a/templates/scala/guides/search/saveObjectsMovies.mustache b/templates/scala/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..468d49c8fdf --- /dev/null +++ b/templates/scala/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,36 @@ +import scala.io.Source +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, ExecutionContextExecutor} + +{{> snippets/import}} +{{#isSearchClient}} +import algoliasearch.extension.SearchClientExtensions +{{/isSearchClient}} + +import org.json4s.native.JsonMethods +import org.json4s.jvalue2extractable + +object Main { + def main(args: Array[String]): Unit = { + implicit val ec: ExecutionContextExecutor = scala.concurrent.ExecutionContext.global + implicit val formats: org.json4s.Formats = org.json4s.DefaultFormats + + // Fetch sample dataset + val url = "https://dashboard.algolia.com/sample_datasets/movie.json" + val result = Source.fromURL(url).mkString + val movies = JsonMethods.parse(result).extract[Seq[Map[String, Any]]] + + // Connect and authenticate with your Algolia app + {{> snippets/init}} + + // Save records in Algolia index + try { + Await.result( + {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}}, + Duration(100, "sec") + ) + } catch { + case e: Exception => println(e) + } + } +} \ No newline at end of file diff --git a/templates/swift/guides/Package.mustache b/templates/swift/guides/Package.mustache new file mode 100644 index 00000000000..45d09281c2c --- /dev/null +++ b/templates/swift/guides/Package.mustache @@ -0,0 +1,28 @@ +// swift-tools-version: 5.9 +// {{generationBanner}} + +import PackageDescription + +let package = Package( + name: "AlgoliaSearchClientGuides", + platforms: [ + .iOS(.v13), + .macOS(.v11), + .tvOS(.v13), + .watchOS(.v6), + ], + dependencies: [ + .package(path: "../../clients/algoliasearch-client-swift") + ], + targets: [ + .executableTarget( + name: "AlgoliaSearchClientGuides", + dependencies: [{{#packageList}} + .product( + name: "{{{.}}}", + package: "algoliasearch-client-swift" + ),{{/packageList}} + ] + ) + ] +) diff --git a/templates/swift/guides/search/saveObjectsMovies.mustache b/templates/swift/guides/search/saveObjectsMovies.mustache new file mode 100644 index 00000000000..5d1aec37c85 --- /dev/null +++ b/templates/swift/guides/search/saveObjectsMovies.mustache @@ -0,0 +1,28 @@ +import Foundation +#if os(Linux) // For linux interop + import FoundationNetworking +#endif + +import Core +{{> snippets/import}} + +func saveObjectsMovies() async throws { + let url = URL(string: "https://dashboard.algolia.com/sample_datasets/movie.json")! + var data: Data? = nil + #if os(Linux) // For linux interop + (data, _) = try await URLSession.shared.asyncData(for: URLRequest(url: url)) + #else + (data, _) = try await URLSession.shared.data(from: url) + #endif + let movies = try JSONDecoder().decode([AnyCodable].self, from: data!) + + // Connect and authenticate with your Algolia app + {{> snippets/init}} + + do { + // Save records in Algolia index + {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}} + } catch { + print(error.localizedDescription) + } +} \ No newline at end of file diff --git a/templates/swift/snippets/Package.mustache b/templates/swift/snippets/Package.mustache index 9ee535ab270..61d485db923 100644 --- a/templates/swift/snippets/Package.mustache +++ b/templates/swift/snippets/Package.mustache @@ -1,5 +1,5 @@ -// {{generationBanner}} // swift-tools-version: 5.9 +// {{generationBanner}} import PackageDescription @@ -30,4 +30,4 @@ let package = Package( ] ) ] -) \ No newline at end of file +) diff --git a/templates/swift/tests/Package.mustache b/templates/swift/tests/Package.mustache index ab3ebc5cb21..b9f1921b076 100644 --- a/templates/swift/tests/Package.mustache +++ b/templates/swift/tests/Package.mustache @@ -1,4 +1,5 @@ // swift-tools-version: 5.9 +// {{generationBanner}} import PackageDescription @@ -59,4 +60,4 @@ let package = Package( ] + libraries ) ] -) \ No newline at end of file +)