[pigeon] argument is neither an Objective-C object nor a block type

Steps to Reproduce

Define an enum YourEnum
Define a class YourObject with a Map<YourEnum?,String?> field
Define a pigeon API with a method that takes YourObject as input
Run pigeon to generate the code
Run flutter build ios
Error: Xcode can't build because of the enum as key of Map

You can also check this repository with a sample app:

Clone the repo
Run flutter build ios

Expected results:  I expected to use a Map with enum as key
Actual results: The Map generates a build error in Xcode

Code sample

Pigeon API definition:
enum MessageKey {
  title,
  subtitle,
  description,
}

class Message {
  int? id;
  Map<MessageKey?, String?>? additionalProperties;
}

@HostApi()
abstract class HostApiBridge {
  void sendMessage(Message message);
}

A working sample is available in this repository.

Logs

Xcode's output:
↳
    In file included from
    /Users/your.name/mydev/pigeon_issue_example/ios/Runner/HostApi.m:3:
    /Users/your.name/mydev/pigeon_issue_example/ios/Runner/HostApi.h:21:53: error: type
    argument 'MessageKey *' (aka 'enum MessageKey *') is neither an Objective-C object nor a block type
    @property(nonatomic, strong, nullable) NSDictionary<MessageKey *, NSString *> * additionalProperties;
                                                        ^~~~~~~~~~~~
    1 error generated.
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description

Flutter Analyze:
Analyzing pigeon_issue_example...
No issues found! (ran in 2.6s)

Flutter Doctor:
[✓] Flutter (Channel stable, 2.5.2, on macOS 11.6.1 20G224 darwin-x64, locale en-GB)
    • Flutter version 2.5.2 at /Users/gianluca.paradiso/flutter-sdk/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 3595343e20 (6 weeks ago), 2021-09-30 12:58:18 -0700
    • Engine revision 6ac856380f
    • Dart version 2.14.3

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /Users/gianluca.paradiso/Library/Android/sdk
    • Platform android-30, build-tools 30.0.3
    • ANDROID_HOME = /Users/gianluca.paradiso/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.8+10-b944.6916264)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.4, Build version 12D4e
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.8+10-b944.6916264)

[✓] IntelliJ IDEA Ultimate Edition (version 2020.3.2)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] VS Code (version 1.62.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.28.0

[✓] Connected device (2 available)
    • Nexus 5X (mobile) • 02628c9c66bfd34f • android-arm64  • Android 8.1.0 (API 27)
    • Chrome (web)      • chrome           • web-javascript • Google Chrome 95.0.4638.69

• No issues found!

Thanks for the report and repo. I see the same behavior upon running on latest stable and master:

Xcode's output:
↳
    In file included from
    /Users/dhs/Documents/NCFlutter/flutter_pigeon_argumenterrot_example/ios/Runn
    er/HostApi.m:3:
    /Users/dhs/Documents/NCFlutter/flutter_pigeon_argumenterrot_example/ios/Runn
    er/HostApi.h:21:53: error: type argument 'MessageKey *' (aka 'enum
    MessageKey *') is neither an Objective-C object nor a block type
    @property(nonatomic, strong, nullable) NSDictionary<MessageKey *, NSString
    *> * additionalProperties;
                                                        ^~~~~~~~~~~~
    1 error generated.
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description

 stable, master flutter doctor -v
[✓] Flutter (Channel stable, 2.5.3, on Mac OS X 10.15.4 19E2269 darwin-x64,
    locale en-GB)
    • Flutter version 2.5.3 at /Users/dhs/documents/fluttersdk/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 18116933e7 (2 days ago), 2021-10-15 10:46:35 -0700
    • Engine revision d3ea636dc5
    • Dart version 2.14.4

[✓] Android toolchain - develop for Android devices (Android SDK version 30)
    • Android SDK at /Users/dhs/Library/Android/sdk
    • Platform android-30, build-tools 30.0.3
    • ANDROID_HOME = /Users/dhs/Library/Android/sdk
    • Java binary at: /Users/dhs/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/202.7486908/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.3, Build version 12C33
    • CocoaPods version 1.10.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.1)
    • Android Studio at /Users/dhs/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/202.7486908/Android
      Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)

[✓] VS Code (version 1.57.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.21.0

[✓] Connected device (4 available)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 93.0.4577.82

• No issues found!

[✓] Flutter (Channel master, 2.6.0-12.0.pre.701, on Mac OS X 10.15.4 19E2269
    darwin-x64, locale en-GB)
    • Flutter version 2.6.0-12.0.pre.701 at
      /Users/dhs/documents/fluttersdk/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 24b9346c9b (5 hours ago), 2021-11-11 16:45:40 -0800
    • Engine revision aaacb670af
    • Dart version 2.15.0 (build 2.15.0-285.0.dev)
    • DevTools version 2.8.0

[✓] Android toolchain - develop for Android devices (Android SDK version 30)
    • Android SDK at /Users/dhs/Library/Android/sdk
    • Platform android-30, build-tools 30.0.3
    • ANDROID_HOME = /Users/dhs/Library/Android/sdk
    • Java binary at: /Users/dhs/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/202.7486908/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.5.1, Build version 12E507
    • CocoaPods version 1.10.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.1)
    • Android Studio at /Users/dhs/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/202.7486908/Android
      Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)

