From 4723adef788812cfadbe12c559fbdd3d83b508e0 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Thu, 18 May 2023 09:26:39 +0200 Subject: [PATCH 01/11] FEATURE add mock server and main_dev.dart for developement --- flutter | 2 +- lib/main.dart | 1 + lib/main_dev.dart | 10 + packages/mock_server/.gitignore | 30 ++ packages/mock_server/.metadata | 10 + packages/mock_server/CHANGELOG.md | 3 + packages/mock_server/LICENSE | 1 + packages/mock_server/README.md | 39 +++ packages/mock_server/analysis_options.yaml | 4 + .../plugins/GeneratedPluginRegistrant.java | 23 ++ packages/mock_server/android/local.properties | 2 + .../ios/Flutter/Generated.xcconfig | 14 + .../ios/Flutter/flutter_export_environment.sh | 13 + .../ios/Runner/GeneratedPluginRegistrant.h | 19 + .../ios/Runner/GeneratedPluginRegistrant.m | 14 + packages/mock_server/lib/mock_server.dart | 161 +++++++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 ++ .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../ephemeral/Flutter-Generated.xcconfig | 11 + .../ephemeral/flutter_export_environment.sh | 12 + packages/mock_server/pubspec.yaml | 57 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 ++ .../example/android/build.gradle | 2 +- .../example/pubspec.lock | 4 +- pubspec.lock | 329 ++++++++++-------- pubspec.yaml | 2 + 30 files changed, 718 insertions(+), 153 deletions(-) create mode 100644 lib/main_dev.dart create mode 100644 packages/mock_server/.gitignore create mode 100644 packages/mock_server/.metadata create mode 100644 packages/mock_server/CHANGELOG.md create mode 100644 packages/mock_server/LICENSE create mode 100644 packages/mock_server/README.md create mode 100644 packages/mock_server/analysis_options.yaml create mode 100644 packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 packages/mock_server/android/local.properties create mode 100644 packages/mock_server/ios/Flutter/Generated.xcconfig create mode 100755 packages/mock_server/ios/Flutter/flutter_export_environment.sh create mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m create mode 100644 packages/mock_server/lib/mock_server.dart create mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.cc create mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.h create mode 100644 packages/mock_server/linux/flutter/generated_plugins.cmake create mode 100644 packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100755 packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 100644 packages/mock_server/pubspec.yaml create mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.cc create mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.h create mode 100644 packages/mock_server/windows/flutter/generated_plugins.cmake diff --git a/flutter b/flutter index 4d9e56e..9944297 160000 --- a/flutter +++ b/flutter @@ -1 +1 @@ -Subproject commit 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf +Subproject commit 9944297138845a94256f1cf37beb88ff9a8e811a diff --git a/lib/main.dart b/lib/main.dart index f20fbd5..3eca615 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -121,6 +121,7 @@ void main() async { }); final apiFactory = PaperlessApiFactoryImpl(sessionManager); + runApp( MultiProvider( providers: [ diff --git a/lib/main_dev.dart b/lib/main_dev.dart new file mode 100644 index 0000000..5fb095a --- /dev/null +++ b/lib/main_dev.dart @@ -0,0 +1,10 @@ + + +import 'package:mock_server/mock_server.dart'; +import 'package:paperless_mobile/main.dart' as ParentMain; + +void main() async { + await LocalMockApiServer().start(); + ParentMain.main(); +} + diff --git a/packages/mock_server/.gitignore b/packages/mock_server/.gitignore new file mode 100644 index 0000000..96486fd --- /dev/null +++ b/packages/mock_server/.gitignore @@ -0,0 +1,30 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/mock_server/.metadata b/packages/mock_server/.metadata new file mode 100644 index 0000000..40e012c --- /dev/null +++ b/packages/mock_server/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 + channel: stable + +project_type: package diff --git a/packages/mock_server/CHANGELOG.md b/packages/mock_server/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/packages/mock_server/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/mock_server/LICENSE b/packages/mock_server/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/packages/mock_server/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/mock_server/README.md b/packages/mock_server/README.md new file mode 100644 index 0000000..02fe8ec --- /dev/null +++ b/packages/mock_server/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/mock_server/analysis_options.yaml b/packages/mock_server/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/packages/mock_server/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..d007606 --- /dev/null +++ b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,23 @@ +package io.flutter.plugins; + +import io.flutter.plugin.common.PluginRegistry; + +/** + * Generated file. Do not edit. + */ +public final class GeneratedPluginRegistrant { + public static void registerWith(PluginRegistry registry) { + if (alreadyRegisteredWith(registry)) { + return; + } + } + + private static boolean alreadyRegisteredWith(PluginRegistry registry) { + final String key = GeneratedPluginRegistrant.class.getCanonicalName(); + if (registry.hasPlugin(key)) { + return true; + } + registry.registrarFor(key); + return false; + } +} diff --git a/packages/mock_server/android/local.properties b/packages/mock_server/android/local.properties new file mode 100644 index 0000000..679e454 --- /dev/null +++ b/packages/mock_server/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/Konrad.Lys/Library/Android/sdk +flutter.sdk=/opt/homebrew/Caskroom/flutter/3.10.0/flutter \ No newline at end of file diff --git a/packages/mock_server/ios/Flutter/Generated.xcconfig b/packages/mock_server/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..e3b3caf --- /dev/null +++ b/packages/mock_server/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter +FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=0.0.1 +FLUTTER_BUILD_NUMBER=0.0.1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/ios/Flutter/flutter_export_environment.sh b/packages/mock_server/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..c58c84e --- /dev/null +++ b/packages/mock_server/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=0.0.1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..efe65ec --- /dev/null +++ b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart new file mode 100644 index 0000000..6540acb --- /dev/null +++ b/packages/mock_server/lib/mock_server.dart @@ -0,0 +1,161 @@ +library mock_server; + +import 'dart:convert'; + + +import 'package:logging/logging.dart'; + +import 'package:shelf/shelf.dart'; + +import 'package:shelf/shelf_io.dart' as shelf_io; + +import 'package:shelf_router/shelf_router.dart' as shelf_router; + + +Logger log = Logger('LocalMockApiServer'); + + +class LocalMockApiServer { + + static final host = 'localhost'; + + static final port = 3131; + + static get baseUrl => 'http://$host:$port/'; + + + late shelf_router.Router app; + + + LocalMockApiServer() { + + app = shelf_router.Router(); + + + app.get('/api/', (Request req) async { + log.info('Responding to /api'); + return JsonMockResponse.ok({ + }); + }); + + app.post('/api/token/', (Request req) async { + log.info('Responding to /api/token/'); + var body = await req.bodyJsonMap(); + if (body?['username'] == 'test' && body?['password'] == 'test') { + return JsonMockResponse.ok({ + 'token': 'testToken' + }); + } else { + return Response.unauthorized( + 'Unauthorized' + ); + } + + }); + + app.get('/api/ui_settings/', (Request req) async { + log.info('Responding to /api/ui_settings/'); + return JsonMockResponse.ok({ + 'user': { + 'id': 1, + 'username': 'test', + 'displayName': 'Test User' + } + }); + }); + + app.get('/api/users//', (Request req, String userId) async { + log.info('Responding to /api/users//'); + return JsonMockResponse.ok({ + 'id': 1, + 'username': 'test', + 'displayName': 'Test User', + 'email': 'test@test.pl', + 'firstName': 'Test', + 'lastName': 'User', + 'dateJoined': '2000-01-23T01:23:45', + 'isStaff': false, + 'isActive': true, + 'isSuperuser': true, + 'groups': [], + 'userPermissions': [], + 'inheritedPermissions': [] + }); + }); + + } + + + Future start() async { + + log.info('starting...'); + + + var handler = const Pipeline().addMiddleware( + + logRequests(logger: (message, isError) { + + if (isError) + + log.severe(message); + + else + + log.info(message); + + }), + + ).addHandler(app); + + + var server = await shelf_io.serve(handler, host, port); + + server.autoCompress = true; + + + log.info('serving on: $baseUrl'); + + } + +} + + +extension on Request { + + Future bodyJsonValue(String param) async { + + return jsonDecode(await this.readAsString())?[param]; + + } + + Future bodyJsonMap() async { + + return jsonDecode(await this.readAsString()); + + } + + + String? get accessToken => + + this.headers['Authorization']?.split('Bearer ').last; + +} + + +extension JsonMockResponse on Response { + + static ok(T json, {int delay = 800}) async { + + await Future.delayed(Duration(milliseconds: delay)); // Emulate lag + + return Response.ok( + + jsonEncode(json), + + headers: {'Content-Type': 'application/json'}, + + ); + + } + +} \ No newline at end of file diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.h b/packages/mock_server/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/linux/flutter/generated_plugins.cmake b/packages/mock_server/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..2e1de87 --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..cccf817 --- /dev/null +++ b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 0000000..e822246 --- /dev/null +++ b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter +FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=0.0.1 +FLUTTER_BUILD_NUMBER=0.0.1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 0000000..ded31c1 --- /dev/null +++ b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=0.0.1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/pubspec.yaml b/packages/mock_server/pubspec.yaml new file mode 100644 index 0000000..53e8177 --- /dev/null +++ b/packages/mock_server/pubspec.yaml @@ -0,0 +1,57 @@ +name: mock_server +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + shelf: ^1.4.1 + shelf_router: ^1.1.4 + logging: ^1.1.1 + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.h b/packages/mock_server/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/windows/flutter/generated_plugins.cmake b/packages/mock_server/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..b93c4c3 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/paperless_document_scanner/example/android/build.gradle b/packages/paperless_document_scanner/example/android/build.gradle index 58a8c74..713d7f6 100644 --- a/packages/paperless_document_scanner/example/android/build.gradle +++ b/packages/paperless_document_scanner/example/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/packages/paperless_document_scanner/example/pubspec.lock b/packages/paperless_document_scanner/example/pubspec.lock index 37fac4d..3758a4d 100644 --- a/packages/paperless_document_scanner/example/pubspec.lock +++ b/packages/paperless_document_scanner/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: camera_android - sha256: e0f9b7eea2d1f4d4f5460f178522f0d02c095d2ae00b01a77419ce61c4184bfe + sha256: "61bbae4af0204b9bbfd82182e313d405abf5a01bdb057ff6675f2269a5cab4fd" url: "https://pub.dev" source: hosted - version: "0.10.7" + version: "0.10.8+1" camera_avfoundation: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index b0a0506..25bb03b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: "405666cd3cf0ee0a48d21ec67e65406aad2c726d9fa58840d3375e7bdcd32a07" url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "60.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: "1952250bd005bacb895a01bf1b4dc00e3ba1c526cf47dca54dfe24979c65f5b3" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.12.0" analyzer_plugin: dependency: transitive description: @@ -45,18 +45,18 @@ packages: dependency: transitive description: name: archive - sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" + sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" async: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + sha256: "43865b79fbb78532e4bff7c33087aa43b1d488c4fdef014eaef568af6d8016dc" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" build_config: dependency: transitive description: @@ -157,26 +157,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab" + sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "87e06c939450b9b94e3e1bb2d46e0e9780adbff5500d3969f2ba2de6bbb860cb" + sha256: "220ae4553e50d7c21a17c051afc7b183d28a24a420502e842f303f8e4e6edced" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.4" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + sha256: "30859c90e9ddaccc484f56303931f477b1f1ba2bab74aa32ed5d6ce15870f8cf" url: "https://pub.dev" source: hosted - version: "7.2.7" + version: "7.2.8" built_collection: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d" url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.5.0" cached_network_image: dependency: "direct main" description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" clock: dependency: transitive description: @@ -301,10 +301,10 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" csslib: dependency: transitive description: @@ -317,26 +317,26 @@ packages: dependency: "direct dev" description: name: dart_code_metrics - sha256: "026e28da197a03caeccccc0b174ec98ef03da3c81c4543314d7add121aab4375" + sha256: "8d40e9fa6ba6b5f4f569768e267e9cb3e74350f98b30ac4b8160795792ce5414" url: "https://pub.dev" source: hosted - version: "5.6.0" + version: "5.7.4" dart_code_metrics_presets: dependency: transitive description: name: dart_code_metrics_presets - sha256: "9c51724f836aebc4465228954cb5757e5a99737af26a452b5dec0a2d5d0b4d66" + sha256: "22e27f98e8c7d8b11cca43d2656a822935280747050ae65e8cd03c52d09c0d1c" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.7.0" dart_style: dependency: transitive description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.1" dbus: dependency: transitive description: @@ -381,32 +381,32 @@ packages: dependency: "direct main" description: name: dio - sha256: "9fdbf71baeb250fc9da847f6cb2052196f62c19906a3657adfc18631a667d316" + sha256: "347d56c26d63519552ef9a569f2a593dda99a81fdbdff13c584b7197cfe05059" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.2" dots_indicator: dependency: transitive description: name: dots_indicator - sha256: e59dfc90030ee5a4fd4c53144a8ce97cc7a823c2067b8fb9814960cd1ae63f89 + sha256: f1599baa429936ba87f06ae5f2adc920a367b16d08f74db58c3d0f6e93bcdb5c url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" dynamic_color: dependency: "direct main" description: name: dynamic_color - sha256: c4a508284b14ec4dda5adba2c28b2cdd34fbae1afead7e8c52cad87d51c5405b + sha256: "74dff1435a695887ca64899b8990004f8d1232b0e84bfc4faa1fdda7c6f57cc1" url: "https://pub.dev" source: hosted - version: "1.6.2" + version: "1.6.5" edge_detection: dependency: "direct main" description: path: "." ref: master - resolved-ref: "24da81d7cb3bc6418d5901da355addb337793b46" + resolved-ref: "685af159405b0b3fd8d3f9a02b34a548a79af492" url: "https://github.com/sawankumarbundelkhandi/edge_detection" source: git version: "1.1.1" @@ -430,10 +430,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" file: dependency: transitive description: @@ -520,18 +520,18 @@ packages: dependency: "direct main" description: name: flutter_html - sha256: "342c7908f0a67bcec62b6e0f7cf23e23bafe7f64693665dd35be98d5e783bdfd" + sha256: "850c07bc6c1ed060d3eb3e88469a598260a13eb45d8978b197c1348e0a2b101f" url: "https://pub.dev" source: hosted - version: "3.0.0-alpha.6" + version: "3.0.0-beta.1" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "86b71bbaffa38e885f5c21b1182408b9be6951fd125432cf6652c636254cef2d" + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -592,10 +592,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "8f6c1611e0c4a88a382691a97bb3c3feb24cc0c0b54152b8b5fb7ffb837f7fbf" + sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -613,10 +613,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: e301ae206ff0fb09b67d3716009c6c28c2da57a0ad164827b178421bb9d601f7 + sha256: "02df24aec455c26428dadc637f20d4c548bda23ee2179479a8e8c39f1ecb75b3" url: "https://pub.dev" source: hosted - version: "2.2.18" + version: "2.3.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -690,10 +690,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: "73eb76fa640ea630e2d957e7b469ab2b91e4da6c4950d6032fab7009275637b7" + sha256: "721610b3d61814efa13fb5f720a6781bc123cd51b7e01f5a45d7c92124376644" url: "https://pub.dev" source: hosted - version: "4.3.3" + version: "4.3.8" flutter_web_plugins: dependency: transitive description: flutter @@ -703,10 +703,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "774fa28b07f3a82c93596bc137be33189fec578ed3447a93a5a11c93435de394" + sha256: "2f9c4d3f4836421f7067a28f8939814597b27614e021da9d63e5d3fb6e212d25" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.2.1" font_awesome_flutter: dependency: "direct main" description: @@ -719,10 +719,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "73b58fe836dc05594451d8f740d97d5167886962d628b9f60a1fe945aa0a891f" + sha256: "2edb9ef971d0f803860ecd9084afd48c717d002141ad77b69be3e976bee7190e" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.4" freezed_annotation: dependency: "direct main" description: @@ -788,18 +788,26 @@ packages: dependency: transitive description: name: html - sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 + sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" url: "https://pub.dev" source: hosted - version: "0.15.1" + version: "0.15.3" http: dependency: "direct main" description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" + http_methods: + dependency: transitive + description: + name: http_methods + sha256: "6bccce8f1ec7b5d701e7921dca35e202d425b57e317ba1a37f2638590e29e566" + url: "https://pub.dev" + source: hosted + version: "1.1.1" http_multi_server: dependency: transitive description: @@ -841,18 +849,18 @@ packages: dependency: "direct main" description: name: intl - sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.18.0" + version: "0.18.1" introduction_screen: dependency: "direct main" description: name: introduction_screen - sha256: "73965475d6b271846f81c5fce5b459546a4ea36c285408691522437fd6bbeb69" + sha256: f194ae655a84b945a2aedb7961d09948d789fc91088efb032666112923bcbc1e url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.8" io: dependency: transitive description: @@ -865,10 +873,10 @@ packages: dependency: transitive description: name: jiffy - sha256: "85172c4fc975a50224521c05bf43abc845288863b19d91bd3c221a96a8785dd3" + sha256: c3c1da3fe0c08bba3c2c455e8a3e724dfe7ea34dbe8069b992cab90ea1fe40b6 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.0.1" js: dependency: transitive description: @@ -889,10 +897,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a + sha256: "61a60716544392a82726dd0fa1dd6f5f1fd32aec66422b6e229e7b90d52325c4" url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "6.7.0" lints: dependency: transitive description: @@ -901,46 +909,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.dev" + source: hosted + version: "1.0.2" local_auth: dependency: "direct main" description: name: local_auth - sha256: "8cea55dca20d1e0efa5480df2d47ae30851e7a24cb8e7d225be7e67ae8485aa4" + sha256: "0cf238be2bfa51a6c9e7e9cfc11c05ea39f2a3a4d3e5bb255d0ebc917da24401" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.6" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: cfcbc4936e288d61ef85a04feef6b95f49ba496d4fd98364e6abafb462b06a1f + sha256: c5e48c4a67fc0e5dd9b5725cc8766b67e2da9a54155c82c6e2ea4a0d1cf9ef93 url: "https://pub.dev" source: hosted - version: "1.0.18" + version: "1.0.28" local_auth_ios: dependency: transitive description: name: local_auth_ios - sha256: aa32478d7513066564139af57e11e2cad1bbd535c1efd224a88a8764c5665e3b + sha256: "503a938c4edde6b244c6ee3b1e2e675ddb7e37e79d5056658dbed1997cf04785" url: "https://pub.dev" source: hosted - version: "1.0.12" + version: "1.1.2" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: fbb6973f2fd088e2677f39a5ab550aa1cfbc00997859d5e865569872499d6d61 + sha256: "9e160d59ef0743e35f1b50f4fb84dc64f55676b1b8071e319ef35e7f3bc13367" url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.7" local_auth_windows: dependency: transitive description: name: local_auth_windows - sha256: "888482e4f9ca3560e00bc227ce2badeb4857aad450c42a31c6cfc9dc21e0ccbc" + sha256: "19323b75ab781d5362dbb15dcb7e0916d2431c7a6dbdda016ec9708689877f73" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.8" logging: dependency: transitive description: @@ -981,6 +997,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + mock_server: + dependency: "direct dev" + description: + path: "packages/mock_server" + relative: true + source: path + version: "0.0.1" mockito: dependency: "direct dev" description: @@ -1017,18 +1040,10 @@ packages: dependency: transitive description: name: node_preamble - sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" url: "https://pub.dev" source: hosted - version: "2.0.1" - numerus: - dependency: transitive - description: - name: numerus - sha256: "436759d84f233b40107d0cc31cfa92d24e0960afeb2e506be70926d4cddffd9e" - url: "https://pub.dev" - source: hosted - version: "2.0.0" + version: "2.0.2" octo_image: dependency: transitive description: @@ -1104,42 +1119,42 @@ packages: dependency: "direct main" description: name: path_provider - sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" url: "https://pub.dev" source: hosted - version: "2.0.12" + version: "2.0.15" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" url: "https://pub.dev" source: hosted - version: "2.0.22" + version: "2.0.27" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.3" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" + sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" url: "https://pub.dev" source: hosted - version: "2.1.8" + version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_windows: dependency: transitive description: @@ -1176,18 +1191,18 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + sha256: d8cc6a62ded6d0f49c6eac337e080b066ee3bce4d405bd9439a61e1f1927bfe8 url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.2.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85 url: "https://pub.dev" source: hosted - version: "9.0.7" + version: "9.0.8" permission_handler_platform_interface: dependency: transitive description: @@ -1236,6 +1251,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" pool: dependency: transitive description: @@ -1272,26 +1295,26 @@ packages: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pub_updater: dependency: transitive description: name: pub_updater - sha256: "42890302ab2672adf567dc2b20e55b4ecc29d7e19c63b6b98143ab68dd717d3a" + sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c" url: "https://pub.dev" source: hosted - version: "0.2.4" + version: "0.3.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.3" qr: dependency: transitive description: @@ -1352,10 +1375,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" share_plus_web: dependency: transitive description: @@ -1376,34 +1399,42 @@ packages: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" + shelf_router: + dependency: transitive + description: + name: shelf_router + sha256: f5e5d492440a7fb165fe1e2e1a623f31f734d3370900070b2b1e0d0428d59864 + url: "https://pub.dev" + source: hosted + version: "1.1.4" shelf_static: dependency: transitive description: name: shelf_static - sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" shimmer: dependency: "direct main" description: @@ -1421,10 +1452,10 @@ packages: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" url: "https://pub.dev" source: hosted - version: "1.2.7" + version: "1.3.2" source_helper: dependency: transitive description: @@ -1445,10 +1476,10 @@ packages: dependency: transitive description: name: source_maps - sha256: "490098075234dcedb83c5d949b4c93dad5e6b7702748de000be2b57b8e6b2427" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" url: "https://pub.dev" source: hosted - version: "0.10.11" + version: "0.10.12" source_span: dependency: transitive description: @@ -1461,18 +1492,18 @@ packages: dependency: transitive description: name: sqflite - sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" + sha256: b4d6710e1200e96845747e37338ea8a819a12b51689a3bcf31eff0003b37a0b9 url: "https://pub.dev" source: hosted - version: "2.2.4+1" + version: "2.2.8+4" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + sha256: e77abf6ff961d69dfef41daccbb66b51e9983cdd5cb35bf30733598057401555 url: "https://pub.dev" source: hosted - version: "2.4.2+2" + version: "2.4.5" stack_trace: dependency: transitive description: @@ -1517,10 +1548,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" term_glyph: dependency: transitive description: @@ -1557,10 +1588,10 @@ packages: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.9.2" timing: dependency: transitive description: @@ -1573,10 +1604,10 @@ packages: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" universal_io: dependency: transitive description: @@ -1589,66 +1620,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 url: "https://pub.dev" source: hosted - version: "6.1.9" + version: "6.1.11" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "3e2f6dfd2c7d9cd123296cab8ef66cfc2c1a13f5845f42c7a0f365690a8a7dd1" + sha256: "1a5848f598acc5b7d8f7c18b8cb834ab667e59a13edc3c93e9d09cf38cc6bc87" url: "https://pub.dev" source: hosted - version: "6.0.23" + version: "6.0.34" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "0a5af0aefdd8cf820dd739886efb1637f1f24489900204f50984634c07a54815" + sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "318c42cba924e18180c029be69caf0a1a710191b9ec49bb42b5998fdcccee3cc" + sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "41988b55570df53b3dd2a7fc90c76756a963de6a8c5f8e113330cb35992e2094" + sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "44d79408ce9f07052095ef1f9a693c258d6373dc3944249374e30eff7219ccb0" + sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: b6217370f8eb1fd85c8890c539f5a639a01ab209a36db82c921ebeacefc7a615 + sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" uuid: dependency: "direct main" description: @@ -1677,18 +1708,18 @@ packages: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web_socket_channel: dependency: "direct main" description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.0" webdriver: dependency: transitive description: @@ -1733,10 +1764,10 @@ packages: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: dart: ">=3.0.0 <4.0.0" flutter: ">=3.7.0" diff --git a/pubspec.yaml b/pubspec.yaml index f5d7080..c516c7c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -113,6 +113,8 @@ dev_dependencies: auto_route_generator: ^5.0.3 freezed: ^2.3.3 hive_generator: ^2.0.0 + mock_server: + path: packages/mock_server # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From b381032134d60a38b76b219e0781f30b37b6a961 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 18:43:13 +0200 Subject: [PATCH 02/11] FEATURE more mocked APIs, full tags API --- .../mock_server/fixtures/correspondents.json | 257 ++++++++++ packages/mock_server/fixtures/doc_types.json | 25 + packages/mock_server/fixtures/documents.json | 152 ++++++ packages/mock_server/fixtures/groups.json | 119 +++++ packages/mock_server/fixtures/lorem-ipsum.png | Bin 0 -> 159453 bytes packages/mock_server/fixtures/metadata.json | 1 + packages/mock_server/fixtures/notes.json | 26 + .../mock_server/fixtures/saved_views.json | 44 ++ packages/mock_server/fixtures/statistics.json | 16 + .../mock_server/fixtures/storage_paths.json | 17 + .../mock_server/fixtures/suggestions.json | 1 + packages/mock_server/fixtures/tags.json | 103 ++++ packages/mock_server/fixtures/tasks.json | 142 ++++++ .../mock_server/fixtures/ui_settings.json | 163 ++++++ packages/mock_server/fixtures/user-1.json | 148 ++++++ packages/mock_server/fixtures/users.json | 462 ++++++++++++++++++ .../ios/Flutter/Generated.xcconfig | 14 - .../ios/Flutter/flutter_export_environment.sh | 13 - packages/mock_server/lib/mock_server.dart | 217 +++++++- .../ephemeral/Flutter-Generated.xcconfig | 11 - .../ephemeral/flutter_export_environment.sh | 12 - packages/mock_server/pubspec.yaml | 4 +- pubspec.lock | 20 +- 23 files changed, 1880 insertions(+), 87 deletions(-) create mode 100644 packages/mock_server/fixtures/correspondents.json create mode 100644 packages/mock_server/fixtures/doc_types.json create mode 100644 packages/mock_server/fixtures/documents.json create mode 100644 packages/mock_server/fixtures/groups.json create mode 100644 packages/mock_server/fixtures/lorem-ipsum.png create mode 100644 packages/mock_server/fixtures/metadata.json create mode 100644 packages/mock_server/fixtures/notes.json create mode 100644 packages/mock_server/fixtures/saved_views.json create mode 100644 packages/mock_server/fixtures/statistics.json create mode 100644 packages/mock_server/fixtures/storage_paths.json create mode 100644 packages/mock_server/fixtures/suggestions.json create mode 100644 packages/mock_server/fixtures/tags.json create mode 100644 packages/mock_server/fixtures/tasks.json create mode 100644 packages/mock_server/fixtures/ui_settings.json create mode 100644 packages/mock_server/fixtures/user-1.json create mode 100644 packages/mock_server/fixtures/users.json delete mode 100644 packages/mock_server/ios/Flutter/Generated.xcconfig delete mode 100755 packages/mock_server/ios/Flutter/flutter_export_environment.sh delete mode 100644 packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig delete mode 100755 packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh diff --git a/packages/mock_server/fixtures/correspondents.json b/packages/mock_server/fixtures/correspondents.json new file mode 100644 index 0000000..d43ff66 --- /dev/null +++ b/packages/mock_server/fixtures/correspondents.json @@ -0,0 +1,257 @@ +{ + "count": 27, + "next": "http://localhost:8000/api/correspondents/?page=2", + "previous": null, + "results": [ + { + "id": 9, + "slug": "abc-test-correspondent", + "name": "ABC Test Correspondent", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 13, + "slug": "corresp-10", + "name": "Corresp 10", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 14, + "slug": "corresp-11", + "name": "Corresp 11", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 15, + "slug": "corresp-12", + "name": "Corresp 12", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 16, + "slug": "corresp-13", + "name": "Corresp 13", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 18, + "slug": "corresp-15", + "name": "Corresp 15", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 19, + "slug": "corresp-16", + "name": "Corresp 16", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 20, + "slug": "corresp-17", + "name": "Corresp 17", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 21, + "slug": "corresp-18", + "name": "Corresp 18", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 22, + "slug": "corresp-19", + "name": "Corresp 19", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 23, + "slug": "corresp-20", + "name": "Corresp 20", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 24, + "slug": "corresp-21", + "name": "Corresp 21", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 25, + "slug": "corresp-22", + "name": "Corresp 22", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 26, + "slug": "corresp-23", + "name": "Corresp 23", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 5, + "slug": "corresp-3", + "name": "Corresp 3", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 6, + "slug": "corresp-4", + "name": "Corresp 4", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 7, + "slug": "corresp-5", + "name": "Corresp 5", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 8, + "slug": "corresp-6", + "name": "Corresp 6", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 10, + "slug": "corresp-7", + "name": "Corresp 7", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 11, + "slug": "corresp-8", + "name": "Corresp 8", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 12, + "slug": "corresp-9", + "name": "Corresp 9", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 17, + "slug": "correspondent-14", + "name": "Correspondent 14", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 2, + "slug": "correspondent-2", + "name": "Correspondent 2", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 7, + "last_correspondence": "2021-01-20T23:37:58.204614Z" + }, + { + "id": 27, + "slug": "correspondent-slug", + "name": "Correspondent Slug", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1, + "last_correspondence": "2022-03-16T03:48:50.089624Z" + }, + { + "id": 4, + "slug": "newest-correspondent", + "name": "Newest Correspondent", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1, + "last_correspondence": "2021-02-07T08:00:00Z" + } + ] +} diff --git a/packages/mock_server/fixtures/doc_types.json b/packages/mock_server/fixtures/doc_types.json new file mode 100644 index 0000000..eb2d74a --- /dev/null +++ b/packages/mock_server/fixtures/doc_types.json @@ -0,0 +1,25 @@ +{ + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "slug": "test", + "name": "Test Doc Type", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1 + }, + { + "id": 2, + "slug": "test2", + "name": "Test Doc Type 2", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1 + } + ] +} diff --git a/packages/mock_server/fixtures/documents.json b/packages/mock_server/fixtures/documents.json new file mode 100644 index 0000000..c63e957 --- /dev/null +++ b/packages/mock_server/fixtures/documents.json @@ -0,0 +1,152 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "correspondent": 9, + "document_type": 1, + "storage_path": null, + "title": "No latin title", + "content": "Test document PDF \n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla est purus, ultrices in porttitor \nin, accumsan non quam. Nam consectetur porttitor rhoncus. Curabitur eu est et leo feugiat \nauctor vel quis lorem. Ut et ligula dolor, sit amet consequat lorem. Aliquam porta eros sed \nvelit imperdiet egestas. Maecenas tempus eros ut diam ullamcorper id dictum libero \ntempor. Donec quis augue quis magna condimentum lobortis. Quisque imperdiet ipsum vel \nmagna viverra rutrum. Cras viverra molestie urna, vitae vestibulum turpis varius id. \nVestibulum mollis, arcu iaculis bibendum varius, velit sapien blandit metus, ac posuere lorem \nnulla ac dolor. Maecenas urna elit, tincidunt in dapibus nec, vehicula eu dui. Duis lacinia \nfringilla massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur \nridiculus mus. Ut consequat ultricies est, non rhoncus mauris congue porta. Vivamus viverra \nsuscipit felis eget condimentum. Cum sociis natoque penatibus et magnis dis parturient \nmontes, nascetur ridiculus mus. Integer bibendum sagittis ligula, non faucibus nulla volutpat \nvitae. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. \nIn aliquet quam et velit bibendum accumsan. Cum sociis natoque penatibus et magnis dis \nparturient montes, nascetur ridiculus mus. Vestibulum vitae ipsum nec arcu semper \nadipiscing at ac lacus. Praesent id pellentesque orci. Morbi congue viverra nisl nec rhoncus. \nInteger mattis, ipsum a tincidunt commodo, lacus arcu elementum elit, at mollis eros ante ac \nrisus. In volutpat, ante at pretium ultricies, velit magna suscipit enim, aliquet blandit massa \norci nec lorem. Nulla facilisi. Duis eu vehicula arcu. Nulla facilisi. Maecenas pellentesque \nvolutpat felis, quis tristique ligula luctus vel. Sed nec mi eros. Integer augue enim, sollicitudin \nullamcorper mattis eget, aliquam in est. Morbi sollicitudin libero nec augue dignissim ut \nconsectetur dui volutpat. Nulla facilisi. Mauris egestas vestibulum neque cursus tincidunt. \nDonec sit amet pulvinar orci. \nQuisque volutpat pharetra tincidunt. Fusce sapien arcu, molestie eget varius egestas, \nfaucibus ac urna. Sed at nisi in velit egestas aliquam ut a felis. Aenean malesuada iaculis nisl, \nut tempor lacus egestas consequat. Nam nibh lectus, gravida sed egestas ut, feugiat quis \ndolor. Donec eu leo enim, non laoreet ante. Morbi dictum tempor vulputate. Phasellus \nultricies risus vel augue sagittis euismod. Vivamus tincidunt placerat nisi in aliquam. Cras \nquis mi ac nunc pretium aliquam. Aenean elementum erat ac metus commodo rhoncus. \nAliquam nulla augue, porta non sagittis quis, accumsan vitae sem. Phasellus id lectus tortor, \neget pulvinar augue. Etiam eget velit ac purus fringilla blandit. Donec odio odio, sagittis sed \niaculis sed, consectetur eget sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. \nMaecenas accumsan velit vel turpis rutrum in sodales diam placerat. \nQuisque luctus ullamcorper velit sit amet lobortis. Etiam ligula felis, vulputate quis rhoncus \nnec, fermentum eget odio. Vivamus vel ipsum ac augue sodales mollis euismod nec tellus. \nFusce et augue rutrum nunc semper vehicula vel semper nisl. Nam laoreet euismod quam at \nvarius. Sed aliquet auctor nibh. Curabitur malesuada fermentum lacus vel accumsan. Duis \nornare scelerisque nulla, ac pulvinar ligula tempus sit amet. In placerat nulla ac ante \nscelerisque posuere. Phasellus at ante felis. Sed hendrerit risus a metus posuere rutrum. \nPhasellus eu augue dui. Proin in vestibulum ipsum. Aenean accumsan mollis sapien, ut \neleifend sem blandit at. Vivamus luctus mi eget lorem lobortis pharetra. Phasellus at tortor \nquam, a volutpat purus. Etiam sollicitudin arcu vel elit bibendum et imperdiet risus tincidunt. \nEtiam elit velit, posuere ut pulvinar ac, condimentum eget justo. Fusce a erat velit. Vivamus \nimperdiet ultrices orci in hendrerit.", + "tags": [ + 4 + ], + "created": "2022-03-22T07:24:18Z", + "created_date": "2022-03-22", + "modified": "2022-03-22T07:24:23.264859Z", + "added": "2022-03-22T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "2022-03-22 no latin title.pdf", + "archived_file_name": "2022-03-22 no latin title.pdf", + "owner": null, + "user_can_change": true, + + "notes": [ + { + "id": 9, + "note": "Testing one more time", + "created": "2022-02-18T04:24:55.176008Z", + "user": 15 + }, + { + "id": 8, + "note": "Another note", + "created": "2021-11-08T04:24:47.925042Z", + "user": 3 + }, + { + "id": 7, + "note": "Cupcake ipsum dolor sit amet cheesecake candy cookie tiramisu. Donut chocolate chupa chups macaroon brownie halvah pie cheesecake gummies. Sweet chocolate bar candy donut gummi bears bear claw liquorice bonbon shortbread.\n\nDonut chocolate bar candy wafer wafer tiramisu. Gummies chocolate cake muffin toffee carrot cake macaroon. Toffee toffee jelly beans danish lollipop cake.", + "created": "2021-02-08T02:37:49.724132Z", + "user": 3 + } + ] + }, + { + "id": 2, + "correspondent": null, + "document_type": null, + "storage_path": 2, + "title": "lorem ipsum dolor sit amet", + "content": "Test document PDF", + "tags": [], + "created": "2022-03-23T07:24:18Z", + "created_date": "2022-03-23", + "modified": "2022-03-23T07:24:23.264859Z", + "added": "2022-03-23T07:24:22.922631Z", + "archive_serial_number": 12345, + "original_file_name": "2022-03-23 lorem ipsum dolor sit amet.pdf", + "archived_file_name": "2022-03-23 llorem ipsum dolor sit amet.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 3, + "correspondent": 14, + "document_type": 1, + "storage_path": null, + "title": "dolor", + "content": "Test document PDF", + "tags": [ + 2 + ], + "created": "2022-03-24T07:24:18Z", + "created_date": "2022-03-24", + "modified": "2022-03-24T07:24:23.264859Z", + "added": "2022-03-24T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "2022-03-24 dolor.pdf", + "archived_file_name": "2022-03-24 dolor.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 4, + "correspondent": 9, + "document_type": 2, + "storage_path": null, + "title": "sit amet", + "content": "Test document PDF", + "tags": [ + 4, 5 + ], + "created": "2022-06-01T07:24:18Z", + "created_date": "2022-06-01", + "modified": "2022-06-01T07:24:23.264859Z", + "added": "2022-06-01T07:24:22.922631Z", + "archive_serial_number": 12347, + "original_file_name": "2022-06-01 sit amet.pdf", + "archived_file_name": "2022-06-01 sit amet.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 5, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 5", + "content": "Test document 5", + "tags": [], + "created": "2023-05-01T07:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T07:24:23.264859Z", + "added": "2023-05-02T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc5.pdf", + "archived_file_name": "doc5.pdf", + "owner": 15, + "user_can_change": true, + + "notes": [] + }, + { + "id": 6, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 6", + "content": "Test document 6", + "tags": [], + "created": "2023-05-01T10:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T10:24:23.264859Z", + "added": "2023-05-02T10:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc6.pdf", + "archived_file_name": "doc6.pdf", + "owner": 6, + "user_can_change": true, + + "notes": [] + } + ] +} diff --git a/packages/mock_server/fixtures/groups.json b/packages/mock_server/fixtures/groups.json new file mode 100644 index 0000000..f6051be --- /dev/null +++ b/packages/mock_server/fixtures/groups.json @@ -0,0 +1,119 @@ +{ + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "id": 6, + "name": "Another Group", + "permissions": [ + "add_user", + "change_user", + "delete_user", + "view_user", + "add_note", + "change_note", + "delete_note", + "view_note" + ] + }, + { + "id": 1, + "name": "First Group", + "permissions": [ + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_correspondent", + "change_correspondent", + "delete_correspondent", + "view_correspondent", + "add_document", + "change_document", + "delete_document", + "view_document", + "add_documenttype", + "change_documenttype", + "delete_documenttype", + "view_documenttype", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_savedview", + "change_savedview", + "delete_savedview", + "view_savedview", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_session", + "change_session", + "delete_session", + "view_session" + ] + } + ] +} diff --git a/packages/mock_server/fixtures/lorem-ipsum.png b/packages/mock_server/fixtures/lorem-ipsum.png new file mode 100644 index 0000000000000000000000000000000000000000..a74f2aee2088c75ce09a0032a907ddef57966a11 GIT binary patch literal 159453 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

vI+C8S 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 S`h5l-4|y4|bfuJO$o~Q&AHU83 literal 0 HcmV?d00001 diff --git a/packages/mock_server/fixtures/metadata.json b/packages/mock_server/fixtures/metadata.json new file mode 100644 index 0000000..f5bfd95 --- /dev/null +++ b/packages/mock_server/fixtures/metadata.json @@ -0,0 +1 @@ +{"original_checksum":"e959bc7d593245d92685213264e962ba","original_size":963754,"original_mime_type":"application/pdf","media_filename":"2022/lorem-ipsum.pdf","has_archive_version":true,"original_metadata":[],"archive_checksum":"5a1f46a9150bcade978c764b039ce4d0","archive_media_filename":"2022/lorem-ipsum.pdf","archive_size":351160,"archive_metadata":[{"namespace":"http://ns.adobe.com/pdf/1.3/","prefix":"pdf","key":"Producer","value":"pikepdf5.0.1"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"ModifyDate","value":"2022-03-22T04:53:18+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreateDate","value":"2022-03-22T18:05:43+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreatorTool","value":"ocrmypdf13.4.0/TesseractOCR-PDF4.1.1"},{"namespace":"http://ns.adobe.com/xap/1.0/mm/","prefix":"xmpMM","key":"DocumentID","value":"uuid:df27edcf-e34a-11f7-0000-8fa6067a3c04"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"format","value":"application/pdf"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"title","value":"ScannedDocument"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"part","value":"2"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"conformance","value":"B"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"creator","value":"None"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"MetadataDate","value":"2022-03-22T21:53:18.882551-07:00"}]} diff --git a/packages/mock_server/fixtures/notes.json b/packages/mock_server/fixtures/notes.json new file mode 100644 index 0000000..dfd4449 --- /dev/null +++ b/packages/mock_server/fixtures/notes.json @@ -0,0 +1,26 @@ +[ + { + "id": 10, + "note": "Testing new note", + "created": "2022-08-08T04:24:55.176008Z", + "user": 3 + }, + { + "id": 9, + "note": "Testing one more time", + "created": "2022-02-18T04:24:55.176008Z", + "user": 15 + }, + { + "id": 8, + "note": "Another note", + "created": "2021-11-08T04:24:47.925042Z", + "user": 3 + }, + { + "id": 7, + "note": "Cupcake ipsum dolor sit amet cheesecake candy cookie tiramisu. Donut chocolate chupa chups macaroon brownie halvah pie cheesecake gummies. Sweet chocolate bar candy donut gummi bears bear claw liquorice bonbon shortbread.\n\nDonut chocolate bar candy wafer wafer tiramisu. Gummies chocolate cake muffin toffee carrot cake macaroon. Toffee toffee jelly beans danish lollipop cake.", + "created": "2021-02-08T02:37:49.724132Z", + "user": 3 + } +] \ No newline at end of file diff --git a/packages/mock_server/fixtures/saved_views.json b/packages/mock_server/fixtures/saved_views.json new file mode 100644 index 0000000..64afcf3 --- /dev/null +++ b/packages/mock_server/fixtures/saved_views.json @@ -0,0 +1,44 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "Inbox", + "show_on_dashboard": true, + "show_in_sidebar": true, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [ + { + "rule_type": 6, + "value": "18" + } + ] + }, + { + "id": 2, + "name": "Recently Added", + "show_on_dashboard": true, + "show_in_sidebar": false, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [] + }, + { + "id": 11, + "name": "Taxes", + "show_on_dashboard": false, + "show_in_sidebar": true, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [ + { + "rule_type": 6, + "value": "39" + } + ] + } + ] +} diff --git a/packages/mock_server/fixtures/statistics.json b/packages/mock_server/fixtures/statistics.json new file mode 100644 index 0000000..0cfe52b --- /dev/null +++ b/packages/mock_server/fixtures/statistics.json @@ -0,0 +1,16 @@ +{ + "documents_total": 64, + "documents_inbox": null, + "inbox_tag": null, + "document_file_type_counts": [ + { + "mime_type": "application/pdf", + "mime_type_count": 35 + }, + { + "mime_type": "image/jpeg", + "mime_type_count": 29 + } + ], + "character_count": 309035 +} \ No newline at end of file diff --git a/packages/mock_server/fixtures/storage_paths.json b/packages/mock_server/fixtures/storage_paths.json new file mode 100644 index 0000000..86ae9b7 --- /dev/null +++ b/packages/mock_server/fixtures/storage_paths.json @@ -0,0 +1,17 @@ +{ + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "slug": "year-title", + "name": "Year - Title", + "path": "{created_year}/{title}", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "document_count": 1 + } + ] +} diff --git a/packages/mock_server/fixtures/suggestions.json b/packages/mock_server/fixtures/suggestions.json new file mode 100644 index 0000000..39b9595 --- /dev/null +++ b/packages/mock_server/fixtures/suggestions.json @@ -0,0 +1 @@ +{"correspondents":[],"tags":[3],"document_types":[1]} \ No newline at end of file diff --git a/packages/mock_server/fixtures/tags.json b/packages/mock_server/fixtures/tags.json new file mode 100644 index 0000000..eefee90 --- /dev/null +++ b/packages/mock_server/fixtures/tags.json @@ -0,0 +1,103 @@ +{ + "count": 8, + "next": null, + "previous": null, + "results": [ + { + "id": 4, + "slug": "another-sample-tag", + "name": "Another Sample Tag", + "color": "#a6cee3", + "text_color": "#000000", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 3 + }, + { + "id": 7, + "slug": "newone", + "name": "NewOne", + "color": "#9e4ad1", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 2 + }, + { + "id": 6, + "slug": "partial-tag", + "name": "Partial Tag", + "color": "#72dba7", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 1 + }, + { + "id": 2, + "slug": "tag-2", + "name": "Tag 2", + "color": "#612db7", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 3 + }, + { + "id": 3, + "slug": "tag-3", + "name": "Tag 3", + "color": "#b2df8a", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 4 + }, + { + "id": 5, + "slug": "tagwithpartial", + "name": "TagWithPartial", + "color": "#3b2db4", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 2 + }, + { + "id": 8, + "slug": "test-another", + "name": "Test Another", + "color": "#3ccea5", + "text_color": "#000000", + "match": "", + "matching_algorithm": 4, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 0 + }, + { + "id": 1, + "slug": "test-tag", + "name": "Test Tag", + "color": "#fb9a99", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 4 + } + ] +} diff --git a/packages/mock_server/fixtures/tasks.json b/packages/mock_server/fixtures/tasks.json new file mode 100644 index 0000000..25e4d07 --- /dev/null +++ b/packages/mock_server/fixtures/tasks.json @@ -0,0 +1,142 @@ +[ + { + "id": 141, + "type": "file", + "result": "sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 316, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 218, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 113, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 84, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate.\n", + "status": "FAILURE", + "task_id": "d8ddbe298a42427d82553206ddf0bc94", + "task_file_name": "sample 2.pdf", + "date_created": "2022-05-26T23:17:38.333474-07:00", + "date_done": null, + "acknowledged": false, + "related_document": null + }, + { + "id": 132, + "type": "file", + "result": " : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 131, in get_version\n env=env,\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 68, in run\n proc = subprocess_run(args, env=env, **kwargs)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 423, in run\n with Popen(*popenargs, **kwargs) as process:\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 729, in __init__\n restore_signals, start_new_session)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 1364, in _execute_child\n raise child_exception_type(errno_num, err_msg, err_filename)\nFileNotFoundError: [Errno 2] No such file or directory: 'unpaper': 'unpaper'\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 287, in check_external_program\n found_version = version_checker()\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_exec/unpaper.py\", line 34, in version\n return get_version('unpaper')\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 137, in get_version\n ) from e\nocrmypdf.exceptions.MissingDependencyError: Could not find program 'unpaper' on the PATH\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 176, in parse\n ocrmypdf.ocr(**ocr_args)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/api.py\", line 315, in ocr\n check_options(options, plugin_manager)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 260, in check_options\n _check_options(options, plugin_manager, ocr_engine_languages)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 250, in _check_options\n check_options_preprocessing(options)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 128, in check_options_preprocessing\n required_for=['--clean, --clean-final'],\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 293, in check_external_program\n raise MissingDependencyError()\nocrmypdf.exceptions.MissingDependencyError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 179, in try_consume_file\n document_parser.parse(self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 197, in parse\n raise ParseError(e)\ndocuments.parsers.ParseError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 73, in consume_file\n override_tag_ids=override_tag_ids)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 196, in try_consume_file\n raise ConsumerError(e)\ndocuments.consumer.ConsumerError\n", + "status": "FAILURE", + "task_id": "4c554075552c4cc985abd76e6f274c90", + "task_file_name": "pdf-sample 10.24.48 PM.pdf", + "date_created": "2022-05-26T14:26:07.846365-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 115, + "type": "file", + "result": "2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 75, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 168, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 85, in pre_check_duplicate\n self._fail(\"Document is a duplicate\")\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 53, in _fail\n raise ConsumerError(f\"{self.filename}: {message}\")\ndocuments.consumer.ConsumerError: 2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate\n", + "status": "FAILURE", + "task_id": "86494713646a4364b01da17aadca071d", + "task_file_name": "2021-01-24 2021-01-20 sample_wide_orange.pdf", + "date_created": "2022-05-26T14:26:07.817608-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 85, + "type": "file", + "result": "cannot open resource : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 81, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 244, in try_consume_file\n self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/parsers.py\", line 302, in get_optimised_thumbnail\n thumbnail = self.get_thumbnail(document_path, mime_type, file_name)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_text/parsers.py\", line 29, in get_thumbnail\n layout_engine=ImageFont.LAYOUT_BASIC)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 852, in truetype\n return freetype(font)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 849, in freetype\n return FreeTypeFont(font, size, index, encoding, layout_engine)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 210, in __init__\n font, size, index, encoding, layout_engine=layout_engine\nOSError: cannot open resource\n", + "status": "FAILURE", + "task_id": "abca803fa46342e1ac81f3d3f2080e79", + "task_file_name": "simple.txt", + "date_created": "2022-05-26T14:26:07.771541-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 41, + "type": "file", + "result": "commands.txt: Not consuming commands.txt: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 70, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 199, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 97, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 69, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: commands.txt: Not consuming commands.txt: It is a duplicate.\n", + "status": "FAILURE", + "task_id": "0af67672e8e14404b060d4cf8f69313d", + "task_file_name": "commands.txt", + "date_created": "2022-05-26T14:26:07.704247-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 10, + "type": "file", + "result": "Success. New document id 260 created", + "status": "SUCCESS", + "task_id": "b7629a0f41bd40c7a3ea4680341321b5", + "task_file_name": "2022-03-24+Sonstige+ScanPC2022-03-24_081058.pdf", + "date_created": "2022-05-26T14:26:07.670577-07:00", + "date_done": "2022-05-26T14:26:07.670577-07:00", + "acknowledged": false, + "related_document": 260 + }, + { + "id": 9, + "type": "file", + "result": "Success. New document id 261 created", + "status": "SUCCESS", + "task_id": "02e276a86a424ccfb83309df5d8594be", + "task_file_name": "2sample-pdf-with-images.pdf", + "date_created": "2022-05-26T14:26:07.668987-07:00", + "date_done": "2022-05-26T14:26:07.668987-07:00", + "acknowledged": false, + "related_document": 261 + }, + { + "id": 8, + "type": "file", + "result": "Success. New document id 262 created", + "status": "SUCCESS", + "task_id": "41229b8be9b445c0a523697d0f58f13e", + "task_file_name": "2sample-pdf-with-images_pw.pdf", + "date_created": "2022-05-26T14:26:07.667993-07:00", + "date_done": "2022-05-26T14:26:07.667993-07:00", + "acknowledged": false, + "related_document": 262 + }, + { + "id": 6, + "type": "file", + "result": "Success. New document id 264 created", + "status": "SUCCESS", + "task_id": "bbbca32d408c4619bd0b512a8327c773", + "task_file_name": "homebridge.log", + "date_created": "2022-05-26T14:26:07.665560-07:00", + "date_done": "2022-05-26T14:26:07.665560-07:00", + "acknowledged": false, + "related_document": 264 + }, + { + "id": 5, + "type": "file", + "result": "Success. New document id 265 created", + "status": "SUCCESS", + "task_id": "00ab285ab4bf482ab30c7d580b252ecb", + "task_file_name": "IMG_7459.PNG", + "date_created": "2022-05-26T14:26:07.664506-07:00", + "date_done": "2022-05-26T14:26:07.664506-07:00", + "acknowledged": false, + "related_document": 265 + }, + { + "id": 3, + "type": "file", + "result": "Success. New document id 267 created", + "status": "SUCCESS", + "task_id": "289c5163cfec410db42948a0cacbeb9c", + "task_file_name": "IMG_7459.PNG", + "date_created": "2022-05-26T14:26:07.659661-07:00", + "date_done": "2022-05-26T14:26:07.659661-07:00", + "acknowledged": false, + "related_document": 267 + }, + { + "id": 1, + "type": "file", + "result": null, + "status": "STARTED", + "task_id": "7a4ebdb2bde04311935284027ef8ca65", + "task_file_name": "2019-08-04 DSA Questionnaire - 5-8-19.pdf", + "date_created": "2022-05-26T14:26:07.655276-07:00", + "date_done": null, + "acknowledged": false, + "related_document": null + } +] diff --git a/packages/mock_server/fixtures/ui_settings.json b/packages/mock_server/fixtures/ui_settings.json new file mode 100644 index 0000000..b885eec --- /dev/null +++ b/packages/mock_server/fixtures/ui_settings.json @@ -0,0 +1,163 @@ +{ + "user": { + "id": 1, + "username": "admin", + "is_superuser": true, + "groups": [] + }, + "settings": { + "language": "", + "bulk_edit": { + "confirmation_dialogs": true, + "apply_on_close": false + }, + "documentListSize": 50, + "dark_mode": { + "use_system": true, + "enabled": "false", + "thumb_inverted": "true" + }, + "theme": { + "color": "#b198e5" + }, + "document_details": { + "native_pdf_viewer": false + }, + "date_display": { + "date_locale": "", + "date_format": "mediumDate" + }, + "notifications": { + "consumer_new_documents": true, + "consumer_success": true, + "consumer_failed": true, + "consumer_suppress_on_dashboard": true + } + }, + "permissions": [ + "add_logentry", + "change_logentry", + "delete_logentry", + "view_logentry", + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_user", + "change_user", + "delete_user", + "view_user", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_correspondent", + "change_correspondent", + "delete_correspondent", + "view_correspondent", + "add_document", + "change_document", + "delete_document", + "view_document", + "add_documenttype", + "change_documenttype", + "delete_documenttype", + "view_documenttype", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_paperlesstask", + "change_paperlesstask", + "delete_paperlesstask", + "view_paperlesstask", + "add_savedview", + "change_savedview", + "delete_savedview", + "view_savedview", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_storagepath", + "change_storagepath", + "delete_storagepath", + "view_storagepath", + "add_tag", + "change_tag", + "delete_tag", + "view_tag", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_uisettings", + "change_uisettings", + "delete_uisettings", + "view_uisettings", + "add_mailaccount", + "change_mailaccount", + "delete_mailaccount", + "view_mailaccount", + "add_mailrule", + "change_mailrule", + "delete_mailrule", + "view_mailrule", + "add_session", + "change_session", + "delete_session", + "view_session" + ] +} diff --git a/packages/mock_server/fixtures/user-1.json b/packages/mock_server/fixtures/user-1.json new file mode 100644 index 0000000..cc264b0 --- /dev/null +++ b/packages/mock_server/fixtures/user-1.json @@ -0,0 +1,148 @@ +{ + "id": 1, + "username": "admin", + "password": "**********", + "email": "test2@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-02-14T23:11:09.103293Z", + "is_staff": true, + "is_active": true, + "is_superuser": true, + "groups": [], + "user_permissions": [], + "inherited_permissions": [ + "auth.delete_permission", + "paperless_mail.change_mailrule", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "documents.view_paperlesstask", + "django_q.add_success", + "documents.view_uisettings", + "auth.change_user", + "admin.delete_logentry", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "paperless_mail.add_mailaccount", + "auth.change_group", + "documents.add_note", + "paperless_mail.delete_mailaccount", + "authtoken.delete_tokenproxy", + "guardian.delete_groupobjectpermission", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "documents.delete_tag", + "documents.change_note", + "django_q.delete_task", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "paperless_mail.add_mailrule", + "paperless_mail.view_mailaccount", + "documents.add_frontendsettings", + "sessions.change_session", + "documents.view_savedview", + "authtoken.add_tokenproxy", + "documents.change_tag", + "documents.view_document", + "documents.add_savedview", + "auth.delete_user", + "documents.view_log", + "documents.view_note", + "guardian.change_groupobjectpermission", + "sessions.delete_session", + "django_q.change_failure", + "guardian.change_userobjectpermission", + "documents.change_storagepath", + "documents.delete_document", + "documents.delete_taskattributes", + "django_celery_results.change_groupresult", + "django_q.add_ormq", + "guardian.view_groupobjectpermission", + "admin.change_logentry", + "django_q.delete_schedule", + "documents.delete_paperlesstask", + "django_q.view_ormq", + "documents.change_paperlesstask", + "guardian.delete_userobjectpermission", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "authtoken.change_token", + "guardian.add_groupobjectpermission", + "documents.view_documenttype", + "documents.change_log", + "paperless_mail.delete_mailrule", + "auth.view_group", + "authtoken.view_token", + "admin.view_logentry", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.view_storagepath", + "documents.add_storagepath", + "django_celery_results.add_groupresult", + "documents.view_tag", + "guardian.view_userobjectpermission", + "documents.delete_correspondent", + "documents.add_tag", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "django_q.change_task", + "documents.add_taskattributes", + "documents.delete_storagepath", + "sessions.add_session", + "documents.add_uisettings", + "documents.change_taskattributes", + "documents.delete_uisettings", + "django_q.delete_ormq", + "auth.change_permission", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "paperless_mail.change_mailaccount", + "documents.add_paperlesstask", + "django_q.view_success", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "django_celery_results.add_chordcounter", + "contenttypes.change_contenttype", + "admin.add_logentry", + "django_q.delete_failure", + "documents.change_uisettings", + "django_q.view_failure", + "documents.add_log", + "documents.change_savedview", + "paperless_mail.view_mailrule", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "guardian.add_userobjectpermission", + "sessions.view_session", + "contenttypes.view_contenttype", + "auth.add_permission", + "documents.delete_log", + "django_q.add_task", + "auth.add_group" + ] +} diff --git a/packages/mock_server/fixtures/users.json b/packages/mock_server/fixtures/users.json new file mode 100644 index 0000000..875be85 --- /dev/null +++ b/packages/mock_server/fixtures/users.json @@ -0,0 +1,462 @@ +{ + "count": 4, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "username": "admin", + "password": "**********", + "email": "test@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-02-14T23:11:09.103293Z", + "is_staff": true, + "is_active": true, + "is_superuser": true, + "groups": [], + "user_permissions": [], + "inherited_permissions": [ + "auth.delete_permission", + "paperless_mail.change_mailrule", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "documents.view_paperlesstask", + "django_q.add_success", + "documents.view_uisettings", + "auth.change_user", + "admin.delete_logentry", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "paperless_mail.add_mailaccount", + "auth.change_group", + "documents.add_note", + "paperless_mail.delete_mailaccount", + "authtoken.delete_tokenproxy", + "guardian.delete_groupobjectpermission", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "documents.delete_tag", + "documents.change_note", + "django_q.delete_task", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "paperless_mail.add_mailrule", + "paperless_mail.view_mailaccount", + "documents.add_frontendsettings", + "sessions.change_session", + "documents.view_savedview", + "authtoken.add_tokenproxy", + "documents.change_tag", + "documents.view_document", + "documents.add_savedview", + "auth.delete_user", + "documents.view_log", + "documents.view_note", + "guardian.change_groupobjectpermission", + "sessions.delete_session", + "django_q.change_failure", + "guardian.change_userobjectpermission", + "documents.change_storagepath", + "documents.delete_document", + "documents.delete_taskattributes", + "django_celery_results.change_groupresult", + "django_q.add_ormq", + "guardian.view_groupobjectpermission", + "admin.change_logentry", + "django_q.delete_schedule", + "documents.delete_paperlesstask", + "django_q.view_ormq", + "documents.change_paperlesstask", + "guardian.delete_userobjectpermission", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "authtoken.change_token", + "guardian.add_groupobjectpermission", + "documents.view_documenttype", + "documents.change_log", + "paperless_mail.delete_mailrule", + "auth.view_group", + "authtoken.view_token", + "admin.view_logentry", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.view_storagepath", + "documents.add_storagepath", + "django_celery_results.add_groupresult", + "documents.view_tag", + "guardian.view_userobjectpermission", + "documents.delete_correspondent", + "documents.add_tag", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "django_q.change_task", + "documents.add_taskattributes", + "documents.delete_storagepath", + "sessions.add_session", + "documents.add_uisettings", + "documents.change_taskattributes", + "documents.delete_uisettings", + "django_q.delete_ormq", + "auth.change_permission", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "paperless_mail.change_mailaccount", + "documents.add_paperlesstask", + "django_q.view_success", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "django_celery_results.add_chordcounter", + "contenttypes.change_contenttype", + "admin.add_logentry", + "django_q.delete_failure", + "documents.change_uisettings", + "django_q.view_failure", + "documents.add_log", + "documents.change_savedview", + "paperless_mail.view_mailrule", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "guardian.add_userobjectpermission", + "sessions.view_session", + "contenttypes.view_contenttype", + "auth.add_permission", + "documents.delete_log", + "django_q.add_task", + "auth.add_group" + ] + }, + { + "id": 15, + "username": "test", + "email": "test2@test.com", + "password": "**********", + "first_name": "", + "last_name": "", + "date_joined": "2022-11-23T08:30:54Z", + "is_staff": true, + "is_active": true, + "is_superuser": false, + "groups": [ + 1 + ], + "user_permissions": [ + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_session", + "change_session", + "delete_session", + "view_session" + ], + "inherited_permissions": [ + "auth.delete_permission", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "django_q.add_ormq", + "django_q.add_success", + "django_q.delete_schedule", + "django_q.view_ormq", + "auth.view_permission", + "django_q.add_schedule", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "authtoken.change_token", + "auth.change_group", + "documents.add_note", + "authtoken.delete_tokenproxy", + "documents.view_documenttype", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.change_log", + "auth.view_group", + "authtoken.view_token", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "django_celery_results.add_groupresult", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "auth.add_permission", + "documents.delete_correspondent", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "documents.add_taskattributes", + "django_q.change_task", + "sessions.add_session", + "documents.change_taskattributes", + "documents.change_note", + "django_q.delete_task", + "django_q.delete_ormq", + "auth.change_permission", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "django_q.view_success", + "documents.add_frontendsettings", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "sessions.change_session", + "django_celery_results.add_chordcounter", + "documents.view_savedview", + "contenttypes.change_contenttype", + "django_q.delete_failure", + "authtoken.add_tokenproxy", + "documents.view_document", + "documents.add_savedview", + "django_q.view_failure", + "documents.view_note", + "documents.view_log", + "documents.add_log", + "documents.change_savedview", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "sessions.delete_session", + "django_q.change_failure", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "sessions.view_session", + "contenttypes.view_contenttype", + "documents.delete_taskattributes", + "documents.delete_document", + "documents.delete_log", + "django_q.add_task", + "django_celery_results.change_groupresult", + "auth.add_group" + ] + }, + { + "id": 6, + "username": "testuser", + "password": "**********", + "email": "test3@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-11-16T04:14:20.484914Z", + "is_staff": false, + "is_active": true, + "is_superuser": false, + "groups": [ + 1, + 6 + ], + "user_permissions": [ + "add_logentry", + "change_logentry", + "delete_logentry", + "view_logentry" + ], + "inherited_permissions": [ + "auth.delete_permission", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "django_q.add_ormq", + "django_q.add_success", + "django_q.delete_schedule", + "django_q.view_ormq", + "auth.change_user", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "authtoken.change_token", + "auth.change_group", + "documents.add_note", + "authtoken.delete_tokenproxy", + "documents.view_documenttype", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.change_log", + "auth.view_group", + "authtoken.view_token", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "django_celery_results.add_groupresult", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "auth.add_permission", + "documents.delete_correspondent", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "documents.add_taskattributes", + "django_q.change_task", + "sessions.add_session", + "documents.change_taskattributes", + "documents.change_note", + "django_q.delete_task", + "django_q.delete_ormq", + "auth.change_permission", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "django_q.view_success", + "documents.add_frontendsettings", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "sessions.change_session", + "django_celery_results.add_chordcounter", + "documents.view_savedview", + "contenttypes.change_contenttype", + "django_q.delete_failure", + "authtoken.add_tokenproxy", + "documents.view_document", + "documents.add_savedview", + "django_q.view_failure", + "documents.view_note", + "documents.view_log", + "auth.delete_user", + "documents.add_log", + "documents.change_savedview", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "sessions.delete_session", + "django_q.change_failure", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "sessions.view_session", + "contenttypes.view_contenttype", + "documents.delete_taskattributes", + "documents.delete_document", + "documents.delete_log", + "django_q.add_task", + "django_celery_results.change_groupresult", + "auth.add_group" + ] + } + ] +} diff --git a/packages/mock_server/ios/Flutter/Generated.xcconfig b/packages/mock_server/ios/Flutter/Generated.xcconfig deleted file mode 100644 index e3b3caf..0000000 --- a/packages/mock_server/ios/Flutter/Generated.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter -FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server -COCOAPODS_PARALLEL_CODE_SIGN=true -FLUTTER_TARGET=lib/main.dart -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=0.0.1 -FLUTTER_BUILD_NUMBER=0.0.1 -EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 -EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/ios/Flutter/flutter_export_environment.sh b/packages/mock_server/ios/Flutter/flutter_export_environment.sh deleted file mode 100755 index c58c84e..0000000 --- a/packages/mock_server/ios/Flutter/flutter_export_environment.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" -export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_TARGET=lib/main.dart" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=0.0.1" -export "FLUTTER_BUILD_NUMBER=0.0.1" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart index 6540acb..4d3ad2b 100644 --- a/packages/mock_server/lib/mock_server.dart +++ b/packages/mock_server/lib/mock_server.dart @@ -1,7 +1,8 @@ library mock_server; import 'dart:convert'; - +import 'dart:math'; +import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; @@ -11,7 +12,8 @@ import 'package:shelf/shelf_io.dart' as shelf_io; import 'package:shelf_router/shelf_router.dart' as shelf_router; - +import 'package:flutter/services.dart' show rootBundle; +import 'dart:convert'; Logger log = Logger('LocalMockApiServer'); @@ -25,12 +27,17 @@ class LocalMockApiServer { late shelf_router.Router app; - + Future> loadFixture(String name) async { + var fixture = await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); + return json.decode(fixture); + } LocalMockApiServer() { app = shelf_router.Router(); + Map createdTags = {}; + app.get('/api/', (Request req) async { log.info('Responding to /api'); @@ -41,7 +48,7 @@ class LocalMockApiServer { app.post('/api/token/', (Request req) async { log.info('Responding to /api/token/'); var body = await req.bodyJsonMap(); - if (body?['username'] == 'test' && body?['password'] == 'test') { + if (body?['username'] == 'admin' && body?['password'] == 'test') { return JsonMockResponse.ok({ 'token': 'testToken' }); @@ -55,32 +62,190 @@ class LocalMockApiServer { app.get('/api/ui_settings/', (Request req) async { log.info('Responding to /api/ui_settings/'); - return JsonMockResponse.ok({ - 'user': { - 'id': 1, - 'username': 'test', - 'displayName': 'Test User' - } - }); + var data = await loadFixture('ui_settings'); + return JsonMockResponse.ok(data); }); app.get('/api/users//', (Request req, String userId) async { log.info('Responding to /api/users//'); - return JsonMockResponse.ok({ - 'id': 1, - 'username': 'test', - 'displayName': 'Test User', - 'email': 'test@test.pl', - 'firstName': 'Test', - 'lastName': 'User', - 'dateJoined': '2000-01-23T01:23:45', - 'isStaff': false, - 'isActive': true, - 'isSuperuser': true, - 'groups': [], - 'userPermissions': [], - 'inheritedPermissions': [] - }); + var data = await loadFixture('user-1'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/users/', (Request req, String userId) async { + log.info('Responding to /api/users/'); + var data = await loadFixture('users'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/groups/', (Request req, String userId) async { + log.info('Responding to /api/groups/'); + var data = await loadFixture('groups'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/correspondents/', (Request req) async { + log.info('Responding to /api/correspondents/'); + var data = await loadFixture('correspondents'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/document_types/', (Request req) async { + log.info('Responding to /api/document_types/'); + var data = await loadFixture('doc_types'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/tags/', (Request req) async { + log.info('Responding to /api/tags/'); + if (createdTags.isEmpty) { + var data = await loadFixture("tags"); + createdTags = data; + } + return JsonMockResponse.ok(createdTags); + }); + + app.post('/api/tags/', (Request req) async { + log.info('Responding to POST /api/tags/'); + var body = await req.bodyJsonMap(); + var data = { + "id": Random().nextInt(200), + "slug": body?['name'], + "name": body?['name'], + "color": body?['color'], + "text_color":"#000000", + "match":"", + "matching_algorithm": body?['matching_algorithm'], + "is_insensitive": body?['is_insensitive'], + "is_inbox_tag":false, + "owner":1, + "user_can_change":true, + "document_count": Random().nextInt(200) + }; + (createdTags['results'] as List).add(data); + return Response( + 201, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.put('/api/tags//', (Request req, String tagId) async { + log.info('Responding to PUT /api/tags//'); + var body = await req.bodyJsonMap(); + var data = { + "id": body?['id'], + "slug": body?['name'], + "name": body?['name'], + "color": body?['color'], + "text_color":"#000000", + "match":"", + "matching_algorithm": body?['matching_algorithm'], + "is_insensitive": body?['is_insensitive'], + "is_inbox_tag":false, + "owner":1, + "user_can_change":true, + "document_count": Random().nextInt(200) + }; + var index = (createdTags['results'] as List).indexWhere((element) => element['id'] == body?['id']); + (createdTags['results'] as List)[index] = data; + return Response( + 200, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.delete('/api/tags//', (Request req, String tagId) async { + log.info('Responding to PUT /api/tags//'); + (createdTags['results'] as List).removeWhere((element) => element['id'] == tagId); + return Response( + 204, + body: null, + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.get('/api/storage_paths/', (Request req) async { + log.info('Responding to /api/storage_paths/'); + var data = await loadFixture('storage_paths'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/storage_paths/', (Request req) async { + log.info('Responding to /api/storage_paths/'); + var data = await loadFixture('storage_paths'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/saved_views/', (Request req) async { + log.info('Responding to /api/saved_views/'); + var data = await loadFixture('saved_views'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/documents/', (Request req) async { + log.info('Responding to /api/documents/'); + var data = await loadFixture('documents'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/documents//thumb/', (Request req, String docId) async { + log.info('Responding to /api/documents//thumb/'); + var thumb = await rootBundle.load('packages/mock_server/fixtures/lorem-ipsum.png'); + try { + var resp = Response.ok( + http.ByteStream.fromBytes(thumb.buffer.asInt8List()), + headers: {'Content-Type': 'image/png'}, + ); + return resp; + } catch (e) { + return null; + } + }); + + app.get('/api/documents//metadata/', (Request req, String docId) async { + log.info('Responding to /api/documents//metadata/'); + var data = await loadFixture('metadata'); + return JsonMockResponse.ok(data); + }); + + //This is not yet used in the app + app.get('/api/documents//suggestions/', (Request req, String docId) async { + log.info('Responding to /api/documents//suggestions/'); + var data = await loadFixture('suggestions'); + return JsonMockResponse.ok(data); + }); + + //This is not yet used in the app + app.get('/api/documents//notes/', (Request req, String docId) async { + log.info('Responding to /api/documents//notes/'); + var data = await loadFixture('notes'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/tasks/', (Request req) async { + log.info('Responding to /api/tasks/'); + var data = await loadFixture('tasks'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/statistics/', (Request req) async { + log.info('Responding to /api/statistics/'); + var data = await loadFixture('statistics'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/statistics/', (Request req) async { + log.info('Responding to /api/statistics/'); + var data = await loadFixture('statistics'); + return JsonMockResponse.ok(data); }); } diff --git a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig deleted file mode 100644 index e822246..0000000 --- a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter -FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server -COCOAPODS_PARALLEL_CODE_SIGN=true -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=0.0.1 -FLUTTER_BUILD_NUMBER=0.0.1 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh deleted file mode 100755 index ded31c1..0000000 --- a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" -export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=0.0.1" -export "FLUTTER_BUILD_NUMBER=0.0.1" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/pubspec.yaml b/packages/mock_server/pubspec.yaml index 53e8177..0808b48 100644 --- a/packages/mock_server/pubspec.yaml +++ b/packages/mock_server/pubspec.yaml @@ -24,7 +24,9 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - + assets: + - fixtures/ + - fixtures/ui_settings.json # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/pubspec.lock b/pubspec.lock index 25bb03b..9ee1b3c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -261,10 +261,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "45262924896ff72a8cd92b722bb7e3d5020f9e0724531a3e10e22ddae2005991" + sha256: "8599ae9edca5ff96163fca3e36f8e481ea917d1e71cdad912c084b5579913f34" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" connectivity_plus_platform_interface: dependency: transitive description: @@ -325,10 +325,10 @@ packages: dependency: transitive description: name: dart_code_metrics_presets - sha256: "22e27f98e8c7d8b11cca43d2656a822935280747050ae65e8cd03c52d09c0d1c" + sha256: b71eadf02a3787ebd5c887623f83f6fdc204d45c75a081bd636c4104b3fd8b73 url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" dart_style: dependency: transitive description: @@ -621,10 +621,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "96af49aa6b57c10a312106ad6f71deed5a754029c24789bbf620ba784f0bd0b0" + sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.15" flutter_secure_storage: dependency: "direct main" description: @@ -748,10 +748,10 @@ packages: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" graphs: dependency: "direct overridden" description: @@ -1072,10 +1072,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: d39e8fbff4c5aef4592737e25ad6ac500df006ce7a7a8e1f838ce1256e167542 + sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" package_info_plus_platform_interface: dependency: transitive description: From 3979f255f621314aa70d48b405a9f88400d5e60b Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 18:47:54 +0200 Subject: [PATCH 03/11] FEATURE dart format --- packages/mock_server/lib/mock_server.dart | 114 +++++++--------------- 1 file changed, 36 insertions(+), 78 deletions(-) diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart index 4d3ad2b..281209c 100644 --- a/packages/mock_server/lib/mock_server.dart +++ b/packages/mock_server/lib/mock_server.dart @@ -14,50 +14,41 @@ import 'package:shelf_router/shelf_router.dart' as shelf_router; import 'package:flutter/services.dart' show rootBundle; import 'dart:convert'; + Logger log = Logger('LocalMockApiServer'); - class LocalMockApiServer { - static final host = 'localhost'; static final port = 3131; static get baseUrl => 'http://$host:$port/'; - late shelf_router.Router app; Future> loadFixture(String name) async { - var fixture = await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); + var fixture = + await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); return json.decode(fixture); } LocalMockApiServer() { - app = shelf_router.Router(); Map createdTags = {}; - app.get('/api/', (Request req) async { log.info('Responding to /api'); - return JsonMockResponse.ok({ - }); + return JsonMockResponse.ok({}); }); app.post('/api/token/', (Request req) async { log.info('Responding to /api/token/'); var body = await req.bodyJsonMap(); if (body?['username'] == 'admin' && body?['password'] == 'test') { - return JsonMockResponse.ok({ - 'token': 'testToken' - }); + return JsonMockResponse.ok({'token': 'testToken'}); } else { - return Response.unauthorized( - 'Unauthorized' - ); + return Response.unauthorized('Unauthorized'); } - }); app.get('/api/ui_settings/', (Request req) async { @@ -113,23 +104,21 @@ class LocalMockApiServer { "slug": body?['name'], "name": body?['name'], "color": body?['color'], - "text_color":"#000000", - "match":"", + "text_color": "#000000", + "match": "", "matching_algorithm": body?['matching_algorithm'], "is_insensitive": body?['is_insensitive'], - "is_inbox_tag":false, - "owner":1, - "user_can_change":true, + "is_inbox_tag": false, + "owner": 1, + "user_can_change": true, "document_count": Random().nextInt(200) }; (createdTags['results'] as List).add(data); - return Response( - 201, - body: jsonEncode(data), - headers: {'Content-Type': 'application/json'}, - encoding: null, - context: null - ); + return Response(201, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null); }); app.put('/api/tags//', (Request req, String tagId) async { @@ -140,36 +129,34 @@ class LocalMockApiServer { "slug": body?['name'], "name": body?['name'], "color": body?['color'], - "text_color":"#000000", - "match":"", + "text_color": "#000000", + "match": "", "matching_algorithm": body?['matching_algorithm'], "is_insensitive": body?['is_insensitive'], - "is_inbox_tag":false, - "owner":1, - "user_can_change":true, + "is_inbox_tag": false, + "owner": 1, + "user_can_change": true, "document_count": Random().nextInt(200) }; - var index = (createdTags['results'] as List).indexWhere((element) => element['id'] == body?['id']); + var index = (createdTags['results'] as List) + .indexWhere((element) => element['id'] == body?['id']); (createdTags['results'] as List)[index] = data; - return Response( - 200, + return Response(200, body: jsonEncode(data), headers: {'Content-Type': 'application/json'}, encoding: null, - context: null - ); + context: null); }); app.delete('/api/tags//', (Request req, String tagId) async { log.info('Responding to PUT /api/tags//'); - (createdTags['results'] as List).removeWhere((element) => element['id'] == tagId); - return Response( - 204, + (createdTags['results'] as List) + .removeWhere((element) => element['id'] == tagId); + return Response(204, body: null, headers: {'Content-Type': 'application/json'}, encoding: null, - context: null - ); + context: null); }); app.get('/api/storage_paths/', (Request req) async { @@ -198,7 +185,8 @@ class LocalMockApiServer { app.get('/api/documents//thumb/', (Request req, String docId) async { log.info('Responding to /api/documents//thumb/'); - var thumb = await rootBundle.load('packages/mock_server/fixtures/lorem-ipsum.png'); + var thumb = await rootBundle + .load('packages/mock_server/fixtures/lorem-ipsum.png'); try { var resp = Response.ok( http.ByteStream.fromBytes(thumb.buffer.asInt8List()), @@ -210,14 +198,16 @@ class LocalMockApiServer { } }); - app.get('/api/documents//metadata/', (Request req, String docId) async { + app.get('/api/documents//metadata/', + (Request req, String docId) async { log.info('Responding to /api/documents//metadata/'); var data = await loadFixture('metadata'); return JsonMockResponse.ok(data); }); //This is not yet used in the app - app.get('/api/documents//suggestions/', (Request req, String docId) async { + app.get('/api/documents//suggestions/', + (Request req, String docId) async { log.info('Responding to /api/documents//suggestions/'); var data = await loadFixture('suggestions'); return JsonMockResponse.ok(data); @@ -247,80 +237,48 @@ class LocalMockApiServer { var data = await loadFixture('statistics'); return JsonMockResponse.ok(data); }); - } - Future start() async { - log.info('starting...'); - var handler = const Pipeline().addMiddleware( - logRequests(logger: (message, isError) { - if (isError) - log.severe(message); - else - log.info(message); - }), - ).addHandler(app); - var server = await shelf_io.serve(handler, host, port); server.autoCompress = true; - log.info('serving on: $baseUrl'); - } - } - extension on Request { - Future bodyJsonValue(String param) async { - return jsonDecode(await this.readAsString())?[param]; - } Future bodyJsonMap() async { - return jsonDecode(await this.readAsString()); - } - String? get accessToken => - this.headers['Authorization']?.split('Bearer ').last; - } - extension JsonMockResponse on Response { - static ok(T json, {int delay = 800}) async { - await Future.delayed(Duration(milliseconds: delay)); // Emulate lag return Response.ok( - jsonEncode(json), - headers: {'Content-Type': 'application/json'}, - ); - } - -} \ No newline at end of file +} From f217ac37bad561ae135521e578306ed619cb832a Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 19:24:07 +0200 Subject: [PATCH 04/11] FEATURE remove generated files --- .../plugins/GeneratedPluginRegistrant.java | 23 ------------------- packages/mock_server/android/local.properties | 2 -- .../ios/Runner/GeneratedPluginRegistrant.h | 19 --------------- .../ios/Runner/GeneratedPluginRegistrant.m | 14 ----------- .../flutter/generated_plugin_registrant.cc | 11 --------- .../flutter/generated_plugin_registrant.h | 15 ------------ .../linux/flutter/generated_plugins.cmake | 23 ------------------- .../Flutter/GeneratedPluginRegistrant.swift | 10 -------- .../flutter/generated_plugin_registrant.cc | 11 --------- .../flutter/generated_plugin_registrant.h | 15 ------------ .../windows/flutter/generated_plugins.cmake | 23 ------------------- 11 files changed, 166 deletions(-) delete mode 100644 packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java delete mode 100644 packages/mock_server/android/local.properties delete mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h delete mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m delete mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.cc delete mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.h delete mode 100644 packages/mock_server/linux/flutter/generated_plugins.cmake delete mode 100644 packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift delete mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.cc delete mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.h delete mode 100644 packages/mock_server/windows/flutter/generated_plugins.cmake diff --git a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java deleted file mode 100644 index d007606..0000000 --- a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.flutter.plugins; - -import io.flutter.plugin.common.PluginRegistry; - -/** - * Generated file. Do not edit. - */ -public final class GeneratedPluginRegistrant { - public static void registerWith(PluginRegistry registry) { - if (alreadyRegisteredWith(registry)) { - return; - } - } - - private static boolean alreadyRegisteredWith(PluginRegistry registry) { - final String key = GeneratedPluginRegistrant.class.getCanonicalName(); - if (registry.hasPlugin(key)) { - return true; - } - registry.registrarFor(key); - return false; - } -} diff --git a/packages/mock_server/android/local.properties b/packages/mock_server/android/local.properties deleted file mode 100644 index 679e454..0000000 --- a/packages/mock_server/android/local.properties +++ /dev/null @@ -1,2 +0,0 @@ -sdk.dir=/Users/Konrad.Lys/Library/Android/sdk -flutter.sdk=/opt/homebrew/Caskroom/flutter/3.10.0/flutter \ No newline at end of file diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h deleted file mode 100644 index 7a89092..0000000 --- a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GeneratedPluginRegistrant_h -#define GeneratedPluginRegistrant_h - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface GeneratedPluginRegistrant : NSObject -+ (void)registerWithRegistry:(NSObject*)registry; -@end - -NS_ASSUME_NONNULL_END -#endif /* GeneratedPluginRegistrant_h */ diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m deleted file mode 100644 index efe65ec..0000000 --- a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#import "GeneratedPluginRegistrant.h" - -@implementation GeneratedPluginRegistrant - -+ (void)registerWithRegistry:(NSObject*)registry { -} - -@end diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index e71a16d..0000000 --- a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.h b/packages/mock_server/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/packages/mock_server/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/linux/flutter/generated_plugins.cmake b/packages/mock_server/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 2e1de87..0000000 --- a/packages/mock_server/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100644 index cccf817..0000000 --- a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { -} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc deleted file mode 100644 index 8b6d468..0000000 --- a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void RegisterPlugins(flutter::PluginRegistry* registry) { -} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.h b/packages/mock_server/windows/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d8..0000000 --- a/packages/mock_server/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/windows/flutter/generated_plugins.cmake b/packages/mock_server/windows/flutter/generated_plugins.cmake deleted file mode 100644 index b93c4c3..0000000 --- a/packages/mock_server/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) From 5b0459963a940a97f5041fa78fd4e9a5b608253c Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Thu, 18 May 2023 09:26:39 +0200 Subject: [PATCH 05/11] FEATURE add mock server and main_dev.dart for developement --- flutter | 2 +- lib/main.dart | 1 + lib/main_dev.dart | 10 + packages/mock_server/.gitignore | 30 ++ packages/mock_server/.metadata | 10 + packages/mock_server/CHANGELOG.md | 3 + packages/mock_server/LICENSE | 1 + packages/mock_server/README.md | 39 +++ packages/mock_server/analysis_options.yaml | 4 + .../plugins/GeneratedPluginRegistrant.java | 23 ++ packages/mock_server/android/local.properties | 2 + .../ios/Flutter/Generated.xcconfig | 14 + .../ios/Flutter/flutter_export_environment.sh | 13 + .../ios/Runner/GeneratedPluginRegistrant.h | 19 + .../ios/Runner/GeneratedPluginRegistrant.m | 14 + packages/mock_server/lib/mock_server.dart | 161 +++++++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 ++ .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../ephemeral/Flutter-Generated.xcconfig | 11 + .../ephemeral/flutter_export_environment.sh | 12 + packages/mock_server/pubspec.yaml | 57 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 ++ .../example/pubspec.lock | 4 +- pubspec.lock | 329 ++++++++++-------- pubspec.yaml | 2 + 29 files changed, 717 insertions(+), 152 deletions(-) create mode 100644 lib/main_dev.dart create mode 100644 packages/mock_server/.gitignore create mode 100644 packages/mock_server/.metadata create mode 100644 packages/mock_server/CHANGELOG.md create mode 100644 packages/mock_server/LICENSE create mode 100644 packages/mock_server/README.md create mode 100644 packages/mock_server/analysis_options.yaml create mode 100644 packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 packages/mock_server/android/local.properties create mode 100644 packages/mock_server/ios/Flutter/Generated.xcconfig create mode 100755 packages/mock_server/ios/Flutter/flutter_export_environment.sh create mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m create mode 100644 packages/mock_server/lib/mock_server.dart create mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.cc create mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.h create mode 100644 packages/mock_server/linux/flutter/generated_plugins.cmake create mode 100644 packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100755 packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 100644 packages/mock_server/pubspec.yaml create mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.cc create mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.h create mode 100644 packages/mock_server/windows/flutter/generated_plugins.cmake diff --git a/flutter b/flutter index 4d9e56e..9944297 160000 --- a/flutter +++ b/flutter @@ -1 +1 @@ -Subproject commit 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf +Subproject commit 9944297138845a94256f1cf37beb88ff9a8e811a diff --git a/lib/main.dart b/lib/main.dart index f20fbd5..3eca615 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -121,6 +121,7 @@ void main() async { }); final apiFactory = PaperlessApiFactoryImpl(sessionManager); + runApp( MultiProvider( providers: [ diff --git a/lib/main_dev.dart b/lib/main_dev.dart new file mode 100644 index 0000000..5fb095a --- /dev/null +++ b/lib/main_dev.dart @@ -0,0 +1,10 @@ + + +import 'package:mock_server/mock_server.dart'; +import 'package:paperless_mobile/main.dart' as ParentMain; + +void main() async { + await LocalMockApiServer().start(); + ParentMain.main(); +} + diff --git a/packages/mock_server/.gitignore b/packages/mock_server/.gitignore new file mode 100644 index 0000000..96486fd --- /dev/null +++ b/packages/mock_server/.gitignore @@ -0,0 +1,30 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/mock_server/.metadata b/packages/mock_server/.metadata new file mode 100644 index 0000000..40e012c --- /dev/null +++ b/packages/mock_server/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 + channel: stable + +project_type: package diff --git a/packages/mock_server/CHANGELOG.md b/packages/mock_server/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/packages/mock_server/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/mock_server/LICENSE b/packages/mock_server/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/packages/mock_server/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/mock_server/README.md b/packages/mock_server/README.md new file mode 100644 index 0000000..02fe8ec --- /dev/null +++ b/packages/mock_server/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/mock_server/analysis_options.yaml b/packages/mock_server/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/packages/mock_server/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..d007606 --- /dev/null +++ b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,23 @@ +package io.flutter.plugins; + +import io.flutter.plugin.common.PluginRegistry; + +/** + * Generated file. Do not edit. + */ +public final class GeneratedPluginRegistrant { + public static void registerWith(PluginRegistry registry) { + if (alreadyRegisteredWith(registry)) { + return; + } + } + + private static boolean alreadyRegisteredWith(PluginRegistry registry) { + final String key = GeneratedPluginRegistrant.class.getCanonicalName(); + if (registry.hasPlugin(key)) { + return true; + } + registry.registrarFor(key); + return false; + } +} diff --git a/packages/mock_server/android/local.properties b/packages/mock_server/android/local.properties new file mode 100644 index 0000000..679e454 --- /dev/null +++ b/packages/mock_server/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/Konrad.Lys/Library/Android/sdk +flutter.sdk=/opt/homebrew/Caskroom/flutter/3.10.0/flutter \ No newline at end of file diff --git a/packages/mock_server/ios/Flutter/Generated.xcconfig b/packages/mock_server/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..e3b3caf --- /dev/null +++ b/packages/mock_server/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter +FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=0.0.1 +FLUTTER_BUILD_NUMBER=0.0.1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/ios/Flutter/flutter_export_environment.sh b/packages/mock_server/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..c58c84e --- /dev/null +++ b/packages/mock_server/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=0.0.1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..efe65ec --- /dev/null +++ b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart new file mode 100644 index 0000000..6540acb --- /dev/null +++ b/packages/mock_server/lib/mock_server.dart @@ -0,0 +1,161 @@ +library mock_server; + +import 'dart:convert'; + + +import 'package:logging/logging.dart'; + +import 'package:shelf/shelf.dart'; + +import 'package:shelf/shelf_io.dart' as shelf_io; + +import 'package:shelf_router/shelf_router.dart' as shelf_router; + + +Logger log = Logger('LocalMockApiServer'); + + +class LocalMockApiServer { + + static final host = 'localhost'; + + static final port = 3131; + + static get baseUrl => 'http://$host:$port/'; + + + late shelf_router.Router app; + + + LocalMockApiServer() { + + app = shelf_router.Router(); + + + app.get('/api/', (Request req) async { + log.info('Responding to /api'); + return JsonMockResponse.ok({ + }); + }); + + app.post('/api/token/', (Request req) async { + log.info('Responding to /api/token/'); + var body = await req.bodyJsonMap(); + if (body?['username'] == 'test' && body?['password'] == 'test') { + return JsonMockResponse.ok({ + 'token': 'testToken' + }); + } else { + return Response.unauthorized( + 'Unauthorized' + ); + } + + }); + + app.get('/api/ui_settings/', (Request req) async { + log.info('Responding to /api/ui_settings/'); + return JsonMockResponse.ok({ + 'user': { + 'id': 1, + 'username': 'test', + 'displayName': 'Test User' + } + }); + }); + + app.get('/api/users//', (Request req, String userId) async { + log.info('Responding to /api/users//'); + return JsonMockResponse.ok({ + 'id': 1, + 'username': 'test', + 'displayName': 'Test User', + 'email': 'test@test.pl', + 'firstName': 'Test', + 'lastName': 'User', + 'dateJoined': '2000-01-23T01:23:45', + 'isStaff': false, + 'isActive': true, + 'isSuperuser': true, + 'groups': [], + 'userPermissions': [], + 'inheritedPermissions': [] + }); + }); + + } + + + Future start() async { + + log.info('starting...'); + + + var handler = const Pipeline().addMiddleware( + + logRequests(logger: (message, isError) { + + if (isError) + + log.severe(message); + + else + + log.info(message); + + }), + + ).addHandler(app); + + + var server = await shelf_io.serve(handler, host, port); + + server.autoCompress = true; + + + log.info('serving on: $baseUrl'); + + } + +} + + +extension on Request { + + Future bodyJsonValue(String param) async { + + return jsonDecode(await this.readAsString())?[param]; + + } + + Future bodyJsonMap() async { + + return jsonDecode(await this.readAsString()); + + } + + + String? get accessToken => + + this.headers['Authorization']?.split('Bearer ').last; + +} + + +extension JsonMockResponse on Response { + + static ok(T json, {int delay = 800}) async { + + await Future.delayed(Duration(milliseconds: delay)); // Emulate lag + + return Response.ok( + + jsonEncode(json), + + headers: {'Content-Type': 'application/json'}, + + ); + + } + +} \ No newline at end of file diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.h b/packages/mock_server/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/linux/flutter/generated_plugins.cmake b/packages/mock_server/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..2e1de87 --- /dev/null +++ b/packages/mock_server/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..cccf817 --- /dev/null +++ b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 0000000..e822246 --- /dev/null +++ b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter +FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=0.0.1 +FLUTTER_BUILD_NUMBER=0.0.1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 0000000..ded31c1 --- /dev/null +++ b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=0.0.1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/pubspec.yaml b/packages/mock_server/pubspec.yaml new file mode 100644 index 0000000..53e8177 --- /dev/null +++ b/packages/mock_server/pubspec.yaml @@ -0,0 +1,57 @@ +name: mock_server +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + shelf: ^1.4.1 + shelf_router: ^1.1.4 + logging: ^1.1.1 + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.h b/packages/mock_server/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/windows/flutter/generated_plugins.cmake b/packages/mock_server/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..b93c4c3 --- /dev/null +++ b/packages/mock_server/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/paperless_document_scanner/example/pubspec.lock b/packages/paperless_document_scanner/example/pubspec.lock index 6b2cc09..d9d59f4 100644 --- a/packages/paperless_document_scanner/example/pubspec.lock +++ b/packages/paperless_document_scanner/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: camera_android - sha256: e0f9b7eea2d1f4d4f5460f178522f0d02c095d2ae00b01a77419ce61c4184bfe + sha256: "61bbae4af0204b9bbfd82182e313d405abf5a01bdb057ff6675f2269a5cab4fd" url: "https://pub.dev" source: hosted - version: "0.10.7" + version: "0.10.8+1" camera_avfoundation: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index d3d982b..f49ff96 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: "405666cd3cf0ee0a48d21ec67e65406aad2c726d9fa58840d3375e7bdcd32a07" url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "60.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: "1952250bd005bacb895a01bf1b4dc00e3ba1c526cf47dca54dfe24979c65f5b3" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.12.0" analyzer_plugin: dependency: transitive description: @@ -45,18 +45,18 @@ packages: dependency: transitive description: name: archive - sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" + sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" async: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + sha256: "43865b79fbb78532e4bff7c33087aa43b1d488c4fdef014eaef568af6d8016dc" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" build_config: dependency: transitive description: @@ -157,26 +157,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab" + sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "87e06c939450b9b94e3e1bb2d46e0e9780adbff5500d3969f2ba2de6bbb860cb" + sha256: "220ae4553e50d7c21a17c051afc7b183d28a24a420502e842f303f8e4e6edced" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.4" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + sha256: "30859c90e9ddaccc484f56303931f477b1f1ba2bab74aa32ed5d6ce15870f8cf" url: "https://pub.dev" source: hosted - version: "7.2.7" + version: "7.2.8" built_collection: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d" url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.5.0" cached_network_image: dependency: "direct main" description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" clock: dependency: transitive description: @@ -301,10 +301,10 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" csslib: dependency: transitive description: @@ -317,26 +317,26 @@ packages: dependency: "direct dev" description: name: dart_code_metrics - sha256: "026e28da197a03caeccccc0b174ec98ef03da3c81c4543314d7add121aab4375" + sha256: "8d40e9fa6ba6b5f4f569768e267e9cb3e74350f98b30ac4b8160795792ce5414" url: "https://pub.dev" source: hosted - version: "5.6.0" + version: "5.7.4" dart_code_metrics_presets: dependency: transitive description: name: dart_code_metrics_presets - sha256: "9c51724f836aebc4465228954cb5757e5a99737af26a452b5dec0a2d5d0b4d66" + sha256: "22e27f98e8c7d8b11cca43d2656a822935280747050ae65e8cd03c52d09c0d1c" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.7.0" dart_style: dependency: transitive description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.1" dbus: dependency: transitive description: @@ -381,32 +381,32 @@ packages: dependency: "direct main" description: name: dio - sha256: "9fdbf71baeb250fc9da847f6cb2052196f62c19906a3657adfc18631a667d316" + sha256: "347d56c26d63519552ef9a569f2a593dda99a81fdbdff13c584b7197cfe05059" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.2" dots_indicator: dependency: transitive description: name: dots_indicator - sha256: e59dfc90030ee5a4fd4c53144a8ce97cc7a823c2067b8fb9814960cd1ae63f89 + sha256: f1599baa429936ba87f06ae5f2adc920a367b16d08f74db58c3d0f6e93bcdb5c url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" dynamic_color: dependency: "direct main" description: name: dynamic_color - sha256: c4a508284b14ec4dda5adba2c28b2cdd34fbae1afead7e8c52cad87d51c5405b + sha256: "74dff1435a695887ca64899b8990004f8d1232b0e84bfc4faa1fdda7c6f57cc1" url: "https://pub.dev" source: hosted - version: "1.6.2" + version: "1.6.5" edge_detection: dependency: "direct main" description: path: "." ref: master - resolved-ref: "24da81d7cb3bc6418d5901da355addb337793b46" + resolved-ref: "685af159405b0b3fd8d3f9a02b34a548a79af492" url: "https://github.com/sawankumarbundelkhandi/edge_detection" source: git version: "1.1.1" @@ -430,10 +430,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" file: dependency: transitive description: @@ -520,18 +520,18 @@ packages: dependency: "direct main" description: name: flutter_html - sha256: "342c7908f0a67bcec62b6e0f7cf23e23bafe7f64693665dd35be98d5e783bdfd" + sha256: "850c07bc6c1ed060d3eb3e88469a598260a13eb45d8978b197c1348e0a2b101f" url: "https://pub.dev" source: hosted - version: "3.0.0-alpha.6" + version: "3.0.0-beta.1" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "86b71bbaffa38e885f5c21b1182408b9be6951fd125432cf6652c636254cef2d" + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -592,10 +592,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "8f6c1611e0c4a88a382691a97bb3c3feb24cc0c0b54152b8b5fb7ffb837f7fbf" + sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -613,10 +613,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: e301ae206ff0fb09b67d3716009c6c28c2da57a0ad164827b178421bb9d601f7 + sha256: "02df24aec455c26428dadc637f20d4c548bda23ee2179479a8e8c39f1ecb75b3" url: "https://pub.dev" source: hosted - version: "2.2.18" + version: "2.3.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -690,10 +690,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: "73eb76fa640ea630e2d957e7b469ab2b91e4da6c4950d6032fab7009275637b7" + sha256: "721610b3d61814efa13fb5f720a6781bc123cd51b7e01f5a45d7c92124376644" url: "https://pub.dev" source: hosted - version: "4.3.3" + version: "4.3.8" flutter_web_plugins: dependency: transitive description: flutter @@ -703,10 +703,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "774fa28b07f3a82c93596bc137be33189fec578ed3447a93a5a11c93435de394" + sha256: "2f9c4d3f4836421f7067a28f8939814597b27614e021da9d63e5d3fb6e212d25" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.2.1" font_awesome_flutter: dependency: "direct main" description: @@ -719,10 +719,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "73b58fe836dc05594451d8f740d97d5167886962d628b9f60a1fe945aa0a891f" + sha256: "2edb9ef971d0f803860ecd9084afd48c717d002141ad77b69be3e976bee7190e" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.4" freezed_annotation: dependency: "direct main" description: @@ -788,18 +788,26 @@ packages: dependency: transitive description: name: html - sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 + sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" url: "https://pub.dev" source: hosted - version: "0.15.1" + version: "0.15.3" http: dependency: "direct main" description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" + http_methods: + dependency: transitive + description: + name: http_methods + sha256: "6bccce8f1ec7b5d701e7921dca35e202d425b57e317ba1a37f2638590e29e566" + url: "https://pub.dev" + source: hosted + version: "1.1.1" http_multi_server: dependency: transitive description: @@ -841,18 +849,18 @@ packages: dependency: "direct main" description: name: intl - sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.18.0" + version: "0.18.1" introduction_screen: dependency: "direct main" description: name: introduction_screen - sha256: "73965475d6b271846f81c5fce5b459546a4ea36c285408691522437fd6bbeb69" + sha256: f194ae655a84b945a2aedb7961d09948d789fc91088efb032666112923bcbc1e url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.8" io: dependency: transitive description: @@ -865,10 +873,10 @@ packages: dependency: transitive description: name: jiffy - sha256: "85172c4fc975a50224521c05bf43abc845288863b19d91bd3c221a96a8785dd3" + sha256: c3c1da3fe0c08bba3c2c455e8a3e724dfe7ea34dbe8069b992cab90ea1fe40b6 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.0.1" js: dependency: transitive description: @@ -889,10 +897,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a + sha256: "61a60716544392a82726dd0fa1dd6f5f1fd32aec66422b6e229e7b90d52325c4" url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "6.7.0" lints: dependency: transitive description: @@ -901,46 +909,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.dev" + source: hosted + version: "1.0.2" local_auth: dependency: "direct main" description: name: local_auth - sha256: "8cea55dca20d1e0efa5480df2d47ae30851e7a24cb8e7d225be7e67ae8485aa4" + sha256: "0cf238be2bfa51a6c9e7e9cfc11c05ea39f2a3a4d3e5bb255d0ebc917da24401" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.6" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: cfcbc4936e288d61ef85a04feef6b95f49ba496d4fd98364e6abafb462b06a1f + sha256: c5e48c4a67fc0e5dd9b5725cc8766b67e2da9a54155c82c6e2ea4a0d1cf9ef93 url: "https://pub.dev" source: hosted - version: "1.0.18" + version: "1.0.28" local_auth_ios: dependency: transitive description: name: local_auth_ios - sha256: aa32478d7513066564139af57e11e2cad1bbd535c1efd224a88a8764c5665e3b + sha256: "503a938c4edde6b244c6ee3b1e2e675ddb7e37e79d5056658dbed1997cf04785" url: "https://pub.dev" source: hosted - version: "1.0.12" + version: "1.1.2" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: fbb6973f2fd088e2677f39a5ab550aa1cfbc00997859d5e865569872499d6d61 + sha256: "9e160d59ef0743e35f1b50f4fb84dc64f55676b1b8071e319ef35e7f3bc13367" url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.7" local_auth_windows: dependency: transitive description: name: local_auth_windows - sha256: "888482e4f9ca3560e00bc227ce2badeb4857aad450c42a31c6cfc9dc21e0ccbc" + sha256: "19323b75ab781d5362dbb15dcb7e0916d2431c7a6dbdda016ec9708689877f73" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.8" logging: dependency: transitive description: @@ -981,6 +997,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + mock_server: + dependency: "direct dev" + description: + path: "packages/mock_server" + relative: true + source: path + version: "0.0.1" mockito: dependency: "direct dev" description: @@ -1017,18 +1040,10 @@ packages: dependency: transitive description: name: node_preamble - sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" url: "https://pub.dev" source: hosted - version: "2.0.1" - numerus: - dependency: transitive - description: - name: numerus - sha256: "436759d84f233b40107d0cc31cfa92d24e0960afeb2e506be70926d4cddffd9e" - url: "https://pub.dev" - source: hosted - version: "2.0.0" + version: "2.0.2" octo_image: dependency: transitive description: @@ -1104,42 +1119,42 @@ packages: dependency: "direct main" description: name: path_provider - sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" url: "https://pub.dev" source: hosted - version: "2.0.12" + version: "2.0.15" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" url: "https://pub.dev" source: hosted - version: "2.0.22" + version: "2.0.27" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.3" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" + sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" url: "https://pub.dev" source: hosted - version: "2.1.8" + version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_windows: dependency: transitive description: @@ -1176,18 +1191,18 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + sha256: d8cc6a62ded6d0f49c6eac337e080b066ee3bce4d405bd9439a61e1f1927bfe8 url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.2.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85 url: "https://pub.dev" source: hosted - version: "9.0.7" + version: "9.0.8" permission_handler_platform_interface: dependency: transitive description: @@ -1236,6 +1251,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" pool: dependency: transitive description: @@ -1272,26 +1295,26 @@ packages: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pub_updater: dependency: transitive description: name: pub_updater - sha256: "42890302ab2672adf567dc2b20e55b4ecc29d7e19c63b6b98143ab68dd717d3a" + sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c" url: "https://pub.dev" source: hosted - version: "0.2.4" + version: "0.3.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.3" qr: dependency: transitive description: @@ -1352,10 +1375,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" share_plus_web: dependency: transitive description: @@ -1376,34 +1399,42 @@ packages: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" + shelf_router: + dependency: transitive + description: + name: shelf_router + sha256: f5e5d492440a7fb165fe1e2e1a623f31f734d3370900070b2b1e0d0428d59864 + url: "https://pub.dev" + source: hosted + version: "1.1.4" shelf_static: dependency: transitive description: name: shelf_static - sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" shimmer: dependency: "direct main" description: @@ -1429,10 +1460,10 @@ packages: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" url: "https://pub.dev" source: hosted - version: "1.2.7" + version: "1.3.2" source_helper: dependency: transitive description: @@ -1453,10 +1484,10 @@ packages: dependency: transitive description: name: source_maps - sha256: "490098075234dcedb83c5d949b4c93dad5e6b7702748de000be2b57b8e6b2427" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" url: "https://pub.dev" source: hosted - version: "0.10.11" + version: "0.10.12" source_span: dependency: transitive description: @@ -1469,18 +1500,18 @@ packages: dependency: transitive description: name: sqflite - sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" + sha256: b4d6710e1200e96845747e37338ea8a819a12b51689a3bcf31eff0003b37a0b9 url: "https://pub.dev" source: hosted - version: "2.2.4+1" + version: "2.2.8+4" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + sha256: e77abf6ff961d69dfef41daccbb66b51e9983cdd5cb35bf30733598057401555 url: "https://pub.dev" source: hosted - version: "2.4.2+2" + version: "2.4.5" stack_trace: dependency: transitive description: @@ -1525,10 +1556,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" term_glyph: dependency: transitive description: @@ -1565,10 +1596,10 @@ packages: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.9.2" timing: dependency: transitive description: @@ -1581,10 +1612,10 @@ packages: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" universal_io: dependency: transitive description: @@ -1597,66 +1628,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 url: "https://pub.dev" source: hosted - version: "6.1.9" + version: "6.1.11" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "3e2f6dfd2c7d9cd123296cab8ef66cfc2c1a13f5845f42c7a0f365690a8a7dd1" + sha256: "1a5848f598acc5b7d8f7c18b8cb834ab667e59a13edc3c93e9d09cf38cc6bc87" url: "https://pub.dev" source: hosted - version: "6.0.23" + version: "6.0.34" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "0a5af0aefdd8cf820dd739886efb1637f1f24489900204f50984634c07a54815" + sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "318c42cba924e18180c029be69caf0a1a710191b9ec49bb42b5998fdcccee3cc" + sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "41988b55570df53b3dd2a7fc90c76756a963de6a8c5f8e113330cb35992e2094" + sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "44d79408ce9f07052095ef1f9a693c258d6373dc3944249374e30eff7219ccb0" + sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: b6217370f8eb1fd85c8890c539f5a639a01ab209a36db82c921ebeacefc7a615 + sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" uuid: dependency: "direct main" description: @@ -1685,18 +1716,18 @@ packages: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web_socket_channel: dependency: "direct main" description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.0" webdriver: dependency: transitive description: @@ -1773,10 +1804,10 @@ packages: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: dart: ">=3.0.0 <4.0.0" flutter: ">=3.7.0" diff --git a/pubspec.yaml b/pubspec.yaml index 46f6943..3c73fa8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -115,6 +115,8 @@ dev_dependencies: auto_route_generator: ^5.0.3 freezed: ^2.3.3 hive_generator: ^2.0.0 + mock_server: + path: packages/mock_server # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 440883dd3e16240c1618be8697e3610c9c798bdb Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 18:43:13 +0200 Subject: [PATCH 06/11] FEATURE more mocked APIs, full tags API --- .../mock_server/fixtures/correspondents.json | 257 ++++++++++ packages/mock_server/fixtures/doc_types.json | 25 + packages/mock_server/fixtures/documents.json | 152 ++++++ packages/mock_server/fixtures/groups.json | 119 +++++ packages/mock_server/fixtures/lorem-ipsum.png | Bin 0 -> 159453 bytes packages/mock_server/fixtures/metadata.json | 1 + packages/mock_server/fixtures/notes.json | 26 + .../mock_server/fixtures/saved_views.json | 44 ++ packages/mock_server/fixtures/statistics.json | 16 + .../mock_server/fixtures/storage_paths.json | 17 + .../mock_server/fixtures/suggestions.json | 1 + packages/mock_server/fixtures/tags.json | 103 ++++ packages/mock_server/fixtures/tasks.json | 142 ++++++ .../mock_server/fixtures/ui_settings.json | 163 ++++++ packages/mock_server/fixtures/user-1.json | 148 ++++++ packages/mock_server/fixtures/users.json | 462 ++++++++++++++++++ .../ios/Flutter/Generated.xcconfig | 14 - .../ios/Flutter/flutter_export_environment.sh | 13 - packages/mock_server/lib/mock_server.dart | 217 +++++++- .../ephemeral/Flutter-Generated.xcconfig | 11 - .../ephemeral/flutter_export_environment.sh | 12 - packages/mock_server/pubspec.yaml | 4 +- pubspec.lock | 20 +- 23 files changed, 1880 insertions(+), 87 deletions(-) create mode 100644 packages/mock_server/fixtures/correspondents.json create mode 100644 packages/mock_server/fixtures/doc_types.json create mode 100644 packages/mock_server/fixtures/documents.json create mode 100644 packages/mock_server/fixtures/groups.json create mode 100644 packages/mock_server/fixtures/lorem-ipsum.png create mode 100644 packages/mock_server/fixtures/metadata.json create mode 100644 packages/mock_server/fixtures/notes.json create mode 100644 packages/mock_server/fixtures/saved_views.json create mode 100644 packages/mock_server/fixtures/statistics.json create mode 100644 packages/mock_server/fixtures/storage_paths.json create mode 100644 packages/mock_server/fixtures/suggestions.json create mode 100644 packages/mock_server/fixtures/tags.json create mode 100644 packages/mock_server/fixtures/tasks.json create mode 100644 packages/mock_server/fixtures/ui_settings.json create mode 100644 packages/mock_server/fixtures/user-1.json create mode 100644 packages/mock_server/fixtures/users.json delete mode 100644 packages/mock_server/ios/Flutter/Generated.xcconfig delete mode 100755 packages/mock_server/ios/Flutter/flutter_export_environment.sh delete mode 100644 packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig delete mode 100755 packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh diff --git a/packages/mock_server/fixtures/correspondents.json b/packages/mock_server/fixtures/correspondents.json new file mode 100644 index 0000000..d43ff66 --- /dev/null +++ b/packages/mock_server/fixtures/correspondents.json @@ -0,0 +1,257 @@ +{ + "count": 27, + "next": "http://localhost:8000/api/correspondents/?page=2", + "previous": null, + "results": [ + { + "id": 9, + "slug": "abc-test-correspondent", + "name": "ABC Test Correspondent", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 13, + "slug": "corresp-10", + "name": "Corresp 10", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 14, + "slug": "corresp-11", + "name": "Corresp 11", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 15, + "slug": "corresp-12", + "name": "Corresp 12", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 16, + "slug": "corresp-13", + "name": "Corresp 13", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 18, + "slug": "corresp-15", + "name": "Corresp 15", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 19, + "slug": "corresp-16", + "name": "Corresp 16", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 20, + "slug": "corresp-17", + "name": "Corresp 17", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 21, + "slug": "corresp-18", + "name": "Corresp 18", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 22, + "slug": "corresp-19", + "name": "Corresp 19", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 23, + "slug": "corresp-20", + "name": "Corresp 20", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 24, + "slug": "corresp-21", + "name": "Corresp 21", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 25, + "slug": "corresp-22", + "name": "Corresp 22", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 26, + "slug": "corresp-23", + "name": "Corresp 23", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 5, + "slug": "corresp-3", + "name": "Corresp 3", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 6, + "slug": "corresp-4", + "name": "Corresp 4", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 7, + "slug": "corresp-5", + "name": "Corresp 5", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 8, + "slug": "corresp-6", + "name": "Corresp 6", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 10, + "slug": "corresp-7", + "name": "Corresp 7", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 11, + "slug": "corresp-8", + "name": "Corresp 8", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 12, + "slug": "corresp-9", + "name": "Corresp 9", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 17, + "slug": "correspondent-14", + "name": "Correspondent 14", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 0, + "last_correspondence": null + }, + { + "id": 2, + "slug": "correspondent-2", + "name": "Correspondent 2", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 7, + "last_correspondence": "2021-01-20T23:37:58.204614Z" + }, + { + "id": 27, + "slug": "correspondent-slug", + "name": "Correspondent Slug", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1, + "last_correspondence": "2022-03-16T03:48:50.089624Z" + }, + { + "id": 4, + "slug": "newest-correspondent", + "name": "Newest Correspondent", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1, + "last_correspondence": "2021-02-07T08:00:00Z" + } + ] +} diff --git a/packages/mock_server/fixtures/doc_types.json b/packages/mock_server/fixtures/doc_types.json new file mode 100644 index 0000000..eb2d74a --- /dev/null +++ b/packages/mock_server/fixtures/doc_types.json @@ -0,0 +1,25 @@ +{ + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "slug": "test", + "name": "Test Doc Type", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1 + }, + { + "id": 2, + "slug": "test2", + "name": "Test Doc Type 2", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "document_count": 1 + } + ] +} diff --git a/packages/mock_server/fixtures/documents.json b/packages/mock_server/fixtures/documents.json new file mode 100644 index 0000000..c63e957 --- /dev/null +++ b/packages/mock_server/fixtures/documents.json @@ -0,0 +1,152 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "correspondent": 9, + "document_type": 1, + "storage_path": null, + "title": "No latin title", + "content": "Test document PDF \n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla est purus, ultrices in porttitor \nin, accumsan non quam. Nam consectetur porttitor rhoncus. Curabitur eu est et leo feugiat \nauctor vel quis lorem. Ut et ligula dolor, sit amet consequat lorem. Aliquam porta eros sed \nvelit imperdiet egestas. Maecenas tempus eros ut diam ullamcorper id dictum libero \ntempor. Donec quis augue quis magna condimentum lobortis. Quisque imperdiet ipsum vel \nmagna viverra rutrum. Cras viverra molestie urna, vitae vestibulum turpis varius id. \nVestibulum mollis, arcu iaculis bibendum varius, velit sapien blandit metus, ac posuere lorem \nnulla ac dolor. Maecenas urna elit, tincidunt in dapibus nec, vehicula eu dui. Duis lacinia \nfringilla massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur \nridiculus mus. Ut consequat ultricies est, non rhoncus mauris congue porta. Vivamus viverra \nsuscipit felis eget condimentum. Cum sociis natoque penatibus et magnis dis parturient \nmontes, nascetur ridiculus mus. Integer bibendum sagittis ligula, non faucibus nulla volutpat \nvitae. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. \nIn aliquet quam et velit bibendum accumsan. Cum sociis natoque penatibus et magnis dis \nparturient montes, nascetur ridiculus mus. Vestibulum vitae ipsum nec arcu semper \nadipiscing at ac lacus. Praesent id pellentesque orci. Morbi congue viverra nisl nec rhoncus. \nInteger mattis, ipsum a tincidunt commodo, lacus arcu elementum elit, at mollis eros ante ac \nrisus. In volutpat, ante at pretium ultricies, velit magna suscipit enim, aliquet blandit massa \norci nec lorem. Nulla facilisi. Duis eu vehicula arcu. Nulla facilisi. Maecenas pellentesque \nvolutpat felis, quis tristique ligula luctus vel. Sed nec mi eros. Integer augue enim, sollicitudin \nullamcorper mattis eget, aliquam in est. Morbi sollicitudin libero nec augue dignissim ut \nconsectetur dui volutpat. Nulla facilisi. Mauris egestas vestibulum neque cursus tincidunt. \nDonec sit amet pulvinar orci. \nQuisque volutpat pharetra tincidunt. Fusce sapien arcu, molestie eget varius egestas, \nfaucibus ac urna. Sed at nisi in velit egestas aliquam ut a felis. Aenean malesuada iaculis nisl, \nut tempor lacus egestas consequat. Nam nibh lectus, gravida sed egestas ut, feugiat quis \ndolor. Donec eu leo enim, non laoreet ante. Morbi dictum tempor vulputate. Phasellus \nultricies risus vel augue sagittis euismod. Vivamus tincidunt placerat nisi in aliquam. Cras \nquis mi ac nunc pretium aliquam. Aenean elementum erat ac metus commodo rhoncus. \nAliquam nulla augue, porta non sagittis quis, accumsan vitae sem. Phasellus id lectus tortor, \neget pulvinar augue. Etiam eget velit ac purus fringilla blandit. Donec odio odio, sagittis sed \niaculis sed, consectetur eget sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. \nMaecenas accumsan velit vel turpis rutrum in sodales diam placerat. \nQuisque luctus ullamcorper velit sit amet lobortis. Etiam ligula felis, vulputate quis rhoncus \nnec, fermentum eget odio. Vivamus vel ipsum ac augue sodales mollis euismod nec tellus. \nFusce et augue rutrum nunc semper vehicula vel semper nisl. Nam laoreet euismod quam at \nvarius. Sed aliquet auctor nibh. Curabitur malesuada fermentum lacus vel accumsan. Duis \nornare scelerisque nulla, ac pulvinar ligula tempus sit amet. In placerat nulla ac ante \nscelerisque posuere. Phasellus at ante felis. Sed hendrerit risus a metus posuere rutrum. \nPhasellus eu augue dui. Proin in vestibulum ipsum. Aenean accumsan mollis sapien, ut \neleifend sem blandit at. Vivamus luctus mi eget lorem lobortis pharetra. Phasellus at tortor \nquam, a volutpat purus. Etiam sollicitudin arcu vel elit bibendum et imperdiet risus tincidunt. \nEtiam elit velit, posuere ut pulvinar ac, condimentum eget justo. Fusce a erat velit. Vivamus \nimperdiet ultrices orci in hendrerit.", + "tags": [ + 4 + ], + "created": "2022-03-22T07:24:18Z", + "created_date": "2022-03-22", + "modified": "2022-03-22T07:24:23.264859Z", + "added": "2022-03-22T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "2022-03-22 no latin title.pdf", + "archived_file_name": "2022-03-22 no latin title.pdf", + "owner": null, + "user_can_change": true, + + "notes": [ + { + "id": 9, + "note": "Testing one more time", + "created": "2022-02-18T04:24:55.176008Z", + "user": 15 + }, + { + "id": 8, + "note": "Another note", + "created": "2021-11-08T04:24:47.925042Z", + "user": 3 + }, + { + "id": 7, + "note": "Cupcake ipsum dolor sit amet cheesecake candy cookie tiramisu. Donut chocolate chupa chups macaroon brownie halvah pie cheesecake gummies. Sweet chocolate bar candy donut gummi bears bear claw liquorice bonbon shortbread.\n\nDonut chocolate bar candy wafer wafer tiramisu. Gummies chocolate cake muffin toffee carrot cake macaroon. Toffee toffee jelly beans danish lollipop cake.", + "created": "2021-02-08T02:37:49.724132Z", + "user": 3 + } + ] + }, + { + "id": 2, + "correspondent": null, + "document_type": null, + "storage_path": 2, + "title": "lorem ipsum dolor sit amet", + "content": "Test document PDF", + "tags": [], + "created": "2022-03-23T07:24:18Z", + "created_date": "2022-03-23", + "modified": "2022-03-23T07:24:23.264859Z", + "added": "2022-03-23T07:24:22.922631Z", + "archive_serial_number": 12345, + "original_file_name": "2022-03-23 lorem ipsum dolor sit amet.pdf", + "archived_file_name": "2022-03-23 llorem ipsum dolor sit amet.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 3, + "correspondent": 14, + "document_type": 1, + "storage_path": null, + "title": "dolor", + "content": "Test document PDF", + "tags": [ + 2 + ], + "created": "2022-03-24T07:24:18Z", + "created_date": "2022-03-24", + "modified": "2022-03-24T07:24:23.264859Z", + "added": "2022-03-24T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "2022-03-24 dolor.pdf", + "archived_file_name": "2022-03-24 dolor.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 4, + "correspondent": 9, + "document_type": 2, + "storage_path": null, + "title": "sit amet", + "content": "Test document PDF", + "tags": [ + 4, 5 + ], + "created": "2022-06-01T07:24:18Z", + "created_date": "2022-06-01", + "modified": "2022-06-01T07:24:23.264859Z", + "added": "2022-06-01T07:24:22.922631Z", + "archive_serial_number": 12347, + "original_file_name": "2022-06-01 sit amet.pdf", + "archived_file_name": "2022-06-01 sit amet.pdf", + "owner": null, + "user_can_change": true, + + "notes": [] + }, + { + "id": 5, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 5", + "content": "Test document 5", + "tags": [], + "created": "2023-05-01T07:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T07:24:23.264859Z", + "added": "2023-05-02T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc5.pdf", + "archived_file_name": "doc5.pdf", + "owner": 15, + "user_can_change": true, + + "notes": [] + }, + { + "id": 6, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 6", + "content": "Test document 6", + "tags": [], + "created": "2023-05-01T10:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T10:24:23.264859Z", + "added": "2023-05-02T10:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc6.pdf", + "archived_file_name": "doc6.pdf", + "owner": 6, + "user_can_change": true, + + "notes": [] + } + ] +} diff --git a/packages/mock_server/fixtures/groups.json b/packages/mock_server/fixtures/groups.json new file mode 100644 index 0000000..f6051be --- /dev/null +++ b/packages/mock_server/fixtures/groups.json @@ -0,0 +1,119 @@ +{ + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "id": 6, + "name": "Another Group", + "permissions": [ + "add_user", + "change_user", + "delete_user", + "view_user", + "add_note", + "change_note", + "delete_note", + "view_note" + ] + }, + { + "id": 1, + "name": "First Group", + "permissions": [ + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_correspondent", + "change_correspondent", + "delete_correspondent", + "view_correspondent", + "add_document", + "change_document", + "delete_document", + "view_document", + "add_documenttype", + "change_documenttype", + "delete_documenttype", + "view_documenttype", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_savedview", + "change_savedview", + "delete_savedview", + "view_savedview", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_session", + "change_session", + "delete_session", + "view_session" + ] + } + ] +} diff --git a/packages/mock_server/fixtures/lorem-ipsum.png b/packages/mock_server/fixtures/lorem-ipsum.png new file mode 100644 index 0000000000000000000000000000000000000000..a74f2aee2088c75ce09a0032a907ddef57966a11 GIT binary patch literal 159453 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

vI+C8S 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 S`h5l-4|y4|bfuJO$o~Q&AHU83 literal 0 HcmV?d00001 diff --git a/packages/mock_server/fixtures/metadata.json b/packages/mock_server/fixtures/metadata.json new file mode 100644 index 0000000..f5bfd95 --- /dev/null +++ b/packages/mock_server/fixtures/metadata.json @@ -0,0 +1 @@ +{"original_checksum":"e959bc7d593245d92685213264e962ba","original_size":963754,"original_mime_type":"application/pdf","media_filename":"2022/lorem-ipsum.pdf","has_archive_version":true,"original_metadata":[],"archive_checksum":"5a1f46a9150bcade978c764b039ce4d0","archive_media_filename":"2022/lorem-ipsum.pdf","archive_size":351160,"archive_metadata":[{"namespace":"http://ns.adobe.com/pdf/1.3/","prefix":"pdf","key":"Producer","value":"pikepdf5.0.1"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"ModifyDate","value":"2022-03-22T04:53:18+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreateDate","value":"2022-03-22T18:05:43+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreatorTool","value":"ocrmypdf13.4.0/TesseractOCR-PDF4.1.1"},{"namespace":"http://ns.adobe.com/xap/1.0/mm/","prefix":"xmpMM","key":"DocumentID","value":"uuid:df27edcf-e34a-11f7-0000-8fa6067a3c04"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"format","value":"application/pdf"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"title","value":"ScannedDocument"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"part","value":"2"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"conformance","value":"B"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"creator","value":"None"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"MetadataDate","value":"2022-03-22T21:53:18.882551-07:00"}]} diff --git a/packages/mock_server/fixtures/notes.json b/packages/mock_server/fixtures/notes.json new file mode 100644 index 0000000..dfd4449 --- /dev/null +++ b/packages/mock_server/fixtures/notes.json @@ -0,0 +1,26 @@ +[ + { + "id": 10, + "note": "Testing new note", + "created": "2022-08-08T04:24:55.176008Z", + "user": 3 + }, + { + "id": 9, + "note": "Testing one more time", + "created": "2022-02-18T04:24:55.176008Z", + "user": 15 + }, + { + "id": 8, + "note": "Another note", + "created": "2021-11-08T04:24:47.925042Z", + "user": 3 + }, + { + "id": 7, + "note": "Cupcake ipsum dolor sit amet cheesecake candy cookie tiramisu. Donut chocolate chupa chups macaroon brownie halvah pie cheesecake gummies. Sweet chocolate bar candy donut gummi bears bear claw liquorice bonbon shortbread.\n\nDonut chocolate bar candy wafer wafer tiramisu. Gummies chocolate cake muffin toffee carrot cake macaroon. Toffee toffee jelly beans danish lollipop cake.", + "created": "2021-02-08T02:37:49.724132Z", + "user": 3 + } +] \ No newline at end of file diff --git a/packages/mock_server/fixtures/saved_views.json b/packages/mock_server/fixtures/saved_views.json new file mode 100644 index 0000000..64afcf3 --- /dev/null +++ b/packages/mock_server/fixtures/saved_views.json @@ -0,0 +1,44 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "Inbox", + "show_on_dashboard": true, + "show_in_sidebar": true, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [ + { + "rule_type": 6, + "value": "18" + } + ] + }, + { + "id": 2, + "name": "Recently Added", + "show_on_dashboard": true, + "show_in_sidebar": false, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [] + }, + { + "id": 11, + "name": "Taxes", + "show_on_dashboard": false, + "show_in_sidebar": true, + "sort_field": "created", + "sort_reverse": true, + "filter_rules": [ + { + "rule_type": 6, + "value": "39" + } + ] + } + ] +} diff --git a/packages/mock_server/fixtures/statistics.json b/packages/mock_server/fixtures/statistics.json new file mode 100644 index 0000000..0cfe52b --- /dev/null +++ b/packages/mock_server/fixtures/statistics.json @@ -0,0 +1,16 @@ +{ + "documents_total": 64, + "documents_inbox": null, + "inbox_tag": null, + "document_file_type_counts": [ + { + "mime_type": "application/pdf", + "mime_type_count": 35 + }, + { + "mime_type": "image/jpeg", + "mime_type_count": 29 + } + ], + "character_count": 309035 +} \ No newline at end of file diff --git a/packages/mock_server/fixtures/storage_paths.json b/packages/mock_server/fixtures/storage_paths.json new file mode 100644 index 0000000..86ae9b7 --- /dev/null +++ b/packages/mock_server/fixtures/storage_paths.json @@ -0,0 +1,17 @@ +{ + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "slug": "year-title", + "name": "Year - Title", + "path": "{created_year}/{title}", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "document_count": 1 + } + ] +} diff --git a/packages/mock_server/fixtures/suggestions.json b/packages/mock_server/fixtures/suggestions.json new file mode 100644 index 0000000..39b9595 --- /dev/null +++ b/packages/mock_server/fixtures/suggestions.json @@ -0,0 +1 @@ +{"correspondents":[],"tags":[3],"document_types":[1]} \ No newline at end of file diff --git a/packages/mock_server/fixtures/tags.json b/packages/mock_server/fixtures/tags.json new file mode 100644 index 0000000..eefee90 --- /dev/null +++ b/packages/mock_server/fixtures/tags.json @@ -0,0 +1,103 @@ +{ + "count": 8, + "next": null, + "previous": null, + "results": [ + { + "id": 4, + "slug": "another-sample-tag", + "name": "Another Sample Tag", + "color": "#a6cee3", + "text_color": "#000000", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 3 + }, + { + "id": 7, + "slug": "newone", + "name": "NewOne", + "color": "#9e4ad1", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 2 + }, + { + "id": 6, + "slug": "partial-tag", + "name": "Partial Tag", + "color": "#72dba7", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 1 + }, + { + "id": 2, + "slug": "tag-2", + "name": "Tag 2", + "color": "#612db7", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 3 + }, + { + "id": 3, + "slug": "tag-3", + "name": "Tag 3", + "color": "#b2df8a", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 4 + }, + { + "id": 5, + "slug": "tagwithpartial", + "name": "TagWithPartial", + "color": "#3b2db4", + "text_color": "#ffffff", + "match": "", + "matching_algorithm": 6, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 2 + }, + { + "id": 8, + "slug": "test-another", + "name": "Test Another", + "color": "#3ccea5", + "text_color": "#000000", + "match": "", + "matching_algorithm": 4, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 0 + }, + { + "id": 1, + "slug": "test-tag", + "name": "Test Tag", + "color": "#fb9a99", + "text_color": "#000000", + "match": "", + "matching_algorithm": 1, + "is_insensitive": true, + "is_inbox_tag": false, + "document_count": 4 + } + ] +} diff --git a/packages/mock_server/fixtures/tasks.json b/packages/mock_server/fixtures/tasks.json new file mode 100644 index 0000000..25e4d07 --- /dev/null +++ b/packages/mock_server/fixtures/tasks.json @@ -0,0 +1,142 @@ +[ + { + "id": 141, + "type": "file", + "result": "sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 316, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 218, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 113, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 84, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate.\n", + "status": "FAILURE", + "task_id": "d8ddbe298a42427d82553206ddf0bc94", + "task_file_name": "sample 2.pdf", + "date_created": "2022-05-26T23:17:38.333474-07:00", + "date_done": null, + "acknowledged": false, + "related_document": null + }, + { + "id": 132, + "type": "file", + "result": " : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 131, in get_version\n env=env,\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 68, in run\n proc = subprocess_run(args, env=env, **kwargs)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 423, in run\n with Popen(*popenargs, **kwargs) as process:\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 729, in __init__\n restore_signals, start_new_session)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 1364, in _execute_child\n raise child_exception_type(errno_num, err_msg, err_filename)\nFileNotFoundError: [Errno 2] No such file or directory: 'unpaper': 'unpaper'\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 287, in check_external_program\n found_version = version_checker()\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_exec/unpaper.py\", line 34, in version\n return get_version('unpaper')\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 137, in get_version\n ) from e\nocrmypdf.exceptions.MissingDependencyError: Could not find program 'unpaper' on the PATH\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 176, in parse\n ocrmypdf.ocr(**ocr_args)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/api.py\", line 315, in ocr\n check_options(options, plugin_manager)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 260, in check_options\n _check_options(options, plugin_manager, ocr_engine_languages)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 250, in _check_options\n check_options_preprocessing(options)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 128, in check_options_preprocessing\n required_for=['--clean, --clean-final'],\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 293, in check_external_program\n raise MissingDependencyError()\nocrmypdf.exceptions.MissingDependencyError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 179, in try_consume_file\n document_parser.parse(self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 197, in parse\n raise ParseError(e)\ndocuments.parsers.ParseError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 73, in consume_file\n override_tag_ids=override_tag_ids)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 196, in try_consume_file\n raise ConsumerError(e)\ndocuments.consumer.ConsumerError\n", + "status": "FAILURE", + "task_id": "4c554075552c4cc985abd76e6f274c90", + "task_file_name": "pdf-sample 10.24.48 PM.pdf", + "date_created": "2022-05-26T14:26:07.846365-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 115, + "type": "file", + "result": "2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 75, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 168, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 85, in pre_check_duplicate\n self._fail(\"Document is a duplicate\")\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 53, in _fail\n raise ConsumerError(f\"{self.filename}: {message}\")\ndocuments.consumer.ConsumerError: 2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate\n", + "status": "FAILURE", + "task_id": "86494713646a4364b01da17aadca071d", + "task_file_name": "2021-01-24 2021-01-20 sample_wide_orange.pdf", + "date_created": "2022-05-26T14:26:07.817608-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 85, + "type": "file", + "result": "cannot open resource : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 81, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 244, in try_consume_file\n self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/parsers.py\", line 302, in get_optimised_thumbnail\n thumbnail = self.get_thumbnail(document_path, mime_type, file_name)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_text/parsers.py\", line 29, in get_thumbnail\n layout_engine=ImageFont.LAYOUT_BASIC)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 852, in truetype\n return freetype(font)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 849, in freetype\n return FreeTypeFont(font, size, index, encoding, layout_engine)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 210, in __init__\n font, size, index, encoding, layout_engine=layout_engine\nOSError: cannot open resource\n", + "status": "FAILURE", + "task_id": "abca803fa46342e1ac81f3d3f2080e79", + "task_file_name": "simple.txt", + "date_created": "2022-05-26T14:26:07.771541-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 41, + "type": "file", + "result": "commands.txt: Not consuming commands.txt: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 70, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 199, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 97, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 69, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: commands.txt: Not consuming commands.txt: It is a duplicate.\n", + "status": "FAILURE", + "task_id": "0af67672e8e14404b060d4cf8f69313d", + "task_file_name": "commands.txt", + "date_created": "2022-05-26T14:26:07.704247-07:00", + "date_done": null, + "acknowledged": null + }, + { + "id": 10, + "type": "file", + "result": "Success. New document id 260 created", + "status": "SUCCESS", + "task_id": "b7629a0f41bd40c7a3ea4680341321b5", + "task_file_name": "2022-03-24+Sonstige+ScanPC2022-03-24_081058.pdf", + "date_created": "2022-05-26T14:26:07.670577-07:00", + "date_done": "2022-05-26T14:26:07.670577-07:00", + "acknowledged": false, + "related_document": 260 + }, + { + "id": 9, + "type": "file", + "result": "Success. New document id 261 created", + "status": "SUCCESS", + "task_id": "02e276a86a424ccfb83309df5d8594be", + "task_file_name": "2sample-pdf-with-images.pdf", + "date_created": "2022-05-26T14:26:07.668987-07:00", + "date_done": "2022-05-26T14:26:07.668987-07:00", + "acknowledged": false, + "related_document": 261 + }, + { + "id": 8, + "type": "file", + "result": "Success. New document id 262 created", + "status": "SUCCESS", + "task_id": "41229b8be9b445c0a523697d0f58f13e", + "task_file_name": "2sample-pdf-with-images_pw.pdf", + "date_created": "2022-05-26T14:26:07.667993-07:00", + "date_done": "2022-05-26T14:26:07.667993-07:00", + "acknowledged": false, + "related_document": 262 + }, + { + "id": 6, + "type": "file", + "result": "Success. New document id 264 created", + "status": "SUCCESS", + "task_id": "bbbca32d408c4619bd0b512a8327c773", + "task_file_name": "homebridge.log", + "date_created": "2022-05-26T14:26:07.665560-07:00", + "date_done": "2022-05-26T14:26:07.665560-07:00", + "acknowledged": false, + "related_document": 264 + }, + { + "id": 5, + "type": "file", + "result": "Success. New document id 265 created", + "status": "SUCCESS", + "task_id": "00ab285ab4bf482ab30c7d580b252ecb", + "task_file_name": "IMG_7459.PNG", + "date_created": "2022-05-26T14:26:07.664506-07:00", + "date_done": "2022-05-26T14:26:07.664506-07:00", + "acknowledged": false, + "related_document": 265 + }, + { + "id": 3, + "type": "file", + "result": "Success. New document id 267 created", + "status": "SUCCESS", + "task_id": "289c5163cfec410db42948a0cacbeb9c", + "task_file_name": "IMG_7459.PNG", + "date_created": "2022-05-26T14:26:07.659661-07:00", + "date_done": "2022-05-26T14:26:07.659661-07:00", + "acknowledged": false, + "related_document": 267 + }, + { + "id": 1, + "type": "file", + "result": null, + "status": "STARTED", + "task_id": "7a4ebdb2bde04311935284027ef8ca65", + "task_file_name": "2019-08-04 DSA Questionnaire - 5-8-19.pdf", + "date_created": "2022-05-26T14:26:07.655276-07:00", + "date_done": null, + "acknowledged": false, + "related_document": null + } +] diff --git a/packages/mock_server/fixtures/ui_settings.json b/packages/mock_server/fixtures/ui_settings.json new file mode 100644 index 0000000..b885eec --- /dev/null +++ b/packages/mock_server/fixtures/ui_settings.json @@ -0,0 +1,163 @@ +{ + "user": { + "id": 1, + "username": "admin", + "is_superuser": true, + "groups": [] + }, + "settings": { + "language": "", + "bulk_edit": { + "confirmation_dialogs": true, + "apply_on_close": false + }, + "documentListSize": 50, + "dark_mode": { + "use_system": true, + "enabled": "false", + "thumb_inverted": "true" + }, + "theme": { + "color": "#b198e5" + }, + "document_details": { + "native_pdf_viewer": false + }, + "date_display": { + "date_locale": "", + "date_format": "mediumDate" + }, + "notifications": { + "consumer_new_documents": true, + "consumer_success": true, + "consumer_failed": true, + "consumer_suppress_on_dashboard": true + } + }, + "permissions": [ + "add_logentry", + "change_logentry", + "delete_logentry", + "view_logentry", + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_user", + "change_user", + "delete_user", + "view_user", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_correspondent", + "change_correspondent", + "delete_correspondent", + "view_correspondent", + "add_document", + "change_document", + "delete_document", + "view_document", + "add_documenttype", + "change_documenttype", + "delete_documenttype", + "view_documenttype", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_paperlesstask", + "change_paperlesstask", + "delete_paperlesstask", + "view_paperlesstask", + "add_savedview", + "change_savedview", + "delete_savedview", + "view_savedview", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_storagepath", + "change_storagepath", + "delete_storagepath", + "view_storagepath", + "add_tag", + "change_tag", + "delete_tag", + "view_tag", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_uisettings", + "change_uisettings", + "delete_uisettings", + "view_uisettings", + "add_mailaccount", + "change_mailaccount", + "delete_mailaccount", + "view_mailaccount", + "add_mailrule", + "change_mailrule", + "delete_mailrule", + "view_mailrule", + "add_session", + "change_session", + "delete_session", + "view_session" + ] +} diff --git a/packages/mock_server/fixtures/user-1.json b/packages/mock_server/fixtures/user-1.json new file mode 100644 index 0000000..cc264b0 --- /dev/null +++ b/packages/mock_server/fixtures/user-1.json @@ -0,0 +1,148 @@ +{ + "id": 1, + "username": "admin", + "password": "**********", + "email": "test2@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-02-14T23:11:09.103293Z", + "is_staff": true, + "is_active": true, + "is_superuser": true, + "groups": [], + "user_permissions": [], + "inherited_permissions": [ + "auth.delete_permission", + "paperless_mail.change_mailrule", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "documents.view_paperlesstask", + "django_q.add_success", + "documents.view_uisettings", + "auth.change_user", + "admin.delete_logentry", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "paperless_mail.add_mailaccount", + "auth.change_group", + "documents.add_note", + "paperless_mail.delete_mailaccount", + "authtoken.delete_tokenproxy", + "guardian.delete_groupobjectpermission", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "documents.delete_tag", + "documents.change_note", + "django_q.delete_task", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "paperless_mail.add_mailrule", + "paperless_mail.view_mailaccount", + "documents.add_frontendsettings", + "sessions.change_session", + "documents.view_savedview", + "authtoken.add_tokenproxy", + "documents.change_tag", + "documents.view_document", + "documents.add_savedview", + "auth.delete_user", + "documents.view_log", + "documents.view_note", + "guardian.change_groupobjectpermission", + "sessions.delete_session", + "django_q.change_failure", + "guardian.change_userobjectpermission", + "documents.change_storagepath", + "documents.delete_document", + "documents.delete_taskattributes", + "django_celery_results.change_groupresult", + "django_q.add_ormq", + "guardian.view_groupobjectpermission", + "admin.change_logentry", + "django_q.delete_schedule", + "documents.delete_paperlesstask", + "django_q.view_ormq", + "documents.change_paperlesstask", + "guardian.delete_userobjectpermission", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "authtoken.change_token", + "guardian.add_groupobjectpermission", + "documents.view_documenttype", + "documents.change_log", + "paperless_mail.delete_mailrule", + "auth.view_group", + "authtoken.view_token", + "admin.view_logentry", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.view_storagepath", + "documents.add_storagepath", + "django_celery_results.add_groupresult", + "documents.view_tag", + "guardian.view_userobjectpermission", + "documents.delete_correspondent", + "documents.add_tag", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "django_q.change_task", + "documents.add_taskattributes", + "documents.delete_storagepath", + "sessions.add_session", + "documents.add_uisettings", + "documents.change_taskattributes", + "documents.delete_uisettings", + "django_q.delete_ormq", + "auth.change_permission", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "paperless_mail.change_mailaccount", + "documents.add_paperlesstask", + "django_q.view_success", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "django_celery_results.add_chordcounter", + "contenttypes.change_contenttype", + "admin.add_logentry", + "django_q.delete_failure", + "documents.change_uisettings", + "django_q.view_failure", + "documents.add_log", + "documents.change_savedview", + "paperless_mail.view_mailrule", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "guardian.add_userobjectpermission", + "sessions.view_session", + "contenttypes.view_contenttype", + "auth.add_permission", + "documents.delete_log", + "django_q.add_task", + "auth.add_group" + ] +} diff --git a/packages/mock_server/fixtures/users.json b/packages/mock_server/fixtures/users.json new file mode 100644 index 0000000..875be85 --- /dev/null +++ b/packages/mock_server/fixtures/users.json @@ -0,0 +1,462 @@ +{ + "count": 4, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "username": "admin", + "password": "**********", + "email": "test@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-02-14T23:11:09.103293Z", + "is_staff": true, + "is_active": true, + "is_superuser": true, + "groups": [], + "user_permissions": [], + "inherited_permissions": [ + "auth.delete_permission", + "paperless_mail.change_mailrule", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "documents.view_paperlesstask", + "django_q.add_success", + "documents.view_uisettings", + "auth.change_user", + "admin.delete_logentry", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "paperless_mail.add_mailaccount", + "auth.change_group", + "documents.add_note", + "paperless_mail.delete_mailaccount", + "authtoken.delete_tokenproxy", + "guardian.delete_groupobjectpermission", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "documents.delete_tag", + "documents.change_note", + "django_q.delete_task", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "paperless_mail.add_mailrule", + "paperless_mail.view_mailaccount", + "documents.add_frontendsettings", + "sessions.change_session", + "documents.view_savedview", + "authtoken.add_tokenproxy", + "documents.change_tag", + "documents.view_document", + "documents.add_savedview", + "auth.delete_user", + "documents.view_log", + "documents.view_note", + "guardian.change_groupobjectpermission", + "sessions.delete_session", + "django_q.change_failure", + "guardian.change_userobjectpermission", + "documents.change_storagepath", + "documents.delete_document", + "documents.delete_taskattributes", + "django_celery_results.change_groupresult", + "django_q.add_ormq", + "guardian.view_groupobjectpermission", + "admin.change_logentry", + "django_q.delete_schedule", + "documents.delete_paperlesstask", + "django_q.view_ormq", + "documents.change_paperlesstask", + "guardian.delete_userobjectpermission", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "authtoken.change_token", + "guardian.add_groupobjectpermission", + "documents.view_documenttype", + "documents.change_log", + "paperless_mail.delete_mailrule", + "auth.view_group", + "authtoken.view_token", + "admin.view_logentry", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.view_storagepath", + "documents.add_storagepath", + "django_celery_results.add_groupresult", + "documents.view_tag", + "guardian.view_userobjectpermission", + "documents.delete_correspondent", + "documents.add_tag", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "django_q.change_task", + "documents.add_taskattributes", + "documents.delete_storagepath", + "sessions.add_session", + "documents.add_uisettings", + "documents.change_taskattributes", + "documents.delete_uisettings", + "django_q.delete_ormq", + "auth.change_permission", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "paperless_mail.change_mailaccount", + "documents.add_paperlesstask", + "django_q.view_success", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "django_celery_results.add_chordcounter", + "contenttypes.change_contenttype", + "admin.add_logentry", + "django_q.delete_failure", + "documents.change_uisettings", + "django_q.view_failure", + "documents.add_log", + "documents.change_savedview", + "paperless_mail.view_mailrule", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "guardian.add_userobjectpermission", + "sessions.view_session", + "contenttypes.view_contenttype", + "auth.add_permission", + "documents.delete_log", + "django_q.add_task", + "auth.add_group" + ] + }, + { + "id": 15, + "username": "test", + "email": "test2@test.com", + "password": "**********", + "first_name": "", + "last_name": "", + "date_joined": "2022-11-23T08:30:54Z", + "is_staff": true, + "is_active": true, + "is_superuser": false, + "groups": [ + 1 + ], + "user_permissions": [ + "add_group", + "change_group", + "delete_group", + "view_group", + "add_permission", + "change_permission", + "delete_permission", + "view_permission", + "add_token", + "change_token", + "delete_token", + "view_token", + "add_tokenproxy", + "change_tokenproxy", + "delete_tokenproxy", + "view_tokenproxy", + "add_contenttype", + "change_contenttype", + "delete_contenttype", + "view_contenttype", + "add_chordcounter", + "change_chordcounter", + "delete_chordcounter", + "view_chordcounter", + "add_groupresult", + "change_groupresult", + "delete_groupresult", + "view_groupresult", + "add_taskresult", + "change_taskresult", + "delete_taskresult", + "view_taskresult", + "add_failure", + "change_failure", + "delete_failure", + "view_failure", + "add_ormq", + "change_ormq", + "delete_ormq", + "view_ormq", + "add_schedule", + "change_schedule", + "delete_schedule", + "view_schedule", + "add_success", + "change_success", + "delete_success", + "view_success", + "add_task", + "change_task", + "delete_task", + "view_task", + "add_note", + "change_note", + "delete_note", + "view_note", + "add_frontendsettings", + "change_frontendsettings", + "delete_frontendsettings", + "view_frontendsettings", + "add_log", + "change_log", + "delete_log", + "view_log", + "add_savedviewfilterrule", + "change_savedviewfilterrule", + "delete_savedviewfilterrule", + "view_savedviewfilterrule", + "add_taskattributes", + "change_taskattributes", + "delete_taskattributes", + "view_taskattributes", + "add_session", + "change_session", + "delete_session", + "view_session" + ], + "inherited_permissions": [ + "auth.delete_permission", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "django_q.add_ormq", + "django_q.add_success", + "django_q.delete_schedule", + "django_q.view_ormq", + "auth.view_permission", + "django_q.add_schedule", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "authtoken.change_token", + "auth.change_group", + "documents.add_note", + "authtoken.delete_tokenproxy", + "documents.view_documenttype", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.change_log", + "auth.view_group", + "authtoken.view_token", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "django_celery_results.add_groupresult", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "auth.add_permission", + "documents.delete_correspondent", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "documents.add_taskattributes", + "django_q.change_task", + "sessions.add_session", + "documents.change_taskattributes", + "documents.change_note", + "django_q.delete_task", + "django_q.delete_ormq", + "auth.change_permission", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "django_q.view_success", + "documents.add_frontendsettings", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "sessions.change_session", + "django_celery_results.add_chordcounter", + "documents.view_savedview", + "contenttypes.change_contenttype", + "django_q.delete_failure", + "authtoken.add_tokenproxy", + "documents.view_document", + "documents.add_savedview", + "django_q.view_failure", + "documents.view_note", + "documents.view_log", + "documents.add_log", + "documents.change_savedview", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "sessions.delete_session", + "django_q.change_failure", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "sessions.view_session", + "contenttypes.view_contenttype", + "documents.delete_taskattributes", + "documents.delete_document", + "documents.delete_log", + "django_q.add_task", + "django_celery_results.change_groupresult", + "auth.add_group" + ] + }, + { + "id": 6, + "username": "testuser", + "password": "**********", + "email": "test3@test.com", + "first_name": "", + "last_name": "", + "date_joined": "2022-11-16T04:14:20.484914Z", + "is_staff": false, + "is_active": true, + "is_superuser": false, + "groups": [ + 1, + 6 + ], + "user_permissions": [ + "add_logentry", + "change_logentry", + "delete_logentry", + "view_logentry" + ], + "inherited_permissions": [ + "auth.delete_permission", + "django_celery_results.add_taskresult", + "documents.view_taskattributes", + "django_q.add_ormq", + "django_q.add_success", + "django_q.delete_schedule", + "django_q.view_ormq", + "auth.change_user", + "auth.view_permission", + "auth.view_user", + "django_q.add_schedule", + "django_celery_results.change_taskresult", + "django_q.change_schedule", + "django_celery_results.delete_taskresult", + "authtoken.change_token", + "auth.change_group", + "documents.add_note", + "authtoken.delete_tokenproxy", + "documents.view_documenttype", + "contenttypes.delete_contenttype", + "documents.change_correspondent", + "authtoken.delete_token", + "documents.change_log", + "auth.view_group", + "authtoken.view_token", + "django_celery_results.view_chordcounter", + "django_celery_results.view_groupresult", + "documents.delete_documenttype", + "django_q.change_ormq", + "documents.change_savedviewfilterrule", + "django_celery_results.add_groupresult", + "auth.delete_group", + "documents.add_documenttype", + "django_q.change_success", + "auth.add_permission", + "documents.delete_correspondent", + "documents.delete_savedviewfilterrule", + "documents.add_correspondent", + "authtoken.view_tokenproxy", + "documents.delete_frontendsettings", + "django_celery_results.delete_chordcounter", + "documents.add_taskattributes", + "django_q.change_task", + "sessions.add_session", + "documents.change_taskattributes", + "documents.change_note", + "django_q.delete_task", + "django_q.delete_ormq", + "auth.change_permission", + "documents.add_savedviewfilterrule", + "django_q.view_task", + "documents.view_savedviewfilterrule", + "documents.change_frontendsettings", + "documents.change_documenttype", + "documents.view_correspondent", + "auth.add_user", + "django_q.view_success", + "documents.add_frontendsettings", + "django_celery_results.delete_groupresult", + "documents.delete_savedview", + "authtoken.change_tokenproxy", + "documents.view_frontendsettings", + "authtoken.add_token", + "sessions.change_session", + "django_celery_results.add_chordcounter", + "documents.view_savedview", + "contenttypes.change_contenttype", + "django_q.delete_failure", + "authtoken.add_tokenproxy", + "documents.view_document", + "documents.add_savedview", + "django_q.view_failure", + "documents.view_note", + "documents.view_log", + "auth.delete_user", + "documents.add_log", + "documents.change_savedview", + "django_q.view_schedule", + "documents.change_document", + "django_celery_results.change_chordcounter", + "documents.add_document", + "sessions.delete_session", + "django_q.change_failure", + "django_celery_results.view_taskresult", + "contenttypes.add_contenttype", + "django_q.delete_success", + "documents.delete_note", + "django_q.add_failure", + "sessions.view_session", + "contenttypes.view_contenttype", + "documents.delete_taskattributes", + "documents.delete_document", + "documents.delete_log", + "django_q.add_task", + "django_celery_results.change_groupresult", + "auth.add_group" + ] + } + ] +} diff --git a/packages/mock_server/ios/Flutter/Generated.xcconfig b/packages/mock_server/ios/Flutter/Generated.xcconfig deleted file mode 100644 index e3b3caf..0000000 --- a/packages/mock_server/ios/Flutter/Generated.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter -FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server -COCOAPODS_PARALLEL_CODE_SIGN=true -FLUTTER_TARGET=lib/main.dart -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=0.0.1 -FLUTTER_BUILD_NUMBER=0.0.1 -EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 -EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/ios/Flutter/flutter_export_environment.sh b/packages/mock_server/ios/Flutter/flutter_export_environment.sh deleted file mode 100755 index c58c84e..0000000 --- a/packages/mock_server/ios/Flutter/flutter_export_environment.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" -export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_TARGET=lib/main.dart" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=0.0.1" -export "FLUTTER_BUILD_NUMBER=0.0.1" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart index 6540acb..4d3ad2b 100644 --- a/packages/mock_server/lib/mock_server.dart +++ b/packages/mock_server/lib/mock_server.dart @@ -1,7 +1,8 @@ library mock_server; import 'dart:convert'; - +import 'dart:math'; +import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; @@ -11,7 +12,8 @@ import 'package:shelf/shelf_io.dart' as shelf_io; import 'package:shelf_router/shelf_router.dart' as shelf_router; - +import 'package:flutter/services.dart' show rootBundle; +import 'dart:convert'; Logger log = Logger('LocalMockApiServer'); @@ -25,12 +27,17 @@ class LocalMockApiServer { late shelf_router.Router app; - + Future> loadFixture(String name) async { + var fixture = await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); + return json.decode(fixture); + } LocalMockApiServer() { app = shelf_router.Router(); + Map createdTags = {}; + app.get('/api/', (Request req) async { log.info('Responding to /api'); @@ -41,7 +48,7 @@ class LocalMockApiServer { app.post('/api/token/', (Request req) async { log.info('Responding to /api/token/'); var body = await req.bodyJsonMap(); - if (body?['username'] == 'test' && body?['password'] == 'test') { + if (body?['username'] == 'admin' && body?['password'] == 'test') { return JsonMockResponse.ok({ 'token': 'testToken' }); @@ -55,32 +62,190 @@ class LocalMockApiServer { app.get('/api/ui_settings/', (Request req) async { log.info('Responding to /api/ui_settings/'); - return JsonMockResponse.ok({ - 'user': { - 'id': 1, - 'username': 'test', - 'displayName': 'Test User' - } - }); + var data = await loadFixture('ui_settings'); + return JsonMockResponse.ok(data); }); app.get('/api/users//', (Request req, String userId) async { log.info('Responding to /api/users//'); - return JsonMockResponse.ok({ - 'id': 1, - 'username': 'test', - 'displayName': 'Test User', - 'email': 'test@test.pl', - 'firstName': 'Test', - 'lastName': 'User', - 'dateJoined': '2000-01-23T01:23:45', - 'isStaff': false, - 'isActive': true, - 'isSuperuser': true, - 'groups': [], - 'userPermissions': [], - 'inheritedPermissions': [] - }); + var data = await loadFixture('user-1'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/users/', (Request req, String userId) async { + log.info('Responding to /api/users/'); + var data = await loadFixture('users'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/groups/', (Request req, String userId) async { + log.info('Responding to /api/groups/'); + var data = await loadFixture('groups'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/correspondents/', (Request req) async { + log.info('Responding to /api/correspondents/'); + var data = await loadFixture('correspondents'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/document_types/', (Request req) async { + log.info('Responding to /api/document_types/'); + var data = await loadFixture('doc_types'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/tags/', (Request req) async { + log.info('Responding to /api/tags/'); + if (createdTags.isEmpty) { + var data = await loadFixture("tags"); + createdTags = data; + } + return JsonMockResponse.ok(createdTags); + }); + + app.post('/api/tags/', (Request req) async { + log.info('Responding to POST /api/tags/'); + var body = await req.bodyJsonMap(); + var data = { + "id": Random().nextInt(200), + "slug": body?['name'], + "name": body?['name'], + "color": body?['color'], + "text_color":"#000000", + "match":"", + "matching_algorithm": body?['matching_algorithm'], + "is_insensitive": body?['is_insensitive'], + "is_inbox_tag":false, + "owner":1, + "user_can_change":true, + "document_count": Random().nextInt(200) + }; + (createdTags['results'] as List).add(data); + return Response( + 201, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.put('/api/tags//', (Request req, String tagId) async { + log.info('Responding to PUT /api/tags//'); + var body = await req.bodyJsonMap(); + var data = { + "id": body?['id'], + "slug": body?['name'], + "name": body?['name'], + "color": body?['color'], + "text_color":"#000000", + "match":"", + "matching_algorithm": body?['matching_algorithm'], + "is_insensitive": body?['is_insensitive'], + "is_inbox_tag":false, + "owner":1, + "user_can_change":true, + "document_count": Random().nextInt(200) + }; + var index = (createdTags['results'] as List).indexWhere((element) => element['id'] == body?['id']); + (createdTags['results'] as List)[index] = data; + return Response( + 200, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.delete('/api/tags//', (Request req, String tagId) async { + log.info('Responding to PUT /api/tags//'); + (createdTags['results'] as List).removeWhere((element) => element['id'] == tagId); + return Response( + 204, + body: null, + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null + ); + }); + + app.get('/api/storage_paths/', (Request req) async { + log.info('Responding to /api/storage_paths/'); + var data = await loadFixture('storage_paths'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/storage_paths/', (Request req) async { + log.info('Responding to /api/storage_paths/'); + var data = await loadFixture('storage_paths'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/saved_views/', (Request req) async { + log.info('Responding to /api/saved_views/'); + var data = await loadFixture('saved_views'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/documents/', (Request req) async { + log.info('Responding to /api/documents/'); + var data = await loadFixture('documents'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/documents//thumb/', (Request req, String docId) async { + log.info('Responding to /api/documents//thumb/'); + var thumb = await rootBundle.load('packages/mock_server/fixtures/lorem-ipsum.png'); + try { + var resp = Response.ok( + http.ByteStream.fromBytes(thumb.buffer.asInt8List()), + headers: {'Content-Type': 'image/png'}, + ); + return resp; + } catch (e) { + return null; + } + }); + + app.get('/api/documents//metadata/', (Request req, String docId) async { + log.info('Responding to /api/documents//metadata/'); + var data = await loadFixture('metadata'); + return JsonMockResponse.ok(data); + }); + + //This is not yet used in the app + app.get('/api/documents//suggestions/', (Request req, String docId) async { + log.info('Responding to /api/documents//suggestions/'); + var data = await loadFixture('suggestions'); + return JsonMockResponse.ok(data); + }); + + //This is not yet used in the app + app.get('/api/documents//notes/', (Request req, String docId) async { + log.info('Responding to /api/documents//notes/'); + var data = await loadFixture('notes'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/tasks/', (Request req) async { + log.info('Responding to /api/tasks/'); + var data = await loadFixture('tasks'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/statistics/', (Request req) async { + log.info('Responding to /api/statistics/'); + var data = await loadFixture('statistics'); + return JsonMockResponse.ok(data); + }); + + app.get('/api/statistics/', (Request req) async { + log.info('Responding to /api/statistics/'); + var data = await loadFixture('statistics'); + return JsonMockResponse.ok(data); }); } diff --git a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig deleted file mode 100644 index e822246..0000000 --- a/packages/mock_server/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter -FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server -COCOAPODS_PARALLEL_CODE_SIGN=true -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=0.0.1 -FLUTTER_BUILD_NUMBER=0.0.1 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh deleted file mode 100755 index ded31c1..0000000 --- a/packages/mock_server/macos/Flutter/ephemeral/flutter_export_environment.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/opt/homebrew/Caskroom/flutter/3.10.0/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/Konrad.Lys/IdeaProjects/paperless-mobile/packages/mock_server" -export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=0.0.1" -export "FLUTTER_BUILD_NUMBER=0.0.1" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/mock_server/pubspec.yaml b/packages/mock_server/pubspec.yaml index 53e8177..0808b48 100644 --- a/packages/mock_server/pubspec.yaml +++ b/packages/mock_server/pubspec.yaml @@ -24,7 +24,9 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - + assets: + - fixtures/ + - fixtures/ui_settings.json # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/pubspec.lock b/pubspec.lock index f49ff96..c9646e1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -261,10 +261,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "45262924896ff72a8cd92b722bb7e3d5020f9e0724531a3e10e22ddae2005991" + sha256: "8599ae9edca5ff96163fca3e36f8e481ea917d1e71cdad912c084b5579913f34" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" connectivity_plus_platform_interface: dependency: transitive description: @@ -325,10 +325,10 @@ packages: dependency: transitive description: name: dart_code_metrics_presets - sha256: "22e27f98e8c7d8b11cca43d2656a822935280747050ae65e8cd03c52d09c0d1c" + sha256: b71eadf02a3787ebd5c887623f83f6fdc204d45c75a081bd636c4104b3fd8b73 url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" dart_style: dependency: transitive description: @@ -621,10 +621,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "96af49aa6b57c10a312106ad6f71deed5a754029c24789bbf620ba784f0bd0b0" + sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.15" flutter_secure_storage: dependency: "direct main" description: @@ -748,10 +748,10 @@ packages: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" graphs: dependency: "direct overridden" description: @@ -1072,10 +1072,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: d39e8fbff4c5aef4592737e25ad6ac500df006ce7a7a8e1f838ce1256e167542 + sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" package_info_plus_platform_interface: dependency: transitive description: From 0e88f9252c9e786c390562ddc3148c0d23459df9 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 18:47:54 +0200 Subject: [PATCH 07/11] FEATURE dart format --- packages/mock_server/lib/mock_server.dart | 114 +++++++--------------- 1 file changed, 36 insertions(+), 78 deletions(-) diff --git a/packages/mock_server/lib/mock_server.dart b/packages/mock_server/lib/mock_server.dart index 4d3ad2b..281209c 100644 --- a/packages/mock_server/lib/mock_server.dart +++ b/packages/mock_server/lib/mock_server.dart @@ -14,50 +14,41 @@ import 'package:shelf_router/shelf_router.dart' as shelf_router; import 'package:flutter/services.dart' show rootBundle; import 'dart:convert'; + Logger log = Logger('LocalMockApiServer'); - class LocalMockApiServer { - static final host = 'localhost'; static final port = 3131; static get baseUrl => 'http://$host:$port/'; - late shelf_router.Router app; Future> loadFixture(String name) async { - var fixture = await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); + var fixture = + await rootBundle.loadString('packages/mock_server/fixtures/$name.json'); return json.decode(fixture); } LocalMockApiServer() { - app = shelf_router.Router(); Map createdTags = {}; - app.get('/api/', (Request req) async { log.info('Responding to /api'); - return JsonMockResponse.ok({ - }); + return JsonMockResponse.ok({}); }); app.post('/api/token/', (Request req) async { log.info('Responding to /api/token/'); var body = await req.bodyJsonMap(); if (body?['username'] == 'admin' && body?['password'] == 'test') { - return JsonMockResponse.ok({ - 'token': 'testToken' - }); + return JsonMockResponse.ok({'token': 'testToken'}); } else { - return Response.unauthorized( - 'Unauthorized' - ); + return Response.unauthorized('Unauthorized'); } - }); app.get('/api/ui_settings/', (Request req) async { @@ -113,23 +104,21 @@ class LocalMockApiServer { "slug": body?['name'], "name": body?['name'], "color": body?['color'], - "text_color":"#000000", - "match":"", + "text_color": "#000000", + "match": "", "matching_algorithm": body?['matching_algorithm'], "is_insensitive": body?['is_insensitive'], - "is_inbox_tag":false, - "owner":1, - "user_can_change":true, + "is_inbox_tag": false, + "owner": 1, + "user_can_change": true, "document_count": Random().nextInt(200) }; (createdTags['results'] as List).add(data); - return Response( - 201, - body: jsonEncode(data), - headers: {'Content-Type': 'application/json'}, - encoding: null, - context: null - ); + return Response(201, + body: jsonEncode(data), + headers: {'Content-Type': 'application/json'}, + encoding: null, + context: null); }); app.put('/api/tags//', (Request req, String tagId) async { @@ -140,36 +129,34 @@ class LocalMockApiServer { "slug": body?['name'], "name": body?['name'], "color": body?['color'], - "text_color":"#000000", - "match":"", + "text_color": "#000000", + "match": "", "matching_algorithm": body?['matching_algorithm'], "is_insensitive": body?['is_insensitive'], - "is_inbox_tag":false, - "owner":1, - "user_can_change":true, + "is_inbox_tag": false, + "owner": 1, + "user_can_change": true, "document_count": Random().nextInt(200) }; - var index = (createdTags['results'] as List).indexWhere((element) => element['id'] == body?['id']); + var index = (createdTags['results'] as List) + .indexWhere((element) => element['id'] == body?['id']); (createdTags['results'] as List)[index] = data; - return Response( - 200, + return Response(200, body: jsonEncode(data), headers: {'Content-Type': 'application/json'}, encoding: null, - context: null - ); + context: null); }); app.delete('/api/tags//', (Request req, String tagId) async { log.info('Responding to PUT /api/tags//'); - (createdTags['results'] as List).removeWhere((element) => element['id'] == tagId); - return Response( - 204, + (createdTags['results'] as List) + .removeWhere((element) => element['id'] == tagId); + return Response(204, body: null, headers: {'Content-Type': 'application/json'}, encoding: null, - context: null - ); + context: null); }); app.get('/api/storage_paths/', (Request req) async { @@ -198,7 +185,8 @@ class LocalMockApiServer { app.get('/api/documents//thumb/', (Request req, String docId) async { log.info('Responding to /api/documents//thumb/'); - var thumb = await rootBundle.load('packages/mock_server/fixtures/lorem-ipsum.png'); + var thumb = await rootBundle + .load('packages/mock_server/fixtures/lorem-ipsum.png'); try { var resp = Response.ok( http.ByteStream.fromBytes(thumb.buffer.asInt8List()), @@ -210,14 +198,16 @@ class LocalMockApiServer { } }); - app.get('/api/documents//metadata/', (Request req, String docId) async { + app.get('/api/documents//metadata/', + (Request req, String docId) async { log.info('Responding to /api/documents//metadata/'); var data = await loadFixture('metadata'); return JsonMockResponse.ok(data); }); //This is not yet used in the app - app.get('/api/documents//suggestions/', (Request req, String docId) async { + app.get('/api/documents//suggestions/', + (Request req, String docId) async { log.info('Responding to /api/documents//suggestions/'); var data = await loadFixture('suggestions'); return JsonMockResponse.ok(data); @@ -247,80 +237,48 @@ class LocalMockApiServer { var data = await loadFixture('statistics'); return JsonMockResponse.ok(data); }); - } - Future start() async { - log.info('starting...'); - var handler = const Pipeline().addMiddleware( - logRequests(logger: (message, isError) { - if (isError) - log.severe(message); - else - log.info(message); - }), - ).addHandler(app); - var server = await shelf_io.serve(handler, host, port); server.autoCompress = true; - log.info('serving on: $baseUrl'); - } - } - extension on Request { - Future bodyJsonValue(String param) async { - return jsonDecode(await this.readAsString())?[param]; - } Future bodyJsonMap() async { - return jsonDecode(await this.readAsString()); - } - String? get accessToken => - this.headers['Authorization']?.split('Bearer ').last; - } - extension JsonMockResponse on Response { - static ok(T json, {int delay = 800}) async { - await Future.delayed(Duration(milliseconds: delay)); // Emulate lag return Response.ok( - jsonEncode(json), - headers: {'Content-Type': 'application/json'}, - ); - } - -} \ No newline at end of file +} From 58c65fd925bc374761b2eb9da3124b30538ab0d1 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Fri, 26 May 2023 19:24:07 +0200 Subject: [PATCH 08/11] FEATURE remove generated files --- .../plugins/GeneratedPluginRegistrant.java | 23 ------------------- packages/mock_server/android/local.properties | 2 -- .../ios/Runner/GeneratedPluginRegistrant.h | 19 --------------- .../ios/Runner/GeneratedPluginRegistrant.m | 14 ----------- .../flutter/generated_plugin_registrant.cc | 11 --------- .../flutter/generated_plugin_registrant.h | 15 ------------ .../linux/flutter/generated_plugins.cmake | 23 ------------------- .../Flutter/GeneratedPluginRegistrant.swift | 10 -------- .../flutter/generated_plugin_registrant.cc | 11 --------- .../flutter/generated_plugin_registrant.h | 15 ------------ .../windows/flutter/generated_plugins.cmake | 23 ------------------- 11 files changed, 166 deletions(-) delete mode 100644 packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java delete mode 100644 packages/mock_server/android/local.properties delete mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h delete mode 100644 packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m delete mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.cc delete mode 100644 packages/mock_server/linux/flutter/generated_plugin_registrant.h delete mode 100644 packages/mock_server/linux/flutter/generated_plugins.cmake delete mode 100644 packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift delete mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.cc delete mode 100644 packages/mock_server/windows/flutter/generated_plugin_registrant.h delete mode 100644 packages/mock_server/windows/flutter/generated_plugins.cmake diff --git a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java deleted file mode 100644 index d007606..0000000 --- a/packages/mock_server/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.flutter.plugins; - -import io.flutter.plugin.common.PluginRegistry; - -/** - * Generated file. Do not edit. - */ -public final class GeneratedPluginRegistrant { - public static void registerWith(PluginRegistry registry) { - if (alreadyRegisteredWith(registry)) { - return; - } - } - - private static boolean alreadyRegisteredWith(PluginRegistry registry) { - final String key = GeneratedPluginRegistrant.class.getCanonicalName(); - if (registry.hasPlugin(key)) { - return true; - } - registry.registrarFor(key); - return false; - } -} diff --git a/packages/mock_server/android/local.properties b/packages/mock_server/android/local.properties deleted file mode 100644 index 679e454..0000000 --- a/packages/mock_server/android/local.properties +++ /dev/null @@ -1,2 +0,0 @@ -sdk.dir=/Users/Konrad.Lys/Library/Android/sdk -flutter.sdk=/opt/homebrew/Caskroom/flutter/3.10.0/flutter \ No newline at end of file diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h deleted file mode 100644 index 7a89092..0000000 --- a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GeneratedPluginRegistrant_h -#define GeneratedPluginRegistrant_h - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface GeneratedPluginRegistrant : NSObject -+ (void)registerWithRegistry:(NSObject*)registry; -@end - -NS_ASSUME_NONNULL_END -#endif /* GeneratedPluginRegistrant_h */ diff --git a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m b/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m deleted file mode 100644 index efe65ec..0000000 --- a/packages/mock_server/ios/Runner/GeneratedPluginRegistrant.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#import "GeneratedPluginRegistrant.h" - -@implementation GeneratedPluginRegistrant - -+ (void)registerWithRegistry:(NSObject*)registry { -} - -@end diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc b/packages/mock_server/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index e71a16d..0000000 --- a/packages/mock_server/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/packages/mock_server/linux/flutter/generated_plugin_registrant.h b/packages/mock_server/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/packages/mock_server/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/linux/flutter/generated_plugins.cmake b/packages/mock_server/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 2e1de87..0000000 --- a/packages/mock_server/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100644 index cccf817..0000000 --- a/packages/mock_server/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { -} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc b/packages/mock_server/windows/flutter/generated_plugin_registrant.cc deleted file mode 100644 index 8b6d468..0000000 --- a/packages/mock_server/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void RegisterPlugins(flutter::PluginRegistry* registry) { -} diff --git a/packages/mock_server/windows/flutter/generated_plugin_registrant.h b/packages/mock_server/windows/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d8..0000000 --- a/packages/mock_server/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/mock_server/windows/flutter/generated_plugins.cmake b/packages/mock_server/windows/flutter/generated_plugins.cmake deleted file mode 100644 index b93c4c3..0000000 --- a/packages/mock_server/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) From 96ae4ae7584ed9aed49b15c428d39ea3e0c09ae7 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Sun, 28 May 2023 07:28:58 +0200 Subject: [PATCH 09/11] FEATURE make user email nullable --- android/build.gradle | 2 +- packages/mock_server/fixtures/users.json | 1 - .../lib/src/models/user_model.dart | 2 +- pubspec.lock | 74 +++++++++---------- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 6572cbe..7e471ae 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.0' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() diff --git a/packages/mock_server/fixtures/users.json b/packages/mock_server/fixtures/users.json index 875be85..9be8628 100644 --- a/packages/mock_server/fixtures/users.json +++ b/packages/mock_server/fixtures/users.json @@ -154,7 +154,6 @@ { "id": 15, "username": "test", - "email": "test2@test.com", "password": "**********", "first_name": "", "last_name": "", diff --git a/packages/paperless_api/lib/src/models/user_model.dart b/packages/paperless_api/lib/src/models/user_model.dart index 340f5f4..56bc1c1 100644 --- a/packages/paperless_api/lib/src/models/user_model.dart +++ b/packages/paperless_api/lib/src/models/user_model.dart @@ -16,7 +16,7 @@ class UserModel with _$UserModel { const factory UserModel.v3({ @HiveField(0) required int id, @HiveField(1) required String username, - @HiveField(2) required String email, + @HiveField(2) String? email, @HiveField(3) String? firstName, @HiveField(4) String? lastName, @HiveField(5) DateTime? dateJoined, diff --git a/pubspec.lock b/pubspec.lock index c9646e1..6ab6dca 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: barcode - sha256: "52570564684bbb0240a9f1fdb6bad12adc5e0540103c1c96d6dd550bd928b1c9" + sha256: "789f898eef0bd88312470bdb2cc996f895ad7dd5f89e9adde84b204546a90b45" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.2.4" bidi: dependency: transitive description: @@ -109,18 +109,18 @@ packages: dependency: transitive description: name: bloc - sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80" + sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.1.2" bloc_test: dependency: "direct dev" description: name: bloc_test - sha256: ffbb60c17ee3d8e3784cb78071088e353199057233665541e8ac6cd438dca8ad + sha256: "5f41a3e391c89ccdade81a96233e1e5e5d01564e29e5fe180741fb23579399b9" url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.1.2" boolean_selector: dependency: transitive description: @@ -173,10 +173,10 @@ packages: dependency: transitive description: name: build_runner_core - sha256: "30859c90e9ddaccc484f56303931f477b1f1ba2bab74aa32ed5d6ce15870f8cf" + sha256: "88a57f2ac99849362e73878334caa9f06ee25f31d2adced882b8337838c84e1e" url: "https://pub.dev" source: hosted - version: "7.2.8" + version: "7.2.9" built_collection: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: built_value - sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d" + sha256: "7dd62d9faf105c434f3d829bbe9c4be02ec67f5ed94832222116122df67c5452" url: "https://pub.dev" source: hosted - version: "8.5.0" + version: "8.6.0" cached_network_image: dependency: "direct main" description: @@ -309,10 +309,10 @@ packages: dependency: transitive description: name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 + sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" url: "https://pub.dev" source: hosted - version: "0.17.2" + version: "0.17.3" dart_code_metrics: dependency: "direct dev" description: @@ -406,7 +406,7 @@ packages: description: path: "." ref: master - resolved-ref: "685af159405b0b3fd8d3f9a02b34a548a79af492" + resolved-ref: "6ca5e015fc9cb4603890bddacdea0cafb839650d" url: "https://github.com/sawankumarbundelkhandi/edge_detection" source: git version: "1.1.1" @@ -446,10 +446,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c7a8e25ca60e7f331b153b0cb3d405828f18d3e72a6fa1d9440c86556fffc877 + sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf" url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "5.3.1" fixnum: dependency: transitive description: @@ -467,10 +467,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775" + sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.3" flutter_blurhash: dependency: transitive description: @@ -690,10 +690,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: "721610b3d61814efa13fb5f720a6781bc123cd51b7e01f5a45d7c92124376644" + sha256: "986143baa65734d02b494ffb8c4e22fc1065d272ded050e7229b81e37aed316e" url: "https://pub.dev" source: hosted - version: "4.3.8" + version: "4.4.0" flutter_web_plugins: dependency: transitive description: flutter @@ -703,10 +703,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "2f9c4d3f4836421f7067a28f8939814597b27614e021da9d63e5d3fb6e212d25" + sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "8.2.2" font_awesome_flutter: dependency: "direct main" description: @@ -828,10 +828,10 @@ packages: dependency: "direct main" description: name: hydrated_bloc - sha256: eb92d88061b6b911c48779b08a91c8a9f3a3aa8475f80d9380045375d9876536 + sha256: "0ea117b32259d9a79c2a2d33eef92e9dd676b88ec4f1ef94102c5889ca1673b6" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "9.1.1" image: dependency: "direct main" description: @@ -937,10 +937,10 @@ packages: dependency: transitive description: name: local_auth_ios - sha256: "503a938c4edde6b244c6ee3b1e2e675ddb7e37e79d5056658dbed1997cf04785" + sha256: edc2977c5145492f3451db9507a2f2f284ee4f408950b3e16670838726761940 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" local_auth_platform_interface: dependency: transitive description: @@ -961,10 +961,10 @@ packages: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" matcher: dependency: transitive description: @@ -1008,10 +1008,10 @@ packages: dependency: "direct dev" description: name: mockito - sha256: dd61809f04da1838a680926de50a9e87385c1de91c6579629c3d1723946e8059 + sha256: "8b46d7eb40abdda92d62edd01546051f0c27365e65608c284de336dccfef88cc" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" mocktail: dependency: transitive description: @@ -1143,10 +1143,10 @@ packages: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" + sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 url: "https://pub.dev" source: hosted - version: "2.1.10" + version: "2.1.11" path_provider_platform_interface: dependency: transitive description: @@ -1167,10 +1167,10 @@ packages: dependency: "direct main" description: name: pdf - sha256: "70d84154dc5b6ddf28eee6c012510a4cbbebb3a1879c0957e05364a95e8f3832" + sha256: "9f75fc7f5580ea5e635b5724de58fb27f684c9ad03ed46fdc1aac768e4557315" url: "https://pub.dev" source: hosted - version: "3.10.3" + version: "3.10.4" pedantic: dependency: transitive description: @@ -1636,10 +1636,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "1a5848f598acc5b7d8f7c18b8cb834ab667e59a13edc3c93e9d09cf38cc6bc87" + sha256: eed4e6a1164aa9794409325c3b707ff424d4d1c2a785e7db67f8bbda00e36e51 url: "https://pub.dev" source: hosted - version: "6.0.34" + version: "6.0.35" url_launcher_ios: dependency: transitive description: @@ -1676,10 +1676,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" + sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab" url: "https://pub.dev" source: hosted - version: "2.0.16" + version: "2.0.17" url_launcher_windows: dependency: transitive description: From fce44c9fbb7ad313466462b14436f0afd4d82aee Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Sun, 28 May 2023 10:50:03 +0200 Subject: [PATCH 10/11] FEATURE fix permissions model --- packages/mock_server/fixtures/documents.json | 55 +++++++++++++++++-- .../lib/config/hive/hive_type_ids.dart | 1 + .../src/models/permissions/permissions.dart | 5 +- .../users_and_groups_permissions.dart | 17 ++++++ 4 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 packages/paperless_api/lib/src/models/permissions/users_and_groups_permissions.dart diff --git a/packages/mock_server/fixtures/documents.json b/packages/mock_server/fixtures/documents.json index c63e957..87bc3a4 100644 --- a/packages/mock_server/fixtures/documents.json +++ b/packages/mock_server/fixtures/documents.json @@ -22,7 +22,16 @@ "archived_file_name": "2022-03-22 no latin title.pdf", "owner": null, "user_can_change": true, - + "permissions": { + "view": { + "users": [], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, "notes": [ { "id": 9, @@ -61,7 +70,16 @@ "archived_file_name": "2022-03-23 llorem ipsum dolor sit amet.pdf", "owner": null, "user_can_change": true, - + "permissions": { + "view": { + "users": [], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, "notes": [] }, { @@ -83,7 +101,16 @@ "archived_file_name": "2022-03-24 dolor.pdf", "owner": null, "user_can_change": true, - + "permissions": { + "view": { + "users": [], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, "notes": [] }, { @@ -105,7 +132,16 @@ "archived_file_name": "2022-06-01 sit amet.pdf", "owner": null, "user_can_change": true, - + "permissions": { + "view": { + "users": [], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, "notes": [] }, { @@ -125,7 +161,16 @@ "archived_file_name": "doc5.pdf", "owner": 15, "user_can_change": true, - + "permissions": { + "view": { + "users": [], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, "notes": [] }, { diff --git a/packages/paperless_api/lib/config/hive/hive_type_ids.dart b/packages/paperless_api/lib/config/hive/hive_type_ids.dart index 3568647..a931473 100644 --- a/packages/paperless_api/lib/config/hive/hive_type_ids.dart +++ b/packages/paperless_api/lib/config/hive/hive_type_ids.dart @@ -30,6 +30,7 @@ class PaperlessApiHiveTypeIds { static const int groupModel = 124; static const int permissions = 125; static const int userModelv2 = 126; + static const int usersAndGroupsPermissions = 127; } void registerPaperlessApiHiveTypeAdapters() { diff --git a/packages/paperless_api/lib/src/models/permissions/permissions.dart b/packages/paperless_api/lib/src/models/permissions/permissions.dart index ea0d489..3530f8b 100644 --- a/packages/paperless_api/lib/src/models/permissions/permissions.dart +++ b/packages/paperless_api/lib/src/models/permissions/permissions.dart @@ -1,6 +1,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:hive/hive.dart'; import 'package:paperless_api/paperless_api.dart'; +import 'package:paperless_api/src/models/permissions/users_and_groups_permissions.dart'; part 'permissions.freezed.dart'; part 'permissions.g.dart'; @@ -9,8 +10,8 @@ part 'permissions.g.dart'; @freezed class Permissions with _$Permissions { const factory Permissions({ - @HiveField(0) @Default([]) List view, - @HiveField(1) @Default([]) List change, + @HiveField(0) required UsersAndGroupsPermissions view, + @HiveField(1) required UsersAndGroupsPermissions change, }) = _Permissions; factory Permissions.fromJson(Map json) => _$PermissionsFromJson(json); diff --git a/packages/paperless_api/lib/src/models/permissions/users_and_groups_permissions.dart b/packages/paperless_api/lib/src/models/permissions/users_and_groups_permissions.dart new file mode 100644 index 0000000..326005e --- /dev/null +++ b/packages/paperless_api/lib/src/models/permissions/users_and_groups_permissions.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:hive/hive.dart'; +import 'package:paperless_api/paperless_api.dart'; + +part 'users_and_groups_permissions.freezed.dart'; +part 'users_and_groups_permissions.g.dart'; + +@HiveType(typeId: PaperlessApiHiveTypeIds.usersAndGroupsPermissions) +@freezed +class UsersAndGroupsPermissions with _$UsersAndGroupsPermissions { + const factory UsersAndGroupsPermissions({ + @HiveField(0) @Default([]) List users, + @HiveField(1) @Default([]) List groups, + }) = _UsersAndGroupsPermissions; + + factory UsersAndGroupsPermissions.fromJson(Map json) => _$UsersAndGroupsPermissionsFromJson(json); +} From d325b827273cfb3e72aac2403bb1d0ec5f91e869 Mon Sep 17 00:00:00 2001 From: "konrad.lys@eu.equinix.com" Date: Sun, 28 May 2023 10:59:11 +0200 Subject: [PATCH 11/11] FEATURE revert unnecessary dependency changes --- android/build.gradle | 2 +- .../example/pubspec.lock | 4 +- pubspec.lock | 358 +++++++++--------- 3 files changed, 178 insertions(+), 186 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 7e471ae..6572cbe 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.8.0' + ext.kotlin_version = '1.7.0' repositories { google() mavenCentral() diff --git a/packages/paperless_document_scanner/example/pubspec.lock b/packages/paperless_document_scanner/example/pubspec.lock index d9d59f4..6b2cc09 100644 --- a/packages/paperless_document_scanner/example/pubspec.lock +++ b/packages/paperless_document_scanner/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: camera_android - sha256: "61bbae4af0204b9bbfd82182e313d405abf5a01bdb057ff6675f2269a5cab4fd" + sha256: e0f9b7eea2d1f4d4f5460f178522f0d02c095d2ae00b01a77419ce61c4184bfe url: "https://pub.dev" source: hosted - version: "0.10.8+1" + version: "0.10.7" camera_avfoundation: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 6ab6dca..4cc75b4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "405666cd3cf0ee0a48d21ec67e65406aad2c726d9fa58840d3375e7bdcd32a07" + sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" url: "https://pub.dev" source: hosted - version: "60.0.0" + version: "52.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "1952250bd005bacb895a01bf1b4dc00e3ba1c526cf47dca54dfe24979c65f5b3" + sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 url: "https://pub.dev" source: hosted - version: "5.12.0" + version: "5.4.0" analyzer_plugin: dependency: transitive description: @@ -45,18 +45,18 @@ packages: dependency: transitive description: name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" + sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" url: "https://pub.dev" source: hosted - version: "3.3.7" + version: "3.3.2" args: dependency: transitive description: name: args - sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.0" async: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: barcode - sha256: "789f898eef0bd88312470bdb2cc996f895ad7dd5f89e9adde84b204546a90b45" + sha256: "52570564684bbb0240a9f1fdb6bad12adc5e0540103c1c96d6dd550bd928b1c9" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.3" bidi: dependency: transitive description: @@ -109,18 +109,18 @@ packages: dependency: transitive description: name: bloc - sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" + sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.1" bloc_test: dependency: "direct dev" description: name: bloc_test - sha256: "5f41a3e391c89ccdade81a96233e1e5e5d01564e29e5fe180741fb23579399b9" + sha256: ffbb60c17ee3d8e3784cb78071088e353199057233665541e8ac6cd438dca8ad url: "https://pub.dev" source: hosted - version: "9.1.2" + version: "9.1.1" boolean_selector: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: build - sha256: "43865b79fbb78532e4bff7c33087aa43b1d488c4fdef014eaef568af6d8016dc" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.1" build_config: dependency: transitive description: @@ -157,26 +157,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 + sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "220ae4553e50d7c21a17c051afc7b183d28a24a420502e842f303f8e4e6edced" + sha256: "87e06c939450b9b94e3e1bb2d46e0e9780adbff5500d3969f2ba2de6bbb860cb" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.2" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "88a57f2ac99849362e73878334caa9f06ee25f31d2adced882b8337838c84e1e" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" url: "https://pub.dev" source: hosted - version: "7.2.9" + version: "7.2.7" built_collection: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: built_value - sha256: "7dd62d9faf105c434f3d829bbe9c4be02ec67f5ed94832222116122df67c5452" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" url: "https://pub.dev" source: hosted - version: "8.6.0" + version: "8.4.3" cached_network_image: dependency: "direct main" description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.2" clock: dependency: transitive description: @@ -261,10 +261,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "8599ae9edca5ff96163fca3e36f8e481ea917d1e71cdad912c084b5579913f34" + sha256: "45262924896ff72a8cd92b722bb7e3d5020f9e0724531a3e10e22ddae2005991" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.0" connectivity_plus_platform_interface: dependency: transitive description: @@ -301,42 +301,42 @@ packages: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.2" csslib: dependency: transitive description: name: csslib - sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" + sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 url: "https://pub.dev" source: hosted - version: "0.17.3" + version: "0.17.2" dart_code_metrics: dependency: "direct dev" description: name: dart_code_metrics - sha256: "8d40e9fa6ba6b5f4f569768e267e9cb3e74350f98b30ac4b8160795792ce5414" + sha256: "026e28da197a03caeccccc0b174ec98ef03da3c81c4543314d7add121aab4375" url: "https://pub.dev" source: hosted - version: "5.7.4" + version: "5.6.0" dart_code_metrics_presets: dependency: transitive description: name: dart_code_metrics_presets - sha256: b71eadf02a3787ebd5c887623f83f6fdc204d45c75a081bd636c4104b3fd8b73 + sha256: "9c51724f836aebc4465228954cb5757e5a99737af26a452b5dec0a2d5d0b4d66" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.2.0" dart_style: dependency: transitive description: name: dart_style - sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.2.4" dbus: dependency: transitive description: @@ -381,32 +381,32 @@ packages: dependency: "direct main" description: name: dio - sha256: "347d56c26d63519552ef9a569f2a593dda99a81fdbdff13c584b7197cfe05059" + sha256: "9fdbf71baeb250fc9da847f6cb2052196f62c19906a3657adfc18631a667d316" url: "https://pub.dev" source: hosted - version: "5.1.2" + version: "5.0.0" dots_indicator: dependency: transitive description: name: dots_indicator - sha256: f1599baa429936ba87f06ae5f2adc920a367b16d08f74db58c3d0f6e93bcdb5c + sha256: e59dfc90030ee5a4fd4c53144a8ce97cc7a823c2067b8fb9814960cd1ae63f89 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.0" dynamic_color: dependency: "direct main" description: name: dynamic_color - sha256: "74dff1435a695887ca64899b8990004f8d1232b0e84bfc4faa1fdda7c6f57cc1" + sha256: c4a508284b14ec4dda5adba2c28b2cdd34fbae1afead7e8c52cad87d51c5405b url: "https://pub.dev" source: hosted - version: "1.6.5" + version: "1.6.2" edge_detection: dependency: "direct main" description: path: "." ref: master - resolved-ref: "6ca5e015fc9cb4603890bddacdea0cafb839650d" + resolved-ref: "24da81d7cb3bc6418d5901da355addb337793b46" url: "https://github.com/sawankumarbundelkhandi/edge_detection" source: git version: "1.1.1" @@ -430,10 +430,10 @@ packages: dependency: transitive description: name: ffi - sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.1" file: dependency: transitive description: @@ -446,10 +446,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf" + sha256: c7a8e25ca60e7f331b153b0cb3d405828f18d3e72a6fa1d9440c86556fffc877 url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "5.3.0" fixnum: dependency: transitive description: @@ -467,10 +467,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae + sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.2" flutter_blurhash: dependency: transitive description: @@ -520,18 +520,18 @@ packages: dependency: "direct main" description: name: flutter_html - sha256: "850c07bc6c1ed060d3eb3e88469a598260a13eb45d8978b197c1348e0a2b101f" + sha256: "342c7908f0a67bcec62b6e0f7cf23e23bafe7f64693665dd35be98d5e783bdfd" url: "https://pub.dev" source: hosted - version: "3.0.0-beta.1" + version: "3.0.0-alpha.6" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + sha256: "86b71bbaffa38e885f5c21b1182408b9be6951fd125432cf6652c636254cef2d" url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "5.4.0" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -592,10 +592,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_linux - sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 + sha256: "8f6c1611e0c4a88a382691a97bb3c3feb24cc0c0b54152b8b5fb7ffb837f7fbf" url: "https://pub.dev" source: hosted - version: "3.0.0+1" + version: "3.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -613,18 +613,18 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: "02df24aec455c26428dadc637f20d4c548bda23ee2179479a8e8c39f1ecb75b3" + sha256: e301ae206ff0fb09b67d3716009c6c28c2da57a0ad164827b178421bb9d601f7 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.2.18" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" + sha256: "96af49aa6b57c10a312106ad6f71deed5a754029c24789bbf620ba784f0bd0b0" url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.0.14" flutter_secure_storage: dependency: "direct main" description: @@ -690,10 +690,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: "986143baa65734d02b494ffb8c4e22fc1065d272ded050e7229b81e37aed316e" + sha256: "73eb76fa640ea630e2d957e7b469ab2b91e4da6c4950d6032fab7009275637b7" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.3.3" flutter_web_plugins: dependency: transitive description: flutter @@ -703,10 +703,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c" + sha256: "774fa28b07f3a82c93596bc137be33189fec578ed3447a93a5a11c93435de394" url: "https://pub.dev" source: hosted - version: "8.2.2" + version: "8.1.3" font_awesome_flutter: dependency: "direct main" description: @@ -719,10 +719,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "2edb9ef971d0f803860ecd9084afd48c717d002141ad77b69be3e976bee7190e" + sha256: "73b58fe836dc05594451d8f740d97d5167886962d628b9f60a1fe945aa0a891f" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.3" freezed_annotation: dependency: "direct main" description: @@ -748,10 +748,10 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" graphs: dependency: "direct overridden" description: @@ -788,18 +788,18 @@ packages: dependency: transitive description: name: html - sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" + sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 url: "https://pub.dev" source: hosted - version: "0.15.3" + version: "0.15.1" http: dependency: "direct main" description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "0.13.5" http_methods: dependency: transitive description: @@ -828,10 +828,10 @@ packages: dependency: "direct main" description: name: hydrated_bloc - sha256: "0ea117b32259d9a79c2a2d33eef92e9dd676b88ec4f1ef94102c5889ca1673b6" + sha256: eb92d88061b6b911c48779b08a91c8a9f3a3aa8475f80d9380045375d9876536 url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.1.0" image: dependency: "direct main" description: @@ -849,18 +849,18 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.18.0" introduction_screen: dependency: "direct main" description: name: introduction_screen - sha256: f194ae655a84b945a2aedb7961d09948d789fc91088efb032666112923bcbc1e + sha256: "73965475d6b271846f81c5fce5b459546a4ea36c285408691522437fd6bbeb69" url: "https://pub.dev" source: hosted - version: "3.1.8" + version: "3.1.4" io: dependency: transitive description: @@ -873,10 +873,10 @@ packages: dependency: transitive description: name: jiffy - sha256: c3c1da3fe0c08bba3c2c455e8a3e724dfe7ea34dbe8069b992cab90ea1fe40b6 + sha256: "85172c4fc975a50224521c05bf43abc845288863b19d91bd3c221a96a8785dd3" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "5.0.0" js: dependency: transitive description: @@ -897,10 +897,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: "61a60716544392a82726dd0fa1dd6f5f1fd32aec66422b6e229e7b90d52325c4" + sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.6.1" lints: dependency: transitive description: @@ -909,62 +909,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - list_counter: - dependency: transitive - description: - name: list_counter - sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 - url: "https://pub.dev" - source: hosted - version: "1.0.2" local_auth: dependency: "direct main" description: name: local_auth - sha256: "0cf238be2bfa51a6c9e7e9cfc11c05ea39f2a3a4d3e5bb255d0ebc917da24401" + sha256: "8cea55dca20d1e0efa5480df2d47ae30851e7a24cb8e7d225be7e67ae8485aa4" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.3" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: c5e48c4a67fc0e5dd9b5725cc8766b67e2da9a54155c82c6e2ea4a0d1cf9ef93 + sha256: cfcbc4936e288d61ef85a04feef6b95f49ba496d4fd98364e6abafb462b06a1f url: "https://pub.dev" source: hosted - version: "1.0.28" + version: "1.0.18" local_auth_ios: dependency: transitive description: name: local_auth_ios - sha256: edc2977c5145492f3451db9507a2f2f284ee4f408950b3e16670838726761940 + sha256: aa32478d7513066564139af57e11e2cad1bbd535c1efd224a88a8764c5665e3b url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.0.12" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: "9e160d59ef0743e35f1b50f4fb84dc64f55676b1b8071e319ef35e7f3bc13367" + sha256: fbb6973f2fd088e2677f39a5ab550aa1cfbc00997859d5e865569872499d6d61 url: "https://pub.dev" source: hosted - version: "1.0.7" + version: "1.0.6" local_auth_windows: dependency: transitive description: name: local_auth_windows - sha256: "19323b75ab781d5362dbb15dcb7e0916d2431c7a6dbdda016ec9708689877f73" + sha256: "888482e4f9ca3560e00bc227ce2badeb4857aad450c42a31c6cfc9dc21e0ccbc" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.5" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.1.1" matcher: dependency: transitive description: @@ -1008,10 +1000,10 @@ packages: dependency: "direct dev" description: name: mockito - sha256: "8b46d7eb40abdda92d62edd01546051f0c27365e65608c284de336dccfef88cc" + sha256: dd61809f04da1838a680926de50a9e87385c1de91c6579629c3d1723946e8059 url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "5.4.0" mocktail: dependency: transitive description: @@ -1040,10 +1032,18 @@ packages: dependency: transitive description: name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.1" + numerus: + dependency: transitive + description: + name: numerus + sha256: "436759d84f233b40107d0cc31cfa92d24e0960afeb2e506be70926d4cddffd9e" + url: "https://pub.dev" + source: hosted + version: "2.0.0" octo_image: dependency: transitive description: @@ -1072,10 +1072,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" + sha256: d39e8fbff4c5aef4592737e25ad6ac500df006ce7a7a8e1f838ce1256e167542 url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1119,42 +1119,42 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e url: "https://pub.dev" source: hosted - version: "2.0.27" + version: "2.0.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 + sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "2.1.8" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.0.5" path_provider_windows: dependency: transitive description: @@ -1167,10 +1167,10 @@ packages: dependency: "direct main" description: name: pdf - sha256: "9f75fc7f5580ea5e635b5724de58fb27f684c9ad03ed46fdc1aac768e4557315" + sha256: "70d84154dc5b6ddf28eee6c012510a4cbbebb3a1879c0957e05364a95e8f3832" url: "https://pub.dev" source: hosted - version: "3.10.4" + version: "3.10.3" pedantic: dependency: transitive description: @@ -1191,18 +1191,18 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: d8cc6a62ded6d0f49c6eac337e080b066ee3bce4d405bd9439a61e1f1927bfe8 + sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" url: "https://pub.dev" source: hosted - version: "10.2.1" + version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85 + sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" url: "https://pub.dev" source: hosted - version: "9.0.8" + version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: @@ -1251,14 +1251,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" pool: dependency: transitive description: @@ -1295,26 +1287,26 @@ packages: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.3" pub_updater: dependency: transitive description: name: pub_updater - sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c" + sha256: "42890302ab2672adf567dc2b20e55b4ecc29d7e19c63b6b98143ab68dd717d3a" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.2.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.1" qr: dependency: transitive description: @@ -1375,10 +1367,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" + sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.0" share_plus_web: dependency: transitive description: @@ -1407,10 +1399,10 @@ packages: dependency: transitive description: name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" shelf_router: dependency: transitive description: @@ -1423,18 +1415,18 @@ packages: dependency: transitive description: name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.3" shimmer: dependency: "direct main" description: @@ -1460,10 +1452,10 @@ packages: dependency: transitive description: name: source_gen - sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" + sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.2.7" source_helper: dependency: transitive description: @@ -1484,10 +1476,10 @@ packages: dependency: transitive description: name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + sha256: "490098075234dcedb83c5d949b4c93dad5e6b7702748de000be2b57b8e6b2427" url: "https://pub.dev" source: hosted - version: "0.10.12" + version: "0.10.11" source_span: dependency: transitive description: @@ -1500,18 +1492,18 @@ packages: dependency: transitive description: name: sqflite - sha256: b4d6710e1200e96845747e37338ea8a819a12b51689a3bcf31eff0003b37a0b9 + sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" url: "https://pub.dev" source: hosted - version: "2.2.8+4" + version: "2.2.4+1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: e77abf6ff961d69dfef41daccbb66b51e9983cdd5cb35bf30733598057401555 + sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f url: "https://pub.dev" source: hosted - version: "2.4.5" + version: "2.4.2+2" stack_trace: dependency: transitive description: @@ -1556,10 +1548,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" + sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.0.1" term_glyph: dependency: transitive description: @@ -1596,10 +1588,10 @@ packages: dependency: transitive description: name: timezone - sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.9.1" timing: dependency: transitive description: @@ -1612,10 +1604,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.1" universal_io: dependency: transitive description: @@ -1628,66 +1620,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b url: "https://pub.dev" source: hosted - version: "6.1.11" + version: "6.1.9" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: eed4e6a1164aa9794409325c3b707ff424d4d1c2a785e7db67f8bbda00e36e51 + sha256: "3e2f6dfd2c7d9cd123296cab8ef66cfc2c1a13f5845f42c7a0f365690a8a7dd1" url: "https://pub.dev" source: hosted - version: "6.0.35" + version: "6.0.23" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" + sha256: "0a5af0aefdd8cf820dd739886efb1637f1f24489900204f50984634c07a54815" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "6.1.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" + sha256: "318c42cba924e18180c029be69caf0a1a710191b9ec49bb42b5998fdcccee3cc" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" + sha256: "41988b55570df53b3dd2a7fc90c76756a963de6a8c5f8e113330cb35992e2094" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.2" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab" + sha256: "44d79408ce9f07052095ef1f9a693c258d6373dc3944249374e30eff7219ccb0" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.0.14" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" + sha256: b6217370f8eb1fd85c8890c539f5a639a01ab209a36db82c921ebeacefc7a615 url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.3" uuid: dependency: "direct main" description: @@ -1716,18 +1708,18 @@ packages: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.0.2" web_socket_channel: dependency: "direct main" description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.0" webdriver: dependency: transitive description: @@ -1804,10 +1796,10 @@ packages: dependency: transitive description: name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.1" sdks: dart: ">=3.0.0 <4.0.0" flutter: ">=3.7.0"