diff --git a/doc/dev_guide/images/choco_chocolateyinstall_ps1.png b/doc/dev_guide/images/choco_chocolateyinstall_ps1.png new file mode 100644 index 00000000..d7a25e45 Binary files /dev/null and b/doc/dev_guide/images/choco_chocolateyinstall_ps1.png differ diff --git a/doc/dev_guide/images/choco_create_structure.png b/doc/dev_guide/images/choco_create_structure.png new file mode 100644 index 00000000..25eb226c Binary files /dev/null and b/doc/dev_guide/images/choco_create_structure.png differ diff --git a/doc/dev_guide/images/choco_nuspec.png b/doc/dev_guide/images/choco_nuspec.png new file mode 100644 index 00000000..29c00cf5 Binary files /dev/null and b/doc/dev_guide/images/choco_nuspec.png differ diff --git a/doc/dev_guide/images/choco_shell_output.png b/doc/dev_guide/images/choco_shell_output.png new file mode 100644 index 00000000..c7edc265 Binary files /dev/null and b/doc/dev_guide/images/choco_shell_output.png differ diff --git a/doc/dev_guide/packaging.md b/doc/dev_guide/packaging.md index 8516a209..f43a0a63 100644 --- a/doc/dev_guide/packaging.md +++ b/doc/dev_guide/packaging.md @@ -1,5 +1,14 @@ # Packaging API Dash +- [Windows](#windows) +- [macOS](#macos) +- [Linux Debian (.deb) & RPM (.rpm)](#linux-debian-deb--rpm-rpm) +- [Arch Linux (PKGBUILD)](#arch-linux-pkgbuild) +- [FlatHub (Flatpak)](#flathub-flatpak) +- [Homebrew](#homebrew) +- [Chocolatey](#chocolatey) +- [WinGet](#winget) + ## Windows [Packaging and Distributing Flutter Desktop Apps : Creating Windows .exe installer](https://medium.com/@fluttergems/packaging-and-distributing-flutter-desktop-apps-the-missing-guide-for-open-source-indie-0b468d5e9e70) @@ -104,7 +113,90 @@ brew install apidash ## Chocolatey -TODO Instructions +### Step 1: Setup Skeleton + +First step towards making a choco package is initializing a base. + +The command `choco new -h` can teach you more about the `new` command, its usage, options, switches, and exit codes. + +Run the following command to setup the base + +```powershell +choco new --name="apidash" --version="0.3.0" maintainername="foss42" maintainerrepo="https://github.com/foss42/apidash" --built-in-template +``` + +![choco folder structure](images/choco_create_structure.png) + +This creates the following folder structure + +``` +apidash +├── ReadMe.md +├── _TODO.txt +├── apidash.nuspec +└── tools + ├── chocolateybeforemodify.ps1 + ├── chocolateyinstall.ps1 + ├── chocolateyuninstall.ps1 + ├── LICENSE.txt + └── VERIFICATION.txt +``` + +The files `ReadMe.md` and `_TODO.md` can be deleted before pushing. + +The files of our main interest are `chocolateyinstall.ps1` and `apidash.nuspec`. + +### Step 2: Editing `chocolateyinstall.ps1` + +Take a look at `chocolateyinstall.ps1` file. There are many comments stating the use case of each line itself. +![chocolatelyinstall.ps1](images/choco_chocolateyinstall_ps1.png) + +Comments can bre remoed using the following command. +```powershell +$f='apidash\tools\chocolateyinstall.ps1' +gc $f | ? {$_ -notmatch "^\s*#"} | % {$_ -replace '(^.*?)\s*? [^``]#.*','$1'} | Out-File $f+".~" -en utf8; mv -fo $f+".~" $f +``` + +Now our `chocolateyinstall.ps1` file is ready. + +### Step 3: Editing `apidash.nuspec` + +![final apidash.nuspec](images/choco_nuspec.png) + +### Step 4: Build the package + +All our files are ready, we just need to pack out files in a choco package with the extension `.nupkg`. + +Run the following command from the root of your directory: +```powershell +choco pack +``` +This command generates the `apidash.0.3.0.nupkg` file. + +### Step 5: Test the Package Locally + +Install the package locally using Chocolatey: +```powershell +choco install apidash -s . +``` +Ensure the application installs correctly. + +![Shell output](images/choco_shell_output.png) + +### Step 6: Pre-Publishing - Update `LICENSE.txt` & `VERIFICATION.txt` + +Update `LICENSE.txt` with the actual **LICENSE **and `VERIFICATION.txt` accordingly. + +### Step 7: Publish the Package (Optional) + +To share the package, you can push it to a Chocolatey repository. For the official Chocolatey Community Repository, follow these steps: + +1. Create an account on the Chocolatey Community. +2. Get an API key by navigating to your profile. +3. Use the following command to push your package: +```powershell +choco push apidash.0.3.0.nupkg --source="https://push.chocolatey.org/" --api-key="YOUR_API_KEY" +``` ## WinGet diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 2fb83077..35bc4aa0 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -25,14 +25,11 @@ final requestSequenceProvider = StateProvider>((ref) { return ids ?? []; }); -final httpClientManager = HttpClientManager(); - final StateNotifierProvider?> collectionStateNotifierProvider = StateNotifierProvider((ref) => CollectionStateNotifier( ref, hiveHandler, - httpClientManager, )); class CollectionStateNotifier @@ -40,7 +37,6 @@ class CollectionStateNotifier CollectionStateNotifier( this.ref, this.hiveHandler, - this.httpClientManager, ) : super(null) { var status = loadData(); Future.microtask(() { @@ -57,7 +53,6 @@ class CollectionStateNotifier final Ref ref; final HiveHandler hiveHandler; final baseHttpResponseModel = const HttpResponseModel(); - final HttpClientManager httpClientManager; bool hasId(String id) => state?.keys.contains(id) ?? false; @@ -117,6 +112,7 @@ class CollectionStateNotifier final rId = id ?? ref.read(selectedIdStateProvider); var itemIds = ref.read(requestSequenceProvider); int idx = itemIds.indexOf(rId!); + cancelHttpRequest(rId); itemIds.remove(rId); ref.read(requestSequenceProvider.notifier).state = [...itemIds]; @@ -293,7 +289,7 @@ class CollectionStateNotifier state = map; bool noSSL = ref.read(settingsProvider).isSSLDisabled; - (HttpResponse?, Duration?, String?)? responseRec = await request( + var responseRec = await sendHttpRequest( requestId, apiType, substitutedHttpRequestModel, @@ -349,7 +345,7 @@ class CollectionStateNotifier void cancelRequest() { final id = ref.read(selectedIdStateProvider); - httpClientManager.cancelRequest(id); + cancelHttpRequest(id); unsave(); } diff --git a/packages/apidash_core/lib/services/http_service.dart b/packages/apidash_core/lib/services/http_service.dart index 0bbc0501..ad06a21d 100644 --- a/packages/apidash_core/lib/services/http_service.dart +++ b/packages/apidash_core/lib/services/http_service.dart @@ -10,15 +10,16 @@ import 'http_client_manager.dart'; typedef HttpResponse = http.Response; -Future<(HttpResponse?, Duration?, String?)> request( +final httpClientManager = HttpClientManager(); + +Future<(HttpResponse?, Duration?, String?)> sendHttpRequest( String requestId, APIType apiType, HttpRequestModel requestModel, { SupportedUriSchemes defaultUriScheme = kDefaultUriScheme, bool noSSL = false, }) async { - final clientManager = HttpClientManager(); - final client = clientManager.createClient(requestId, noSSL: noSSL); + final client = httpClientManager.createClient(requestId, noSSL: noSSL); (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, @@ -123,14 +124,18 @@ Future<(HttpResponse?, Duration?, String?)> request( stopwatch.stop(); return (response, stopwatch.elapsed, null); } catch (e) { - if (clientManager.wasRequestCancelled(requestId)) { + if (httpClientManager.wasRequestCancelled(requestId)) { return (null, null, kMsgRequestCancelled); } return (null, null, e.toString()); } finally { - clientManager.closeClient(requestId); + httpClientManager.closeClient(requestId); } } else { return (null, null, uriRec.$2); } } + +void cancelHttpRequest(String? requestId) { + httpClientManager.cancelRequest(requestId); +} diff --git a/test/models/response_model_test.dart b/test/models/response_model_test.dart index a568e383..5438f108 100644 --- a/test/models/response_model_test.dart +++ b/test/models/response_model_test.dart @@ -14,7 +14,7 @@ void main() { }); test('Testing fromResponse', () async { - (HttpResponse?, Duration?, String?)? responseRec = await request( + var responseRec = await sendHttpRequest( requestModelGet1.id, requestModelGet1.apiType, requestModelGet1.httpRequestModel!, @@ -32,7 +32,7 @@ void main() { }); test('Testing fromResponse for contentType not Json', () async { - (HttpResponse?, Duration?, String?)? responseRec = await request( + var responseRec = await sendHttpRequest( requestModelGet13.id, requestModelGet1.apiType, requestModelGet13.httpRequestModel!, @@ -48,7 +48,7 @@ void main() { }); test('Testing fromResponse for Bad SSL with certificate check', () async { - (HttpResponse?, Duration?, String?)? responseRec = await request( + var responseRec = await sendHttpRequest( requestModelGetBadSSL.id, requestModelGet1.apiType, requestModelGetBadSSL.httpRequestModel!, @@ -60,7 +60,7 @@ void main() { }); test('Testing fromResponse for Bad SSL with no certificate check', () async { - (HttpResponse?, Duration?, String?)? responseRec = await request( + var responseRec = await sendHttpRequest( requestModelGetBadSSL.id, requestModelGet1.apiType, requestModelGetBadSSL.httpRequestModel!,