[✓] VS Code (version 1.57.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.21.0

[[✓] Connected device (4 available)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 93.0.4577.82

• No issues found!

I believe this is resolved in current versions, since we wrap nullable enums (and currently all generics must be nullable). @tarrinneal Can you validate that we have a test for this case, and close if so?

I believe this is resolved in current versions, since we wrap nullable enums (and currently all generics must be nullable). @tarrinneal Can you validate that we have a test for this case, and close if so?

We don't currently allow for enums as keys, that is something I'm working on currently though.


Add st.camera_input release demo

Adds st.camera_input release demo.

Closing this, but merged these changes directly onto the 1.4.0 branch (that's where we usually deploy the demo apps from) with #20.


Add Emoji 14.0

Can you please release Emoji 14.0 on Saturday? Are are you done with them yet?

It looks like this comment was meant for user C1710 regarding their fork... That fork has released an Emoji 14.0 version... And this PR has not much relevance to the actual repo it got opened in. I think this can be closed?

I can't publicly commit to a date for Unicode 14. I think it's safe to say I expect it will come :)

The readiness is all.

That's okay because C1710 already added emoji 14.0 into blobmoji. And this request in here was a accident.


Port for Minigrid Environments

Hello and congrats for the nice paper!
I am working on my master's thesis trying out your code as my codebase. However, I integrated and use the Minigrid environments instead of the custom mazes you created.
Now, if I understand correctly, the concept of "Memory" refers to the amount of timesteps our policy is fed with data (for each batch).
If I use a Minigrid environment, should the code theoretically work as is?
If not, what changes should I do?
Thanks in advance!

Hi,
Sorry I did not see this issue in time. I discussed MiniGrid-Memory environment in the paper, so the (optimal) policy memory length can be quite short.
To clarify, the amount of timesteps our policy is fed with data this is the policy context length, not necessarily the memory length, because an RNN policy may be hard to capture distant information even if the policy saw it.
The code for T-Maze needs some adjustment for Minigrid: a more expressive observation encoder (e.g., CNN), the policy context length might be shortened (the current code use the full episode length which may be too slow for minigrid).

Thanks a lot for your repy!
What I am working on for my master's thesis is the effects of using the GPT2 as encoder (instead of an LSTM or RNN) together with self-predictive representations (your other project minZP).
So what I am doing right now is feeding the GPT2 encoder with the history and learning oservations and studying the effects of learning efficiency and generalization.
What I was wondering was also if I should train with random samples from the R2D2 buffer or whole episodes like in your MemoryRL project. But I guess I will do an abletion for both cases.
If you are interested on the results/thesis topic we could also have a brief discussion about it if you like :)

What I was wondering was also if I should train with random samples from the R2D2 buffer or whole episodes like in your MemoryRL project. But I guess I will do an abletion for both cases.

Yes, R2D2 buffer will be useful if you do not train whole episodes.
I am interested; could you send me an email to have a brief meeting?


Deployment of AzureChat via Azure Developer CLI successful, but WebApp shows ":( Application Error"

Hey!
I've deployed AzureChat several times now, without any deployment issues, but in the end the WebApp is throwing an Application Error.
In the Log stream of the webapp i find the following:
2024-03-20T17:13:26.528Z ERROR - Container xxxx-webapp-sd5cwsptk25rq_0_bd9ec074 for site xxxx-webapp-sd5cwsptk25rq has exited, failing site start 2024-03-20T17:13:26.530Z ERROR - Container xxxx-webapp-sd5cwsptk25rq_0_bd9ec074 didn't respond to HTTP pings on port: 8080, failing site start. See container logs for debugging. 2024-03-20T17:13:26.534Z INFO  - Stopping site xxxx-webapp-sd5cwsptk25rq because it failed during startup.
In the container log:
2024-03-20T02:17:26.745016371Z    _____
2024-03-20T02:17:26.745044872Z   /  _  \ __________ _________   ____
2024-03-20T02:17:26.745049472Z  /  /_\  \\___   /  |  \_  __ \_/ __ \
2024-03-20T02:17:26.745053172Z /    |    \/    /|  |  /|  | \/\  ___/
2024-03-20T02:17:26.745056572Z \____|__  /_____ \____/ |__|    \___  >
2024-03-20T02:17:26.745060272Z         \/      \/                  \/
2024-03-20T02:17:26.745063672Z A P P   S E R V I C E   O N   L I N U X
2024-03-20T02:17:26.745066972Z
2024-03-20T02:17:26.745070073Z Documentation: http://aka.ms/webapp-linux
2024-03-20T02:17:26.745073173Z NodeJS quickstart: https://aka.ms/node-qs
2024-03-20T02:17:26.745076273Z NodeJS Version : v18.19.0
2024-03-20T02:17:26.745079273Z Note: Any data outside '/home' is not persisted
2024-03-20T02:17:26.745082473Z
2024-03-20T02:17:27.701832454Z Starting OpenBSD Secure Shell server: sshd.
2024-03-20T02:17:27.744094673Z Starting periodic command scheduler: cron.
2024-03-20T02:17:27.751778849Z Could not find build manifest file at '/home/site/wwwroot/oryx-manifest.toml'
2024-03-20T02:17:27.751849852Z Could not find operation ID in manifest. Generating an operation id...
2024-03-20T02:17:27.751858652Z Build Operation ID: b2600354-0d5c-4c21-8a8b-21b6070904e2
2024-03-20T02:17:27.800861213Z Environment Variables for Application Insight's IPA Codeless Configuration exists..
2024-03-20T02:17:27.802549474Z Writing output script to '/opt/startup/startup.sh'
2024-03-20T02:17:27.811806207Z Running #!/bin/sh
2024-03-20T02:17:27.811823407Z
2024-03-20T02:17:27.811828707Z # Enter the source directory to make sure the script runs where the user expects
2024-03-20T02:17:27.811832708Z cd "/home/site/wwwroot"
2024-03-20T02:17:27.811836708Z
2024-03-20T02:17:27.811840108Z export NODE_PATH=/usr/local/lib/node_modules:$NODE_PATH
2024-03-20T02:17:27.811897910Z if [ -z "$PORT" ]; then
2024-03-20T02:17:27.811903310Z 		export PORT=8080
2024-03-20T02:17:27.811907510Z fi
2024-03-20T02:17:27.811911010Z
2024-03-20T02:17:27.821723963Z PATH="$PATH:/home/site/wwwroot" next start
2024-03-20T02:17:27.825401495Z /opt/startup/startup.sh: 11: next: not found

What am I missing? Any idea how I can approach this?
Is there the possibility to trigger only the webapp deployment again via azd?

We have the same issue here, were you able to resolve it?

And ame issue here... Any progress?

I solved that just running azd deploy again.

I am getting same error, could you elaborate what do you mean by running azd deploy again? which step/document is it?


How to parse default arguments from config file

main.py

parser = configargparse.ArgParser(config_file_parser_class=configargparse.YAMLConfigFileParser)
parser.add('-c', '--my-config', required=True, is_config_file=True, help='config file path')
args = parser.parse_args()

args_conf.yaml

input: True

I execute main as python main.py ( and I want to execute it without any arguments, I want parse them as default ones)
The result is:

main.py: error: unrecognized arguments: --input True

At the end, I want just to use args["input"] to acceess to this flag. But because of the error described below I cannot do it. My aim is just to parse all flags from the config file instead of specifying argparse inside script/s to remove code complexity
The error is simple say us that argument that ConfigArgParse parsed from .yaml have not passed in CLI. And there are some lifehacks to get unrecognized arguments as list and then look into them but I want t have it simple without any manipulations :)
I'd like to have recognized arguments as well I would pass them via CLI but don't do it manually. My application has lots of flags and I don't intend to pass all arguments to CLI. I want to pass only required and specific flags that I want to trigger. By the way, please give some example what should I do to add required arguments as well not only default arguments in .yaml to be correctly paraser by parser.parse_args(). The library is great but there are not enough examples to feel free using it
P.S I searched for documentation  and tried to use [DEFAULT] brackets as well as change config_file_parser_class=configargparse.DefaultConfigFileParser to parse from .ini but didn't succeed either.

Hi,
I'm not sure I have understood everything but it seems to me there are multiple matters to answer here :

Fact that configargparse gives you an error when you try to parse unknown arg is the normal behavior. It is the goal of the library itself. If you want to handle unknown arguments : you can use parse_known_args() and merge results of known and unknown dicts if you want to. The goal of the lib is to validate/cast parameters/config so if you want another usage, that seems like out of the scope to me.
use parser.add('-f', '--foo', required=True, default="blah") to set a default and required value to something.
you can use configargparse.ArgParser(..., use default_config_files=['./default_conf.yam', '/etc/another_conf.yaml'], ...) to define default config files that would be parsed before to set default conf values that you can override by command line. I guess this should behave like you expect, using a parse_known_args() call.
in the end, if you want to read data from a yaml file, just use a yaml parser. You could read from a yaml default file with default values (2 lines of code) and get the result in a dict. You can also merge that with the things you parse from command line.

Does that help in any way?
Cheers,
Ronan

@ronhanson Thanks a lot for the explanation but it didn't help me find the answer. I want to have 1 config file and load from it to each module (only module specific flags). By the way I want to specify in this config file "defaults" and "required" flags and write "help" for them. It would be nice to parse config file instead of .py .


Fix: Reduce resource requests.

This PR drops support for cluster profiles since they are not set by either cluster operator nor app operator and therefore the defaults get used. Furthermore it reduces the requests to those from upstream.
Resolves https://github.com/giantswarm/giantswarm/issues/21735.
Tests on workload clusters (not always required)
For changes in the chart, chart templates, and ingress controller container images, I executed the following tests
to verify them working in live enviromnents:

Test / Provider
AWS
Azure
KVM

Upgrade from previous version

Existing Ingress resources are reconciled correctly

Fresh install

Fresh Ingress resources are reconciled correctly

Testing was done using hello-world-app.
Hint for KVM:
kubectl port-forward -n kube-system svc/nginx-ingress-controller-app 8080:80
ingress_domain=host.configured.in.ingress; curl --connect-to "$ingress_domain:80:<IP_ADDRESS>:8080" "http://$ingress_domain" -v

@ubergesundheit Can you tell why the tests are failing? I do not get it...

Yeah, never mind. Found my issue. I did not set proper resource requests for tests.


StopTimer and clearInterval

Hi!!
I have a timer and i want a function to stop timer.
var inter = $(`#my-record-${id} .timer`).startTimer();

But the library don't have any function to stop.
Thanks

The following should work:
var inter = $(`#my-record-${id} .timer`).startTimer({ allowPause: true });

// This function will pause and also resume
function toggleTimer(){
  $(`#my-record-${id} .timer`).trigger('click');
}

Let me know how this goes and feel free to re-open this issue if you run into any issues.
Thank!


Serialize deep class fails at compilation

Expected Behavior
No compilation error
Current Behavior
error C1054: compiler limit: initializers nested too deeply
How to Reproduce
main.cpp
#include "DeepClass.h"
#include "rfl.hpp"
#include "rfl/json.hpp"
int main()
{
    DeepClass dc{};

    const std::string json_string = rfl::json::write(dc);
}

DeepClass.h
#ifndef _DEEPCLASSH_
#define _DEEPCLASSH_

#include "LowHeightClass.h"

class DeepClass
{
public:
	LowHeightClass LHC;

	int dummy1;
	int dummy2;
	double dummy3;
};

#endif

LowHeightClass.h
#ifndef _LOWHEIGHTCLASS_
#define _LOWHEIGHTCLASS_

/*****************/
/* LowHeightClassSub */
/*****************/

class LowHeightClassSub
{
public:
	double dummy1 = 0;
	double dummy2 = 0;
	double dummy3 = 0;
	double dummy4 = 0;
	double dummy5 = 0;
	double dummy6 = 0;
	double dummy7 = 0;
	double dummy8 = 0;
	double dummy9 = 0;
	double dummy10 = 0;
	double dummy11 = 0;
	double dummy12 = 0;
	double dummy13 = 0;
	double dummy14 = 0;
	double dummy15 = 0;
	double dummy16 = 0;
	double dummy17 = 0;
	double dummy18 = 0;
	double dummy19 = 0;

	// Extra channels
	double dummy20 = 0;
	double dummy21 = 0;
};

/***********/
/* LowHeightClass */
/***********/

class LowHeightClass
{
public:
	double dummy1 = 0;
	double dummy2 = 0;
	double dummy3 = 0;

	double dummy4 = 0;
	double dummy5 = 0;
	double dummy6 = 0;

	double dummy7 = 0;
	double dummy8 = 0;

	double dummy9 = 0;
	double dummy10 = 0;

	double dummy11 = 0;
	double dummy12 = 0;
	double dummy13 = 0;
	double dummy14 = 0;

