Adding details about PSTN and DirectRouting report exports

Tagging @tonysmit
The PSTN and DirectRouting report in both Teams (MoPo) and LAC documentation does not have the details about the export. This adds the details for both, including field descriptions.

looks good @SanderSade please push the commit and merge to master


 More importantly, it shouldn't be calling this service. It should be calling the discrete methods for play and pause, rather than the toggle.
I did some spelunking, but couldn't really figure out where it was making the decision to use this service call.

Right now the scene component only supports the ON and OFF states (source). That service call should have been triggered by something else (automation perhaps?).
We could make this method more smart and base decisions what services to call based on the domain of the entity and the state it wants to achieve.
Something like:
if state.domain == 'media_player' and state == 'paused':
  service = 'media_pause'
elif …

I don't understand. So we can't set the state of things to anything but on or offin a scene?
Let me go though this again with a more confident isolation and see if i still see that service call in the logs.

OK, you were right. It must have been a stray call in the logs. So the only issue seems to be the:
15-09-22 21:42:29 WARNING (Thread-20) [homeassistant.helpers.state] reproduce_state: Unable to reproduce state <state media_player.itunes=paused @ 21:38:11 22-09-2015>

...due to the fact that it's asking for a state that isn't supported. This is sort of unfortunate :(

Closing this.


Ai accelerator integration

This PR adds integrates and examples for deploying RHOAI using the EUS 2.8 channel.
What does this repo deploy?

All pre-req operators for OpenShift AI
An instance of OpenShift AI version 2.8 (EUS version) with all GA features enabled
Several example workloads:

A data science pipeline application instance
A data science pipeline example using kfp
A workbench example
A single model server (KServe) example
A multi model server (ModelMesh) example

There are currently a few issues/limitations in the Validated Patterns framework that can cause some issues or require a work around:

OpenShift AI should be installed after all Pre-reqs (Serverless, ServiceMesh, Kiali, Elasticsearch, Jeager) are installed or it will cause an invalid ServiceMesh instance to be created (https://issues.redhat.com/browse/RHOAIRFE-55).

As a work around in the AI Accelerator repo we use a job that checks for the required CRDs before attempting to create the Subscription.  Since there is no way to do something similar in the Validated Pattern I set it up so we simply install the subscription from the AI Accelerator repo instead of using the clustergroup chart.

ai-example-multi-model-serving application is stuck "progressing".  This example creates a model server using ModelMesh.  ModelMesh and KServe both share the same objects (InferenceService and ServingRuntime) but they are managed by different controllers.  The two controllers report different results in status.conditions.  Upstream ArgoCD includes a custom health check that works for KServe but does not work for ModelMesh.

In the AI Accelerator repo we deploy a custom health check (https://github.com/redhat-ai-services/ai-accelerator/blob/main/components/operators/openshift-gitops/instance/components/health-check-openshift-ai/patch-inferenceservice-health-check.yaml) to resolve this so both KServe and ModelMesh can be validated.  At this point in time it does not appear there is a way to provide a custom health check in the Validated Pattern.

ai-example-multi-model-serving-tgis shows out of sync.  This example deploys a model server using KServe, which in turn uses Serverless.  Serverless over aggressively applies labels to the routes it creates which makes it so the Argo tracking label gets applied to the labels and Argo thinks the routes need to be pruned.

To resolve this in the AI Accelerator repo we switch the ArgoCD instance to annotation based resource tracking (https://github.com/redhat-ai-services/ai-accelerator/blob/main/components/operators/openshift-gitops/instance/components/annotation-resource-tracking/patch-resource-tracking.yaml).

The ai-example-dsp-example-pipeline example will not automatically kick off the pipeline and the Tekton pipeline deployed by the example must be manually triggered.

This example uses a PipelineRun to trigger the initial pipeline which should be applied via ArgoCD.  The default ArgoCD configuration includes a resourceExclusions for PipelineRun which prevents Argo from applying the initial example.

We are tracking "how to test" all of these features in the following document:
https://docs.google.com/document/d/18kCWunQOYU0yya05UeyCAOsBKYwqFKVQ_fxkQC2EBnQ/edit?usp=sharing

I have opened PRs against the chartgroup repo to address some of the issues mentioned above.
This addresses the ability to configure the annotation bases resource tracking:
https://github.com/validatedpatterns/clustergroup-chart/pull/1
This addresses the ability to configure health checks:
https://github.com/validatedpatterns/clustergroup-chart/pull/2
This addresses the ability to configure the resourceExclusions:
https://github.com/validatedpatterns/clustergroup-chart/pull/3


Help: Materials Commons Data Site - Phase One

This issue, now, for phase one.
Create help for Materials Commons Data:

Phase one of help is single document will all help and all help link come to document; user does find.
Phase two, add anchors in document, and differentiate where used lands in document by context.
Phase three: TBD

Oops. Closed by accident.


Sample animation does not play in Firefox

In Matplotlib, we eventually figured out that pix format should be yuv420p:
https://github.com/matplotlib/matplotlib/blob/23d3d305a8cb47193700f55934348f340c16cd17/lib/matplotlib/animation.py#L564-L569

Thanks for pointing out the incompatibility. I don't fully understand the relevant encoding details here, however, I managed to make it run with Firefox by replacing the mp4 video with webm.

Yep, that works now.


Group kubernetes section in deploy folder

I think the "deploy in kubernetes" should Go in the same folder as "deploy in a containr" and "deploy standalone".
It also mentions the "Kubernetes operator" as a future option.

Codecov Report
Patch coverage has no change and project coverage change: -30.95% :warning:

Comparison is base (aceaae3) 78.79% compared to head (7dc478e) 47.85%.

Additional details and impacted files
@@             Coverage Diff             @@
##             main     #275       +/-   ##
===========================================
- Coverage   78.79%   47.85%   -30.95%
===========================================
  Files          41       33        -8
  Lines        3240     2495      -745
===========================================
- Hits         2553     1194     -1359
- Misses        526     1226      +700
+ Partials      161       75       -86

Flag
Coverage Δ

integration-test
?

unittests
47.85% <ø> (-0.13%)
:arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.
see 30 files with indirect coverage changes

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


Add functionality to solve quadratic equation

It'd be nice if users could do this.

$ git pull && time cargo clippy -- --allow clippy::result_large_err --deny warnings && time cargo run
Already up to date.
    Checking numbat-exchange-rates v0.5.0 (/home/hamir/numbat/numbat-exchange-rates)
    Checking numbat v1.11.0 (/home/hamir/numbat/numbat)
    Checking numbat-cli v1.11.0 (/home/hamir/numbat/numbat-cli)
    Finished dev [unoptimized + debuginfo] target(s) in 2.49s

real    0m2.620s
user    0m2.412s
sys     0m0.209s
    Finished dev [unoptimized + debuginfo] target(s) in 0.10s
     Running `target/debug/numbat`

  █▄░█ █░█ █▀▄▀█ █▄▄ ▄▀█ ▀█▀    Numbat 1.11.0
  █░▀█ █▄█ █░▀░█ █▄█ █▀█ ░█░    https://numbat.dev/

>>>  quadratic_equation(9.0, -126.0, 441.0)

  quadratic_equation(9, -126, 441)

    = (7, 7)

>>>

We do not have support for lists/tuples so far (see #261), but you can already do this today, by adding code like this to your init.nbt file:
# Solve the quadratic equation: a x² + b x + c == 0
fn quadratic_equation(a: Scalar, b: Scalar, c: Scalar) -> Scalar =
  (-b + sqrt(b^2 - 4 a c)) / 2 a

This will only show you one of the solutions, but you can add a fourth parameter to toggle the sign or add a second function to show you the second solution.
Or you do something like this:
fn _qe_solution<A, B>(a: A, b: B, c: B²/A, sign: Scalar) -> B/A =
  (-b + sign × sqrt(b² - 4 a c)) / 2 a

# Solve the quadratic equation: a x² + b x + c == 0
fn quadratic_equation<A2, B2>(a: A2, b: B2, c: B2²/A2) -> String =
  "x₁ = {_qe_solution(a, b, c, 1)}; x₂ = {_qe_solution(a, b, c, -1)}"

which shows you both solutions (and even allows for dimensionful a, b, c coefficients):
>>> quadratic_equation(1, 1, -1)

    = x₁ = 0.618034; x₂ = -1.61803

Of course, this needs error handling for the b² - 4 a c < 0 case.

Wouldn't it be nicer to instead add more general symbolics support?

Allow functions to take in raw unevaluated expressions, including unbound symbols. Users could just pass expressions likesolve(a x^2 + b x + c = 0, [x]).
If not already present, add more advanced structural pattern matching to the language.
Implement a tiny CAS library, allowing to easily expand from solving basic equations to symbolic trigonometry, differential calculus, etc.

To be completely honest, I am also not completely sure we want specialized functions like solve_quadratic_equation in the Numbat prelude at the current point in time. First, we don't even support for lists and can only return strings. Which is okay for a hack in someones personal prelude, but not for the "standard library".
And also, I'm not sure if it's the right approach to have specialized functions to solve quadratic equations, linear equations, cubic equations,  …
On the other hand:

Wouldn't it be nicer to instead add more general symbolics support?

Yes, it would be nice. But that is completely out of scope for Numbat. I don't think we can just casually implement a "small CAS". That is a huge undertaking. See also the "non features" section in our README (https://github.com/sharkdp/numbat).
Something that seems in scope for Numbat, however, would be a numerical equation solver. Once we have closures (#347) and lambdas (#374, #261), we could implement a function similar to Mathematics NSolve. Maybe first restricted to a single unknown. Users might be required to rewrite their equation in the form f(x)==0 (which is completely trivial). And then they could call the function nsolve with signature
nsolve(f: Fn[(Scalar) -> Scalar], x0: Scalar) -> Scalar

in this way:
let a = 9
let b = 10
let c = 2
fn f(x) = a * x^2 + b * x + c  # or any other complicated expression

nsolve(f, 0)   # would return one of the two solutions -0.261583 or -0.849528, probably -0.261583
nsolve(f, -10)  # would return -0.849528

we don't even support for lists and can only return strings

We now fully support lists (#443), and I have changed quadratic_equation to return a list of solutions (#450).

Something that seems in scope for Numbat, however, would be a numerical equation solver. Once we have closures (#347) and lambdas (#374, #261), we could implement a function similar to Mathematics NSolve. Maybe first restricted to a single unknown. Users might be required to rewrite their equation in the form f(x)==0 (which is completely trivial). And then they could call the function nsolve with signature
nsolve(f: Fn[(Scalar) -> Scalar], x0: Scalar) -> Scalar

This is now also supported: #451


Cannot use Azure OpenAI service

I tried to use Azure OpenAI with the new @microsoft/teams-ai, version 0.1.0-preview.2, and I had the following error on the completion request:
[onTurnError] unhandled error: AxiosError: Request failed with status code 401
To reproduce the problem, I change the OpenAIPlanner for the following AzureOpenAIPlanner:
const planner = new AzureOpenAIPlanner({
  apiKey: config.openAIKey,
  defaultModel: 'gpt-35-turbo',
  logRequests: true,
  endpoint: config.openAIEndpoint,
  apiVersion: '2023-03-15-preview'
});

Debugging the problem, the code requested the OpenAI endpoint not the Azure endpoint.

Maybe I missed a param to configure the planner to use Azure or the Azure Planner is not correctly configured to use the Azure OpenAI client.

@adiazcan the value your passing for config.openAIEndpoint is the endpoint from your Azure deployment?  I can try to reproduce this today...

Hello @Stevenic
I pass the Azure endpoint from my service like https://****.openai.azure.com/

Hey @adiazcan, could you confirm:

The correct model for your Azure OpenAI subscription? Your code says 'gpt-35-turbo' but the model we have internally is a different one -- this is the first thing that stands out to me.
No references to '@microsoft/botbuilder-m365' in any code, including package-lock and yarn.lock?

oh, nice catch. Your PR would be much appreciated! I'll close this issue as resolved. :)

Hi @adiazcan
Based on your comment, I also tried to make TeamsChefBot compatible with Azure OpenAI Service, but it does not work.
js/samples/04.ai.a.teamsChefBot/src/index.ts
// https://xxx.openai.azure.com is dummy

const planner = new AzureOpenAIPlanner({
    apiKey: process.env.OPENAI_API_KEY,
    defaultModel: 'text-davinci-003',
    logRequests: true,
    endpoint: 'https://xxx.openai.azure.com',
    apiVersion: '2023-05-15'
});
const moderator = new OpenAIModerator({
    apiKey: process.env.OPENAI_API_KEY,
    moderate: 'both',
    endpoint: 'https://xxx.openai.azure.com'
});

What other responses have you made?
Thanks for your support.

@tsubakimoto currently moderation is not fully implemented and is in development. For me, not including moderation worked. Could you give that a try?

@corinagum Thank you for your support.
By commenting out moderator I was able to use AOAI.


Permission Denied (publickey)

When trying to clone probnum within the pip install, I'm running into Permission Denied (publickey)
I just copied the entire command line output here, I hope it's somewhat readable
(Numerics) ➜  Python is the name of the conda env and directory - commands follow after it
(Numerics) ➜  Python pip uninstall probnum
WARNING: Skipping probnum as it is not installed.
(Numerics) ➜  Python git clone https://github.com/JonathanWenger/itergp.git
Cloning into 'itergp'...
remote: Enumerating objects: 158, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 158 (delta 4), reused 10 (delta 4), pack-reused 141
Receiving objects: 100% (158/158), 5.73 MiB | 20.79 MiB/s, done.
Resolving deltas: 100% (20/20), done.
(Numerics) ➜  Python cd itergp
(Numerics) ➜  itergp git:(main) pip install .
Processing /Users/leander/Documents/Coding/Libraries/Python/itergp
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting probnum@ git+ssh://git@github.com/marvinpfoertner/probnum.git@ad-prototype
  Cloning<EMAIL_ADDRESS>(to revision ad-prototype) to /private/var/folders/v_/ht9_s7xd68bfqtfbsh60mrd00000gn/T/pip-install-wjxbkv98/probnum_61aaf70cb5ec4e819182d3d817d3cfd1
  Running command git clone --filter=blob:none --quiet<EMAIL_ADDRESS>/private/var/folders/v_/ht9_s7xd68bfqtfbsh60mrd00000gn/T/pip-install-wjxbkv98/probnum_61aaf70cb5ec4e819182d3d817d3cfd1
<EMAIL_ADDRESS>Permission denied (publickey).
  fatal: Could not read from remote repository.

  Please make sure you have the correct access rights
  and the repository exists.
  error: subprocess-exited-with-error

  × git clone --filter=blob:none --quiet<EMAIL_ADDRESS>/private/var/folders/v_/ht9_s7xd68bfqtfbsh60mrd00000gn/T/pip-install-wjxbkv98/probnum_61aaf70cb5ec4e819182d3d817d3cfd1 did not run successfully.
  │ exit code: 128
  ╰─> See above for output.

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× git clone --filter=blob:none --quiet<EMAIL_ADDRESS>/private/var/folders/v_/ht9_s7xd68bfqtfbsh60mrd00000gn/T/pip-install-wjxbkv98/probnum_61aaf70cb5ec4e819182d3d817d3cfd1 did not run successfully.
│ exit code: 128
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

Thanks for the detailed bug report!
TL;DR
Try to clone the repository again. The bug hopefully should be fixed now. If not, feel free to reopen.
Detailed Explanation
This happened because itergp depends on a not-yet-released version of probnum that is only available as a GitHub repository. Internally the package tries to do
pip install git+ssh://git@github.com/marvinpfoertner/probnum.git@ad-prototype

So this command above should produce a similar error message. Github doesn't allow installs via pip in this manner without having deposited a public key in your Github profile. I replaced the installation in the dependencies with
pip install git+https://github.com/marvinpfoertner/probnum.git@ad-prototype

which should be possible for anybody.

I download the new package for itergp, after execute the command pip install.
It shows the error "error: subprocess-exited-with-error".
The complete execution show below:
Processing /Users/suyunkuan/Desktop/ML_Numerics for Machine Learning/Exercise/Ex2/itergp
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done
Collecting probnum@ git+https://github.com/marvinpfoertner/probnum.git@ad-prototype
Cloning https://github.com/marvinpfoertner/probnum.git (to revision ad-prototype) to /private/var/folders/vw/0wr8h_mx7t754p2l19b2mc_r0000gn/T/pip-install-ibzys1gc/probnum_ba67848f910146c89ae6e3683faa4cbe
Running command git clone --filter=blob:none --quiet https://github.com/marvinpfoertner/probnum.git /private/var/folders/vw/0wr8h_mx7t754p2l19b2mc_r0000gn/T/pip-install-ibzys1gc/probnum_ba67848f910146c89ae6e3683faa4cbe
Running command git checkout -b ad-prototype --track origin/ad-prototype
Switched to a new branch 'ad-prototype'
branch 'ad-prototype' set up to track 'origin/ad-prototype'.
Resolved https://github.com/marvinpfoertner/probnum.git to commit bff243f58f2a7f5aa9060a973559b3b4e6ef6db1
Installing build dependencies ... done
Getting requirements to build wheel ... error
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> [47 lines of output]
Error in sitecustomize; set PYTHONVERBOSE for traceback:
AssertionError:
/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py:108: _BetaConfiguration: Support for [tool.setuptools] in pyproject.toml is still beta.
warnings.warn(msg, _BetaConfiguration)
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 351, in
main()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 333, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 118, in get_requires_for_build_wheel
return hook(config_settings)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/build_meta.py", line 338, in get_requires_for_build_wheel
return self._get_build_requires(config_settings, requirements=['wheel'])
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/build_meta.py", line 320, in _get_build_requires
self.run_setup()
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/build_meta.py", line 335, in run_setup
exec(code, locals())
File "", line 33, in
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/init.py", line 87, in setup
return distutils.core.setup(**attrs)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 159, in setup
dist.parse_config_files()
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/dist.py", line 868, in parse_config_files
pyprojecttoml.apply_configuration(self, filename, ignore_option_errors)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 62, in apply_configuration
config = read_configuration(filepath, True, ignore_option_errors, dist)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 140, in read_configuration
return expand_configuration(asdict, root_dir, ignore_option_errors, dist)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 195, in expand_configuration
return _ConfigExpander(config, root_dir, ignore_option_errors, dist).expand()
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 242, in expand
self._expand_all_dynamic(dist, package_dir)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 286, in _expand_all_dynamic
version=self._obtain_version(dist, package_dir),
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 332, in _obtain_version
return _expand.version(self._obtain(dist, "version", package_dir))
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 321, in _obtain
return self._expand_directive(
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py", line 315, in _expand_directive
return _expand.read_attr(directive["attr"], package_dir, root_dir)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/expand.py", line 187, in read_attr
spec = _find_spec(module_name, path)
File "/opt/homebrew/lib/python3.10/site-packages/setuptools/config/expand.py", line 199, in _find_spec
spec = spec or importlib.util.find_spec(module_name)
File<EMAIL_ADDRESS>line 94, in find_spec
parent = import(parent_name, fromlist=['path'])
ModuleNotFoundError: No module named 'probnum'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.


Orchestrator: Kernel task affinity set fails with newer kernels/kernel builds

Unknown origin.
Kernel thread affinity setting is not possible anymore.
WARN: could not set PID 24935-'[kworker/0:2-events]' affinity: Invalid argument
WARN: could not set PID 24949-'[kworker/2:2-events]' affinity: Invalid argument
WARN: could not set PID 25430-'[kworker/1:0-events]' affinity: Invalid argument
WARN: could not set PID 25439-'[kworker/3:2]' affinity: Invalid argument
WARN: could not set PID 25476-'[kworker/u65:3-events_unbound]' affinity: Invalid argument
WARN: could not set PID 25477-'[kworker/u64:0]' affinity: Invalid argument
WARN: could not set PID 25505-'[kworker/5:2]' affinity: Invalid argument

CGroup v2: kworker threads are part of CGroup slice / and, although they may be moved, the root slice is preempted of the docker.slice CPUs, and they should thus not run on them.
Just add code to avoid warnings for CG2 setups

bd9f2f0


关于Table组件，当el-table-column组件type="selection"时,建议可以配置某些行不能选择

ElementUI version

OS/Browers version

Vue version

Reproduction Link

Steps to reproduce
What is Expected?
What is actually happening?

duplicate of #180


Add test for refetchInterval

Close #405

:tada: This PR is included in version 1.5.2 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


[FLINK-34853] Draft: Submit CDC Job To Flink K8S Native Application Mode

Support Submit CDC Job To Flink K8S Native Application Mode #2934
Design Doc: https://docs.google.com/document/d/1HlvRS5aVNqPtOx14mynEL3RFaZORuTFkWZAjvl4k998/edit?usp=sharing

@czy006 Could you rebase the PR to the latest master? Thanks

Hi @czy006, is there any updates on this? Seems this PR is still in draft stage and not ready for review and merge. Feel free to comment if there's any blockers about this.

Thanks for @PatrickRen help improving CI and Unit Tests. I will help Review this PR

Seems this PR changes how CDC CLI behaves. Previously, by running ./bin/flink-cdc.sh <YAML> without extra arguments, it submits the Flink job, prints Job ID / description and quits.
However, now CLI will not quit and prints all events out synchronously, as if it's in the "mini-cluster" mode. It won't quit until job finishes, so e2e / Migration tests will never finish.

Is there any information on how to use this? It seems to be part of the 3.2.0 release but I couldn't find any documentation for it.


[US] Set up MkDocs

As a platform developer, I want to be able to look up documentation for different aspects of the platform, so that I can understand my tasks better and have an easier time working with the apps.

MoSCoW
Risk
Story Points

Must
Medium
3

Acceptance Criteria

Functional documentation website
Functional generation process
Integrated with docker

Risks

Integration with repository failing
Integration with docker / into docker containers

Tasks

[x] Set up MKdocs in project
[x] Integrating docker to run mkdocs

Note
This US has a dependency with US #62, because one of its tasks is to document regarding Use Case 1. Therefore, we must set up the MkDocs(this US) first to be able to start documenting. Please coordinate with the other assignee.
Useful Links
https://www.mkdocs.org/
https://hub.docker.com/r/polinux/mkdocs

https://github.com/WillTrem/UInnovate/assets/78176331/4f5888cb-9cf2-49f3-ba21-11322f9cb9b6

Looks good! Signing off!


Config is missing refresh_token

Hi,
When I try using the example on the front page I am getting the following error:
 Config is missing the following keys: refresh_token

Ah yes, the example is wrong. The RefreshToken grant type should require a 'refresh_token' config key

... or maybe it shouldn't. Fixed with this commit https://github.com/commerceguys/guzzle-oauth2-plugin/commit/6936df59c183c04cd9a0ecc4bbc26101be4a62f3


Browsing a server doesn't show shares/password prompt

Description
I'm on Windows 11, and when I go to \SOME-SVR, it doesn't ask for credentials, nor does it list shares when I have credentials entered via Credential Manager.
Steps To Reproduce

Browse to \SOME-SVR

Expected behavior
Expect password prompt in case of no credentials saved in Credential Manager, or list of shares when authorized to view.
Files Version
<IP_ADDRESS>
Windows Version
Windows 11 21H2
Relevant Assets/Logs

Merging with #258


Cannot detect github.com/aws/smithy-go license.

https://github.com/aws/smithy-go is licensed under Apache License 2, but LicenseFinder says 'unknown.'
I am not sure, but it might because aws/smithy-go LICENSE file does not contain 'END OF TERMS AND CONDITIONS' at the end.

This issue appears to have been fixed in #933


Multi region failover

I wasn't entirely sure how thoroughly to test thread-safety, so I decided to err on the side of caution.

@adamcohen , @ashoda , @emirkin , I think I've addressed all your comments - could you please cast your eyes over it again?

One comment, but the changes look good to me.

LGTM


"update_interval" in "binary_sensor._online" attributes is no longer available

Hello,
Everything is in the title :)
It was handy for custom automations on updating vehicle data to verify that the given value (in seconds) is correct.
However, this did not affect the operation of my automation after modifying the entity names.
Thank you for your work !

Just finally did the update and noticed same.


Switch prop type and prop transform output type?

While adding the stringToBigIntTransform prop transform, I found it not very intuitive to give the prop the encoded type (e.g. string) and then apply a prop transform to get the desired type (e.g. bigint). Instead, I think the opposite order would be more intuitive, e.g.:
@model("M")
class M extends Model({
  int: prop<bigint>().withTransform(bigintToStringTransform()),
  date: prop<Date>().withTransform(dateToTimestampTransform()),
  // ...
}) {
  // ...
}

What do you think?

On the other hand, when using my suggestion with tProp, the input of the prop transform would not be validated whereas with the current approach it is, e.g.:
@model("M")
class M extends Model({
  int: tProp(types.string).withTransform(stringToBigIntTransform()),
  date: tProp(types.number).withTransform(timestampToDateTransform()),
  // ...
}) {
  //

Nevertheless, this API feels not so intuitive, at least to me. :thinking:

Perhaps tProp(...).withTransform(...) could return a new tProp with the new runtime type? Each prop transform would need to provide it, of course. E.g.:
@model("M")
class M extends Model({
  int: tProp(types.bigint).withTransform(bigintToStringTransform()), // -> tProp(types.string).withTransform(bigIntToStringTransform())
  date: tProp(types.date).withTransform(dateToTimestampTransform()), // -> tProp(types.number).withTransform(dateToTimestampTransform())
  // ...
}) {
  // ...
}

Do you know what I mean?

The more I think about it, the more it feels related to the other discussions about dropping prop in favor of only using tProp (https://github.com/xaviergonz/mobx-keystone/issues/299 / https://github.com/xaviergonz/mobx-keystone/issues/299#issuecomment-905784266, https://github.com/xaviergonz/mobx-keystone/issues/308).
What I mean is: Property transforms in the general case are not a feature of model props but an encoder/decoder mechanism of runtime types/schemas. Similarly, as discussed in https://github.com/xaviergonz/mobx-keystone/issues/299, (deeply nested) optional fields with default values can only be expressed properly using a runtime schema. So I think the ultimate solution to this and the other topics may be building out the runtime types beyond mere type-checking.


toggleSeries/showSeries

Bug report
It seems that showSeries is not working fine for me, where I have used line chart with custom legend, hideSeries method is working fine, but when I use showSeries cannot able to show the line again in the chart, also tried the toggleSeries which is also hiding the line in chart not showing them again when toggling. And always returning false on toggleSeries
Using ApexChart.exec()

working fine with default legend, need help with this

Which version of ApexCharts are you using? This problem was recently fixed.

Using
"apexcharts": "^3.15.2"
"react-apexcharts": "^1.3.6",

@junedchhipa I think I found a work-around. However, I am NOT 100% sure why the word-around even works.
So I ended up setting the legendClick to a function like:
apex.chart.events.legendClick = function (context, configs) {}

Maybe some modules that calls the legend's click function explicitly expects a type function to do something, instead of expecting function && undefined:
typeof legendClick === 'function'

Again, I am not sure. I haven't look at the source code, but I hope it helps.
By the way I am using:
"vue": "^2.6.11",
"apexcharts": "^3.15.5"

@junedchhipa Still not able to find any other way to toggle the charts with custom legends

I just tried this example - https://github.com/apexcharts/apexcharts.js/blob/master/samples/vanilla-js/misc/custom-legend.html with ApexCharts.exec(chartID, 'hideSeries', seriesName) and it worked fine.
Can you please create a codepen / codesandbox demo so I can take a closer look?

Yeah, it's working fine. some component rendering issue, thanks for your time


How to get the selection position in PDF and Highlight the selection in PDF?

How to get the selection position in PDF and Highlight the selection in PDF ?
I need to add some token text as name_key and need to replace it?
How to add a text in existing PDF using the cursor ?

jsPDF cannot modify existing PDFs.


Downgrade docker version from 1.7.1 to 1.7.0

This is a temporary solving to fix the issue. It is gonna be fixed in the new docker version.

Can we move to the new docker official repos that install docker-engine instead if lxc-docker
https://blog.docker.com/2015/07/new-apt-and-yum-repos/

I think you are right but the point was to downgrade the version to 1.7.0 because it fixes the issue. It is only temporary solution until it is fixed in new docker version 1.8. The repos which install docker-engine gives you version 1.7.1. We should definitely do that when they fix it and release new version 1.8 what I think it's going to happen in next week.

yep, let's move to the new repos once the new version after 1.7.1 get released.
https://github.com/Capgemini/Apollo/issues/445


Needs update to /jagrosh/MusicBot/releases/tag/0.4.2 to fix 403 when playing videos

Hi, first of all a big thanks for making this a great container.
I noticed that you do not have the newest 0.4.2 version of /jagrosh/MusicBot available as a tag yet. Got released about an hour ago.
Maybe a variable while running your container is a good option for users to switch instead of waiting for your container? Something like
services:
jmusicbot:
image: craumix/jmusicbot
container_name: jmusicbot
restart: unless-stopped
volumes:
- ./config:/jmb/config
jmusic_source_version: 0.4.2

Update to 0.4.2 is done, while setting the version trough env is theoretically possible it would be a really uncommon approach for containers.
Building trough actions is pretty simple now so I'll just need to find someone who can also manually trigger the action on updates or just run it on a cron and check for the latest version on a schedule.

Great, thanks! Would be a weird edge case indeed. Was just wondering if it would be possible because of my unraid setup, simple plug-and-play for dockerimages where I then could just set the version variable.
Probably better to automate releases from a cron that checks for versions and keep using docker tags like you said :)


Trending repo hack that works today

https://github.com/vitalets/github-trending-repos
Kind of brilliant. Can use it w/ GitHawk already. cc @Sherlouk

Subscribing to them is a solid interim solution, but yea would still love to get a featured page!
They have RSS feeds, wonder if we could do something with those?
I still check Swift featured daily!

https://github.com/huchenme/github-trending-api
Another commonly used API

When this feature coming in GitHawk app @rnystrom ?
I would love contributing to it.

Not helping get help somewhere else didn’t go to school remember
On Tue, Jun 11, 2019 at 12:20 AM Sai Ram Kotha<EMAIL_ADDRESS>wrote:

When this feature coming in GitHawk app @rnystrom
https://github.com/rnystrom ?
I would love contributing to it.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/GitHawkApp/GitHawk/issues/1576?email_source=notifications&email_token=AK6NGSIOIJPAR6TKH2FDJ2LPZ4RYVA5CNFSM4ESF24HKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODXL4ROI#issuecomment-500680889,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AK6NGSPZXHQBZY7LHC6SNKLPZ4RYVANCNFSM4ESF24HA
.


http adding endpoint to ingest data with

Description
The http documentation doesn't include any real mention of what endpoint to ingest data at. I've added an Ingestion section, and put an example as well.
Issues Resolved
Version
This relates to the newest version of OpenSearch Data Prepper.
Frontend features
Checklist

[x] By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and subject to the Developers Certificate of Origin.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.
Signed-off-by: Landon Lengyel<EMAIL_ADDRESS>

@dhwanilpatel @bharath-techie @mgodwan Will one of you please tech review this documentation update and provide your approval? We'll move the PR forward following your approval. Thank you.


Refactor existing codebase

@NickTikhonov my earlier work in #30 clashes with a bunch of this work, but let me know if you're still keen to see some of this land and maybe we can revisit it!


Boxer doesn't handle dispatcher type

I encouter this limitation with jitclass
@njit
def add(a):
    return a+1

spec = [
    ('function',typeof(add)),
]

@jitclass(spec)
class testclass():
    def __init__(self,function):
        self.function = function

@njit
def test(obj,a):
    return obj.function(a)
x = testclass(add)
#This return 2
test(x,1)

#This return a error
x.function(1)

The return error :
---> 21 p1.function
     22 @njit
     23 def test(p,a,b):

TypeError: cannot convert native type(CPUDispatcher(<function a_b at 0xa286f61e0>)) to Python object

It's necessarily useful in other situations too. In my casse it's non blocking now but I can see that can be problematic in the futur.

Thanks for the report. This seems like it could be accommodated at some point.

As of mainline for 0.55, this does not reproduce. Closing assumed fixed.


esp8266 connected server with mqtt-ssl  sometimes error

esp8266 connect server with mqtt-ssl, use this application, sometimes error occure,
error log follow,
client's data invalid protocol
Error: SSL error 3
TCP: Disconnected callback
MQTT: Disconnected

@zhyufeng did you fix this issue?

Same here. Have you got rid of this issue guys? @zhyufeng  @priyankachepuri09


Feature carousel

A new carousel block, with a text container overlapping an image.
Requirements

Section is full width and has a black background
On mobile, the image will be shown above the text container
Both image and text container will maintain a square aspect ratio (see also #41)
The content in the text container will vertically be centred (see also #41)
Text container content:

Eyebrow/pre-heading
Heading
Text
Primary button (optional)

On the text container we show the carousel controls
When the end of the carousel is reached, either button will be disabled
The carousel controls will follow the standard states

@Lakshmishri @manuel-vara I just found a related block without the carousel functionality. How would we deal with this?

That might be a carousel with only one slide.

confirmed as done

Just realized this is not what I expected. I believe the original intent of the design was to have the background image change with the carousel click.


dockergen binary support for alpinelinux

Hi, I am curious if there is some interest in preparing a binary that works with Alpine Linux?
I built such binary following the same pattern than what @lorenz outlined for forego here:
https://github.com/ddollar/forego/issues/65#issuecomment-146521766
My Alpine based image of nginx-proxy weighs 23MB
Such a binary works also on glibc Linux distros; I have not tested that for a fact but if that helps here are my forego and dockergen binaries for x64: https://github.com/hmalphettes/nginx-proxy/releases/tag/0.0.0
Thanks for your attention.

I have tested it, they work just fine as long as you don't use NSS (nobody uses that inside Docker).

@lorenz What do you mean about NSS? docker-gen uses Go's crypto/tls library for TLS support.

Sorry, meant nsswitch

@lorenz Got it.

That being said, the docker-gen binary is not only used inside Docker.


Table writer 7: ID generator for distinct partitions

Add an ID generator class PartitionIdGenerator that generates sequential integer IDs for distinct partition values. It takes partition RowVector as input and returns the generated IDs for the corresponding rows. The implementation is based on VectorHasher, so rehash could happen that users need to handle.

@gggrace14 I'm still not sure I understand what it makes sense to require the caller to handle rehash situation and not fold the that logic inside the generator class.

Hi @mbasmanova , saw your comment and had this question in mind when revising my code. I also thought originally it's ideal to have the rehash of VectorHasher transparent to the generator caller. Do you have any suggestion for folding it into the generator class logic? I put the VectorHasher::enableValueIds() inside the generator class. Can I do more about the rehash?
I think the rehash situation here means, after the current input causes the VectorHasher to rehash, we apply the previous partition vector we track so far to the VectorHasher to recalculate the integer IDs. Should I pass the current input and the previous partition vector as two params to the generator and return two ID vectors respectively?

@gggrace14 Ge, in terms of API, currently we have a 'run' method that returns a boolean indicating whether the rehash happened and partition IDs have changed. We could modify this API to return an optional mapping from the old IDs to new IDs in case of rehash.
Current API:
bool run(
      const RowVectorPtr& input,
      const SelectivityVector& rows,
      raw_vector<uint64_t>& result)

Proposed new API:
std::unordered_map<uint64_t, uint64_t> run(
      const RowVectorPtr& input,
      raw_vector<uint64_t>& result)

We will no longer need SelectivityVector parameter since it is currently only used to handle the rehash scenario which will be handled internally. In most cases, the new API will remove empty map and the caller won't need to do anything. In a rare case of rehash, the caller will receive a non-empty map and will need to update the writers accordingly.
What do you think?

Hi Masha, I got this idea. I'm revising this PR based on the idea. I think I still need to track all the partitions seen so far inside the generator class.

@gggrace14 Ge, capturing our offline discussion for posterity.
Rehashing logic is not needed if there is only one partition key. In this case, the new values are added to the set of unique values and assigned sequential IDs. These IDs never change and new value gets "next" ID. We can skip rehash, move and add partitions logic for this case. I expect this to be the common case as many tables are partitioned on a single key "ds".
For example,

first vector has a single partition key 2022-10-05. It is assigned partition ID 1. VectorHasher will reserve 1 extra partition ID for future values (+20% rounded up);
second vector has 2 new partition keys: 2022-10-06, 2022-10-07. This makes number of partition key values 3 which exceeds reserved number of 2 values and makes VectorHasher::computeValuesIds return false. We'll have 2022-10-06 assigned partition ID 2 and 2022-10-07 - 3. Partition ID for the old value 2022-10-05 will stay the same: 1.

In case of multiple partition keys, it is possible that after rehashing some IDs do not change. Hence, we can skip adding these to the idMap. This would be the case if there were no new values for the first key, but there were new values for the second or subsequent keys.
For example, there are 2 partition keys: ds and ts.

first vector has a single pair of values: ds = 2022-10-05, ts = 09:00. VectorHasher for ds assigns value ID 1 to 2022-10-05 and reports multiplier 2. VectorHasher for ts assigns value ID 1 to 09:00 and reports multiplier 2. Rehashing kicks is and set multiplier for ts hasher to 2. This results in  ds = 2022-10-05, ts = 09:00 partition assigned ID 3 = 1 + 2 * 1.
second vector has 2 new partition keys: ds = 2022-10-05, ts = 10:00 and ds = 2022-10-05, ts = 11:00. Here, since ds value hasn't changes, hasher for ds does not change. However, hasher for ts adds 2 new values, assigns them IDs 5 = 2 + 2 * 1, 7 = 3 + 2* 1, and triggers a rehash. Since multiplier for the ds hasher didn't change, rehash is a no-op. At the end we have ds = 2022-10-05, ts = 09:00 having same value ID of 3 and 2 new partition key values having IDs 5 and 7. (If we later get partition key values new ds values, the multiplier for ds hasher may change which will modify the existing IDs.)

See https://github.com/facebookincubator/velox/compare/main...mbasmanova:velox-1:partid?expand=1 for the test cases which show these scenarios.
Also, it seems logical to track total number of unique partition IDs and enforce the limit in the ID generator.
Finally, with the limit of 100 partitions and 2 partition keys, we may have 100 unique values for first key and 100 unique values for the second key. This would result in max partition ID being ~ 120 * 120 = 14,400. With 3 partition keys, max partition ID will be 1,728,000. With the current implementation, we'll end up allocating 1M rows allPartitionsVector_ and 1M entries std::vector of writers. I wonder if that would be problematic. With 4 keys, the max number will be > 100,000,000.
I wonder if it makes sense for the ID generator to assign sequential consecutive IDs instead of re-using value IDs produced by VectorHashers. For the case of single partition key (ds partitions), we can reuse value IDs produced by VectorHasher, but for multi-key use case we would assign a different ID. This would prevent the caller from allowing 1M vector of mostly null writers, allow us to fully hide the rehashing / remapping logic in the ID generator and remove corresponding complexity from the caller. What do you think?

@gggrace14 Ge, capturing our offline discussion for posterity.
Rehashing logic is not needed if there is only one partition key. In this case, the new values are added to the set of unique values and assigned sequential IDs. These IDs never change and new value gets "next" ID. We can skip rehash, move and add partitions logic for this case. I expect this to be the common case as many tables are partitioned on a single key "ds".
For example,

first vector has a single partition key 2022-10-05. It is assigned partition ID 1. VectorHasher will reserve 1 extra partition ID for future values (+20% rounded up);
second vector has 2 new partition keys: 2022-10-06, 2022-10-07. This makes number of partition key values 3 which exceeds reserved number of 2 values and makes VectorHasher::computeValuesIds return false. We'll have 2022-10-06 assigned partition ID 2 and 2022-10-07 - 3. Partition ID for the old value 2022-10-05 will stay the same: 1.

In case of multiple partition keys, it is possible that after rehashing some IDs do not change. Hence, we can skip adding these to the idMap. This would be the case if there were no new values for the first key, but there were new values for the second or subsequent keys.
For example, there are 2 partition keys: ds and ts.

first vector has a single pair of values: ds = 2022-10-05, ts = 09:00. VectorHasher for ds assigns value ID 1 to 2022-10-05 and reports multiplier 2. VectorHasher for ts assigns value ID 1 to 09:00 and reports multiplier 2. Rehashing kicks is and set multiplier for ts hasher to 2. This results in  ds = 2022-10-05, ts = 09:00 partition assigned ID 3 = 1 + 2 * 1.
second vector has 2 new partition keys: ds = 2022-10-05, ts = 10:00 and ds = 2022-10-05, ts = 11:00. Here, since ds value hasn't changes, hasher for ds does not change. However, hasher for ts adds 2 new values, assigns them IDs 5 = 2 + 2 * 1, 7 = 3 + 2* 1, and triggers a rehash. Since multiplier for the ds hasher didn't change, rehash is a no-op. At the end we have ds = 2022-10-05, ts = 09:00 having same value ID of 3 and 2 new partition key values having IDs 5 and 7. (If we later get partition key values new ds values, the multiplier for ds hasher may change which will modify the existing IDs.)

See https://github.com/facebookincubator/velox/compare/main...mbasmanova:velox-1:partid?expand=1 for the test cases which show these scenarios.
Also, it seems logical to track total number of unique partition IDs and enforce the limit in the ID generator.
Finally, with the limit of 100 partitions and 2 partition keys, we may have 100 unique values for first key and 100 unique values for the second key. This would result in max partition ID being ~ 120 * 120 = 14,400. With 3 partition keys, max partition ID will be 1,728,000. With the current implementation, we'll end up allocating 1M rows allPartitionsVector_ and 1M entries std::vector of writers. I wonder if that would be problematic. With 4 keys, the max number will be > 100,000,000.
I wonder if it makes sense for the ID generator to assign sequential consecutive IDs instead of re-using value IDs produced by VectorHashers. For the case of single partition key (ds partitions), we can reuse value IDs produced by VectorHasher, but for multi-key use case we would assign a different ID. This would prevent the caller from allowing 1M vector of mostly null writers, allow us to fully hide the rehashing / remapping logic in the ID generator and remove corresponding complexity from the caller. What do you think?

@mbasmanova Hi Masha, thanks a lot for helping think through and the elaboration on the problem as well as offline discussion w/ me. I got a deeper understanding of the properties of VectorHasher from our discussion. I revised this PR and all related based on our discussion, to solidify the interface of the ID generator, and limit the support to a single partition and utilize a single VectorHasher so that we can get sequential consecutive IDs.
This is ready for review, as well as the other two.
https://github.com/facebookincubator/velox/pull/3421
https://github.com/facebookincubator/velox/pull/3430

@gggrace14

The max number of partitions that could be processed
is enforced by the hive config
hive.max-partitions-per-writers.

This PR doesn't use this config. Instead, the generator allows the caller to specify the limit. Would you update PR description?


Add platform identifier to LocationHistoryData objects

As described in #62, the publisher SDK emits LocationHistoryData objects. These objects can subsequently be serialised and stored for later use. Currently, only the Android SDK emits these objects, but in https://github.com/ably/ably-asset-tracking-swift/issues/111 we'll start emitting them from iOS too. We should add some information (need to determine best for for this) that identifies the platform that the data was generated by. We should then add it to the JSON schema created in https://github.com/ably/ably-asset-tracking-common/issues/62.

@QuintinWillison @KacperKluka @rdeoliv do you have any suggestions about what format this data should take? Are there any examples, either within the asset tracking SDK or more widely at Ably, that we could take advantage of / should be consistent with?

What immediately comes to mind is the similarity to the Agents supplied by SDKs to the Ably service when they connect.
It doesn't sound like we need to worry about the overhead (in terms of data size) of this additional information, so I would prefer something verbose and unabbreviated. Other than that, no strong opinions. Design away! 😁

The corresponding Jira issue is https://ably.atlassian.net/browse/SDK-2717


Added features:ReactiveUrsaWindow and ReactiveUrsaView.

Ursa's intent is to expand the functionality of the original AvaloniaUI, so the ReactiveUI version should be implemented for UrsaWindow and UrsaView.
1.added class ReactiveUrsaWindow.
2.added class ReactiveUrsaView.
3.New project dependencies have been added Avalonia.ReactiveUI(11.1.1)
4.Fixed the ambiguity of method calls between System.ObservableExtensions.Subscribe and Irihi.Avalonia.Shared.Helpers.ObservableExtension.Subscribe.

Ursa does not rely on any specific MVVM design, so introducing ReactiveUI dependency is not acceptable. It is harmful to users consuming other MVVM frameworks.

I think you have a point. Would it be better to publish #410 as a package similar to the Avalonia.ReactiveUI Nuget package?

I think you have a point. Would it be better to publish #410 as a package similar to the Avalonia.ReactiveUI Nuget package?

Yes, it should be delivered separately as Ursa.ReactiveUIExtension, like the Prism extension.

I'm going to refer to the code for Avalonia.ReactiveUI to redesign #410 and add a Ursa.ReactiveUI project and deliver it separately. What do you think?


[CWS] use common buffers when doing sequential eRPC dentry resolutions

What does this PR do?
This PR replaces the buffer allocation "per eRPC" resolution, by common "allocated-once" buffers. This will reduce drastically the amount of allocations, and thus the GC pressure as well, in the cases where file path resolution are frequents (like in build clusters).
Please note that this is only possible as-is (one buffer for everything) because eRPC is done single threaded, once you start doing multi-threaded requests it cannot work.
Motivation

Additional Notes

Possible Drawbacks / Trade-offs

Describe how to test/QA your changes

/merge


[Enhancement] Catalog JDBC for sqlserver uniqueidentifier Type

Search before asking

[X] I had searched in the issues and found no similar issues.

Description
SQL Error [1105] [HY000]: errCode = 2, detailMessage = Unsupported type 'UNSUPPORTED_TYPE' in 'sqlserver_catalog.default_cluster:dbo.TestTable.Id'.
Solution
support data type uniqueidentifier for JDBC sql server
Are you willing to submit PR?

[ ] Yes I am willing to submit a PR!

Code of Conduct

[X] I agree to follow this project's Code of Conduct

That's a good idea. I'll take a look

Has it been fixed? Which version will be released

I see 2.0.1


Threadcap: Add support for the "summary" property

Hello @johnspurlock-skymethod ,
While testing I noticed that threadcap is not supporting the summary property.
According to my tests, this property is used to store Content Warnings (e.g. spoiler alert, sensitive content). See references below.
It would be nice to have this property supported in threadcap.

https://fosstodon.org/@dellagustin/109780550965092145
{
    "@context": [
        "https://www.w3.org/ns/activitystreams",
        {
            "ostatus": "http://ostatus.org#",
            "atomUri": "ostatus:atomUri",
            "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
            "conversation": "ostatus:conversation",
            "sensitive": "as:sensitive",
            "toot": "http://joinmastodon.org/ns#",
            "votersCount": "toot:votersCount"
        }
    ],
    "id": "https://fosstodon.org/users/dellagustin/statuses/109780550965092145",
    "type": "Note",
    "summary": "Testing content warning",
    "inReplyTo": null,
    "published": "2023-01-30T22:37:50Z",
    "url": "https://fosstodon.org/@dellagustin/109780550965092145",
    "attributedTo": "https://fosstodon.org/users/dellagustin",
    "to": [
        "https://www.w3.org/ns/activitystreams#Public"
    ],
    "cc": [
        "https://fosstodon.org/users/dellagustin/followers"
    ],
    "sensitive": true,
    "atomUri": "https://fosstodon.org/users/dellagustin/statuses/109780550965092145",
    "inReplyToAtomUri": null,
    "conversation": "tag:fosstodon.org,2023-01-30:objectId=84208846:objectType=Conversation",
    "content": "
A message with content warning.
",
    "contentMap": {
        "en": "
A message with content warning.
"
    },
    "attachment": [],
    "tag": [],
    "replies": {
        "id": "https://fosstodon.org/users/dellagustin/statuses/109780550965092145/replies",
        "type": "Collection",
        "first": {
            "type": "CollectionPage",
            "next": "https://fosstodon.org/users/dellagustin/statuses/109780550965092145/replies?only_other_accounts=true&page=true",
            "partOf": "https://fosstodon.org/users/dellagustin/statuses/109780550965092145/replies",
            "items": []
        }
    }
}

Remember threadcap started as a way to normalize comments coming from AP or twitter (and an old thing based on fountain comments).  But now that AP is a bit more in focus, I agree that summary, at least, would be a nice addition to the payload.

Added in 0.1.10
https://www.npmjs.com/package/threadcap/v/0.1.10

That is great! Thanks a lot.

Remember threadcap started as a way to normalize comments coming from AP or twitter (and an old thing based on fountain comments). But now that AP is a bit more in focus, I agree that summary, at least, would be a nice addition to the payload.

Even if twitter was still in the game, I think it would still make sense to add summary. It is a backwards compatible addition for a feature that would simply not be present for twitter (shame on them 😃).


Support of JSON filtering for SQLAlchemy

Hi! Awesome lib, by the way. I am wondering if there are any plans on supporting filtering by JSON fields via SQLAlchemy? Would be nice to have.
Something like:
lib:
_orm_operator_transformer = {
    ...
    json_contains: ...
}

url:

url?somefield__json_contains={"test":"ok"}

def filter():
   parsed_key = "test"
   model_field = getattr(self.Constants.model, field_name)
   query = query.filter(model_field[f"{parsed_key}"](value))

so in the query it will be SomeModel.somefield["test"] = "ok"

Thnx in advance!

I have been working on just this feature last week.  While I don't have it cleaned up enough to do an MR, what I have done is set it up so I can extend the existing classes.  This is done by adding a constant of json_field_mapping, and a search_model_json_fields.
json_field_map has three keys:

dfield: database field containing the JSON/JSONB
key: jsonpath of the key. This could be top level or nested
cast: sqlachemy Type to cast the value as. Default is sqlalchemy.Text

import sqlalchemy
from filterextend import FilterExtended

class TrackingFilter(FilterExtended):

    class Constants(FilterExtended.Constants):
        model = dbmodel.IDracTracking
        search_field_name = "search"
        search_model_json_fields = ["clustername", "fqdn", "ip"]
        json_field_mapping = {
            "notrigger": {"dfield": "data", "key": "notrigger", "cast": sqlalchemy.Boolean},
            "notes": {"dfield": "data", "key": "notes"},
            "cmdb_server_installed": {
                "dfield": "data",
                "key": "cmdb_server_installed",
                "cast": sqlalchemy.DateTime
            },
            "cmdb_oob_installed": {"dfield": "data", "key": "cmdb_oob_installed"},
            "cmdb_decomissioned": {"dfield": "data", "key": "cmdb_decomissioned"},
            "started": {"dfield": "data", "key": "started"},
            "ended": {"dfield": "data", "key": "ended"},
            "passed": {"dfield": "data", "key": "passed"},
        }

filterextend.py
from typing import Union
from pydantic import validator
# this is for casting json fields to a specific type
import sqlalchemy.types as satypes

from sqlalchemy import or_
from sqlalchemy.orm import Query
from sqlalchemy.sql.selectable import Select
from collections import defaultdict
from sqlalchemy import desc, asc

from fastapi_filter import FilterDepends, with_prefix
from fastapi_filter.contrib.sqlalchemy import Filter
from fastapi_filter.contrib.sqlalchemy.filter import _orm_operator_transformer

class FilterExtended(Filter):

    def filter(self, query: Union[Query, Select]):
        if hasattr(self.Constants, "json_field_mapping"):
            json_field_mapping = self.Constants.json_field_mapping
            json_field_keys = json_field_mapping.keys()
        else:
            json_field_mapping = {}
            json_field_keys = []

        for field_name, value in self.filtering_fields:
            field_value = getattr(self, field_name)

            if isinstance(field_value, Filter):
                query = field_value.filter(query)
            else:
                if "__" in field_name:
                    field_name, operator = field_name.split("__")
                    operator, value = _orm_operator_transformer[operator](value)
                else:
                    operator = "__eq__"

                if field_name == self.Constants.search_field_name and hasattr(
                    self.Constants, "search_dfields"
                ):
                    search_filters = []
                    for field in self.Constants.search_dfields:
                        search_filters.append(
                            getattr(self.Constants.model, field).ilike(f"%{value}%")
                        )

                    if hasattr(self.Constants, "search_model_json_fields") and hasattr(
                        self.Constants, "json_field_mapping"
                    ):
                        for field in json_field_keys:
                            dfield = getattr(
                                self.Constants.model,
                                json_field_mapping[field]["dfield"],
                            )
                            dfield = dfield[
                                json_field_mapping[field]["key"]
                            ].astext
                            # as we are making all fields text, we have to cast the value to text as well
                            search_filters.append(dfield.ilike(f"%{str(value)}%"))

                    query = query.filter(or_(*search_filters))

                elif (
                    hasattr(self.Constants, "json_field_mapping")
                    and field_name in json_field_keys
                ):

                    dfield = getattr(
                        self.Constants.model,
                        json_field_mapping[field_name]["dfield"],
                    )
                    castas = json_field_mapping[field_name].get("cast", satypes.Text)
                    dfield = dfield[
                        json_field_mapping[field_name]["key"]
                    ].astext.cast(castas)

                    #                 self._table.data["notrigger"]
                    #                 .astext.cast(sqlalchemy.Boolean)
                    #                 .is_(True)

                    query = query.filter(getattr(dfield, operator)(value))
                else:
                    dfield = getattr(self.Constants.model, field_name)
                    query = query.filter(getattr(dfield, operator)(value))

        return query

    def sort(self, query: Union[Query, Select]):

        if not self.ordering_values:
            return query

        for field_name in self.ordering_values:

            direction = Filter.Direction.asc
            if field_name.startswith("-"):
                direction = Filter.Direction.desc
            field_name = field_name.replace("-", "").replace("+", "")

            if (
                hasattr(self.Constants, "json_field_mapping")
                and field_name in self.Constants.json_field_mapping.keys()
            ):
                fieldmap = self.Constants.json_field_mapping[field_name]
                order_by_field = getattr(self.Constants.model, fieldmap["dfield"])
                # todo: should we cast this to a specific type like we do in the filter?
                # ie: order_by_field = order_by_field[fieldmap["key"]].astext.cast(satypes.Boolean)
                order_by_field = order_by_field[fieldmap["key"]].astext
                # astext fields do not have asc/desc as a property, so we have to use the sqlalchemy functions
                if direction == Filter.Direction.asc:
                    query = query.order_by(asc(order_by_field))
                else:
                    query = query.order_by(desc(order_by_field))

            else:
                # normal fields
                order_by_field = getattr(self.Constants.model, field_name)
                query = query.order_by(getattr(order_by_field, direction)())

        return query

    # TODO this does not work with related fields, or "label" fields
    # https://github.com/arthurio/fastapi-filter/issues/417 has suggestions for how to fix this
    @validator("*", allow_reuse=True, check_fields=False)
    def validate_order_by(cls, value, values, field):
        if field.name != cls.Constants.ordering_field_name:
            return value

        if not value:
            return None

        field_name_usages = defaultdict(list)
        duplicated_field_names = set()

        for field_name_with_direction in value:
            field_name = field_name_with_direction.replace("-", "").replace("+", "")

            if not hasattr(cls.Constants.model, field_name):
                # now check if it's a json field
                if (
                    hasattr(cls.Constants, "json_field_mapping")
                    and field_name in cls.Constants.json_field_mapping.keys()
                ):
                    pass
                else:
                    raise ValueError(f"{field_name} is not a valid ordering field.")

            field_name_usages[field_name].append(field_name_with_direction)
            if len(field_name_usages[field_name]) > 1:
                duplicated_field_names.add(field_name)

        if duplicated_field_names:
            ambiguous_field_names = ", ".join(
                [
                    field_name_with_direction
                    for field_name in sorted(duplicated_field_names)
                    for field_name_with_direction in field_name_usages[field_name]
                ]
            )
            raise ValueError(
                f"Field names can appear at most once for {cls.Constants.ordering_field_name}. "
                f"The following was ambiguous: {ambiguous_field_names}."
            )

        return value

I also have a variation for ordering related fields as noted in #417.

Hey, @ytjohn ! This is awesome!
First of all, thanks for the detailed reply. This is definitely something I can use right now, but perhaps you have any ETA on releasing this feature as a part of the library?


Adding phpstan

Question
Answer

Bug fix?
yes

New feature?
no

BC breaks?
no

Deprecations?
no

Tests pass?
yes

License
MIT

Description
Fixing found bugs/errors with phpstan
TODO

[ ] Add tests
[ ] Add documentation
[ ] Updated Changelog.md

Codecov Report

Merging #211 into master will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##             master     #211   +/-   ##
=========================================
  Coverage     81.97%   81.97%
  Complexity      598      598
=========================================
  Files            33       33
  Lines          1531     1531
=========================================
  Hits           1255     1255
  Misses          276      276

Impacted Files
Coverage Δ
Complexity Δ

src/Encryption/EncryptedCachePool.php
79.41% <ø> (ø)
15 <0> (ø)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 39ad0b0...f36a12b. Read the comment docs.

This is just level 1, if this is merged i go for level 2 ;)


Would it work with RGB input and depth from mono depth estimator (proxy depth)?

Hi, thanks for open source this brilliant work! I have some rgb images but I don't have lidar to get real depth. Is it possible for me to utilize some mono depth estimator (eg. Depth Anything v2 ) to estimate depth for the rgb images ? And therefore do the SLAM with your methods? Additionally, I don't have camera poses either. But maybe I could use colmap or some SFM meseasures to get the poses. Were these possible for doing slam with your methods. Thanks in advance!

Hey there, thanks for your interest in our work.

Yes, you can try using the depth maps from an external model. However, we didn't test it in that scenario. Just be careful with how you load the depth maps in the data loader (usually our method expects depth in meters which is not always true in off-the-shelf depth estimation models)
We use camera poses only for evaluation purposes. You don't really need them to run the algorithm. The easy solution might be just to set them as np.eye(4) in the dataloader if you don't have them.

Feel free to re-open if you have any further questions!


Basic Getstart not working. Getting: window is not defined

Steps To Reproduce
I did the standard setup. https://docs.evidence.dev/getting-started/install-evidence
I tried both with and without dbt.
Environment

Node version (node -v): v21.5.0
npm version (npm -v): 10.2.4
OS: macOS Sonoma 14.2.1 (23C71)
Browser: chrome, safari
Database: duckdb

Expected Behavior
Expected to load the app in my browser
Actual Behaviour
Error:
Internal server error: window is not defined
      at detect (/Users/nehiljain/code/future-dynamics/future_dynamics_transformations/reports/node_modules/echarts/dist/echarts.js:123:54)
      at /Users/nehiljain/code/future-dynamics/future_dynamics_transformations/reports/node_modules/echarts/dist/echarts.js:97:9
      at /Users/nehiljain/code/future-dynamics/future_dynamics_transformations/reports/node_modules/echarts/dist/echarts.js:22:68
      at Object.<anonymous> (/Users/nehiljain/code/future-dynamics/future_dynamics_transformations/reports/node_modules/echarts/dist/echarts.js:25:2)
      at Module._compile (node:internal/modules/cjs/loader:1375:14)
      at Module._extensions..js (node:internal/modules/cjs/loader:1434:10)
      at Module.load (node:internal/modules/cjs/loader:1206:32)
      at Module._load (node:internal/modules/cjs/loader:1022:12)
      at cjsLoader (node:internal/modules/esm/translators:358:17)
      at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:307:7) (x5)

Describe what happened. Error messages and screenshots are helpful.

Hi @nehiljain! This is caused by your NodeJS version - Evidence requires version 18 or 20. Let me know if you need any help getting one of those versions set up

That worked. Thanks @hughess


New Feature: Litter Hopper

LitterRobot has added a new feature to the LR4, the litter hopper.  It would be excellent to add this as a feature in pylitterbot to then extend that to Home Assistant.  The app does not display the litter hopper information until you physically click into the Litter Robot section and the hopper itself.
I'm hoping to contribute and add this feature, but I am unsure of how to use the non-public API to see if this information is available.  Due to its availability on the app, I am assuming it is available in the API.  I will need to spend some time discovering how this works, or if you have any shortcuts available (e.g. a way to list endpoints) or some useful documentation around accessing and reading non-public graphql that would be really helpful.

On my iPad, I've had success with Proxyman. On Android I've had to use a mitm proxy to find the endpoints the app is hitting. I see a couple of fields in the existing LR4 endpoint for hopperStatus with values like enabled, disabled, empty, but guessing when you click in there is more information than that.

I tried to set up the proxy with my android phone (via my PC).  It grabs the traffic but I can't actually see any of the requests fully, and it just seems to have a single endpoint that loads all of the data.  I'm not seeing any of the direct API requests.  I think it's having issues with the cert, which I set up following the instructions.  I'll have to try either emulating it on my Windows PC, or come up with another idea, or at worst use some sort of proxy intercept on my phone.
Tell me this is going to be the one time I really wish I was in the mac ecosystem...

I tried to set up the proxy with my android phone (via my PC). It grabs the traffic but I can't actually see any of the requests fully, and it just seems to have a single endpoint that loads all of the data. I'm not seeing any of the direct API requests. I think it's having issues with the cert, which I set up following the instructions. I'll have to try either emulating it on my Windows PC, or come up with another idea, or at worst use some sort of proxy intercept on my phone.
Tell me this is going to be the one time I really wish I was in the mac ecosystem...
They explicitly state that this is harder with android.

If you can share the full endpoint, I can check if I'm able to see a few things.

I only get so far as to see the api.onesignal.com and api.exponea.com in the list.  But, it gives me an internal error.  According to the troubleshooting, I can't actually get that information on Android because I do not own the application.

That might mean this is a nonstarter unless I can get my hands on an apple device.

You'll probably be looking for an iothings.site url as that is what most of the other endpoints use.

Yeah, you're right.  I was able to at least see that URL with HTTP Toolkit, but there's still the android device issue.

I don't think there's a way for me to emulate this app.
On the bright side, my best friend has an iPad she's not using and has agreed to lend it to me, so I can hopefully move forward next week.
Thanks for your help on this :)

@malodie When I was doing some work on this to add pet profiles/weights I futzed around with a few options but ultimately settled on the following as it was easiest:

Install Android Studio
Create an android emulator with an Android Open Source Project (AOSP) version of android on the emulated device. This is important as if you chose a non-AOSP version you will not have root access to the device, which means you won't be able to install root certificates to intercept SSL.
Install the root certificates of your chose proxy software. I used MITMProxy before with wireshark, but HTTP Toolkit is much more user friendly. Use the android with ADB connection method of connection, as scanning a QR code with an emulated device is a headache. AOSP android builds do not have the play store, so you will have to download the HTTP Toolkit APK from elsewhere. I used APK Pure (https://apkpure.com/http-toolkit/tech.httptoolkit.android.v1). You should see in the app both "User Trust Enabled" and "System Trust Enabled"
Install the whisker app. (https://apkpure.com/whisker/com.whisker.android)

Had a quick poke and can confirm the method above works for the whisker app.
Below are endpoints, requests and responses for:

enabling the hopper
disabling the hopper
getting the litter dispense activities
general status across the websocket - seems to have added 'hopperStatus' and 'isHopperRemoved'. Appears to be sent by the client app but I didn't see a response.

Hope this helps. I don't actually have a hopper so can't really do much more unfortunately.
Endpoint: POST https://lr4.iothings.site/graphql
Request body:
{
  "operationName": null,
  "variables": {
    "serial": "<REDACTED>",
    "command": "disableHopper",
    "commandSource": "app"
  },
  "query": "mutation sendLitterRobot4Command($serial: String!, $command: String!, $value: String, $commandSource: String) {\n  __typename\n  sendLitterRobot4Command(input: {serial: $serial, command: $command, value: $value, commandSource: $commandSource})\n}"
}

Response body:
{
  "data": {
    "__typename": "Mutation",
    "sendLitterRobot4Command": "command \"disableHopper (0x020C0000)\" sent"
  }
}

Endpoint: POST https://lr4.iothings.site/graphql
Request body:
{
  "operationName": null,
  "variables": {
    "serial": "<REDACTED>",
    "command": "enableHopper",
    "commandSource": "app"
  },
  "query": "mutation sendLitterRobot4Command($serial: String!, $command: String!, $value: String, $commandSource: String) {\n  __typename\n  sendLitterRobot4Command(input: {serial: $serial, command: $command, value: $value, commandSource: $commandSource})\n}"
}

Response body:
{
  "data": {
    "__typename": "Mutation",
    "sendLitterRobot4Command": "command \"enableHopper (0x020C0001)\" sent"
  }
}

Endpoint: POST https://lr4.iothings.site/graphql
Request body:
{
  "variables": {
    "serial": "<REDACTED>",
    "consumer": "app",
    "limit": 10,
    "activityTypes": [
      "litterHopperDispensed"
    ]
  },
  "query": "    query GetLR4($serial: String!, $consumer: String, $startTimestamp: String, $endTimestamp: String, $limit: Int, $activityTypes: [String]) {\n      getLitterRobot4Activity(serial: $serial, consumer: $consumer, startTimestamp: $startTimestamp, endTimestamp: $endTimestamp, limit: $limit, activityTypes: $activityTypes) {\n        value\n        timestamp\n        measure\n        actionValue\n      }\n    }\n  "
}

Response body:
{
  "data": {
    "getLitterRobot4Activity": []
  }
}

Also got this over the websocket wss://lr4.iothings.site/graphql/realtime?header=<REDACTED - JWT Token>&payload=e30%3D
{
  "id": "<REDACTED - uuid v4 id string>",
  "type": "start",
  "payload": {
    "data": "{\"variables\":{\"userId\":\"<REDACTED - integer>\"},\"query\":\"    subscription GetLR4($userId: String!) {\\n      litterRobot4StateSubscriptionByUser(userId: $userId) {\\n      robots {\\n        name\\n        serial\\n        unitId\\n        unitPowerType\\n        unitPowerStatus\\n        robotStatus\\n        unitTimezone\\n        unitPowerStatus\\n        isOnboarded\\n        setupDateTime\\n        cleanCycleWaitTime\\n        isKeypadLockout\\n        nightLightBrightness\\n        nightLightMode\\n        litterLevel\\n        DFILevelPercent\\n        globeMotorFaultStatus\\n        catWeight\\n        isBonnetRemoved\\n        isDFIFull\\n        wifiRssi\\n        isOnline\\n        espFirmware\\n        picFirmwareVersion\\n        laserBoardFirmwareVersion\\n        isFirmwareUpdateTriggered\\n        sleepStatus\\n        catDetect\\n        robotCycleState\\n        robotCycleStatus\\n        isLaserDirty\\n        panelBrightnessHigh\\n        smartWeightEnabled\\n        surfaceType\\n        hopperStatus\\n        scoopsSavedCount\\n        isHopperRemoved\\n        litterLevelPercentage\\n        litterLevelState\\n        weekdaySleepModeEnabled {\\n            Sunday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Monday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Tuesday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Wednesday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Thursday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Friday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n            Saturday {\\n                sleepTime\\n                wakeTime\\n                isEnabled\\n            }\\n        }\\n        }\\n      }\\n    }\\n  \"}",
    "extensions": {
      "authorization": {
        "Accept": "application/json, text/javascript",
        "Content-Encoding": "amz-1.0",
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": "Bearer <REDACTED - JWT token>",
        "Host": "lr4.iothings.site"
      }
    }
  }
}

Thanks for those @jrhe. I saw the hopperStatus and isHopperRemoved fields before, but wasn't sure what would come back in hopperStatus. Initially I thought there might be a different endpoint to get more details about the hopper accessory, but looking at the information here and on Whisker's website, I don't think there is much more info about the hopper than these couple of fields.

I think the API just provides those two vars and then allows you to query dispensing history (litterHopperDispensed activity type).
hopperStatus should be something like full/running low/empty based on the screenshots I have seen.
I think there is a distinction between the hopper being enabled, and hopper being removed. When I tried to enable the hopper without actually having one installed I got a "LitterHopper Error: Motor fault di... - There's an issue with the LitterHopper's motor connection. [...]".
The hopper itself seems to just have a single barrel jack, that presumably provides power, with no additional sensors. I think any data provided is calculated based on the resistance of the motor (missing, spinning, spinning freely/empty), the LR's litter level sensors, and how many times the hopper has run since being refilled.
Hopefully @malodie can check out the exact values!

Unfortunately I still don't have an iPad to check this :(

You should be able to install the android emulator as above if you want to do it without an ipad

I tried to do it with android and I can't capture the traffic. Sorry. If I get an ipad I will but I have no idea when that will be as I own no apple products.


Formatting Introduction for GlassBR?

In order to use the newly created introF function that automatically generates part of the introductory paragraph, I was wondering if it matters that "This section explains the purpose the document is designed to fulfil, the scope of the requirements and the organization of the document: what the document is based on and intended to portray." is changed to "This section explains the purpose of this document, the scope of the system, the organization of the document and the characteristics of the intended readers.", that too as part of a second paragraph (as opposed to the single paragraph that followed the introduction in the CaseStudies version of GlassBR)?
The 2 sentences are quite similar in content, however they are worded differently...
(Commit 7fa8845)

Hello Maryyam.  I have no problem with changing the text of any of the sections to have it match with your standardization efforts.  However, I think your proposal introduces information that is not in your SRS.  Your proposed text mentions the characteristics of the intended readers, but you do not have this section in your document.
My advice is to add the section "Characteristics of Intended Reader".  You can follow Section 2.3 of the SWHS example (https://github.com/smiths/swhs/blob/master/SRS/PCM_SRS.pdf).  If you add this section, I have no problem with your proposed standardization of the introductory text.

Thank you @smiths. After a deeper look into other examples, it actually turns out SSP and GamePhysiscs also do not have the "Characteristics of Intended Reader"

Yes, SSP and GamePhysics should add the "Characteristics of Intended Reader" section as well.  Can you please coordinate with @njericha and @hmadej ?  We can create an issue if necessary.
The characteristics section is about the people reading the document.  The user section is about the people using the software.  They aren't necessarily the same people.


[A11y] Second link is inaccessible in RichText

Steps to reproduce

Create a RichText widget with multiple TextSpan or WidgetSpan elements, each representing a clickable link.
Wrap each link in a Semantics widget to ensure accessibility support.
Add GestureDetector to handle onTap events for each link.
Test using a screen reader (TalkBack on Android or VoiceOver on iOS).

Expected results
Whole content should be readable in a single tap and each link should be clickable.
Actual results
The screen reader only selects or announces the first link consistently.
The second link is often skipped or merged with surrounding text, making it inaccessible.
Code sample
class RichTextWithLinks extends StatelessWidget {
  const RichTextWithLinks({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Rich Text Links'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: MergeSemantics(
            child: RichText(
              text: TextSpan(
                style: const TextStyle(color: Colors.black, fontSize: 16.0),
                children: [
                  const TextSpan(
                    text:
                        'Android is a mobile operating system based on a modified version of the ',
                  ),
                  WidgetSpan(
                    alignment: PlaceholderAlignment.baseline,
                    baseline: TextBaseline.alphabetic,
                    child: Semantics(
                      label: 'Linux kernel',
                      button: true,
                      //link: true,
                      child: GestureDetector(
                        onTap: () {
                          print("Link 1 tapped!");
                        },
                        child: const Text(
                          'Linux kernel',
                          style: TextStyle(
                            color: Colors.blue,
                            decoration: TextDecoration.underline,
                          ),
                        ),
                      ),
                    ),
                  ),
                  const TextSpan(
                    text: ' and other ',
                  ),
                  WidgetSpan(
                    alignment: PlaceholderAlignment.baseline,
                    baseline: TextBaseline.alphabetic,
                    child: Semantics(
                      label: 'open-source',
                      button: true,
                      //link: true,
                      child: GestureDetector(
                        onTap: () {
                          print(" link 2 tapped!");
                        },
                        child: const Text(
                          'open-source',
                          style: TextStyle(
                            color: Colors.blue,
                            decoration: TextDecoration.underline,
                          ),
                        ),
                      ),
                    ),
                  ),
                  const TextSpan(
                    text: ' software.',
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration
[Upload media here]

Logs
Logs
[Paste your logs here]

Flutter Doctor output
Doctor output
[Paste your output here]

Hi @Nishorecolan
Can you share the reason why you use MergeSemantics here? If I remove MergeSemantics, links are clickable independently as expected.

My rich text content should be read in a single accessibility tap and links should be clickable independently.

In case of using MergeSemantics, I see that URLs (WidgetSpan) are read last, after the reader has read all the TextSpan(s), and it is similar to another issue at https://github.com/flutter/flutter/issues/51804.
Reproduced this issue on Flutter stable 3.24.5 and master 3.27.0-1.0.pre.552. The issue appears on both Android TalkBack and iOS VoiceOver readers.

@huycozy, Do we have any workaround to fix this?

I don't see a workaround now. Please wait for insight from accessibility team.

Okay. Thanks for your update.

I don't think there is an easy way to do as of now, you may be able to get around by converting everything into widget span since there isn't a way to concatenate text from widget span in between textspan.


Review RC: tests not passing

The tests are failing on my laptop with Python 3.8, on the branch new_release_0_4_0. This is weird as I see that the GH action succeeded... I'll investigate this and maybe even close this issue very soon
FAILED harmonize_wq/tests/test_harmonize_WQP.py::test_harmonize_pH - AssertionError: assert nan == 'None'
FAILED harmonize_wq/tests/test_harmonize_WQP.py::test_harmonize_nitrogen - AttributeError: 'float' object has no attribute 'upper'
FAILED harmonize_wq/tests/test_harmonize_WQP.py::test_print_report - ImportError: matplotlib is required for plotting when the default backend "matplotlib" is selected.
ERROR harmonize_wq/tests/test_harmonize_WQP.py::test_harmonize_all - AttributeError: 'float' object has no attribute 'upper'
ERROR harmonize_wq/tests/test_harmonize_WQP.py::test_conductivity_to_PSU - AttributeError: 'float' object has no attribute 'upper'
ERROR harmonize_wq/tests/test_harmonize_WQP.py::test_datetime - AttributeError: 'float' object has no attribute 'upper'
ERROR harmonize_wq/tests/test_harmonize_WQP.py::test_split_col - AttributeError: 'float' object has no attribute 'upper'
ERROR harmonize_wq/tests/test_harmonize_WQP.py::test_split_table - AttributeError: 'float' object has no attribute 'upper'

Ok I did  pip install -r requirements.txt and now the tests pass.
See #63 that could sort this issue. Closing as complete.


Restore counts to the MSOA case data

The data files reporting the number of confirmed cases of COVID-19 by Middle-layer Super Output Area are unhelpful or misleading.

Case counts of less than 3 are shown as "0-2" in the Excel file rather than 0, 1, or 2. This is unhelpful because it is unclear whether zero, 1 or 2 cases of coronavirus were reported.
Case counts of less than 3 are shown as "-99" in the CSV file rather than 0, 1, or 2. This is misleading because "-99" is typically used to refer to a missing value.

Please can the case counts be disaggregated in the Excel file and numeric values be restored in the CSV file.

Thank you for getting in touch.
I'm afraid this is not a development issue and relates to our data and contents team. I will forward your message to them, but I recommend that you get in touch via the email provided on the website. The emails are shared with the relevant team and they will have the opportunity to respond if necessary.
FYI @statsgeekclare / @PHEgeorginaanderson

Thanks @xenatisch. I submitted an issue because I was sure of a response. Also, the dashboard describes the format of the MSOA case data so it is relevant to the developers.

Not sure what you mean by "the dashboard describes the format of the MSOA case data".
The development team provides the means to publish the data. On occasion, we also provide services to facilitate the conversion of formats and automated QAs.
The values between 0-2 (inclusive) in MSOA and LSOA data have been removed to protect people's privacy and ensure that the data is not personally identifiable. Missing values were being interpreted by users as either missing or zero - both assumptions are incorrect. The -99 is therefore used so inform users that the specific value is neither zero nor missing, but excluded.
Neither of the aforementioned decisions were made by the development team. We receive the Excel and CSV files on a daily basis, run it through a filter to ensure no unauthorised disclosure is made by accident, then use them to generate XML and JSON files and schedule them for publication at the designated time, which is currently 4pm. If the file is corrupt or if it doesn't get published when it should, then it is a problem for us to address. Anything else falls outside of our domain.
Hope this helps.

Thanks. As per the screenshot, I only meant that the dashboard contains text that describes the format of the data available to download.
I'm not convinced that it is appropriate to use "-99" to indicate excluded data and values between 0 and 2. How about adopting:

'-' to indicate the case count is less than 3
0 to indicate zero cases
NA to indicate that data are not available

I'm afraid it is not our decision to alter the presentation or the methodology. Whether or not "-99" is appropriate is, again, not a decision made by one individual. You are nonetheless more than welcome to express your opinion via the email provided on the website. I assure you that all suggestions and requests are reviewed and recorded by the relevant team and influence the decisions that make everyday.

[...] the dashboard contains text that describes the format of the data available to download.

Again, the content of the website is dynamic. It is created by a different team - the content team. We as the development team are not responsible for they way in which they are presented. The content have their own repository as do the metadata. Please note that the "issues" section of these repositories are not monitored and all relevant issues and queries are expected to be raised and handled via email.
We as the development team are responsible for linking the content and the metadata to platform that we have created and provide technical advice where required. We are also responsible for the daily deployment of data, the API, the SDK services, and the infrastructure.

I'm not convinced that it is appropriate to use "-99" to indicate excluded data and values between 0 and 2. How about adopting:

'-' to indicate the case count is less than 3
0 to indicate zero cases
NA to indicate that data are not available

As I mentioned in my previous message, all values that are smaller than 3 are indicated as "-99". The fact that zero is included in the filter is intentional and is to prevent the disclosure of identities. You might think that zero means that there is no case, so there is no identity to protect. Whilst that is correct, that subsequent change from zero to an alternative value - e.g. a "-" as you proposed - would indicate that at least one diagnosis has been confirmed, and that would risk revealing the identity of individuals when the dataset is presented at a granular level.
Hope this helps.

If the case counts between 0 and 2 are suppressed for reasons of privacy then that's obviously fine. I still think the use of "-99" is confusing and inconsistent with the "0-2" used in the Excel spreadsheet. Perhaps, "-", "x" or even "0-2" would be better but let's leave that to the data and contents team.

If the case counts between 0 and 2 are suppressed for reasons of privacy then that's obviously fine.

That is indeed the one and only reason.

I still think the use of "-99" is confusing and inconsistent with the "0-2" used in the Excel spreadsheet. Perhaps, "-", "x" or even "0-2" would be better but let's leave that to the data and contents team.

I think the point of using a numeric value is that it is both explicit and can be filtered out pretty quickly and easily. Non-numeric values - which include all of your recommended substitutes - require processes that are computationally more expensive, so it would be more difficult and time consuming to filter them out in both Excel and the programming languages that people use to analyse the data. In all likelihood, using non-numeric values for the amount of data we present in MSOA / LSOA datasets might actually crash Excel on older machines.
We used to leave them empty and that was fine, but then people were confusing them with zero / missing, which wasn't the case.

I really appreciate that you've considered both spreadsheet users and programmers in the choice of value to indicate suppressed data. The rationale is persuasive although the solution, perhaps inevitably, is still an accommodation. Thanks for your time.


Request: Add command line arguments to the "Open in Terminal" context menu option

Description of the new feature/enhancement

I would like to use the option "Open in Terminal" in the context menu (accessed by right click) with some additional command line arguments.
Specifically, I would like to use this option adding the argument -w 0, which opens the terminal as a new tab in the same opened current  window instance, instead of creating a new window.
But this feature could be used for any choice of command line arguments (profile, title, etc).
Proposed technical implementation details (optional)

This could be set on the settings of the software, as an additional field in the settings.json, nothing very complicated for the user point of view.

Thanks! Unless I'm misreading or misunderstanding your request, you can get that behavior with this guy in Settings:

Whether we should break it down by origin (ala "when opened via wt, attach; when opened via taskbar, new window; when opened via taskbar flyout menu, attach")