Mod operator fails to compile with int8 and int32 inputs with GPU target

Using the above mentioned configuration produces a compile error, when compiling kernels.
Other types (int16, int64, float, double) are passing.
I've created a branch where I've extended the ref tests with this. That can be used to reproduce the issue.
Related issue: https://github.com/migraphx-benchmark/AMDMIGraphX/issues/107
The actual error:
/tmp/comgr-483e18/input/main.cpp:13:83: error: cannot convert between vector values of different size ('safe_vec<type, size>' (aka 'vec<conditional_t<is_same<double, bool>{}, uint8_t, double>, 2U>') and 'int __attribute__((ext_vector_type(2)))' (vector of 2 'int' values))
auto z2 = migraphx::convert<int32_t>(migraphx::fmod((migraphx::remainder(x0, x1)) + x1, x1));
                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~
/tmp/comgr-483e18/input/main.cpp:24:53: note: in instantiation of function template specialization 'migraphx::inner_pointwise<int __attribute__((ext_vector_type(2))), int __attribute__((ext_vector_type(2)))>' requested here
    pointwise(idx, vectorize<2, 0>())(MIGRAPHX_LIFT(inner_pointwise), private_p0,private_p1,private_p2);
                                                    ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:66: note: while substituting deduced template arguments into function template 'operator()' [with private_lifts_xs:auto = <int & __attribute__((ext_vector_type(2))), int & __attribute__((ext_vector_type(2)))>]
                      [&](auto i) { out[i] = implicit_conversion(f(xs[i]...)); });
                                                                 ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:160:64: note: in instantiation of function template specialization 'migraphx::pointwise_tensor(index, (lambda at /tmp/comgr-483e18/input/main.cpp:24:39), migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>)::(anonymous class)::operator()<unsigned int>' requested here
    static constexpr auto invoke_loop(F f, I i, D) -> decltype(f(i))
                                                               ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:200:25: note: while substituting deduced template arguments into function template 'invoke_loop' [with F = (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), I = index_int, D = integral_constant<decltype(0), 0>]
                        invoke_loop(f, start, _c<0>);
                        ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:228:9: note: in instantiation of function template specialization 'migraphx::index::for_stride<false, (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>, migraphx::integral_constant<unsigned int, 1024>>' requested here
        for_stride<false>(global, n, nglobal(), f);
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:39:9: note: in instantiation of function template specialization 'migraphx::index::global_stride<(lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>>' requested here
    idx.global_stride(out.get_shape().elements(),
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:48:36: note: in instantiation of function template specialization 'migraphx::pointwise_tensor<(lambda at /tmp/comgr-483e18/input/main.cpp:24:39), migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>>' requested here
        t(ps...)([&](auto... xs) { pointwise_tensor(idx, f, xs...); });
                                   ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:66: error: no matching function for call to object of type '(lambda at /tmp/comgr-483e18/input/main.cpp:24:39)'
                      [&](auto i) { out[i] = implicit_conversion(f(xs[i]...)); });
                                                                 ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:160:64: note: in instantiation of function template specialization 'migraphx::pointwise_tensor(index, (lambda at /tmp/comgr-483e18/input/main.cpp:24:39), migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>)::(anonymous class)::operator()<unsigned int>' requested here
    static constexpr auto invoke_loop(F f, I i, D) -> decltype(f(i))
                                                               ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:200:25: note: while substituting deduced template arguments into function template 'invoke_loop' [with F = (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), I = index_int, D = integral_constant<decltype(0), 0>]
                        invoke_loop(f, start, _c<0>);
                        ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:228:9: note: in instantiation of function template specialization 'migraphx::index::for_stride<false, (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>, migraphx::integral_constant<unsigned int, 1024>>' requested here
        for_stride<false>(global, n, nglobal(), f);
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:39:9: note: in instantiation of function template specialization 'migraphx::index::global_stride<(lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>>' requested here
    idx.global_stride(out.get_shape().elements(),
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:48:36: note: in instantiation of function template specialization 'migraphx::pointwise_tensor<(lambda at /tmp/comgr-483e18/input/main.cpp:24:39), migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>>' requested here
        t(ps...)([&](auto... xs) { pointwise_tensor(idx, f, xs...); });
                                   ^
/tmp/comgr-483e18/input/main.cpp:24:39: note: candidate template ignored: substitution failure [with private_lifts_xs:auto = <int & __attribute__((ext_vector_type(2))), int & __attribute__((ext_vector_type(2)))>]
    pointwise(idx, vectorize<2, 0>())(MIGRAPHX_LIFT(inner_pointwise), private_p0,private_p1,private_p2);
                                      ^
/tmp/comgr-483e18/include/migraphx/kernels/functional.hpp:35:5: note: expanded from macro 'MIGRAPHX_LIFT'
    [](auto&&... private_lifts_xs) MIGRAPHX_RETURNS( \
    ^
In file included from /tmp/comgr-483e18/input/main.cpp:2:
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:200:25: error: no matching function for call to 'invoke_loop'
                        invoke_loop(f, start, _c<0>);
                        ^~~~~~~~~~~
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:228:9: note: in instantiation of function template specialization 'migraphx::index::for_stride<false, (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>, migraphx::integral_constant<unsigned int, 1024>>' requested here
        for_stride<false>(global, n, nglobal(), f);
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:39:9: note: in instantiation of function template specialization 'migraphx::index::global_stride<(lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), migraphx::integral_constant<unsigned int, 3>>' requested here
    idx.global_stride(out.get_shape().elements(),
        ^
/tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:48:36: note: in instantiation of function template specialization 'migraphx::pointwise_tensor<(lambda at /tmp/comgr-483e18/input/main.cpp:24:39), migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>, migraphx::tensor_view<int __attribute__((ext_vector_type(2))), migraphx::shape<migraphx::integral_const_array<unsigned int, 3>, migraphx::integral_const_array<unsigned int, 1>>>>' requested here
        t(ps...)([&](auto... xs) { pointwise_tensor(idx, f, xs...); });
                                   ^
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:154:27: note: candidate template ignored: substitution failure [with F = (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), I = index_int, D = integral_constant<decltype(0), 0>]: no matching function for call to object of type '(lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23)'
    static constexpr auto invoke_loop(F f, I i, D d) -> decltype(f(i, d))
                          ^                                      ~
/tmp/comgr-483e18/include/migraphx/kernels/index.hpp:160:27: note: candidate template ignored: substitution failure [with F = (lambda at /tmp/comgr-483e18/include/migraphx/kernels/pointwise.hpp:40:23), I = index_int, D = integral_constant<decltype(0), 0>]
    static constexpr auto invoke_loop(F f, I i, D) -> decltype(f(i))
                          ^
3 errors generated when compiling for gfx90a.

terminate called after throwing an instance of 'migraphx::version_2_7_0::exception'
  what():  /code/AMDMIGraphX/src/targets/gpu/compile_hip.cpp:170: compile: hiprtc: HIPRTC_ERROR_COMPILATION: Compilation failed.
Aborted (core dumped)

For me it seems like the issue is with this line:
https://github.com/ROCm/AMDMIGraphX/blob/40118191909f98070b5863d0b58a8bfbfc7c9418/src/include/migraphx/op/mod.hpp#L41
According to std::remainder the output of remainder function for int8 and int32:
A) Additional overloads are provided for all integer types, which are treated as double.
After that the remainder computation the next step is a pointwise fuse for the add (+) after remainder which fails to resolve the vec<double> + vec<int8> addition.

Tested other types as weel, the faling ones seems like int8, uint8 and int32


Pipe logging

📖 Documentation
How fp-ts people "debug" pipe? I just created this helper. Is it ok or not? Thank you.
/**
 * A little helper for pipe logging.
 * `pipe(x, foo, logPipe, bla)`
 */
export const logPipe = <T>(arg: T): T => {
  // eslint-disable-next-line no-console
  console.log(arg);
  return arg;
};

For example, something is failing in sequenceT and I need to know what.

In v1 there was a Trace module with helpers for this. I'm not sure why it was removed, possibly to reduce the API surface. Anyway, it's simple enough, have a look and copy it to your project, if you need it: https://github.com/gcanti/fp-ts/blob/1.x/src/Trace.ts
It was inspired by https://pursuit.purescript.org/packages/purescript-debug/3.0.0/docs/Debug.Trace

Thank you. Btw, why Trace is better than logPipe?

After reading https://github.com/gcanti/logging-ts/issues/20, I found a nice logging solution for TaskEither
you can use it in a pipe with just `log(() => "log value")
await pipe(
    TE.Do,
    TE.bind("input", () => pipe(validateInput(event), TE.fromEither)),
    log(() => "checking conditions"),
    TE.bind("pre", () => sequenceT(TE.ApplicativePar)(
      verifyAuth(event),
      verifyTokensAvailable(event, 5e9)
    )),
    log(() => "starting job"),
)()

this is the log function:
import * as C from "fp-ts/lib/Console.js"
import * as L from "logging-ts/lib/IO.js"
import * as TE from "fp-ts/lib/TaskEither.js"

export const withLogger =
  (logger: L.LoggerIO<string>) =>
  <A>(message: (a: A) => string): (<E>(ma: TE.TaskEither<E, A>) => TE.TaskEither<E, A>) =>
    TE.chainFirst((a) => TE.fromIO(logger(message(a))))

export let log = withLogger(C.info)


Single compliance score for paragraphs

Add the single compliance scoring system above the list.  This will likely also need an about definition to clarify what they mean

Primary Non-Compliance
Secondary Non-Compliance
Operational Non-Compliance
Primary Compliance
Secondary Compliance
Operational Compliance (Full compliance)
Not yet due (other)

added in 4f33da7


Sending a message to group chat

Right now pymessenger supports sending message to one user only. There should be feature by which we can message a group chat

This isn't possible by the Facebook Messenger platform. A bot can only reply to a one-on-one conversation directly to a single user.

@Cretezy  we did a slight modification in code and now its working

Wow, this must be new. Can you link me to supporting documentation, I've never heard of this!
Make a PR if you want too

@Cretezy I will send a pull request, please check the code and approve it if you feel its okay.

@Cretezy  I forked and created a pull request can you please check and approve it

Hi there, I am having the same problem. I am using pymessager version <IP_ADDRESS>, the last one available in pypi, and since the PR was not merged there isn't this part that @UmangThapliyal changed in code.
I see that exists other versions of pymessager such as pymessager2 and pymessager3. Does anybody recommend something?
Tks


cpuset support for RGW service

The OSD already supports cpuset to be used for containerized deployments
through the use of the ceph_osd_docker_cpuset_cpus variable. This adds similar
support to the RGW service for containerized deployments by setting a new
variable named ceph_rgw_docker_cpuset_cpus. Like the OSD, there are times where
using distinct cores has advantages over using the CFS in kernel scheduler.
ceph_rgw_docker_cpuset_cpus accepts a comma delimited set of CPU ids
Signed-off-by: Kyle Bader<EMAIL_ADDRESS>

You could have amend your commit in the previous PR instead of creating a new one :)

@mmgaggle any update?
thanks!

Closing in favor of #3882


🚀 Matching Cards Section

Is your feature request related to a problem ? Please describe. ✍

I would like to improve the ui of the other two sections so that it matches with the previous section.
Please assign it to me @Harshil-Jani . I would like to work upon this issue.
Describe briefly how you would implement this enhancement.
Some steps to implement this enhancement-
1. Step 1
2. Step 2
3. Step 3

Additional context or screenshots
Additional context
Are you contributing for a program?
GSSoC2023
Code of Conduct

[X] I have read and agree to the Contributing Guidelines of this project.

Go Ahead @akanksha984

hii @Harshil-Jani  please assign this to me

I have already worked on it I will soon update with pr

@anmode , is this open .
If yes, then please assign me this issue.

@Pragati-3003 i have already written its code @anmode . I am just waiting for the previous pr so that I can proceed with it


feat: create brand model

Kindly review this PR with others too.
The relationship between Brand and Product is 1 to Many
A brand (Apple) can have many products while a product belongs to a Brand (if am not mistaken).
But the relationship between Brand and Category seems like Many to Many
A category (Smartphones) can have many brands (apple, Tecno, etc) and
a brand (Apple) can have many categories (Electronics, Smartphones, Watches, etc)
Since Many to Many requires another table. The third-party table should be the Product table.
How do we go about that?
Just check the PR if it solves the issue and if otherwise, let me know to fix it. Thanks.

Kindly review this PR with others too.
The relationship between Brand and Product is 1 to Many A brand (Apple) can have many products while a product belongs to a Brand (if am not mistaken).
But the relationship between Brand and Category seems like Many to Many A category (Smartphones) can have many brands (apple, Tecno, etc) and a brand (Apple) can have many categories (Electronics, Smartphones, Watches, etc)
Since Many to Many requires another table. The third-party table should be the Product table.
How do we go about that?
Just check the PR if it solves the issue and if otherwise, let me know to fix it. Thanks.

We don't need brand and product category relationship, just brand and product is fine.


simulation driven by core and figure out how to slowdown verify for simulate.

ethereumjs-wallet and ethereumjs-util need to use browserify to use in browser. But our project is based on vite. So I need to browserify ethereumjs-wallet to a bundle then use it as a project asset js file instead of use it by npm.

If I use bundle file browserified, I can use w3.swarm.js in browser, but the test case failed because of the global.crypto is undefined in node.js env.
If I use npm package, I cannot open it in browser because of global is undefined.
I cann't use dynamic import either, because of the function is call in a Class Constructor function, cannot use async. 😿

Use vite alias for browser to link to the bundle file, and node.js will use the npm package.

Stop using eth-wallet to create private key and account. Change to use other algorithm.

done. Now the simualtion can run and send msgs between swarms based on libp2p, then in the view layer, each node shows the same simulation. Next stage is more features about simulating local and in the network, this will be the feature issue.


Error using panos_certificate_import on panorama

Describe the bug
I'm using "panos_certificate_import" on several firewalls, but when I use it on a panorama device I get an error.
Expected behavior
Same behavior on Panorama and Palo Alto devices.
Current behavior
Error message when Terraform try to import the certificate:
Error: Import of panorama.domain.com failed. Failed to extract certificate
The certificate is uploaded, but there is no key on the uploaded certificate.
I get no error when I upload the same certificate and key file manually through the panorama web interface.
Possible solution
Maybe panorama needs some extra parameters I am missing in my TF file...?
Steps to reproduce
resource "panos_certificate_import" "cert-panorama" {
    provider = panos.panorama
    name = "panorama.domain.com"
    pem {
        certificate = file("panorama.domain.com.cer")
        private_key = file("panorama.domain.com.key")
        passphrase = "secret"
    }
}

  # panos_certificate_import.cert-panorama will be created
  + resource "panos_certificate_import" "cert-panorama" {
      + algorithm          = (known after apply)
      + ca                 = (known after apply)
      + cert_format        = (known after apply)
      + cert_passphrase    = (sensitive value)
      + cert_public_key    = (known after apply)
      + common_name        = (known after apply)
      + csr                = (known after apply)
      + expiry_epoch       = (known after apply)
      + id                 = (known after apply)
      + issuer             = (known after apply)
      + issuer_hash        = (known after apply)
      + name               = "panorama.domain.com"
      + not_valid_after    = (known after apply)
      + not_valid_before   = (known after apply)
      + private_key        = (sensitive value)
      + private_key_on_hsm = (known after apply)
      + public_key         = (known after apply)
      + revoke_date_epoch  = (known after apply)
      + status             = (known after apply)
      + subject            = (known after apply)
      + subject_hash       = (known after apply)
      + vsys               = "shared"

      + pem {
          + certificate          = <<-EOT
                -----BEGIN CERTIFICATE-----
                ...
                -----END CERTIFICATE-----
            EOT
          + certificate_filename = "cert.pem"
          + passphrase           = (sensitive value)
          + private_key          = (sensitive value)
          + private_key_filename = "key.pem"
        }
    }

╷
│ Error: Import of panorama.domain.com failed. Failed to extract certificate
│
│   with panos_certificate_import.cert-panorama,
│   on panos-cert-upload.tf line 1, in resource "panos_certificate_import" "cert-panorama":
│    1: resource "panos_certificate_import" "cert-panorama" {
│
╵
Error: Process completed with exit code 1.

Context
I want to upload certificate to the panorama device to use on a ssl profile for the management interface.
Your Environment

Version used: 1.10.0
Environment name and version (e.g. Chrome 59, node.js 5.4, python 3.7.3):
Operating System and version (desktop or mobile): Ubuntu 20.04, Terraform 1.0.10
Link to your project:

I ran into the same issue using acme_certificate, it'll upload manually via GUI but attempting to import it - even from an Azure Keyvault - fails.
I thought it had something to do with being byte64 encoded though

Did anyone find any workaround to this issue? It fails with Letsencrypt certs too.

My workaround is to manually update the certificate.

@jon-larsen Thanks. I will try to consume restapi provider and push that cert via native Panorama API.

Got this fixed for PEM keys in our lab, there was a typo in the pango/dev/certificate/pano.go file that referenced the public certificate instead of the private key (fw.go was correct, hence why it worked on firewalls).  I have a static version published on registry.terraform.io for DEV purposes (unmaintained) until a new version includes the fix.

Fixed by 1.11.1


Record elevation / altitude in speedsurfing sessions, including the FIT and GPX exports

Past experiences from other GPS devices has shown that elevation / altitude data be useful when verifying speed results.
The COROS watches do not currently record elevation / altitude.
Please record altitude data during speedsurfing and windsurfing activities and include it in the FIT + GPX exports.
Notes:

The GPX 1.0 and 1.1 schema definitions both include <ele> - http://www.topografix.com/GPX/1/0/gpx.xsd
The FIT file should contain altitude (uint16) and enhanced_altitude (uint32), both containing the same value.

Further details about FIT content can be found in my notes, available via this link.

Note: I've written a document detailing all of the issues in GPX files generated by COROS:
https://logiqx.github.io/gps-wizard/gpx/issues/coros.html


Hosted module docs are blank

It appears that the module documentation is rendering as blank on RTD:

(Firefox, similar in Safari)
If you click to view the source the content appears to be there, and it also looks fine here on GitHub. All of the package's other pages seem fine. Unfortunately I'm not familiar with deploying to RTD so I'm not sure how to help diagnose further at the moment.

Thanks, i was in the middle of updating cog back in January, and forgot about it.  Now the page is correct.


Cleaning the percent optimization.

Minor tweak.

It is a minor change that should be uncontroversial. Merging.


set $modal-content-color (null value) to --#{$prefix}body-color  in _variables.scss

Description
Identified that $modal-content-color was set to null, which could lead to display issues in React Bootstrap Modals. Changed the value to --#{$prefix}body-color to ensure consistency and correct color application in modal components.
Motivation & Context
The modal text color was defaulting to black inside modals when using the data-bs-theme="dark" attribute.(React Bootstrap Modal Component) This was due to the bs-modal-color variable not being set, originally left as null likely for flexibility before the introduction of dark theme support.
Updated bs-modal-color to ensure appropriate text color contrasts when the dark theme is applied, avoiding visibility issues and improving user experience with dark modals. This change is essential as the use of data-bs-theme="dark" indicates a requirement for dark mode compatibility, which should logically include readable text colors.
Before

After

Type of changes

[x] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Refactoring (non-breaking change)
[ ] Breaking change (fix or feature that would change existing functionality)

Checklist

[x] I have read the contributing guidelines
[x] My code follows the code style of the project (using npm run lint)
[ ] My change introduces changes to the documentation
[ ] I have updated the documentation accordingly
[ ] I have added tests to cover my changes
[x] All new and existing tests passed

Live previews

https://deploy-preview-{your_pr_number}--twbs-bootstrap.netlify.app/

Related issues
https://github.com/react-bootstrap/react-bootstrap/issues/6796

(+1, I'm suffering from the same issue 😢 waiting this PR!)


[Hold #22884] Web -  Request Money Action Item changes to $0.00 when requesting money from an account that is not on Expensify.

If you haven’t already, check out our contributing guidelines for onboarding and email<EMAIL_ADDRESS>to request to join our Slack channel!

Action Performed:

Go to + --> New chat --> Enter email address which is not registered (e.g<EMAIL_ADDRESS>Chat opens --> Click on + --> Request Money --> Enter amount --> Request money
Click on Requested money report action item.
It redirects to concierge.
Find the relevant chat from the LHN and open it
The requested money action item changes to $0.00 and paid even though the original requested amount and currency was different.
Click on the requested money action item.
404 appears.

Expected Result:

The requested money action item amount should not change to $0.00.
Clicking on requested money action item with $0.00 should not go to 404.

Actual Result:

The requested money action item amount changes to $0.00.
Clicking on requested money action item with $0.00 goes to 404 screen

Workaround:
Unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[ ] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[x] MacOS / Chrome / Safari
[ ] MacOS / Desktop

Version Number: <IP_ADDRESS>
Reproducible in staging?: y
Reproducible in production?: y
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos: Any additional supporting documentation
https://github.com/Expensify/App/assets/93399543/ba317498-0acb-4ac8-a35f-fc65a387dd07
https://github.com/Expensify/App/assets/93399543/e5030293-99f4-4143-9efa-3f68f1e5692e
Expensify/Expensify Issue URL:
Issue reported by: @Talha345
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1689517400786329
View all open jobs on GitHub

This is mostly a back end issue.

Proposal
Please re-state the problem that we are trying to solve in this issue.
When we request money from someone that is not on expensify the action item shows 0
What is the root cause of that problem?
The backend return an error during RequestMoney call

This error happens because we pass a debtorEmail that is undefined here:
https://github.com/Expensify/App/blob/40f354b36905d97513ccc52add7859cfd9c6aa9e/src/libs/actions/IOU.js#L413
The reason the debtor email is undefined is because here:
https://github.com/Expensify/App/blob/40f354b36905d97513ccc52add7859cfd9c6aa9e/src/libs/actions/IOU.js#L308
We set the payerEmail with the login of the participant, when the participant is not on expensify he doesn't have a login.
What changes do you think we should make in order to solve the problem?
When the participant doesn't have a login, we should set payerEmail with participant.text. The code looks like this:
const payerEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(participant.login || participant.text);
What alternative solutions did you explore? (Optional)

I suspect this is the same core issue as https://github.com/Expensify/App/issues/20910. I'm going to file it in the Wave3 project for now and stick a hold on it, as this isn't a priority can be be something we tackle in cleanup. cc @mountiny @luacmartins

@JmillsExpensify I think this issue has also the same =root cause: https://github.com/Expensify/App/issues/22884

Still holding. If the root cause is the same, I'll close with no bounty.

Same same

I think @ShogunFire solution makes sense. Does this work fine in the chat even if you sign out and sign back in?

@mountiny I have a PR for this but we are not sure if this is the right way, can you check it out ? https://github.com/Expensify/App/pull/24348

looking at the PR

@mountiny I don't think participant.text will make sense because it will be not an email if the user changes the display name.

@ShogunFire Could we additionally disable the request money option on the chat if there is no email? or the participant.text is not valid email. When going through the FAB then we always have the email there so we should be fine

I think we can, and for split in groups I would disable it if any participant doesn't have the login or text or I would just not put this particular b participant in the selected participant ? Otherwise I proposed a sketchy solution that works in the PR

Yeah lets avoid sketchy solution, I think its better to be actually more strict now that I see all these workaround which are just landmines for future. Could we instead hide the Reqeust Money option from the chat + menu when there are no login details (for unknown user) and basically you can keep requesting money from them using the blobal create as you have to type in the email but you cannot do it easily within the chat

Interesting, I think I agree with you. Basically, in the Global Create flow you can literally request from anyone, including creating an account for them. However, in order to request money from someone in a DM, they need to be known.

@ShogunFire @dukenv0307 What do you think, could you add this to your PR?

@mountiny yes I made the change already

This is a wave2 issue. Removing from the wave3 project.

Now that #22884 is closed, I'm going to remove the hold. What are the next steps?

I believe this should be solved by updating the money request flows to accept accountIDs instead of emails. @aldo-expensify has been working on that AFAIK

I believe this should be solved by updating the money request flows to accept accountIDs instead of emails. @aldo-expensify has been working on that AFAIK

@mountiny In case, this is fixed by the backend change, would I be compensated for the bug report?

yes @Talha345 but once fixed

@aldo-expensify mind commenting on this one as soon as you're back?

Any thoughts on the comment above?

Sorry, I completely missed your comments since I didn't go through emails when I got back 👀. I'll put it in my notes to take a look today.

At the time I worked on it, I enabled to make money requests using the accountID, which you have for accounts that are "unknown" to you (assuming that you are online). I tried to test this now and the button is disabled:

It looks like we are disabling sending the money request?

This props.selectedParticipants is empty when the other account is "unknown", and it contains the other account when it is known.
I don't know if this change is a bug or is it expected behaviour

I think this change comes from this PR https://github.com/Expensify/App/pull/30342, 4 weeks ago.
@puneetlath do you know if we are intentionally not allowing to request money from unknown accounts now?

Hmm yeah I'm also unsure. Will wait for Puneet's confirmation.

Sounds like we may be missing a test if QA missed this.

Agreed. I still think we should fix this one when time permits.

Where should this fit? #vip-split-p2p?

Whoops, missed that last reply. I think your suggestion of #vip-split makes sense.

This one never got picked up, though I will re-float.

Still not a priority.

Still waiting for an internal volunteer

This still hasn't been picked up internally, which indicates to me it's just not a priority right now. I'm going to close and this can be re-opened when we have someone internal that is willing to take it on.


FAI-517: Counterfactual: Add support for "partial" goals in Trusty UI

See https://issues.redhat.com/browse/FAI-517
Many thanks for submitting your Pull Request :heart:!
Please make sure that your PR meets the following requirements:

[x] You have read the contributors guide
[x] Pull Request title is properly formatted: KOGITO-XYZ Subject
[x] Pull Request title contains the target branch if not targeting master: [0.9.x] KOGITO-XYZ Subject
[x] Pull Request contains link to the JIRA issue
[x] Pull Request contains link to any dependent or related Pull Request
[x] Pull Request contains description of the issue
[x] Pull Request does not include fixes for issues other than the main ticket

How to retest this PR or trigger a specific build:

Pull Request
Please add comment: Jenkins retest this

Quarkus LTS checks
Please add comment: Jenkins run LTS

Native checks
Please add comment: Jenkins run native

@kelvah This now includes the fix for missing "Search Domains" we chatted about on Friday.
As far as I'm concerned this PR is "good to merge".


Classpath breaks on Mac OS X

The symptom is an error like this when running ts-java.sh on Mac:
Error: ENOENT: no such file or directory, open '/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home
/jre/lib/rt.jar'

This is an issue with processing the output of find-java-home on Mac OS X.
find-java-home returns a value for JAVA_HOME with a line break at the end. When you do the path.join on it, returns an invalid path, like this:
/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home\n/jre/lib/rt.jar
I fixed it by putting this in initJava in ts-java-main.js:
javaHome = javaHome.replace(/^\s+|\s+$/g, '');
 var rtJarPath = path.join(javaHome, 'jre', 'lib', 'rt.jar');

That's strange, since all development of ts-java has been done on Mac OS X. But I've moved onto other projects and haven't done any real development on ts-java for seven months now. I wondered if any recent change in find-java-home might be the cause, but I see that @jsdevel hasn't made any changes to that project recently.
How are you defining JAVA_HOME? I've done all development using /usr/libexec/java_home to define it like this (in my .bash_profile):
export JAVA_HOME=$(/usr/libexec/java_home)

I don't define it at all. IIRC find-java-home finds it by using which to get the java binary, then walking the directory structure.

Ok, I bet that means you're relying on a different code path in find-java-home, and that code path has a bug. Do you want to log an issue with that project? And as a different workaround for ts-java, I suggest you define JAVA_HOME as I showed above.

if in doubt, you can always modify find-java-home with console.logs to see what path it's using.


Is it possible to capitalize text in a field, no matter the content?

Hi Demian,
I want to capitalize all the letters in a field (Single Line of text) no matter what text they actually put in this field. But I can't seem to figure out how to do this. I tried using the string functions, triggered as a real-time workflow on changes in that field, but I am unsure how to add all the required input lines. I am also unsure if I can capitalize the text in the same field or if I need to create a new field where I can store my capitalized 'conversion'.
Thanks for a great tool
/Thor

No rewsponse ? :-)

I have few issues dalayed, cause last week was Directions EMEA event in Madrid. how to response soon, because I'm going to answer all of them.

Hi ThorTankred, I'm trying to understand what are you saying...
"String functions" actions returns an output parameter called "CapitalizedText" with the string capitalized like this:

Example: if "Capitalize All Words" =True:
"this is the text to capitalize" ----> "This Is The Text To Capitalize"

Example: if "Capitalize All Words" =False:
"this is the text to capitalize" ----> "This is the text to capitalize"

then you can execute an update on the entity to change the field value..
This is what you need?

Hi Demian,
As I said on Extreme CRM in Lisbon, I really appreciate your tool.
And I know this is pro bono, so no pressure!
I'm sorry for not being specific enough.
What I meant was, all letters in the string.
They use this field for initials and hence they want to ensure its capitalized:
Example:
"Demian" ---> "DEMIAN"

Hi ThorTankred,
check my new version <IP_ADDRESS>, I just included 2 new output parameters, with Uppercase and Lowercase Texts.
hope it helps ;)
thanks!

Hi Demian,
Awesome - I Think :-)
In which field, in the form, should I put the Output parameter?

It's an output parameter of the Workflow, so you can add a step to update the entity, and set the value in any field.
I just addedd a new image at the end, to show you how to do it: https://github.com/demianrasko/Dynamics-365-Workflow-Tools/blob/master/docs/String Functions.md
hope it helps.
Demian

Hi Demian,
That made a big difference - It was easy to locate the output parameter, thanks!
Its failing though, due to my input fields being incorrect.
Honestly I am unsure what to put there, I 'just' need to capitalize the whole text (Single Line text with 150 characters).
Cheers
Thor

Thanks Thor!
I found a small bug. you can make it work if you change the parameter "Substring: Length" to zero.
Otherwise update the solution to version <IP_ADDRESS> with the bug fixed.
regards!

Hooray,
It works perfectly!


[Decompiler] Support 64-bit to 128-bit "promotion"

There's some weird code in display that makes the decompiler unhappy. In this example, t0 is a pointer to a gif-tag (128-bit type).
    ld t1, L56(fp)
    pcpyld t1, r0, t1
    sd t1, 0(t0)
    ld t1, L54(fp)
    sd t1, 8(t0)

Here's my guess for what this is:
First, they generated a 128-bit constant that happened to have the upper 64-bits 0. (Likely type gif-tag)
    ld t1, L56(fp)
    pcpyld t1, r0, t1

then, they store it in a uint64 (a uint64 field of gs-gif-tag)
sd t1, 0(t0)

and then the stuff after that is just setting a normal 64-bit constant value.
I think the right way to support this is to add support 128-bit constant loads (always broken up into ld's and combined with pcypld). This is going to take a while because it means we'll also need to support 128-bit bitfield decompilation, which is annoying because C++ doesn't have a 128-bit integer type...

I am pretty sure I understand this now.  GOAL can really only handle a 128-bit bitfield as two 64-bitfields combined with a pcpyld.  It will always emit code to generate the lower 64 bits, then code for the upper 64 bits, then a pcpyld to combine them.

The code originally had (new 'static 'gif-tag ..), a 128-bit type.
The GOAL compiler can only load up to 64-bits relative to fp. It's not clear why this limitation exists, but loading a 128-bit value is always split into two ld's and a pcpyld.
In cases where the upper 64-bits are zero, the second load is omitted and they do a pcpyld x, r0, y.
The 128-bit value is used to set a 64-bit field, doing a normal 64-bit set.

This case happens again and again for all static gif-tag stuff.
Another interesting example happens in close-gif-packet:
    ld v1, L52(fp)            ;; load the constant part of the lower 64-bit field
    lw a2, 0(a0)              ;; one variable part
    dsll32 a2, a2, 28         ;; set that part
    or v1, v1, a2
    dsll32 a1, a1, 31         ;; other variable part (already in a1)
    dsrl32 a1, a1, 16         ;;
    or v1, v1, a1             ;;
    pcpyld v1, r0, v1 ;; upper 64-bits is zero

Depending on the situation, we will need a different strategy to fix this.  There are some quick hacks that could make it work, but we may need better 128-bit support later.
Here's my current idea:

Implement pcpyld as an operator in the decompiler.
The result of v1 after the above example would be (pcpyld 0 (logior ...))
The code that converts "some expression" to a bitfield could look for a (pcpyld 0 x) and just look at x if the bitfield is 64 bit. This is a weird situation (code mismatched bitfield types - we should at least generate a warning and only do this if the upper 64 bits can be proven to be zero) but it happens to work in this case.  For other cases we can use type casts on the pointer-to-bitfield.

I implemented the idea in the previous comment and it worked when the upper 64 bits are 0.  Full support for 128-bit bitfields is tracked in https://github.com/water111/jak-project/issues/438


Feat/ Private input (fixed variant)

This is a working but unsound variant of #622.

Works using a fixed table length.
Unsound because there are no constraints on the witnessed addresses.

Example test command:
MOCK_PROVING=1 cargo run --package ceno_zkvm --bin e2e --release -- --max-steps=1000 examples/fibonacci.elf --platform=sp1

TODO:

Fix the variant with DynamicAddr

Currently facing error record evaluate != expected_evals.

Or switch to fixed addresses.
Discuss improvements in #573

👍 will review #622 and see whats going on for the integration test error

#622 was solved with https://github.com/scroll-tech/ceno/pull/622/commits/b0aab66c31af2aa55ce8fc83f3427ffac9505e43


Can't use resize with one null parameter

Hello,
First of all : thanks for your great work :).
i'm using the latest stable version (3.2.1 - get through composer). Following the doc, I've tried to use "resize()" with one null parameter (to avoid using "fitTo(Width|Height)").
But it result in the following error (with some echo details "TEST") :
Warning: imagecreatetruecolor() [function.imagecreatetruecolor0]: Invalid image dimensions in /X/vendor/claviska/simpleimage/src/claviska/SimpleImage.php on line 791
[TEST - $width:324 - $height: - $this:claviska\SimpleImage Object
(
[image:claviska\SimpleImage:private] => Resource id #8
[mimeType:claviska\SimpleImage:private] => image/jpeg
[exif:claviska\SimpleImage:private] => Array
(
[FileName] => film-reflet-argent-80.jpeg
[FileDateTime] =><PHONE_NUMBER>
[FileSize] => 90315
[FileType] => 2
[MimeType] => image/jpeg
[SectionsFound] => IFD0, APP12
[COMPUTED] => Array
(
[html] => width="837" height="478"
[Height] => 478
[Width] => 837
[IsColor] => 1
[ByteOrderMotorola] => 0
)
[Company] => Ducky
[Info] =>
)
)
]
Did I do it wrong ? Or is that an issue ?
Thanks for your help.
Regards,

OK, my bad, seems that 3.2.2 is required, and it isn't live at the moment :/...

Yep, those changes were in master awaiting feedback. Seems fine, so I just pushed 3.3.0.

Hello Corry,
OK, thanks, work like a charm :D.


Prerequisites

[X] I have searched all issues/PRs to ensure it has not already been reported or fixed.

Criteria

[X] Reasonably well-known and widely used (e.g. if it's a GitHub project, it should have at least 100 stars and/or 50 forks)
[X] English interface (or at least English documentation)
[X] Latest stable version
[X] Full version (i.e. not a trial version)
[X] Fairly standard install (e.g. uses a version-specific download URL, no elaborate pre/post install scripts)

Name
gossip
Description
Desktop client for nostr protocol
Homepage
https://github.com/mikedilger/gossip
Download Link(s)
https://github.com/mikedilger/gossip/releases/download/v0.8.0/gossip.0.8.0.msi
Some Indication of Popularity/Repute
~500 stars on github

I have a manifest for this already.


WL-4726: We want to use the default Sakai tutorial

This is a grab of the latest Sakai 11.x tutorial properties file

Shouldn't en_GB be going as part of this?

Yup great spot


[Security issues] XSS

Is there an existing issue for this?

[X] I have searched the existing issues

Have you updated FilePond and its plugins?

[X] I have updated FilePond and its plugins

Describe the bug
File: https://unpkg.com/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.js
The application is vulnerable to DOM-based cross-site scripting. Data is read from window.location.href and passed to the 'innerHTML' property of a DOM element. DOM-based vulnerabilities arise when a client-side script reads data from a controllable part of the DOM (for example, the URL) and processes this data in an unsafe way. DOM-based cross-site scripting arises when a script writes controllable data into the HTML document in an unsafe way. An attacker may be able to use the vulnerability to construct a URL that, if visited by another application user, will cause JavaScript code supplied by the attacker to execute within the user's browser in the context of that user's session with the application. The attacker-supplied code can perform a wide variety of actions, such as stealing the victim's session token or login credentials, performing arbitrary actions on the victim's behalf, and logging their keystrokes.
Reproduction
var url = window.location.href.replace(window.location.hash, '');
mask = mask.replace(/url(#/g, 'url(' + url + '#');
root.element.innerHTML = mask.replace(/UID/g, SVGMaskUniqueId);
Environment
...

How do you suggest we fix this?

fixed in 4.6.11


Storages: small refine of MergedTask.

What problem does this PR solve?
Issue Number: ref #6834
What is changed and how it works?
Check List
Tests

[ ] Unit test
[ ] Integration test
[ ] Manual test (add detailed scripts or steps below)
[ ] No code

Side effects

[ ] Performance regression: Consumes more CPU
[ ] Performance regression: Consumes more Memory
[ ] Breaking backward compatibility

Documentation

[ ] Affects user behaviors
[ ] Contains syntax changes
[ ] Contains variable changes
[ ] Contains experimental features
[ ] Changes MySQL compatibility

Release note

None

/run-all-tests


dashboard atoms component

Nice update @konnofuente , your atoms components are very nice.
Thanks for the enhancement.


[iOS] 1.0 crash report (iPhone 5)

Note: afaik 1.0.1 has been submitted, but here is the report anyway:
Incident Identifier: AC008870-47B8-4642-8E66-08142BA6530B
CrashReporter Key:   35ec4b69578ef6358481df07f0b6bf160b68216e
Hardware Model:      iPhone5,2
Process:             FTP [552]
Path:                /private/var/mobile/Containers/Bundle/Application/7CB640AB-213C-4992-A6A5-697E8E0FFCAE/FTP.app/FTP
Identifier:          com.kcufthepopulation.app
Version:             5 (1.0)
Code Type:           ARM (Native)
Parent Process:      launchd [1]

Date/Time:           2016-04-07 17:51:21.21 +1000
Launch Time:         2016-04-07 17:51:16.16 +1000
OS Version:          iOS 9.2 (13C75)
Report Version:      105

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000000e7ffdefe
Triggered by Thread:  0

Filtered syslog:
None found

Global Trace Buffer (reverse chronological seconds):
0.709052     CFNetwork                 	0x0000000023607e45 TCP Conn 0x14d811b0 SSL Handshake DONE
0.709580     CFNetwork                 	0x0000000023607e45 TCP Conn 0x14d8f1d0 SSL Handshake DONE
1.588505     CFNetwork                 	0x0000000023607d7f TCP Conn 0x14d8f1d0 starting SSL negotiation
1.588850     CFNetwork                 	0x00000000236871a5 TCP Conn 0x14d8f1d0 complete. fd: 6, err: 0
1.590763     CFNetwork                 	0x00000000236882a7 TCP Conn 0x14d8f1d0 event 1. err: 0
1.600118     CFNetwork                 	0x0000000023607d7f TCP Conn 0x14d811b0 starting SSL negotiation
1.600694     CFNetwork                 	0x00000000236871a5 TCP Conn 0x14d811b0 complete. fd: 5, err: 0
1.601063     CFNetwork                 	0x00000000236882a7 TCP Conn 0x14d811b0 event 1. err: 0
2.280331     CFNetwork                 	0x0000000023688325 TCP Conn 0x14d8f1d0 started
2.380634     CFNetwork                 	0x0000000023688325 TCP Conn 0x14d811b0 started
2.477780     CFNetwork                 	0x00000000236c8957 Creating default cookie storage with default identifier
2.477780     CFNetwork                 	0x00000000236c8933 Faulting in CFHTTPCookieStorage singleton
2.477780     CFNetwork                 	0x000000002370aaa7 Faulting in NSHTTPCookieStorage singleton

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   FTP                           	0x0003f240 0x21000 + 123456
1   FTP                           	0x0003f300 0x21000 + 123648
2   UIKit                         	0x272a5d78 -[UIViewController loadViewIfRequired] + 1028
3   UIKit                         	0x272a5958 -[UIViewController view] + 24
4   UIKit                         	0x27b1d948 -[_UIFullscreenPresentationController _setPresentedViewController:] + 72
5   UIKit                         	0x275efa2c -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 112
6   UIKit                         	0x276132ce -[UIViewController _presentViewController:withAnimationController:completion:] + 3670
7   UIKit                         	0x27615924 __62-[UIViewController presentViewController:animated:completion:]_block_invoke + 336
8   UIKit                         	0x27615b90 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 416
9   UIKit                         	0x2739ef1e -[UIViewController presentViewController:animated:completion:] + 142
10  UIKit                         	0x27618e26 -[UIViewController _showViewController:withAction:sender:] + 234
11  UIKit                         	0x278bf778 __66-[UIStoryboardShowSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 128
12  UIKit                         	0x279982d4 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 432
13  UIKit                         	0x27998102 -[UIStoryboardSegueTemplate _perform:] + 66
14  UIKit                         	0x2760af94 -[UIViewController performSegueWithIdentifier:sender:] + 80
15  FTP                           	0x00041fb4 0x21000 + 135092
16  Alamofire                     	0x001afc64 0x16d000 + 273508
17  Alamofire                     	0x001b275c 0x16d000 + 284508
18  libdispatch.dylib             	0x22cabdd6 _dispatch_call_block_and_release + 10
19  libdispatch.dylib             	0x22cabdc2 _dispatch_client_callout + 22
20  libdispatch.dylib             	0x22cb0670 _dispatch_main_queue_callback_4CF + 1532
21  CoreFoundation                	0x230d0fc4 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
22  CoreFoundation                	0x230cf4be __CFRunLoopRun + 1590
23  CoreFoundation                	0x23021bb8 CFRunLoopRunSpecific + 516
24  CoreFoundation                	0x230219ac CFRunLoopRunInMode + 108
25  GraphicsServices              	0x2429baf8 GSEventRunModal + 160
26  UIKit                         	0x2730dfb4 UIApplicationMain + 144
27  FTP                           	0x0003ce48 0x21000 + 114248
28  libdyld.dylib                 	0x22cd4872 start + 2

Not too sure if this is a server issue or Alamofire issue, but I'm just posting here so you know there is an issue. Also, this is just after app startup, so I see some stuff going on (glitchy FTP logo), but app crashes about 1.5s after.

This bug has been resolved in version 1.0.1, There was a problem with the buttons linking back to the storyboard on the ClosedVoewController due to the fact that the store was closed at the time of when you were trying to open the app, version 1.0.1 has been submitted to the App Store and should be in your hands mommenterly, sorry for the inconvenience.

Changlog for 1.0.1

Closed Store Bug Fixed
Small Design Enhancements
Screen Optimization bug fixed for the iPhone 4s!"


Make log level a configurable parameter

High level

Expose a configurable setting so admins can change the log level for Kafka
Decide what our default level will be
Ideally this will not require a restart of the Kafka process (so that a restart does not clear the bad state)

Kafka logging details from http://kafka.apache.org/coding-guide.html
There are six levels of logging TRACE, DEBUG, INFO, WARN, ERROR, and FATAL, they should be used as follows.

INFO is the level you should assume the software will be run in. INFO messages are things which are not bad but which the user will definitely want to know about every time they occur.
TRACE and DEBUG are both things you turn on when something is wrong and you want to figure out what is going on. DEBUG should not be so fine grained that it will seriously effect the performance of the server. TRACE can be anything. Both DEBUG and TRACE statements should be wrapped in an if(logger.isDebugEnabled) check to avoid pasting together big strings all the time.
WARN and ERROR indicate something that is bad. Use WARN if you aren't totally sure it is bad, and ERROR if you are.
Use FATAL only right before calling System.exit().

Closing stale Issue.


Text.Format() not producing valid Azure Table Storage query

I have a problem constructing an Azure Table Storage query using Text.Format() and SliceStart?
Assume I start with a table that has keys like this ...
PartitionKey    RowKey
AAA             2015-07-30 03:00:00
AAA             2015-07-31 03:00:00
AAA             2015-07-31 04:00:00
AAA             2015-08-01 03:00:00
AAA             2015-08-01 04:00:00
BBB             2015-07-30 03:00:00

If I use this query ...
"azureTableSourceQuery": "PartitionKey eq 'AAA' and RowKey ge '2015-07-31 00:00:00' and RowKey le '2015-07-31 23:59:59'"

I correctly get back these two entities ...
AAA             2015-07-31 03:00:00
AAA             2015-07-31 04:00:00

If I use Text.Format() and SliceStart but not actually interject the SliceStart ...
"azureTableSourceQuery": "$$Text.Format('PartitionKey eq \\'AAA\\' and RowKey ge \\'2015-07-31 00:00:00\\' and RowKey le \\'2015-07-31 23:59:59\\'', SliceStart)"

... that also works.
However, as soon as I start using Text.Format() and attempt to interject the SliceStart into the query string ...
"azureTableSourceQuery": "$$Text.Format('PartitionKey eq \\'AAA\\' and RowKey ge \\'{0:yyyy-MM-dd} 00:00:00\\' and RowKey le \\'{0:yyyy-MM-dd} 23:59:59\\'', SliceStart)"

... it filters all of the entities and I get no entities back. I've tried a dozen variations but nothing seems to work. I think there is a bug in your parser. If not, what am I missing?

btw - One of the problems with my debugging the query is that I can't see what your parser is producing out of the Text.Fomat() function. It would be helpful if you save and show the final query that is being used with the database somewhere in the UI.

Looks like SliceStart is the culprit.
I setup these test entities ...
PartitionKey    RowKey     NewKey    Value
CCC             0001       2014      C1
CCC             0002       2015      C2
CCC             0003       2015      C3
CCC             0004       2014      C4

Then, ran this query against it (note that my NewKey maps into the PartitionKey column in the sink dataset ...
"azureTableSourceQuery": "$$Text.Format('PartitionKey eq \\'CCC\\' and NewKey eq \\'{0:yyyy}\\'', SliceStart)"

Here's what I got back ...
PartitionKey    RowKey     Value
2014             0001       C1

This explains why my earlier attempt to query data by date is failing. SliceStart is using some date in the year 2014 for that query string. The slice should be (and shows in the UI correctly) as 2015.

Rubber duck to the rescue. :baby_chick:  I figured it out: The SliceStart was coming from the pipeline start time. You might want to consider a way to do a "Run" that uses a user-supplied slice start time. As it stands, one has to remember to check the pipeline start (and end) times to make sure they fall within your query for testing purposes.


Fix pycountry import issues during configuration

I'm getting an import issue inside pycountry due to previous partial import in config_flow.py. This fixes it.

Why this change should fix the issue? There is an explanation or it's just a coincidence?

Sorry I'm late responding here. This change means you don't end up with "pycountry" as part of your namespace.
I haven't removed the integration to try again but I was getting import issues inside pycountry due to "partial import".

Thanks for this suggestion, at the end I implemented your fix directly in the code because I made some other changes that created conflict with this PR.
Sorry for not merging directly before.


docs: Write endpoint documentation

Under wiki, perhaps?

Should've read the wiki smh https://github.com/spacebin-for-astronauts/spacebin/wiki/API-Endpoints

It's quite unfinished?

It's quite unfinished?

Well yeah but so are the endpoints themselves.

It's quite unfinished?

Well yeah, but so are the endpoints themselves.

This is my point :suspect:

This should definitely be an Alpha issue, though :feelsgood:


Consider Axum instead of Actix-Web

When I started with this project, actix-web was by far the most powerful and versitile web framework for rust. But it's been a couple of years, and things have changed. The tokio team have created Axum, which has a couple of advantages over Actix-Web:

Actively maintained by the creators
More readable documentation / easier to understand abstractions
Seems to support sub-domains (useful for multi-tenant stuff #288)

But there's also a couple of things I need to find out, before switching:

[ ] File upload / download. Multipart support is there.
[ ] Static files such as the js assets, preferably compiles into the binary. Seems to be there. Can also be done with tower servedir
[ ] Websockets. Yep, with

I am fond of Poem - it can do everything the above.


[BUG] InputFileBlock walks through broadcasts and does not deal with mismatched broadcasts

Describe the bug
I am not sure if this is one thing or two things.
https://github.com/NVIDIA/spark-rapids/issues/3333#issuecomment-909301837
caused InputFileBlock to be implemented as a rule to prevent a serious bug. But as a part of debugging https://github.com/NVIDIA/spark-rapids/issues/9469 I saw that we would walk through a BroadcastExchangeExec and put all of it on the CPU even if it could be on the GPU.
import org.apache.spark.sql.tests.datagen._
import org.apache.spark.sql.types._

val dbgen = new DBGen()
dbgen.setDefaultValueRange(TimestampType, BigDataGenConsts.minTimestampForOrc, BigDataGenConsts.maxTimestampForOrc)
dbgen.addTable("download_100b", StructType(Seq(StructField("partition", StructType(Seq(StructField("local_create_dt", TimestampType), StructField("client_name", StringType)))), StructField("record_count", LongType))),<PHONE_NUMBER>L)
dbgen("download_100b")("record_count").setValueRange(1L, 100000000L)
dbgen.writeParquet(spark, "/data/tmp/test_data", 24, true)

spark.read.parquet("/data/tmp/test_data/download_100b").createOrReplaceTempView("download_100b")

val QUERY = """WITH parts      AS (SELECT partition.local_create_dt, partition.client_name, record_count
                               FROM download_100b
                               ORDER BY hash(partition.local_create_dt, partition.client_name)
                               LIMIT 57)
                               SELECT download_100b.*,
                                      input_file_name()                                                   AS _file_name,
                                      row_number() OVER (PARTITION BY input_file_name() ORDER BY hash(*)) AS rno
                               FROM download_100b
                                      INNER JOIN parts
                                      ON parts.local_create_dt = download_100b.partition.local_create_dt
                                        AND parts.client_name = download_100b.partition.client_name"""

spark.sql(QUERY).show(100, false)

So I decided to fix it.
diff --git a/sql-plugin/src/main/scala/com/nvidia/spark/rapids/InputFileBlockRule.scala b/sql-plugin/src/main/scala/com/nvidia/spark/rapids/InputFileBlockRule.scala
index 23f072d44..375c94828 100644
--- a/sql-plugin/src/main/scala/com/nvidia/spark/rapids/InputFileBlockRule.scala
+++ b/sql-plugin/src/main/scala/com/nvidia/spark/rapids/InputFileBlockRule.scala
@@ -19,7 +19,7 @@ import scala.collection.mutable.{ArrayBuffer, LinkedHashMap}

 import org.apache.spark.sql.execution.{FileSourceScanExec, LeafExecNode, SparkPlan}
 import org.apache.spark.sql.execution.datasources.v2.BatchScanExec
-import org.apache.spark.sql.execution.exchange.ShuffleExchangeExec
+import org.apache.spark.sql.execution.exchange.{BroadcastExchangeLike, ShuffleExchangeLike}

 /**
  * InputFileBlockRule is to prevent the SparkPlans
@@ -61,9 +61,11 @@ object InputFileBlockRule {
         ArrayBuffer[SparkPlanMeta[SparkPlan]]]): Unit = {

     plan.wrapped match {
-      case _: ShuffleExchangeExec => // Exchange will invalid the input_file_xxx
+      case _: ShuffleExchangeLike => // Shuffle Exchange will invalid the input_file_xxx
         key.map(p => resultOps.remove(p)) // Remove the chain from Map
         plan.childPlans.foreach(p => recursivelyResolve(p, None, resultOps))
+      case _: BroadcastExchangeLike =>
+        // noop: Don't go any further, the file info cannot come from a broadcast.
       case _: FileSourceScanExec | _: BatchScanExec =>
         if (plan.canThisBeReplaced) { // FileScan can be replaced
           key.map(p => resultOps.remove(p)) // Remove the chain from Map

But that caused another problem to happen.
java.lang.UnsupportedOperationException: GpuColumnarToRow does not implement doExecuteBroadcast
  at org.apache.spark.sql.errors.QueryExecutionErrors$.doExecuteBroadcastNotImplementedError(QueryExecutionErrors.scala:1755)
  at org.apache.spark.sql.execution.SparkPlan.doExecuteBroadcast(SparkPlan.scala:303)
  at org.apache.spark.sql.execution.InputAdapter.doExecuteBroadcast(WholeStageCodegenExec.scala:516)
  at org.apache.spark.sql.execution.SparkPlan.$anonfun$executeBroadcast$1(SparkPlan.scala:198)
  at org.apache.spark.sql.execution.SparkPlan.$anonfun$executeQuery$1(SparkPlan.scala:223)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:220)

This is because the rules we have in place for a join and a broadcast exchange do not run when/if the join is put back on the CPU as a part of the InputFileBlock rule.  If I disable the BroadcastHashJoin with spark.conf.set("spark.rapids.sql.exec.BroadcastHashJoinExec", false) then it works without errors. So we need a way to make sure that the proper rules run if we remove the BroadcastHashJoin from the GPU. The reason I didn't do it right away, was because I don't know all of the AQE situations that might happen to cause this too.  If the broadcast became a broadcast because of AQE I don't understand enough of that to make sure that it is doing what we want/expect.

Tracking fix here: https://github.com/NVIDIA/spark-rapids/issues/9469


feat: add jsx-a eslint rule

Overview
Added JSLint rule for  tag without an href.
What is it?

[x] Feature / enhancement
[ ] Bug
[ ] Docs / tests / types / typos

Description
An a tag with no href affects SEO score on Google's PageSpeed.
Checklist:

[x] My code follows the developer guidelines of this project
[x] I have performed a self-review of my own code
[ ] I have made corresponding changes to the documentation
[x] Added new tests to cover the fix / functionality

Will fix tests

Hey @kerbelp
Thanks a lot for this addition 🙏 great that you took the time to implement this 🙏
to fix the CI issue, you just need to run pnpm fmt. that should be sufficient. i leave this PR open to get @manucorporat have a look at it and confirm the need of this rule.
in my personal opinion there are already similar eslint plugins out covering this (eg https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) and therefor i am not 100% sure if we should add it as a qwik-specific one 👼  but i leave the decision open to the core team 😄
thanks once again and have a great day 😃

@zanettin thanks for your comment!
Nice, if there is a rule already, then there is no need to add this PR as well.
Thanks!

@kerbelp thanks for your answer. let's wait for a feedback of the core team. maybe there is a good reason to enforce it directly within the qwik rules 😃 thanks again for your submission 🙏


Fatal error browsing for DACP services \ {"code":-3008

Hi.. Happy new year to you and thx for developing on this project.
Hope I‘m not raising a duplicate to another issue, but encountered this tonight when trying to setup my apple tv 4gen for homebridge.
Was able to successfully pair the apple tv but then it always would end in error saying Apple TV is down.
Thx for looking into it!
[2018-1-3 00:47:08] [DACP]
[2018-1-3 00:49:08] [DACP] Starting DACP browser...
[2018-1-3 00:49:08] [DACP] Fatal error browsing for DACP services:
[2018-1-3 00:49:08] [DACP]
[2018-1-3 00:49:08] [DACP]   Error: {"code":-3008,"errno":-3008,"syscall":"getaddrinfo"}
[2018-1-3 00:49:08] [DACP]
[2018-1-3 00:49:08] [DACP] Restarting MDNS browser for DACP in 120 seconds

Just a me too. Error 3008 in a docker container with host networking.

I've updated homebridge-dacp to use the bonjour package instead of the previously used mdns package. Since I plan to release 0.8.0 next week I'm looking for early feedback if this also solves the docker issues you all have been seeing.
Could you please verify by:

uninstalling any previous version you have
installing the latest code from github: npm install -g github:grover/homebridge-dacp (You might need sudo)

and running it again? Feedback appreciated.

Hey thanks for the update. I installed from GitHub, and when start homebridge I get the same error, followed by a type error.
[2018-2-18 15:45:26] [DACP] Starting DACP browser...
[2018-2-18 15:45:26] Homebridge is running on port 51004.
[2018-2-18 15:45:26] [DACP] Fatal error browsing for DACP services:
[2018-2-18 15:45:26] [DACP]
[2018-2-18 15:45:26] [DACP]   Error: {"code":-3008,"errno":-3008,"syscall":"getaddrinfo"}
[2018-2-18 15:45:26] [DACP]
[2018-2-18 15:45:26] [DACP] Restarting MDNS browser for DACP in 120 seconds.
[2018-2-18 15:45:26] [DACP]
[2018-2-18 15:45:26] [DACP] The accessory Apple TV is down.
[2018-2-18 15:45:26] [DACP] Fatal error while talking to Apple TV:
[2018-2-18 15:45:26] [DACP]
[2018-2-18 15:45:26] [DACP]   Error: TypeError: Cannot read property 'host' of undefined
    at DacpClient._withConnection (/homebridge/node_modules/homebridge-dacp/src/dacp/DacpClient.js:205:67)
    at DacpClient.disconnect (/homebridge/node_modules/homebridge-dacp/src/dacp/DacpClient.js:48:23)
    at DacpAccessory.accessoryDown (/homebridge/node_modules/homebridge-dacp/src/DacpAccessory.js:165:22)
    at _accessories.forEach.accessory (/homebridge/node_modules/homebridge-dacp/src/index.js:116:17)
    at Array.forEach (<anonymous>)
    at DacpPlatform._onDacpBrowserError (/homebridge/node_modules/homebridge-dacp/src/index.js:115:23)
    at emitOne (events.js:116:13)
    at DacpBrowser.emit (events.js:211:7)
    at Browser._browser.on.error (/homebridge/node_modules/homebridge-dacp/src/dacp/DacpBrowser.js:37:12)
    at emitTwo (events.js:126:13)
    at Browser.emit (events.js:214:7)
    at on_resolver_done (/homebridge/node_modules/mdns/lib/browser.js:28:14)
    at next (/homebridge/node_modules/mdns/lib/browser.js:100:7)
    at /homebridge/node_modules/mdns/lib/resolver_sequence_tasks.js:160:11
    at getaddrinfo_complete (/homebridge/node_modules/mdns/lib/resolver_sequence_tasks.js:112:7)
    at GetAddrInfoReqWrap.oncomplete (/homebridge/node_modules/mdns/lib/resolver_sequence_tasks.js:120:9)
[2018-2-18 15:45:26] [DACP]
(node:2312) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'host' of undefined
(node:2312) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Also I think the 3008 error is coming from src/dacp/DacpBrowser.js, but the code still seems to reference mdns (unless the lib was changed somewhere higher up the chain haha).
    const ResolverSequence = [
      mdns.rst.DNSServiceResolve(),
      'DNSServiceGetAddrInfo' in mdns.dns_sd ? mdns.rst.DNSServiceGetAddrInfo() : mdns.rst.getaddrinfo({ families: [0] }),
      mdns.rst.makeAddressesUnique()
    ];

    this._browser = mdns.createBrowser(
      mdns.tcp(ServiceName),
      { resolverSequence: ResolverSequence });

You're still using the old version. Please use the latest code from github - see the instructions above. If needed, please uninstall the old version first using npm uninstall -g homebridge-dacp.

Thanks! I actually did do that, and have the same results.. I confirmed I have the latest version by confirming the new example and changelog entries are present in the installed version. Is there another branch?
The code I was referencing is not from my machine, its still live on GitHub https://github.com/grover/homebridge-dacp/blob/master/src/dacp/DacpBrowser.js
Sorry if I've missed something..

Turns out I missed to push the change. Please try again. Sorry.

Alright got the new version installed. Definitely using bonjour instead of the mdns package now, but sadly it looks like bonjour still makes a call to getaddrinfo.
[2018-2-18 16:29:13] [DACP] Starting DACP browser...
[2018-2-18 16:29:14] Homebridge is running on port 51004.
[2018-2-18 16:29:14] [DACP] The accessory Apple TV is announced.
[2018-2-18 16:29:14] [DACP] Attempting to reconnect to Apple TV in 0.1 seconds.
[2018-2-18 16:29:14] [DACP] Connecting to Apple TV (Living.local:3689)
[2018-2-18 16:29:14] [DACP] Creating status connection to Living.local:3689
[2018-2-18 16:29:15] [DACP] Fatal error while talking to Apple TV:
[2018-2-18 16:29:15] [DACP]
[2018-2-18 16:29:15] [DACP]   Error: { error:
   { Error: getaddrinfo ENOTFOUND living.local living.local:3689
    at errnoException (dns.js:50:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
     code: 'ENOTFOUND',
     errno: 'ENOTFOUND',
     syscall: 'getaddrinfo',
     hostname: 'living.local',
     host: 'living.local',
     port: '3689' },
  response: undefined,
  options:
   { encoding: null,
     url: URL {
        href: 'http://living.local:3689/login?pairing-guid=0xD726D61018D31EDF',
        origin: 'http://living.local:3689',
        protocol: 'http:',
        username: '',
        password: '',
        host: 'living.local:3689',
        hostname: 'living.local',
        port: '3689',
        pathname: '/login',
        search: '?pairing-guid=0xD726D61018D31EDF',
        searchParams: URLSearchParams { 'pairing-guid' => '0xD726D61018D31EDF' },
        hash: '' },
     headers:
      { Accept: '*/*',
        'Viewer-Only-Client': '1',
        'Client-DAAP-Version': '3.12',
        'Client-ATV-Sharing-Version': '1.2',
        'Client-iTunes-Sharing-Version': '3.10',
        'User-Agent': 'TVRemote/186 CFNetwork/808.1.4 Darwin/16.1.0' },

nt:
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: [Object],
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: true,
        maxSockets: 1,
        maxFreeSockets: 1 } } }
[2018-2-18 16:29:15] [DACP]
[2018-2-18 16:29:15] [DACP] Attempting to reconnect to Apple TV in 0.2 seconds.
[2018-2-18 16:29:15] [DACP] [Apple TV] Connection to DACP server failed: { error:
   { Error: getaddrinfo ENOTFOUND living.local living.local:3689
    at errnoException (dns.js:50:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
     code: 'ENOTFOUND',
     errno: 'ENOTFOUND',
     syscall: 'getaddrinfo',
     hostname: 'living.local',
     host: 'living.local',
     port: '3689' },
  response: undefined,
  options:
   { encoding: null,
     url: URL {
        href: 'http://living.local:3689/login?pairing-guid=0xD726D61018D31EDF',
        origin: 'http://living.local:3689',
        protocol: 'http:',
        username: '',
        password: '',
        host: 'living.local:3689',
        hostname: 'living.local',
        port: '3689',
        pathname: '/login',
        search: '?pairing-guid=0xD726D61018D31EDF',
        searchParams: URLSearchParams { 'pairing-guid' => '0xD726D61018D31EDF' },
        hash: '' },
     headers:
      { Accept: '*/*',
        'Viewer-Only-Client': '1',
        'Client-DAAP-Version': '3.12',
        'Client-ATV-Sharing-Version': '1.2',
        'Client-iTunes-Sharing-Version': '3.10',
        'User-Agent': 'TVRemote/186 CFNetwork/808.1.4 Darwin/16.1.0' },

nt:
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: [Object],
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: true,
        maxSockets: 1,
        maxFreeSockets: 1 } } }
(node:3633) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): IllegalStateError: Backoff in progress.
(node:3633) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
[2018-2-18 16:29:15] [DACP] Connecting to Apple TV (Living.local:3689)
[2018-2-18 16:29:15] [DACP] Creating status connection to Living.local:3689
[2018-2-18 16:29:16] [DACP] Fatal error while talking to Apple TV:
[2018-2-18 16:29:16] [DACP]
[2018-2-18 16:29:16] [DACP]   Error: { error:
   { Error: getaddrinfo ENOTFOUND living.local living.local:3689
    at errnoException (dns.js:50:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
     code: 'ENOTFOUND',
     errno: 'ENOTFOUND',
     syscall: 'getaddrinfo',
     hostname: 'living.local',
     host: 'living.local',
     port: '3689' },
  response: undefined,
  options:
   { encoding: null,
     url: URL {
        href: 'http://living.local:3689/login?pairing-guid=0xD726D61018D31EDF',
        origin: 'http://living.local:3689',
        protocol: 'http:',
        username: '',
        password: '',
        host: 'living.local:3689',
        hostname: 'living.local',
        port: '3689',
        pathname: '/login',
        search: '?pairing-guid=0xD726D61018D31EDF',
        searchParams: URLSearchParams { 'pairing-guid' => '0xD726D61018D31EDF' },
        hash: '' },
     headers:
      { Accept: '*/*',
        'Viewer-Only-Client': '1',
        'Client-DAAP-Version': '3.12',
        'Client-ATV-Sharing-Version': '1.2',
        'Client-iTunes-Sharing-Version': '3.10',
        'User-Agent': 'TVRemote/186 CFNetwork/808.1.4 Darwin/16.1.0' },

nt:
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: [Object],
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: true,
        maxSockets: 1,
        maxFreeSockets: 1 } } }
[2018-2-18 16:29:16] [DACP]
[2018-2-18 16:29:16] [DACP] Attempting to reconnect to Apple TV in 0.4 seconds.

I assume you're running homebridge in a container as the others?
What happens if you ping living.local inside the container/in a terminal on the system that's running homebridge?

That's the issue! I can't believe I didn't think to check that.
I looked into it more and it seems like the Alpine OS does not support search domains (like local). Ugh. I had only tried to ping the IP before (which works fine as you can see below).
/homebridge # ping Living.local
ping: bad address 'Living.local'
/homebridge # ping <IP_ADDRESS>
PING <IP_ADDRESS> (<IP_ADDRESS>): 56 data bytes
64 bytes from <IP_ADDRESS>: seq=0 ttl=64 time=3.016 ms
/homebridge # nslookup google.com
Name:      google.com
Address 1: <IP_ADDRESS> sea15s07-in-f78.1e100.net
Address 2: 2607:f8b0:400a:800::200e sea15s07-in-x0e.1e100.net
/homebridge # nslookup Living.local
nslookup: can't resolve '(null)': Name does not resolve
nslookup: can't resolve 'Living.local': Name does not resolve

https://github.com/gliderlabs/docker-alpine/blob/master/docs/caveats.md
Would it be possible to have an optional setting for manual IP?

Ha! We're getting closer - at least for Alpine Linux. The name resolution of .local domains is not run through regular DNS, but rather through Avahi with the help of nsswitch.conf. Alpine however doesn't have this facility and the configuration is removed. As such Alpine will never be able to resolve .local domains at all.
I guess I'll have to include an IP option to resolve the Apple TV and hope that the DACP port doesn't change randomly.
Thanks @quacktacular, this is clearer now.

Just to add: The proper solution would be to enable resolution of .local domains through Avahi inside the container, but I can't help with that as I have no experience with Alpine.

I've just pushed another update with some changes from @oznu - specifically the use-referer feature was added. @quacktacular could you enable that in your config.json and try again? I'm a bit curious as @oznu also reported pairing issues that you didn't seem to have.

Hey @grover I only had a couple minutes to test this morning, but it looks like the control portion is working. Only tried the modified play plays control in Home so far.
I did not try to re-pair (using a pairing code generated from the mDNS version) this morning, but I did last night. It didn’t work with Bomjour. Asked for my pairing code onscreen the Apple TV and got stuck there.
Can try more after work.

Hey @grover Thx very much for trying to get a fix here. Highly appreciate it.
Any ETA if you're going to push 0.8 also up to NPM? Would make it a bit easier to update HomeBridge on the Synology... If too much trouble, never mind.. will try to install it manually as well and report back asap.. thx!

It's not a question of trouble, but rather: Does the version already what it should do? As such there's only one remaining issue and that's getting feedback if this is working.
Apparently the bonjour stuff does help a bit, but breaks the pairing... :(

If someone could try to pair again with the latest version and capture a tcpdump of all udp and tcp traffic in their docker container, that would help me tremendously to figure out the pairing problem with bonjour.

@grover confirmed the pairing issue is still present. Here's a tcpdump during the pairing request. Lots of garbage from other services though haha (they are running on other machines).
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:45:20.735101 IP <IP_ADDRESS>.40376 > <IP_ADDRESS>.21028: UDP, length 335
17:45:23.661207 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 165
17:45:23.887430 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 197
17:45:24.760175 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.36544: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251072905 ecr 543328446], length 0
17:45:24.760239 IP <IP_ADDRESS>.36544 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 502, options [nop,nop,TS val 543508670 ecr 165278260], length 0
17:45:24.760248 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.34386: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251072905 ecr 543328446], length 0
17:45:24.760253 IP <IP_ADDRESS>.34386 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 1444, options [nop,nop,TS val 543508670 ecr 165278260], length 0
17:45:24.760257 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.38468: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251072905 ecr 543328446], length 0
17:45:24.760272 IP <IP_ADDRESS>.38468 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 393, options [nop,nop,TS val 543508670 ecr 165278260], length 0
17:45:24.760276 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.49364: Flags [.], ack 715626401, win 237, options [nop,nop,TS val 251060688 ecr 543316229], length 0
17:45:28.818573 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 165
17:45:28.856011 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:28.856030 ARP, Reply <IP_ADDRESS> is-at 02:42:e6:7a:d7:89 (oui Unknown), length 28
17:45:29.043915 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 197
17:45:29.880109 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:29.880243 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:29.880256 ARP, Reply <IP_ADDRESS> is-at 02:42:e6:7a:d7:89 (oui Unknown), length 28
17:45:29.880259 ARP, Reply <IP_ADDRESS> is-at 02:42:ac:11:00:02 (oui Unknown), length 28
17:45:34.719807 IP <IP_ADDRESS>.22020 > <IP_ADDRESS>.3478: UDP, length 44
17:45:34.822001 IP <IP_ADDRESS>.22020 > <IP_ADDRESS>.3478: UDP, length 44
17:45:34.876159 IP <IP_ADDRESS>.3478 > <IP_ADDRESS>.22020: UDP, length 56
17:45:34.977890 IP <IP_ADDRESS>.3478 > <IP_ADDRESS>.22020: UDP, length 56
17:45:38.071260 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 69
17:45:39.296124 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 69
17:45:39.826822 IP <IP_ADDRESS>.45624 > espresso.somedomain.net.49511: Flags [P.], seq 923093481:923093510, ack<PHONE_NUMBER>, win 24576, length 29
17:45:39.843965 IP espresso.somedomain.net.49511 > <IP_ADDRESS>.45624: Flags [.], ack 29, win 856, length 0
17:45:39.864531 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:39.864563 ARP, Reply <IP_ADDRESS> is-at 02:42:e6:7a:d7:89 (oui Unknown), length 28
17:45:40.124156 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:40.124437 ARP, Reply <IP_ADDRESS> is-at 02:42:ac:11:00:07 (oui Unknown), length 28
17:45:40.890315 IP <IP_ADDRESS>.50712 > S0106b88d125b2dcd.vc.blagh.net.22000: Flags [P.], seq 658721566:658721595, ack 268932247, win 18508, options [nop,nop,TS val 309447799 ecr<PHONE_NUMBER>], length 29
17:45:40.919008 IP S0106b88d125b2dcd.vc.blagh.net.22000 > <IP_ADDRESS>.50712: Flags [.], ack 29, win 32767, options [nop,nop,TS val<PHONE_NUMBER> ecr 309447799], length 0
17:45:41.193596 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 117
17:45:41.199457 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 117
17:45:41.365187 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 101
17:45:41.479593 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 165
17:45:41.483460 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 101
17:45:41.656652 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 101
17:45:41.809726 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 165
17:45:41.823014 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 101
17:45:41.824109 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 101
17:45:46.263957 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:45:46.264509 ARP, Reply <IP_ADDRESS> is-at 02:42:ac:11:00:05 (oui Unknown), length 28
17:45:47.944451 IP syncthing.colintaylor.tech.443 > <IP_ADDRESS>.45216: Flags [P.], seq<PHONE_NUMBER>:2409384368, ack<PHONE_NUMBER>, win 490, options [nop,nop,TS val<PHONE_NUMBER> ecr 210864341], length 41
17:45:47.947571 IP <IP_ADDRESS>.45216 > syncthing.colintaylor.tech.443: Flags [P.], seq 1:42, ack 41, win 253, options [nop,nop,TS val 210924342 ecr<PHONE_NUMBER>], length 41
17:45:48.011103 IP syncthing.colintaylor.tech.443 > <IP_ADDRESS>.45216: Flags [.], ack 42, win 490, options [nop,nop,TS val<PHONE_NUMBER> ecr 210924342], length 0
17:45:50.735800 IP <IP_ADDRESS>.40376 > <IP_ADDRESS>.21028: UDP, length 335
17:45:51.140313 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 69
17:45:51.277351 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 69
17:45:58.881372 IP <IP_ADDRESS>.22020 > <IP_ADDRESS>.3478: UDP, length 44
17:45:58.987925 IP <IP_ADDRESS>.22020 > <IP_ADDRESS>.3478: UDP, length 44
17:45:59.037938 IP <IP_ADDRESS>.3478 > <IP_ADDRESS>.22020: UDP, length 56
17:45:59.145096 IP <IP_ADDRESS>.3478 > <IP_ADDRESS>.22020: UDP, length 56
17:46:01.330143 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 69
17:46:01.335461 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 69
17:46:02.376874 IP <IP_ADDRESS>.41805 > google-public-dns-a.google.com.53: 31838+ AAAA? discovery-v6.syncthing.net. (44)
17:46:02.377883 IP <IP_ADDRESS>.38813 > google-public-dns-a.google.com.53: 60835+ A? discovery-v6.syncthing.net. (44)
17:46:02.405062 IP google-public-dns-a.google.com.53 > <IP_ADDRESS>.38813: 60835 0/1/0 (108)
17:46:02.409920 IP google-public-dns-a.google.com.53 > <IP_ADDRESS>.41805: 31838 2/0/0 AAAA 2001:bc8:4700:2000::515, AAAA 2001:bc8:4400:2200::c39 (100)
17:46:03.504432 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 165
17:46:11.363930 IP <IP_ADDRESS>.1198 > <IP_ADDRESS>.43934: UDP, length 69
17:46:13.472278 IP <IP_ADDRESS>.43934 > <IP_ADDRESS>.1198: UDP, length 69
17:46:13.912143 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.42396: Flags [.], ack 784783575, win 237, options [nop,nop,TS val 251122057 ecr 543377598], length 0
17:46:13.912218 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.41502: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251122057 ecr 543377598], length 0
17:46:13.912428 IP <IP_ADDRESS>.41502 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 237, options [nop,nop,TS val 543557823 ecr 184787267], length 0
17:46:13.912435 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.41712: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251122057 ecr 543377598], length 0
17:46:13.912449 IP <IP_ADDRESS>.42396 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 1444, options [nop,nop,TS val 543557823 ecr 250573404], length 0
17:46:13.912450 IP <IP_ADDRESS>.41712 > <IP_ADDRESS>.9000: Flags [.], ack 1, win 237, options [nop,nop,TS val 543557823 ecr 184787267], length 0
17:46:13.912455 IP <IP_ADDRESS>.9000 > <IP_ADDRESS>.41534: Flags [.], ack<PHONE_NUMBER>, win 237, options [nop,nop,TS val 251122057 ecr 543377598], length 0
17:46:16.472194 ARP, Request who-has <IP_ADDRESS> tell <IP_ADDRESS>, length 28
17:46:16.473053 ARP, Reply <IP_ADDRESS> is-at 02:42:ac:11:00:05 (oui Unknown), length 28
^C
71 packets captured
77 packets received by filter
6 packets dropped by kernel

Hi @grover,
If you can't get Bonjour working correctly without to much effort, then perhaps this solution will work (based on your master branch before you swapped to use bonjour):
https://github.com/oznu/homebridge-dacp/commit/ed998cd670707e24cf8587096d8cf64ee366895a

It keeps the mdns library in place.
Removes the mdns resolver sequence entries that were causing failures when nss_mdns was not enabled.
Use a pure javascript implementation to resolve the IP address from the .local domain just before connecting.
No need for the use-referer flag since the above library is doing a real mdns dns query and listening for the response (just like nss_mdns would be doing otherwise), so you should be able to safely transition all users onto it.

@grover @oznu the build above is working perfectly so far :)

@oznu Nice! There's just too many MDNS implementations for JS. Let me ponder over this a bit as I really wanted to get rid of the mdns library in the first place. Installing it takes ages on the lower end raspberry pis.

I've applied the branch @oznu gave in a slightly different manner adding IPv6 support for those few that are IPv6 only.
This keeps the MDNS library around for now, but I'll plan to get rid of it in a release or two.
If you could verify it again?

Works for me.

Also pairing? If so, then I'll release this version.

Pairing works for me as well. Nice work!

Hi
Thnx all for putting in all your efforts and skills. Pairing works for me now as well.. which is great. However in the Home App on iOS the Remote appears as "Not supported". Can't do anything with it.

Please see Apps and Features.

I think I have a similar problem with mdns as of today. DACP plugin v0.9.1, Homebridge v0.4.38, node v9.9.0:

[2018-4-11 23:52:35] [DACP] Failed to resolve service Peisestue.local. using IPv4 MDNS lookups.
[2018-4-11 23:52:35] [DACP] Specific error: Error: Could not resolve Peisestue.local - Query Timed Out
at Timeout.setTimeout (/usr/local/lib/node_modules/homebridge-dacp/node_modules/mdns-resolver/src/index.ts:19:14)
at ontimeout (timers.js:466:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:267:5)
[2018-4-11 23:52:36] [DACP] Failed to resolve service Peisestue.local. using IPv4 MDNS lookups.
[2018-4-11 23:52:36] [DACP] Specific error: Error: Could not resolve Peisestue.local - Query Timed Out
at Timeout.setTimeout (/usr/local/lib/node_modules/homebridge-dacp/node_modules/mdns-resolver/src/index.ts:19:14)
at ontimeout (timers.js:466:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:267:5)
[2018-4-11 23:52:38] [DACP] Failed to resolve service Peisestue.local. using IPv4 and IPv6 MDNS lookups.
[2018-4-11 23:52:38] [DACP] Discarding service.
[2018-4-11 23:52:38] [DACP] Specific error: Error: Could not resolve Peisestue.local - Query Timed Out
at Timeout.setTimeout (/usr/local/lib/node_modules/homebridge-dacp/node_modules/mdns-resolver/src/index.ts:19:14)
at ontimeout (timers.js:466:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:267:5)
[2018-4-11 23:52:39] [DACP] Failed to resolve service Peisestue.local. using IPv4 and IPv6 MDNS lookups.
[2018-4-11 23:52:39] [DACP] Discarding service.
[2018-4-11 23:52:39] [DACP] Specific error: Error: Could not resolve Peisestue.local - Query Timed Out
at Timeout.setTimeout (/usr/local/lib/node_modules/homebridge-dacp/node_modules/mdns-resolver/src/index.ts:19:14)
at ontimeout (timers.js:466:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:267:5)


Bug: No cleanup for SSE-endpoints if client tears connection down

Description
This leads to resource leakage. Possibly relevant to #2958.
URL to code causing the issue
https://github.com/vrslev/litestar-sse-cleanup-issue
MCVE
No response
Steps to reproduce
1. Follow the instructions in README in the repository
2. See that logs do not contain `closed redis client`—which is expected.

Screenshots
No response
Logs
INFO:     Started server process [54771]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://<IP_ADDRESS>:8000 (Press CTRL+C to quit)
INFO:     <IP_ADDRESS>:54353 - "GET /sse HTTP/1.1" 200 OK
initialized redis client
caught an exception from blpop: Cancelled by cancel scope 1041246b0
^CINFO:     Shutting down
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.
INFO:     Finished server process [54771]

Litestar Version
2.12.1
Platform

[ ] Linux
[X] Mac
[ ] Windows
[ ] Other (Please specify in the description above)

[!NOTE]
While we are open for sponsoring on GitHub Sponsors and
OpenCollective, we also utilize Polar.sh to engage in pledge-based sponsorship.
Check out all issues funded or available for funding on our Polar.sh dashboard

If you would like to see an issue prioritized, make a pledge towards it!
We receive the pledge once the issue is completed & verified
This, along with engagement in the community, helps us know which features are a priority to our users.

Temporary solution is to shield __aexit__ in entered async context manager:
import contextlib
import sys
import typing

import anyio
import litestar
import redis.asyncio
from litestar.response import ServerSentEvent

AsyncContextManagerReturnType = typing.TypeVar("AsyncContextManagerReturnType")

def shield_async_context_manager_aexit(
    async_context_manager: typing.AsyncContextManager[AsyncContextManagerReturnType],
) -> typing.AsyncContextManager[AsyncContextManagerReturnType]:
    @contextlib.asynccontextmanager
    async def _inner() -> typing.AsyncGenerator[AsyncContextManagerReturnType, None]:
        async_context_manager_result: typing.Final = (
            await async_context_manager.__aenter__()
        )
        try:
            yield async_context_manager_result
        finally:
            with anyio.CancelScope(shield=True):
                await async_context_manager.__aexit__(*sys.exc_info())

    return _inner()

@contextlib.asynccontextmanager
async def create_redis_client() -> typing.AsyncGenerator[redis.asyncio.Redis, None]:
    redis_client = redis.asyncio.Redis(host="localhost", port="6379")
    try:
        await redis_client.initialize()
        print("initialized redis client")
        yield redis_client
    finally:
        await redis_client.aclose()
        print("closed redis client")

redis_list_key = "whatever"

async def _iter_sse_session_events_as_str() -> typing.AsyncIterable[str]:
    async with shield_async_context_manager_aexit(
        create_redis_client()
    ) as redis_client:
        while True:
            try:
                # BLPOP blocks redis client until an item in list is available,
                # i. e. you can't do anything with the client while waiting here.
                _list_key, event_content = await redis_client.blpop(redis_list_key)
            except BaseException as exception:
                print("caught an exception from blpop:", exception)
                raise exception

            yield event_content

@litestar.get("/sse")
async def listen_to_sse_session_events() -> ServerSentEvent:
    return ServerSentEvent(_iter_sse_session_events_as_str())

app = litestar.Litestar([listen_to_sse_session_events])

any reason you create the redis connection inside the generator ? that seems highly inneficient, usually that's what lifespan is for

BLPOP is a blocking operation. To serve to more than one request we would have to create connection-per-request.

Running into this issue as well

Anyways, I found out that this is intended and simply a quirk with Async generators and async context managers in Python. Nothing you can do about it except using contextlib.aclosing.

At first I though this was just a side effect of not having implemented cancelling when a client disconnects (#2496), but on second look, this just seems to be an unexpected behaviour in the with the interplay of route handlers and generators, as @winstxnhdw mentioned.
Even if Litestar were to cancel the route handler task on client disconnect, this wouldn't have the result you want, since the handler task finishes as soon as you return the ServerSentEvent. It's actually the generator inside you want to aclose.
Maybe we could provide some functionality to handle this special case, something like adding Request.listen_for_disconnect that you can await, which would block until the client disconnects. Then you could react to that disconnect independently, and close your resource. The benefit of an approach like this would be that it's generic.


Exception when create shapebatch

protected override void LoadContent()
{
_graphics.GraphicsProfile = GraphicsProfile.HiDef;
_spriteBatch = new SpriteBatch(GraphicsDevice);
ShapeBatch _sb = new ShapeBatch(GraphicsDevice, Content);  // Exception!!!
// TODO: use this.Content to load your game content here
}
It report:
SharpDX.SharpDXException: 'HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: 参数错误。
I copy the spos-shapes.fx file to the content.mgcb and compile it.
I install the monogame with nuget.
VS: 2022
Monogame : <IP_ADDRESS>3
Apos.Shapes : 0.3.0

Try to add this line:
_graphics.GraphicsProfile = GraphicsProfile.HiDef;
_graphics.ApplyChanges();

It works!
_graphics.GraphicsProfile = GraphicsProfile.HiDef;  //must call with ApplyChanges().
Thanks!

You can check the example project https://github.com/Apostolique/Apos.Shapes/blob/1a6c92e6fa0c32c0f0d18a3de162366557883215/Example/Game/GameRoot.cs#L12-L17
I tend to place that line in the game's constructor since I don't need to call ApplyChanges from there.

Yes, you are right.
this statement must be placed inside the constructor. If the ApplyChanges function is called, it must be before ApplyChanges.


Engine Platform Support

NUnit Compatibility Issue
Category: Platform Support
Visibility: Users
Resolution: Resolved: Both will support .NET 4.0 and .NET Standard 2.0.
Description
The TestCentric engine is built for

.NET 4.0
.NET Standard 2.0

The NUnit engine is built for

.NET 2.0
.NET Standard 2.0
.NET Standard 1.6.

Transferred from testcentric-gui issue 583

We are no longer attempting to maintain compatibility with NUnit.


fix: updated the update message

Describe your changes
If you have wrong version of the package, wanna-ml provides misleading information about upgrading.
wanna version
ℹ WANNA GCP access allowed
ℹ WANNA cloud build access is enabled
ℹ WANNA remote validation is enabled
❌ Installed version is 0.2.35, the latest version is 0.2.36
ℹ If you used `pipx` to install WANNA CLI, use the following command:

pipx upgrade wanna

Otherwise, use `pip install --upgrade wanna.cli`(exact command will depend on your environment).

Now it should write
ℹ If you used `pipx` to install WANNA CLI, use the following command:

pipx upgrade wanna-ml

Otherwise, use `pip install --upgrade wanna-ml`(exact command will depend on your environment).

Issue ticket number and link
Checklist before requesting a review

[x] I have performed a self-review of my code
[x] My changes generate no new warnings

Codecov Report
Patch and project coverage have no change.

Comparison is base (4e3121e) 74.42% compared to head (77faf32) 74.42%.

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #100   +/-   ##
=======================================
  Coverage   74.42%   74.42%
=======================================
  Files          57       57
  Lines        2839     2839
=======================================
  Hits         2113     2113
  Misses        726      726

Files Changed
Coverage Δ

src/wanna/cli/version.py
39.13% <ø> (ø)

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


release(docs): update README for v2.5.0 and pydantic v2

Pull Request Checklist

[ ] New code has 100% test coverage
[ ] (If applicable) The prose documentation has been updated to reflect the changes introduced by this PR
[ ] (If applicable) The reference documentation has been updated to reflect the changes introduced by this PR

Description
Close Issue(s)

This swaps the all-contrib badge to what is recommended in their docs:
https://allcontributors.org/docs/en/bot/faq