	LowHeightClassSub dummy15{};
	LowHeightClassSub dummy16{};
	LowHeightClassSub dummy17{};
	LowHeightClassSub dummy18{};

};

#endif

The error is raised in rfl\internal\get_field_names.hpp(142,39).
I was expecting it to work since the data structure is not that deep (in this example, 3 classes deep) but still doesn't compile.
Context (Environment)
Visual Studio 2022 (v143) 17.10.0
Windows 10.0
C++20

Thank you for reporting this. I will take a Look.
My suspicion is that's it isn't the the depth of the struct but the total number of fields that's the problem here. It may be due to std::tuple. I will take a closer look and let you know.

Hi @Alecsou , I was able to reproduce the problem. It appears to be an MSVC-only problem, though, all other compilers work fine:
https://github.com/getml/reflect-cpp/pull/147
I will try to find a fix for this.

Hi, quick update :
This problem is a more broad one, the library fails to deal with "big" classes in multiple cases with always the same error.
I for example added an operator using the library in a class with a lot (30~ double fields) and it failed compilation also.
double operator [] (std::string field) {
	std::map m = std::map < std::string, double>();
	const auto view = rfl::to_view(*this);
	view.apply([](const auto& f) {
		if (f.name() == field) {
			return (double)f.value();
		}
		});
}

This makes the library completely unusable under MSVC right now... Hope this can be solved, as this library seems really promising to say the least !

Yes, that is what I thought. It's not the depth, it's the number of fields.
I suspect that the issue is std::tuple and I am afraid that I might have to implement my own version. I am on this.

I was about to create an issue, but I am facing the same one as described here.
Hope this gets resolved soon, as I wanted to implement reflect-cpp into my project.

@RampantDespair , I am on it.
I have conducted a couple of experiments. I am afraid the issue is with the way std::tuple is implemented in the standard library in combination with MSVC compiler restrictions and I will probably have to implement my own version. It will take me a couple of days, but I think I might get this resolved by next week.

@Alecsou and @RampantDespair , good news: My initial hypothesis turned out to be true. It was indeed std::tuple that was the problem here. I have now found a tuple-free way of getting the field names out of the structs:
https://github.com/getml/reflect-cpp/pull/160
As you can see, the test compiles even on MSVC. This still needs some code beautification, but the proof-of-concept is there. I am confident I will be able to merge this over the next couple of days.

@liuzicheng1987 That's great news! I'm eager to try it it out

@RampantDespair and @Alecsou , the issue is resolved: 9c9eceab929a65aa9a7c846940ba60675fd243b5


multiinput does not handle remove tokens event

Using multiinput can add token with the submit event. When removing tokents the tokenupdate event does not handle correctly the remove.(no index or other data to find out what was removed.

@ssocratous71 is this solved with https://github.com/abap2UI5/abap2UI5/issues/406 ?

continue with https://github.com/abap2UI5/abap2UI5/issues/406 and i close this one


Saving to and loading series from file

Added helpers to dump and load a series to a file.
In order to be able to gob.Encode the series, I had to export all fields.
This should not breaking anything :ok_hand:

This seems like the wrong approach.  A more generic "save' function would load and store from a []byte, allowing serialization from any location and not depend on an actual local file.
It seems to me you want to temporarily pause writing and store all local state to a file, and then be able to pick it up against and resume writing values to the time series?  Is this correct?
(Just trying to avoid http://xyproblem.info here..)

You are right, my approach is too specific. I want to write the series periodically to disk or restore them when restarting a service. I'll update the PR accordingly.

did you see #6 ?
we were running the gob encoding/decoding for a while but it turned out to be way too slow.
Instead of functions like Load/Save, why not GobEncode and GobDecode ? that way we can later add other/better serialisation formats, just a thought.

Adding GobEncode means we aren't tied to exporting every single identifier. MarshalBinary is even more generic.

Thanks for the feedback. I made another attempt now going the Marshal route. I'm kind of successful but struggle restoring the datapoints in a sensible way. Here is what I got so far: https://github.com/dgryski/go-tsz/compare/master...glaslos:marshal_binary I'd be glad if someone could point out what I am missing.

Closing due to https://github.com/dgryski/go-tsz/pull/17


Enhancement to JsonPatch to support inheritance and overrides

Hello,
I am looking to extend JsonPatch to support the SCIM patch protocol.  Specifically I am looking to add attribute filters within a list, rather than needing to rely solely on indexes.  I have a fork with some basic functionality to prove it can be done, but I am trying to minimize the amount of code that needs to be maintained outside the main version.  I would like to propose minor refactoring that would make it easier for me to extend JsonPatch to meet these needs.  The actual logic could certainly be included in the base library, but I suspect that would cause unneeded confusion for anybody not leveraging Scim.
Basically I would like to make the following changes:

Allow all Adapters to be inherited and their methods be overridden
Create interfaces for ParsedPath and ObjectVisitor, in addition to allowing their methods to be overridden
Create a new ObjectAdapterTyped which allows the implementation types of the ParsedPath and ObjectVisitor to be set via generics
Update the existing ObjectAdapter to inherit from ObjectAdapterTyped with the current ParsedPath and ObjectVisitor types set, which should prevent any breaking changes to the interface
Allow the Adapter selection to be customized - although this might be easier done just using a new concrete ObjectVisitor

I would also like to propose a change to the ObjectVisitor.TryTraverse which will attempt to create an empty object if the value is null.  This would make it easier to Add a child value to a property that doesn't already exist.  There may be limitations to the capabilities, but I believe it would be very helpful. However, this could be handled in a custom ObjectVisitor if required.
I think this will make it much easier for others to extend the JsonPatch capabilities to add additional support for standard protocols (like Scim) or simply to support additional non-standards complaint patch operations.
Since this requires some minor refactoring of the code base, I wanted to check in with the owners of the project before starting to get feedback on the overall approach.
I am also having some issues running the test project due to dependencies on Core 2.1 preview, and would like to get some assistance to ensure my changes do not cause any breaking changes for others.
Thanks!
Dave

@Eilon, I wanted to ping you quickly on this concept.  I see you were in discussions with somebody else around a similar need that never materialized earlier this year.  I am running into some CI build issues using the forked repo due to internal nuget references and rather than trying to solve that issue, wanted to see if getting this code pulled into JsonPatch proper would be a better use of my time.  The only changes I have made are changing the scope of some methods and exposing some additional interfaces, so I believe the changes are relatively low risk while improving the flexibility. Thanks!

@jmudavid would it be possible to send a PR with a rough outline of what you're looking for? I certainly don't want to waste anyone's time, but that might be the easiest way for us to get a sense of how big a change you're talking about. Don't worry about tests or anything (yet!) - I just want to see if we can easily get a sense of how much API churn there is. Thanks!

@Eilon I created the PR and while I was able to mention you, I couldn't add you as a reviewer.  Here it is https://github.com/aspnet/JsonPatch/pull/130 as I am sure you get a lot of mentions and didn't want it to get buried in your other alerts.  Thanks!

I see you were in discussions with somebody else around a similar need that never materialized earlier this year.

For context, I believe this refers back to #2743.
@jmudavid Thanks for raising this issue again. It looks like we have similar goals regarding extension.
@Eilon and @jmudavid  Some of the changes proposed here look out of the primary goal's scope. It might be easier to manage and consider them if they're filed in individual, separate issues.  Also, as @mkArtakMSFT and @Eilon explained in #2432, "the main goal of this repo is to support the JSON PATCH spec".  For getting started at least, perhaps we should narrow down the scope of the current issue a bit.
Among the proposed changes listed above, these make sense to me:

Allow all Adapters to be inherited and their methods be overridden
Allow the Adapter selection to be customized

For the latter, please reconsider the small change suggested in #2743 to introduce:

a public interface IAdapterFactory. It defines a single method with the signature IAdapter Create( object target, JsonContract jsonContract ). Use IAdapterFactory in ObjectVisitor's private SelectAdapter method.

Making this smaller change first would alleviate large code duplication for extension scenarios.  The "Allow all Adapters to be inherited and their methods be overridden" proposal could take the duplication reduction even further in certain extension scenarios.  But perhaps we could start with a minor tweak, see how it goes, and then expand upon what we've learned from there.

@HappyNomad I have been reviewing the changes I made and the factory approach might be sufficient. Most of the changes I had to make were to get the right Adapter loaded from within the ObjectVisitor and then to handle the different path separators.  The only Adapter I am currently extending is the ListAdapter so I could just replicate the current code, if we don't want to allow them to be overridden currently.
I will start a fresh branch using the factory approach and see if I can replicate the functionality I need without needing new interfaces for ParsedPath and ObjectVisitor, which would certainly be cleaner.
It looks like we would need to define the IAdapterFactory within the JsonPatchDocument and then pass it to the ObjectVisitor through the ObjectAdapter.  Is there a cleaner or more direct approach you had in mind?  Anything else seems like it is going to introduce breaking changes to the API without a lot of benefit.
Let me know what you are thinking.  Thanks!

For IAdapterFactory, I had in mind that a JsonPatchDocument.ApplyTo overload accepts an IAdapterFactory instance, like there's already one that accepts an IObjectAdapter instance.  ApplyTo passes it to an ObjectAdapter constructor overload, which passes it to an ObjectVisitor constructor overload.  This looks like what you described, and it's without breaking changes.
Earlier today I posted an alternative to the IAdapterFactory idea at https://github.com/aspnet/Home/issues/2743#issuecomment-370843641.  Let me know how you think it compares.  Considering your requirement for a custom path separator, it might be nice to have a class JsonPatchSettings that a JsonPatchDocument.ApplyTo overload accepts.  This settings class could have both an Adpaters list property and a PathSeparator property.  These changes wouldn't have to be breaking, either.

@HappyNomad, I can see injecting the IAdapterFactory directly within the ApplyTo method, rather than at the JsonPatchDocument level.  This would make sense to me if there where scenarios where you wanted to apply a different IAdapterFactory to the same JsonPatchDocument instance.  I wouldn't expect this to happen often, so putting it at the class level made sense to me.  It may be a stylistic approach, so I could go either way.  If we are going to add it at the method level, we should make sure it can be supported in all the ApplyTo methods, which to me just adds unnecessary complexity as you would end up with 5 methods.  If there isn't a need to use different IAdapterFactory implementations, we can keep it simpler by including it at the class.  We could just leverage the existing ApplyTo that accepts the IObjectAdapter, but we would still need to add support for the action logger.  I will defer to you on which direction you prefer.
Regarding applying the AspNet formatter pattern to the adapters, I find the way the formatters are handled to be confusing for some and difficult to debug.  I have worked with several of our developers to get them to work right.  I think the factory is simple, straight forward, and easy for somebody to understand and implement.
I have a basic factory pattern working, let me see if I can do without the PathSeparator updates.  If not, we can explore creating JsonPatchSettings following the same approach that we land on for the factory.  Thoughts?

@jmudavid  I prefer passing IAdapterFactory  or JsonPatchSettings to JsonPatchDocument's constructor as you do.  I suggested passing it to ApplyTo only because that's how it how works with ObjectAdapter.  IMHO JsonPatchDocument's constructor should accept ObjectAdapter instead of ApplyTo accepting it, but that would be a breaking change,.  We can at least get it right for IAdapterFactory by having the constructor accept it.
Let me know how the path separator issue goes for you.  Yea, a JsonPatchSettings class could have an AdapterFactory property.  It might be good to introduce a JsonPatchSettings class anyway, for possible future configurability.

@HappyNomad, OK, let's leave it in the constructor.  I thought you were indicating a preference at the method level.  I agree that trying to remain consistent in an existing code base is ideal, but since some objects are passed through the constructor and others the methods, we should be good.
I was able to get all my changes re-implemented using the factory approach.  I did update the Adapters to support inheritance as well since it seems like a low-risk, high-value change, although it is in a separate commit if it is decided to do one without the other.  I was able to work through the path separators without needing any changes there.  While not the most elegant, it keeps the overall solution much cleaner.
We could still use a settings class with only the Factory, but my expectation is that since the other classes are closed, that it may not do folks any good and simply adds another layer.  If the assembly grows in the future it may become more useful, but without knowing how likely that is, I don't know if it is worth it.  I am going to close the old PR and open a new one with the current factory implementation just so you can take a look.  If you want to go the settings route, its just another short step from where we are.
Thanks!

@jmudavid After experimenting with your idea to accept an IAdapterFactory in JsonPatchDocument's constructor and store it in a property on JsonPatchDocument, I've realized that such changes are extraneous to the goal we've agreed upon.  We don't need to modify JsonPatchDocument at all.  Since we're adding an ObjectAdapter constructor that accepts an IAdapterFactory, we can just call the existing ApplyTo overload that accepts an IObjectAdapter.
Although I can relate to your desire to bake in our custom ApplyTo behavior starting from JsonPatchDocument's constructor, I think that proposal belongs in a separate issue.  I also think it should be generalized to work for the existing IObjectAdapter extension point.

@HappyNomad ,
I see where you are going.  If we take that approach, I would want to add another method ApplyTo(object objectToApplyTo, Action logErrorAction, IObjectAdapter adapter).  That should give enough coverage to do everything we need.  Sound right to you?

@jmudavid I don't know about "right".  I see ApplyTo(object objectToApplyTo, IObjectAdapter adapter, Action logErrorAction ) does complement the existing ApplyTo overloads, which lack that parameter combination.  On one hand, it's indirectly related to our agreed upon goal.  On the other hand, it's not one of the minimal changes needed to reach our goal.  You could create a separate issue and pull request.  I don't use logErrorAction.  It's your call.

Seems the PR has been merged already: https://github.com/aspnet/JsonPatch/pull/135
Thanks @jmudavid!


The Share Post overlay pops up after an Add plays and won't go away when clicking the X button.

Refreshing is the only way to remove it.

I think it has to do with some sort of interaction with the last option window you popped up and then it tries to block an ad. For me, if I use the save function to save a video to a playlist, the next time it tries to block an ad it will bring up my save window with all my playlists and like your share frame, I am unable to close it without refreshing the page.


Feature readme

adding README.md content, such as:

setup

install python
install pip
install venv
install libs

use VENV(activate/deactivate)
run server

@ArthurFleischman I won't be able to merge this PR, I still see a lot of changes not related to the ReadME :/

My bad, bad habbit

You are helping me a lot... thank you

I'll delete de venv, by the way, it's all generated files.... I'm not adding 42 files...

now it may be ok


refactor: meta default evaluation

Pull Request Template
Use this template to quickly create a well written pull request. Delete all quotes before creating the pull request.

Description

Please include a summary of the changes and which issue has been fixed. Please also include relevant motivation
and context. List any dependencies that are required for this change.

Fixes # (issue)

if no issue exists, please create an issue and ask the maintainers about this first

Type of change

Please delete options that are not relevant.

Bug fix (non-breaking change which fixes an issue)
New feature (non-breaking change which adds functionality)
Breaking change (fix or feature that would cause existing functionality to not work as expected)
This change requires a documentation update

How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide instructions, so we can reproduce.
Please also list any relevant details for your test configuration.

Test A
Test B

Checklist:

[ ] My code follows the style guidelines of this project
[ ] I have performed a self-review of my own code
[ ] I have commented my code, particularly in hard-to-understand areas
[ ] I have made corresponding changes to the documentation
[ ] My changes generate no new warnings
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] New and existing unit tests pass locally with my changes

Test coverage results :test_tube:
:red_circle: Total coverage has decreased
// Code coverage diff between base branch:release and head branch: refactor/meta-defaul-evaluation

Status
File
% Stmts
% Branch
% Funcs
% Lines

:red_circle:
total
55.01 (0)
36.47 (-0.01)
34.46 (-0.02)
55.51 (0.01)

:green_circle:
app/client/src/entities/DataTree/dataTreeWidget.ts
97.3 (12.45)
75 (50)
100 (20)
97.22 (12.84)

:red_circle:
app/client/src/sagas/EvaluationsSaga.ts
19.63 (-0.37)
2.13 (0)
8 (-3.11)
22.46 (-0.34)

:red_circle:
app/client/src/sagas/WidgetDeletionSagas.ts
40.54 (-0.13)
25 (0)
42.11 (0)
41.98 (-0.13)

:green_circle:
app/client/src/selectors/commentsSelectors.ts
85.25 (1.64)
64.71 (2.95)
73.33 (0)
90.59 (2.35)

:red_circle:
app/client/src/utils/DynamicBindingUtils.ts
83.33 (-0.19)
69.64 (0)
75.86 (0)
82.61 (-0.21)

:red_circle:
app/client/src/utils/autocomplete/TernServer.ts
52.71 (-0.23)
40.83 (-0.84)
36.21 (0)
56.74 (-0.25)

:green_circle:
app/client/src/widgets/MetaHOC.tsx
85.25 (2.9)
57.89 (0)
92.31 (0)
83.93 (0.88)

:green_circle:
app/client/src/workers/DataTreeEvaluator.ts
78.93 (0.61)
61.57 (0.14)
79.01 (2.27)
78.61 (0.51)

:green_circle:
app/client/src/workers/evaluation.worker.ts
7.8 (0.52)
0 (0)
33.33 (0)
8.33 (0.58)

:red_circle:
app/client/src/workers/evaluationUtils.ts
54.14 (-3.32)
57.58 (3.64)
60.38 (-1.88)
53.57 (-1.62)

:red_circle:
app/client/src/workers/validations.ts
76.79 (-0.29)
69.37 (-1.68)
67.65 (0)
78.59 (-0.32)

/ok-to-test sha=650a391

/ok-to-test sha=98a71b2

/ok-to-test sha=50321f9

As these changes were merged in PR https://github.com/appsmithorg/appsmith/pull/10401, this PR can be closed.


Implement the API modifications

Connection with issue(s)

Close #128

Connected to #119  #116
Solution description
Screenshots or Videos

To Do

[x] Read contributing guide
[ ] Check the original issue to confirm it is fully satisfied
[ ] Add solution description to help guide reviewers
[ ] Add unit test to verify new or fixed behaviour
[ ] If apply, add documentation to code properties and package readme

@ArturAssisComp before implement all validators, I think that is better create a documentation on readme to be discuss about.
I don't sure about the "duplicate" all validators to add a Elementary behaviour

@deandreamatias ok, I will do that. I implemented only the bool validators. I am using the version already implemented to make use of the tests, but today I will implement a prototype of the FormBuilderValidator using the new API to discuss the idea. Thanks for the feedback.

I added a section at the end of the readme for the discussion. But it can also be discussed here. I made a video documentation about what I did too.
https://youtu.be/pmrOFjsJ9ss

I taken a look on this propouse. My thougths:

Is really hard to catch all cases and logic on the API propouse. Make sense the abstract concept, but I think that the implementation can be more simple for developer experience.
Maybe can use FormBuilderValidators.compose to add required and optional validators. Like FormBuilderValidators.compose(required: [validators], optional: [another validators])

The name ValidatorBuilder is really necessary? On Flutter, Builder word usually is used to widgets that have a builder property.
The types validators like IsNumericElementaryValidator, I think like a nice thing to have, is an improvement to reuse code.
Thinks like

 ValidatorBuilder.numeric(
          errorText: 'La edad debe ser numérica.',
          and: <BaseElementaryValidator<num, dynamic>>[
            ValidatorBuilder.max(70),
          ])

could be simplify. A option is use ValidatorBuilder.numeric().and(ValidatorBuilder.max(70)) or even improve andc reate something like ValidatorBuilder.numeric() && ValidatorBuilder.max(70)

Is really hard to catch all cases and logic on the API propouse. Make sense the abstract concept, but I think that the implementation can be more simple for developer experience.
Maybe can use FormBuilderValidators.compose to add required and optional validators. Like FormBuilderValidators.compose(required: [validators], optional: [another validators])
-> I will investigate that with a prototype.

The name ValidatorBuilder is really necessary? On Flutter, Builder word usually is used to widgets that have a builder property.
-> That is right. I forgot about the builder semantics that is specific to Flutter. I will think about another name.

Thinks like

 ValidatorBuilder.numeric(
          errorText: 'La edad debe ser numérica.',
          and: <BaseElementaryValidator<num, dynamic>>[
            ValidatorBuilder.max(70),
          ])

could be simplify. A option is use ValidatorBuilder.numeric().and(ValidatorBuilder.max(70)) or even improve andc reate something like ValidatorBuilder.numeric() && ValidatorBuilder.max(70)
--> I think that would be a good idea. I will investigate with prototypes too.

Tomorrow I will give a better comment on the new API prototype. But it is already implemented for the examples. Fell free to take a look at the new_api_prototype.dart if you want. Otherwise, wait for my comments.
I also did a draft benchmark on a password checker comparing the new api with the old one.

About the new prototype:

It maintains the functionality of the original
It is simpler:

// Instead of

I also explored possibilities using operator overloading which would allow things like: req() * isNum() * (gt(10) * lt(15) + gtE(20)), using boolean logic notation as example. But it would become very complex to handle some edge cases and the error message composition, and the compiler would not help too much during the composition. It would be necessary to rely on some runtime check or to maintain the generality of each validator, maintaining the redundancy.

I want to know if the parameter regex in some of the validators is really necessary. There is an example below of a validator that checks if the input has a minimum number of lowercase chars. It already has the default regex: RegExp('[a-z]') which I think is enough. I am not seeing any use case for that parameter.
The parameter is also in other validators. The only one that I can see a use case is the regex validator. If there is a use case, please, clarify for me.
/// {@template has_lowercase_chars_template}
/// [HasLowercaseCharsValidator] extends [TranslatedValidator] to validate if a string
/// contains a specified minimum number of lowercase characters.
///
/// ## Parameters:
///
/// - [atLeast] The minimum number of lowercase characters required.
/// - [regex] The regular expression used to identify lowercase characters.
/// - [errorText] The error message returned if the validation fails.
///
/// {@macro lower_case_template}
/// {@endtemplate}
class HasLowercaseCharsValidator extends TranslatedValidator<String> {
  /// Constructor for the lowercase characters validator.
  HasLowercaseCharsValidator({
    this.atLeast = 1,

    /// {@macro lower_case_template}
    RegExp? regex,

    /// {@macro base_validator_error_text}
    super.errorText,

    /// {@macro base_validator_null_check}
    super.checkNullOrEmpty,
  }){...}

I want to know if the parameter regex in some of the validators is really necessary. There is an example below of a validator that checks if the input has a minimum number of lowercase chars. It already has the default regex: RegExp('[a-z]') which I think is enough. I am not seeing any use case for that parameter.
The parameter is also in other validators. The only one that I can see a use case is the regex validator. If there is a use case, please, clarify for me.
/// {@template has_lowercase_chars_template}
/// [HasLowercaseCharsValidator] extends [TranslatedValidator] to validate if a string
/// contains a specified minimum number of lowercase characters.
///
/// ## Parameters:
///
/// - [atLeast] The minimum number of lowercase characters required.
/// - [regex] The regular expression used to identify lowercase characters.
/// - [errorText] The error message returned if the validation fails.
///
/// {@macro lower_case_template}
/// {@endtemplate}
class HasLowercaseCharsValidator extends TranslatedValidator<String> {
  /// Constructor for the lowercase characters validator.
  HasLowercaseCharsValidator({
    this.atLeast = 1,

    /// {@macro lower_case_template}
    RegExp? regex,

    /// {@macro base_validator_error_text}
    super.errorText,

    /// {@macro base_validator_null_check}
    super.checkNullOrEmpty,
  }){...}

Is necesary in some cases. In some languages, the regex need to be increased. For example in spanish, that need to add ñ on regex (example).

There are some considerations about collection validators below:

I moved the containsElement validator from the 'collections' group to a new group that I called 'generic validators', which are validators that handle generic type T input, but are not necessarily collections. The problem is that containsElement does not handle necessarily a collection input from the user. The "collection" part is only the reference list of elements that will be used internally by the validator to check if the user input (which is not necessarily a collection) is in that list. What do you think?
The same with the uniqueValidator. It does not check something about a user input collection necessarily. What do you think?
I think the range validator can be split into 2 validators: betweenLength and between (that already exists). The former will check if the length of the input collection is between a min and a max. The latter will do a numeric comparison. In my opinion, merging both in the same validator make it more confusing and I do not see a clear use case for that. What do you think?

Static vs dynamic values in validators
I will use the isEqual validator to show some issues that I found, but it is valid for other validators like: isGreaterThan, isNotEqual, etc.
This validator has the following signatures:
Current API:  static FormFieldValidator<T> equal<T>(Object value, {String? errorText, bool checkNullOrEmpty = true,})
New API: Validator<T> isEqual<T extends Object?>(T? value, { T Function()? dynValue, String Function(String)? equalMsg,})
Both has a parameter value that will be used to compare with the user input.
The issue starts when we want to use a dynamic value as value. I created an example (example/lib/new_api_examples/static_vs_dynamic_value_example_main.dart) to illustrate that situation. I also recorded a video showing the situation:
https://github.com/user-attachments/assets/89f8d04a-82bc-4727-ba87-2e3497917689
Basically, what happens is that inside the FormBuilder from flutter_form_builder, the update for the error message is delayed by 1 frame. I don't know exactly what happens under the hood, but, as you can see in the example, when I increment the value used by the isEqual/equal validator, it updates properly when the text field is outside the FormBuilder, but not when it is inside it. The provisory solution that I found for that was to add a value parameter as a callback. Below is the implementation:
Validator<T> isEqual<T extends Object?>(
  T? value, {
  T Function()? dynValue, // This is the dynamic value
  String Function(String)? equalMsg,
}) {
  assert(
      (value != null && dynValue == null) ||
          (value == null && dynValue != null),
      'Exactly one of "value" or "dynValue" must be provided');
  return (T input) {
    final T? currentValue = value ?? dynValue?.call();
    final String valueString = currentValue!.toString();
    return currentValue == input
        ? null
        : equalMsg?.call(valueString) ??
            FormBuilderLocalizations.current.equalErrorText(valueString);
  };
}

In the example, I called isEqual (static) the one that uses the value parameter (does not work inside FormBuilder) and I called isEqual (dynamic) the one that uses the dynValue parameter (works inside the FormBuilder). Their code is illustrated below:
// The state variable 'referenceValue' is used by the validator isEqual/equal
class _HomePageState extends State<_HomePage> {
  int referenceValue = 0;
  //(...)

  // The static example (does not work well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (static)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (static)'),
    validator: isRequired(isInt(isEqual(referenceValue))),
  ),
  //The dynamic example (works well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (dynamic)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (dynamic)'),
    validator: isRequired(
        isInt(isEqual(null, dynValue: () => referenceValue))),
  ),
  // The current API (does not work well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (old API)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (old API)'),
    validator: FormBuilderValidators.equal(
        referenceValue.toString()),
  ),

Questions

What do you think about this situation? Is this a bug or is there any solution to solve this issue?
Will it be necessary to have the dynamic parameter for all the validators that depend on external dynamic values?

Complete code for the example
The complete code for the example is below:
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:form_builder_validators/form_builder_validators.dart';

import '../localization/intl/app_localizations.dart';

final GlobalKey<FormBuilderState> _formKey = GlobalKey<FormBuilderState>();

void main() {
  runApp(const _App());
}

class _App extends StatelessWidget {
  const _App();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Static vs Dynamic - Example',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const _HomePage(),
      supportedLocales: AppLocalizations.supportedLocales,
      localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
        ...GlobalMaterialLocalizations.delegates,
        // Placed in front of `FormBuilderLocalizations.delegate`
        ...AppLocalizations.localizationsDelegates,
        FormBuilderLocalizations.delegate,
      ],
    );
  }
}

class _HomePage extends StatefulWidget {
  const _HomePage();

  @override
  State<_HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<_HomePage> {
  int referenceValue = 0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Static vs Dynamic - Example')),
      body: Padding(
        padding: const EdgeInsets.all(8),
        child: Column(
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                IconButton(
                    onPressed: () => setState(() {
                          referenceValue--;
                        }),
                    icon: const Icon(Icons.remove)),
                Text(referenceValue.toString()),
                IconButton(
                    onPressed: () => setState(() {
                          referenceValue++;
                        }),
                    icon: const Icon(Icons.add)),
              ],
            ),
            const SizedBox(height: 8),
            Expanded(
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    const Text('With flutter TextFormField:'),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (static)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: isRequired(isInt(isEqual(referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (dynamic)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: isRequired(
                          isInt(isEqual(null, dynValue: () => referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (old API)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: FormBuilderValidators.equal(
                          referenceValue.toString()),
                    ),
                    const SizedBox(height: 8),
                    const Text(
                        'With flutter_form_builder outside a FormBuilder:'),
                    FormBuilderTextField(
                      name: 'isEqual (static)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (static)'),
                      validator: isRequired(isInt(isEqual(referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    FormBuilderTextField(
                      name: 'isEqual (dynamic)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (dynamic)'),
                      validator: isRequired(
                          isInt(isEqual(null, dynValue: () => referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    FormBuilderTextField(
                      name: 'isEqual (old API)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (old API)'),
                      validator: FormBuilderValidators.equal(
                          referenceValue.toString()),
                    ),
                    const SizedBox(height: 8),
                    const Text(
                        'With flutter_form_builder inside a FormBuilder:'),
                    FormBuilder(
                      key: _formKey,
                      autovalidateMode: AutovalidateMode.always,
                      child: Column(
                        children: <Widget>[
                          FormBuilderTextField(
                            name: 'isEqual (static)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (static)'),
                            validator:
                                isRequired(isInt(isEqual(referenceValue))),
                          ),
                          const SizedBox(height: 5),
                          FormBuilderTextField(
                            name: 'isEqual (dynamic)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (dynamic)'),
                            validator: isRequired(isInt(
                                isEqual(null, dynValue: () => referenceValue))),
                          ),
                          const SizedBox(height: 5),
                          FormBuilderTextField(
                            name: 'isEqual (old API)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (old API)'),
                            validator: FormBuilderValidators.equal(
                                referenceValue.toString()),
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

There are some considerations about collection validators below:
1. I moved the `containsElement` validator from the 'collections' group to a new group that I called 'generic validators', which are validators that handle generic type T input, but are not necessarily collections. The problem is that `containsElement` does not handle necessarily a collection input from the user. The "collection" part is only the reference list of elements that will be used internally by the validator to check if the user input (which is not necessarily a collection) is in that list. What do you think?

2. The same with the `uniqueValidator`. It does not check something about a user input collection necessarily. What do you think?

3. Other than moving uniqueValidator from collections category to generic type category, I cannot find an use case for this validator. Maybe, a validator like: allowed/notAllowed, which checks if the user input is inside a list of allowed/not allowed elements would be better. What do you think?

4. I think the range validator can be split into 2 validators: betweenLength and between (that already exists). The former will check if the length of the input collection is between a min and a max. The latter will do a numeric comparison. In my opinion, merging both in the same validator make it more confusing and I do not see a clear use case for that. What do you think?

I think that this is a minor change and don't make a lot difference on DX.
The same
Maybe remove this validator
I think that betweenLength isn't necessary. Easily a developer can use between to accomplish betweenLength

Static vs dynamic values in validators
I will use the isEqual validator to show some issues that I found, but it is valid for other validators like: isGreaterThan, isNotEqual, etc.
This validator has the following signatures: Current API:  static FormFieldValidator<T> equal<T>(Object value, {String? errorText, bool checkNullOrEmpty = true,}) New API: Validator<T> isEqual<T extends Object?>(T? value, { T Function()? dynValue, String Function(String)? equalMsg,}) Both has a parameter value that will be used to compare with the user input.
The issue starts when we want to use a dynamic value as value. I created an example (example/lib/new_api_examples/static_vs_dynamic_value_example_main.dart) to illustrate that situation. I also recorded a video showing the situation:
demo.mp4
Basically, what happens is that inside the FormBuilder from flutter_form_builder, the update for the error message is delayed by 1 frame. I don't know exactly what happens under the hood, but, as you can see in the example, when I increment the value used by the isEqual/equal validator, it updates properly when the text field is outside the FormBuilder, but not when it is inside it. The provisory solution that I found for that was to add a value parameter as a callback. Below is the implementation:
Validator<T> isEqual<T extends Object?>(
  T? value, {
  T Function()? dynValue, // This is the dynamic value
  String Function(String)? equalMsg,
}) {
  assert(
      (value != null && dynValue == null) ||
          (value == null && dynValue != null),
      'Exactly one of "value" or "dynValue" must be provided');
  return (T input) {
    final T? currentValue = value ?? dynValue?.call();
    final String valueString = currentValue!.toString();
    return currentValue == input
        ? null
        : equalMsg?.call(valueString) ??
            FormBuilderLocalizations.current.equalErrorText(valueString);
  };
}

In the example, I called isEqual (static) the one that uses the value parameter (does not work inside FormBuilder) and I called isEqual (dynamic) the one that uses the dynValue parameter (works inside the FormBuilder). Their code is illustrated below:
// The state variable 'referenceValue' is used by the validator isEqual/equal
class _HomePageState extends State<_HomePage> {
  int referenceValue = 0;
  //(...)

  // The static example (does not work well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (static)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (static)'),
    validator: isRequired(isInt(isEqual(referenceValue))),
  ),
  //The dynamic example (works well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (dynamic)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (dynamic)'),
    validator: isRequired(
        isInt(isEqual(null, dynValue: () => referenceValue))),
  ),
  // The current API (does not work well inside FormBuilder)
  FormBuilderTextField(
    name: 'isEqual (old API)',
    autovalidateMode: AutovalidateMode.always,
    decoration:
        const InputDecoration(labelText: 'isEqual (old API)'),
    validator: FormBuilderValidators.equal(
        referenceValue.toString()),
  ),

Questions
* What do you think about this situation? Is this a bug or is there any solution to solve this issue?

* Will it be necessary to have the dynamic parameter for all the validators that depend on external dynamic values?

Complete code for the example
The complete code for the example is below:
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:form_builder_validators/form_builder_validators.dart';

import '../localization/intl/app_localizations.dart';

final GlobalKey<FormBuilderState> _formKey = GlobalKey<FormBuilderState>();

void main() {
  runApp(const _App());
}

class _App extends StatelessWidget {
  const _App();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Static vs Dynamic - Example',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const _HomePage(),
      supportedLocales: AppLocalizations.supportedLocales,
      localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
        ...GlobalMaterialLocalizations.delegates,
        // Placed in front of `FormBuilderLocalizations.delegate`
        ...AppLocalizations.localizationsDelegates,
        FormBuilderLocalizations.delegate,
      ],
    );
  }
}

class _HomePage extends StatefulWidget {
  const _HomePage();

  @override
  State<_HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<_HomePage> {
  int referenceValue = 0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Static vs Dynamic - Example')),
      body: Padding(
        padding: const EdgeInsets.all(8),
        child: Column(
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                IconButton(
                    onPressed: () => setState(() {
                          referenceValue--;
                        }),
                    icon: const Icon(Icons.remove)),
                Text(referenceValue.toString()),
                IconButton(
                    onPressed: () => setState(() {
                          referenceValue++;
                        }),
                    icon: const Icon(Icons.add)),
              ],
            ),
            const SizedBox(height: 8),
            Expanded(
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    const Text('With flutter TextFormField:'),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (static)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: isRequired(isInt(isEqual(referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (dynamic)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: isRequired(
                          isInt(isEqual(null, dynValue: () => referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    TextFormField(
                      decoration:
                          const InputDecoration(labelText: 'isEqual (old API)'),
                      autovalidateMode: AutovalidateMode.always,
                      validator: FormBuilderValidators.equal(
                          referenceValue.toString()),
                    ),
                    const SizedBox(height: 8),
                    const Text(
                        'With flutter_form_builder outside a FormBuilder:'),
                    FormBuilderTextField(
                      name: 'isEqual (static)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (static)'),
                      validator: isRequired(isInt(isEqual(referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    FormBuilderTextField(
                      name: 'isEqual (dynamic)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (dynamic)'),
                      validator: isRequired(
                          isInt(isEqual(null, dynValue: () => referenceValue))),
                    ),
                    const SizedBox(height: 5),
                    FormBuilderTextField(
                      name: 'isEqual (old API)',
                      autovalidateMode: AutovalidateMode.always,
                      decoration:
                          const InputDecoration(labelText: 'isEqual (old API)'),
                      validator: FormBuilderValidators.equal(
                          referenceValue.toString()),
                    ),
                    const SizedBox(height: 8),
                    const Text(
                        'With flutter_form_builder inside a FormBuilder:'),
                    FormBuilder(
                      key: _formKey,
                      autovalidateMode: AutovalidateMode.always,
                      child: Column(
                        children: <Widget>[
                          FormBuilderTextField(
                            name: 'isEqual (static)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (static)'),
                            validator:
                                isRequired(isInt(isEqual(referenceValue))),
                          ),
                          const SizedBox(height: 5),
                          FormBuilderTextField(
                            name: 'isEqual (dynamic)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (dynamic)'),
                            validator: isRequired(isInt(
                                isEqual(null, dynValue: () => referenceValue))),
                          ),
                          const SizedBox(height: 5),
                          FormBuilderTextField(
                            name: 'isEqual (old API)',
                            decoration: const InputDecoration(
                                labelText: 'isEqual (old API)'),
                            validator: FormBuilderValidators.equal(
                                referenceValue.toString()),
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

I think that has a lot probability that the issue is inside FormBuilder. I will search some issues there to link here

So, I think that this is related with value on autoValidateMode: AutovalidateMode.always.
Maybe can try remove the AutovalidateMode.always and validate with _formKey.currentState?.saveAndValidate(). This should work if the problem is the autoValidateMode
I would continue with refactor and use the new approach isEqual (static), as it does not work within FormBuilder is the current behaviour so doesn't change anything

Ok, I will continue implementing the other validators that suffer from the same problem in the FormBuilder without using the dynamic value parameter. Given that it is probably a bug in FormBuilder.
I will try to test the autoValidateMode  approach too.

So, I think that this is related with value on autoValidateMode: AutovalidateMode.always. Maybe can try remove the AutovalidateMode.always and validate with _formKey.currentState?.saveAndValidate(). This should work if the problem is the autoValidateMode
I would continue with refactor and use the new approach isEqual (static), as it does not work within FormBuilder is the current behaviour so doesn't change anything

By the way, I cannot answer directly on your answers like we were doing in the previous threads. I don't know why.

I think that the changes that are being made reached a huge size. Can we push them to a branch to finish this PR and then open other PRs to continue the refactoring? This would make it easier for the review. I already implemented the main validators.

@ArturAssisComp changed to a branch refactor_2024_11
when MR will ready for review, remove the draft state

I started to expose the new api functions. I noticed that 2 ways are being practiced by the current api:

exposing them by using the aggregator class FormBuilderValidators. This avoids the identifier collision but adds the verbosity.
Example: FormBuilderValidators.hasNumericChars
exposing directly the name of each validator class. This also does not avoid the verbosity because we need to use the suffix: "Validator.validate"
Example: HasNumericCharsValidator.validate

I think of some possible options:
OP1. keep exposing the aggregator (I changed its name to "Validators" only to avoid collision with the current api, because some validators have the same name but do not have the same signature) and also expose the validators individually. Given that some of them may generate collisiion (and or or, for instance), the user would have the possibility to add the namespace himself.
Example: Import 'package...' as val or import 'package' as validators or import 'package' as v.
OP2. Expose only the aggregator.
OP3. (I do not find this options interesting) Expose only the functions
What do you think, @deandreamatias ?

Ok, I will keep with op2.


initializing dimensional reduction manifold preservation task

Getting started with the dimensional reduction manifold preservation task per #80

@dburkhardt @scottgigante I don't totally understand the Travis checks that fail (pictured) - could someone explain this to me? Maybe it's not a big issue for merge requests like these? Let me know.

@mvinyard a bit late, but it looks like the failed build was a combination of errors unrelated to this PR, and errors with this PR. In future please check with us and we can help you fix the build before merging.


Follow up to PR #418

Sorry, just realised I forgot to include some changes when splitting off the last PR from the other one:

removed the unnecessary method calls from _put
removed unnecessary .fen call from load

Actually, I'll branch this from the current main branch rather than from my old branch


Error "Element not found" for wsl update

Windows Version
Microsoft Windows [version 10.0.22631.4249
WSL Version
<IP_ADDRESS>
Are you using WSL 1 or WSL 2?

[X] WSL 2
[ ] WSL 1

Kernel Version
<IP_ADDRESS>
Distro Version
Ubuntu
Other Software
Docker version 27.2.0
Repro Steps

windows update days
https://learn.microsoft.com/fr-fr/windows/wsl/install

Expected Behavior
I would like it to work with the message "WSL has been updated successfully."
Actual Behavior
When I run wsl --update with the cmder here is the error: Element not found.=======90.0%======================

I just installed docker, same error :

I tried to install "Windows Subsystem for Linux" but error  Code : 0x80070490

Diagnostic Logs
send by mail<EMAIL_ADDRESS>

/emailed-logs


Full functionality without remote

Hi Guys. Nice work.
I tried this tool and it is working nicely. I would like to use this tool in all my projects but i have some issues.
Usually i have nothing to do with Python projects, mostly i am doing c++ and android but i think its doable.
So the problem is now if i do publish it says "Remote named 'origin' didn't exist"
It is possible to make it work without remote so only in local repo and write the changelog to local file?
Because thats everything i need to make it work in any project not only python.
Thank you.

Can be added with a flag use_remote_version_control that should be true as default. See upload_to_pypi(see docs) flag in the config file.

Hi @relekang
Is this use_remote_version_control feature still on the roadmap? Or is there another way to get the same result: only perform changes in local repo?
I have tried --noop option, but it does no operation at all.


fix(es/transforms/base): Wrap call exprs when in a new expr callee

Fixes a bug where the fixer transforms code like this:
new (getObj()).ctor()
// Pseudo AST: NewExpr {callee: MemberExpr { object: CallExpr { callee: "getObj" }, property: "ctor" } }

to this, which is not equivalent:
new getObj().ctor()
// Pseudo AST: CallExpr {callee: MemberExpr { object: NewExpr { callee: "getObj" }, property: "ctor" }}

This is my first PR to swc and one of my first times writing Rust, so I'm not confident in the actual fix. Consider this a bug report with a proposed fix attached to it.
I noticed that there was an existing traversal over member expressions and an is_new context flag for callees, so my idea was to try to reuse that and wrap a Call expression in parens if:

it's the object of a Member expression that is the callee of a New expression, or
it's the object of a Member expression that satisfies (1).

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.


Update README.md

should be upper case 's'

Hi @anton202, this example is following the scenario described here:
https://github.com/DiegoZoracKy/convert-excel-to-json/blob/master/README.md#usage--examples
Where the sheets would be actually named in lower case.


Create 0000-01-02-Manoj-Chetry.md

Add Manoj Chetry's file.

I have created a branch, created a file and made a commit, and opened a pull request.


'caffe2/core/predictor.h' file not found

I am trying to run Caffe2-iOS (the 2-0-stable version), and have followed the installation tutorial. When I build for the first time (without connecting a device), I'm getting the error described in the title:
'caffe2/core/predictor.h' file not found
What is the problem?

To clarify, I am trying to build the program without a device connected.


Water decal projection with waves?

Hello. I'm trying to project texture on water to achieve stylized look like here:

The problem is, to achieve these "artist strokes" feel I need to use texture which is projected on top of the water surface. RenderAlphaOnSurface does a similar thing, but the problem with it is if I make texture less transparent the water looks more transparent. I'm not super experienced with graphics so don't know how to explain it properly, but it just doesn't work with water material properly. It overrides it.
Ultimate Water System allows such kind of water projection. With it I can achieve something like this: https://gyazo.com/86f93ee53ef44cc05500b1de675100ff
Here's what I achieve with crest with the same texture:
https://gyazo.com/16d1f78051c87931e85d743b6b552b6e
Ultimate Water System really lacks other great features you have like dynamic waves with proper physics. We want to use them. UWS has dynamic waves but they are not interacting physically with objects and that's a problem which Crest doesn't have. UWS also is deprecated so hard to continue working with it.
Is there a way to achieve this kind of visual look with Crest? Or at least would it be possible to even develop water projection for it? Super important for the project and possibly our choice of water system depends on it.
Thank you in advance

That looks awesome.
RenderAlphaOnSurface does indeed do a similar thing. Maybe you are looking for different blending modes - your result looks perhaps like multiply blend.
I've just pushed params to the material which allow you to experiment with different blend settings. You can achieve multiply blending with these settings:

That's much better! Still some problems though
https://gyazo.com/6827cd45823923399d494183867a7d3f
Water projection makes the island change the color as well. Would it be possible to make it so it doesn't impact island? Same about foam. It looks a bit blue/green. Any way to make it look white like it should be?

Hm the island is a problem with how the depth offset is applied to keep it above the water (would also be a problem with projectors, to some extent). This offset can be played around with in OceanSurfaceAlpha.shader (search Offset).
From what you're saying you want it to affect only the base colour of the ocean. You could try multiplying the result of ScatterColour() (the colour of light scattered out of the water volume towards the viewer) with your own texture that you could sample there.
If you want to achieve something super stylized like that you'll want to roll up your sleeves and go deep in the (shader) code and do a lot of experimentation. It sounds like you're at the beginning of your journey with graphics, i'd recommend following tutorials to get comfortable with shader coding and you probably want to do some toon shading stuff or similar as that may be useful.
I'm not able to provide general dev services as this is currently a hobby thing, and my hobby time is decreasing over time. However I do my best to stay on top of bugs, and can provide hints/pointers here and there if i have them. I'm mentioning this upfront as it sounds like you're still settling on an ocean system - if you need one with a guaranteed level of support crest may not be the best choice.

It still seems that your water system is much better choice for me than Ultimate Water System. I actually have two options, this one and UWS and UWS doesn't have support at all. It has its own problems as well. I'm not a shader programmer but I have a friend who can help me with that, so maybe I should ask him. He doesn't have much time though.
Would it be possible for you to estimate at least approximately how much work should be done with shader to approach stylization like I need? I have to understand if the time my friend has will be enough... I can show you some more concepts we have, if you need. We have it on our Instagram page - https://www.instagram.com/heartstep_studios/
Also, if you could, could you provide a hint where to dig to make my texture also working with dynamic waves? The problem I'm facing with whirlpool now is that the texture is apllied on top of it, it doesn't actually taking in account that the whirlpool is bending
Here it is without texture - https://gyazo.com/d699a979d5102b3d60ff62102dccb00a
And here it is with texture - https://gyazo.com/2a44a0ca6ed2cfa8afd8ee966af5b4ba
The whirlpool and its bending is almost not seen because the texture is applied on top of it like there is no bending. It doesn't bend the texture, if you could say so.
I understand that you have not much time, but really your system is the hope that I was looking for. We facing problems with our old system as well because it's super hard to stylize foam here and there are various bugs we can't fix. I can ask guy a bit more experienced to help with shaders but he still will need some hints here and there. Would it be okay for you?
Thank you.

Also, if you could, could you provide a hint where to dig to make my texture also working with dynamic waves? The problem I'm facing with whirlpool now is that the texture is apllied on top of it, it doesn't actually taking in account that the whirlpool is bending
Here it is without texture - https://gyazo.com/d699a979d5102b3d60ff62102dccb00a
And here it is with texture - https://gyazo.com/2a44a0ca6ed2cfa8afd8ee966af5b4ba
The whirlpool and its bending is almost not seen because the texture is applied on top of it like there is no bending. It doesn't bend the texture, if you could say so.
As I understand texture doesn't work on waves naturally as well. It just places itself on top of everything. The thing in UWS is that it works even on waves. Any way to fix it?
I'm starting to suspect that this problem appears because of mesh. We actually tried to stylize SUIMONO before with the same method, but developer said that the problem with mesh water is that the projection is flat. And in Ultimate Water System water is done as image effects, there is no mesh there. Any chances to overcome that, if that's so?
In UWS it looks like this https://gyazo.com/380307a1374b0186632193538136b634
If there are no chances to overcome this I will probably consider staying on UWS.

Its hard to estimate when the approach is not yet known. Maybe you can get pretty far by multiplying in a texture like you've done. Perhaps this texture could be animated over time and this might give a good effect. I don't have ideas for similar work to draw from but ill think about it (Oskar Stålberg's work comes to mind as soft & stylized and is probably worth checking out, but its not really the same stuff. Oh alex evans' siggraph talk about dreams might be an interesting reference in painterly rendering styles.). I don't know how to estimate in this circumstance. Perhaps between 2 weeks and 3 months for something working, up to 1 year to do really deep work and match reference closely, but these are just complete guesses based on extremely incomplete information. i recommend talking it through with your friend and figuring out a solution together.
yes i can provide hints for specific questions or problems. i'll typically give a pointer where to look in teh code. for example:
if you sample your stylized texture in the ocean shader in ScatterColour as suggested above, you could also apply flow to it, which will give the horizontal motion thats used on whirlpools, which i believe will give you the 'bend' you're looking for. search the shader code for 'flow'.
from there i'll need you guys to take over - i assume you are happy to search the shader code, experiment with ocean material features and look how they are implemented, read through the code yourself and potentially experiment turning bits of code on and off to see the effect.
i don't know what approach you should use, but i've given hints about how you might begin experimenting, and you'll need to do the experimentation. if you speak to your friend and come up with a technical plan that you guys believe in and want to send it to me, i should be able to put time aside to read it and give feedback. sorry i can't help more!

random idea occurred to me - maybe you should render the ocean as a load of paint strokes - render each stroke as separate geometry, and sample the water at the center of each stroke to give the stroke colour. you could do this by writing a new version of ocean.shader with a bunch of modifications to work for individual strokes (i dont know what they would be without trying it).
you could perhaps align the stroke to the flow, which made me think about this: https://www.youtube.com/watch?v=Bm9YvhBUmc4

Interesting! Thanks for your interest, help and ideas
Your idea about rendering the ocean as a load of paint strokes seems even harder than texture but will consider it for sure
About bending. You said it's possible to achieve horizontal bending by applying flow to sample texture, but what about vertical? Can we achieve something like this(from UWS)

I use displacement with negative amplitude(it's possible to do the same with your whirlpool actually) and the texture bends itself to this high wave. Would your method with flow make that possible as well?

The answer to all of the above should be yes, but you'll need to experiment and try it out to know for sure.

Saw a tweet from heartstep and thought of this. Did you end up going with crest in the end or sticking with what you had? Just curious.

I ended up sticking with UWS. I couldn't find a way to apply texture properly like in UWS. The sad thing is that I'm thinking to switch to SRP for supporting VFX Graph, but I can't do it on UWS. And it's deprecated so no support from developers.
Thinking about switching to crest again.. Is there any chance I can achieve something like I achieved on UWS with crest?


Render samples with shadowDOM to prevent style clashes.

This renders our samples with shadowDOM on a custom element, so we can embed app styles in those elements and not have them leak into Showcase.

Gonna call this done for now, since it seems like ShadowDOM is tough for our use case of having user supplied HTML — and I'll have a hard time maintaining. We'll see how it goes with style clashes.


Update rules_apple to 2.3.0 + remove bitcode support

Update rules_apple to https://github.com/bazelbuild/rules_apple/releases/tag/2.3.0 (https://github.com/bazelbuild/rules_apple/commit/915ac30a9fa1fd3809599a5ab90fa1c6640fe8dc) and handle https://github.com/bazelbuild/rules_apple/pull/1534.

I'm not entirely sure why we're supporting two Bazel versions on main. Should we not instead create a branch specifically for Bazel 5?  This makes maintenance really tough...

I was relying on Tests / Build and Test ( Virtual Frameworks + LTS ) to verify the Bazel 5/LTS codepath. Do you think it's not good enough, @thiagohmcruz?

Oh my bad, forgot that there's an explicitly job to cover that, it should be enough yeah
@luispadron there's a README IIRC to cover the LTS support, maybe a start is to review that and propose changes / a diff approach?
I def can see the pain points in maintaining it, at the same time it was introduced to help enforce there is at least one code path we consider "stable". That said, there's other ways to achieve the same thing and any approach will have trade-offs to discuss IMO.


Bad collaboration with third-party pulgin Quick Explorer.

When New Tab Default is enabled,  items would open automatically as the cursor just slides over them.

Hi @XMB-7
I just tried to reproduce this and It worked just fine! I'm sure this was fixed for #5 and you're still on the old version.
Use BRAT to update the opener plugin and restart obsidian (needed for the update)

@lukemt Thanks for the reply.
I just found that it is related to the popular third-party plugin Hover Editor. When Hover Editor being disabled, everything just goes fine. I have no idea the problem occurs on which side, but really hoping these two plugins collaborate well.

Set the default mode to editing view in the Hover Editor configuration page, then the problem can be reproduced. I just tested it in the provided Obsidian sandbox vault.

Thanks! Will try again

Ok I can reproduce this. Thanks for bringing it up. Let me try to debug it.

@XMB-7 Thank you so much for spotting this! This is now fixed! Please let me know if you find any other problems!

@lukemt Really appreciate your time and effort in solving this issue.
I just found there is also a minor issue with the collaboration between the Opener and Advanced URI, specifically refer to this issue (see here). However, I'm not sure if the relevant feature will be widely used by the community, so it may not be a high priority fix. Therefore, please feel free to address it at your convenience. Thank you.

Hi @XMB-7
I just released a new major version with a slightly new behavior.
Would you be so kind and check if the issue still persists in the new version 2.0.0?
Thank you for your help!

I tested it in the sandbox vault and was pleased to find that the issue has been resolved. Thank you for fixing it. 💕

Pleased to hear this!