[$500] IOU - Email field accepts invalid formats

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

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
Expensify/Expensify Issue URL:
Issue reported by: Applause - Internal Team
Slack conversation:
Action Performed:

Navigate to https://staging.new.expensify.com/
Start a new chat with the FAB button
Type an email address and duplicate the last word<EMAIL_ADDRESS>
Expected Result:
The part after "@" should be validated before showing the actual address in the IOU.
Actual Result:
<EMAIL_ADDRESS>can be used as a valid email address.
Workaround:
Unknown
Platforms:

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

[x] Android: Native
[x] Android: mWeb Chrome
[x] iOS: Native
[x] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[x] MacOS: Desktop

Screenshots/Videos
Add any screenshot/video evidence
https://github.com/Expensify/App/assets/93399543/b64372cb-116b-4eb5-bf6a-5a0caf950b18
View all open jobs on GitHub
Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~011cc49b8f5eebfc16
Upwork Job ID:<PHONE_NUMBER>167351808
Last Price Increase: 2023-11-24

Proposal
Please re-state the problem that we are trying to solve in this issue.
<EMAIL_ADDRESS>can be used as a valid email address.
What is the root cause of that problem?
This is not error. Most top-level domains(TLD)s are 2 to 4 characters long. However, with the introduction of new gTLDs (generic top-level domains), this can extend up to 63 characters. So the email<EMAIL_ADDRESS>actually valid one.
Here's the reference
What changes do you think we should make in order to solve the problem?

Here, we're already limiting the domain name correctly. So no changes are needed.
What alternative solutions did you explore? (Optional)

Reviewing

@Juggernaut-98 Your assumption is wrong since domain name ending is not limited for 4 characters.

@kenny-luk Thank you for your detailed explanation. You right current regex is valid and no change needed.

But I do think we should have common validation for website urls and email addresses. Seems like currently for email validation we are just checking if length of TLD is between 2-63 characters. But for website validation we are using complex regex to check for valid TLDs.
That is why we should go with @tienifr ' proposal which is correctly suggesting to modify current email regex.
C+ reviewed 🎀 👀 🎀

@alitoshmatov
I don't think it's a good idea to use such a complex regex for email TLD check.
Here are the reasons:

It's not a common practice. The TLD in an email regex is usually not strictly validated against a list of valid TLDs, but it often includes a check for the general structure.
We validate emails more often than website domains. Using such a long and complex regex can lead to significant performance issues.
This kind of regex is not flexible. The regex only allows for the specific TLDs listed. It doesn't account for valid but unlisted TLDs. This lack of flexibility can lead to valid email addresses being erroneously marked as invalid.

Waiting for @grgia 's feedback here

@alitoshmatov I think this may be a case of do nothing if the original email supplied is valid and this issue is not technically a bug

@grgia Agreed, we can close this issue then


Upgrading libblkid1 from 2.30.2 to 2.31.1 causes cryptfs-tpm2 to error with "Too large count value passed to g_input_stream_read"

Setup

Ubuntu 18.04 running in Vagrant
tpm2-abrmd version 1.3.1 (built and installed from source)
IBM tpm2 simulator 0.974 (built and installed from source)
tpm2-tss version 1.4.0 (built and installed from source)
tpm2-tools version 3.0.4 (built and installed from source)
cryptfs-tpm2 version 0.6.3 (built and installed from source)
tpm2-abrmd is being started with option --tcti=socket so it can talk to the IBM tpm2 simulator

Command
sudo cryptfs-tpm2 --owner-auth blank unseal passphrase -P auto -o /tmp/passphrase
Results
Result with libblkid 2.30.2-0.1ubuntu3 package installed: Pass phrase successfully unsealed.
Result with libblkid 2.31.1-0.4ubuntu1 package installed:
Thu Aug 23 18:23:30 UTC 2018: [INFO] Use tabrmd as the default tcti interface
** (process:12769): WARNING **: read on istream 0x7f9980006b30 produced error: Too large count value passed to g_input_stream_read
Thu Aug 23 18:23:30 UTC 2018: [ERROR] Unable to get the TPM PCR banks (0xa0001)Thu Aug 23 18:23:30 UTC 2018: [ERROR] Unsupported PCR bank algorithm
Observations

tpm2_abrmd appears to depend on libblkid1 but not cryptfs-tpm2
strace on tpm2_abrmd shows an unexpected client disconnect after cryptfs-tpm2 error message

tpm2-abrmd service file --
[Unit]
Description=TPM2 Access Broker and Resource Management Daemon

[Service]
Type=dbus
Restart=always
RestartSec=5
EnvironmentFile=-/usr/etc/default/tpm2-abrmd
BusName=com.intel.tss2.Tabrmd
StandardOutput=syslog
StandardError=syslog
ExecStart=/usr/sbin/tpm2-abrmd --tcti=socket
User=tss

[Install]
WantedBy=multi-user.target

Strangely enough, it is not necessary to restart the tpm2-abrmd service after installing a "good" or "bad" libblkid1 package, to see the change in behavior in cryptfs-tpm2.

I did a git bisect with the upstream util-linux package and got this as the commit that introduces the error: https://github.com/karelzak/util-linux/commit/d2b0c6587d729a8e838821cb70d4de18c6969868

We appear to have found a solution here: https://github.com/tpm2-software/tpm2-abrmd/issues/514

@gblewis1 I'm sorry I missed this. Thanks for your debugging. I will sync up with the latest in meta-secure-core.

Too long to reproduce this issue. Closed.

Too long to reproduce this issue. Closed.


[Python] Allowing custom objective / metric function with "objective" and "metric" parameters

Summary
It would be nice if one could register custom objective and loss functions, so that these can be passed into the LightGBM's  train function via the param argument.
Motivation
I believe that this would be a nice feature as this allows for easier hyperparameter tuning. Currently one would need to write logic that retrieves the custom function based on the name in a config file and pass those into the train function's feval and fobj arguments. It would be much easier and cleaner if one could just register these custom functions s.t. they can be passed in like the standard objective functions and eval metrics.
Description

Currently one would do something like this to use custom objective functions and evaluation metrics:
import lightgbm as lgb
from custom import custom_objective, custom_metric

params = {}
gbm = lgb.train(params=params,
                train_set=train_set,
                valid_sets=eval_set,
                fobj=custom_objective,
                feval=custom_metric
                )

I would propose to also allow something similar to this:
import lightgbm as lgb
from custom import custom_objective, custom_metric

lgb.register_metric(name="custom_metric", function=custom_metric)
lgb.register_objective(name="custom_objective", function=custom_objective)

params = {
    'objective': 'custom_objective',
    'metric': ['custom_metric'],
}

gbm = lgb.train(params=params,
                train_set=train_set,
                valid_sets=eval_set
                )

thanks @daanklijn
I think this is quite easy to implement.
@shiyu1994 could you help with this when you have time?

thanks @daanklijn
I think this is quite easy to implement.
@shiyu1994 could you help with this when you have time?

Sure.

@daanklijn Will passing callable metric/loss in standard params will suit your needs?
We have something similar for sklearn API and I personally find it more convenient than registering callables.
https://github.com/microsoft/LightGBM/blob/3c0e12dc5cf1bdb941e9845d08ba7b891a935745/examples/python-guide/sklearn_example.py#L65
https://github.com/microsoft/LightGBM/blob/78d31d9ae34c9c8ab2b0f8704c6962c8d3510062/python-package/lightgbm/sklearn.py#L519-L521

@daanklijn Will passing callable metric/loss in standard params will suit your needs?
We have something similar for sklearn API and I personally find it more convenient than registering callables.
https://github.com/microsoft/LightGBM/blob/3c0e12dc5cf1bdb941e9845d08ba7b891a935745/examples/python-guide/sklearn_example.py#L65
https://github.com/microsoft/LightGBM/blob/78d31d9ae34c9c8ab2b0f8704c6962c8d3510062/python-package/lightgbm/sklearn.py#L519-L521

Closed in favor of being in #2302. We decided to keep all feature requests in one place.
Welcome to contribute this feature! Please re-open this issue (or post a comment if you are not a topic starter) if you are actively working on implementing this feature.

Closed in favor of being in #2302. We decided to keep all feature requests in one place.
Welcome to contribute this feature! Please re-open this issue (or post a comment if you are not a topic starter) if you are actively working on implementing this feature.

@StrikerRUS , @jameslamb I'm open to develop this
I will consider starting first with register_objective because it is only a callable or None.
I think a similar logic as with Loggers can be used, that is, first register the metric (example register_logger) and then making the callable available through a function (example _log_warning) _retrieve_objective, this function either return a callable or None.
Inside lgb.train() if fobj is not provided check for a previous register callable
fobj = fobj or _retrieve_objective()  # either passed argument or registered callable

if fobj is not None:
    for obj_alias in _ConfigAliases.get("objective"):
        params.pop(obj_alias, None)
    params['objective'] = 'none'

what are your thoughts?

@TremaMiguel Sorry,  I'm not 100% sold on registering custom functions. I believe that allowing to pass callables to objective/metric argument is more user friendly and is already implemented in the sklearn wrapper (https://github.com/microsoft/LightGBM/issues/3244#issuecomment-759067234). Adding one more way to pass custom functions will add a lot of maintenance burden and may confuse users by number of possibilities.

I agree completely with @StrikerRUS

Agree I think registering custom callables could bring some unnecessary logic. I've found this issue available on #2302, should it be marked as completed or removed from the list?

I believe we can wait for some other opinions. Or this issue can be transformed into feature request for allowing custom callables via objective/metric parameter for all Python interfaces.

I agree with @jameslamb @StrikerRUS. Allowing passing customized function with parameter "objective" or "metric" can also fulfill the need in the motivation of this feature request. I'll change the description in #2302.

@jameslamb I'm out of context, as I understand fobj and feval already accept custom callables, what's different with @StrikerRUS proposal?

what's different with @StrikerRUS proposal

We are saying we'd support a pull request making it possible to do something like the following:
bst = lgb.train(
    ...,
    params = {
        "metric": ["auc", _some_function_i_wrote],
    }
)

And the same for objective.
Like the code linked in https://github.com/microsoft/LightGBM/issues/3244#issuecomment-759067234.

@jameslamb @StrikerRUS so basically to achieve
bst = lgb.train(
    ...,
    params = {
        "objective": "regression" # or custom function  "objective":custom_objective_function
        "metric": ["auc", _some_function_i_wrote],
    }
)

one needs to get the following done

Check if objective is in params and assigned it to fobj like the R implementation. This will be passed to Booster.update()
Check if metric is in params and pass it to Booster.eval_train() and Booster.eval_valid()
Add support for multiple metric values like the R implementation, creating a list of eval_functions

is there anything missing?

Firstly I guess we can simply transfer this logic
https://github.com/microsoft/LightGBM/blob/01568cf59a412de7823b373fe13eb36db9cffe53/python-package/lightgbm/sklearn.py#L668-L675
into basic.py

@StrikerRUS Ohh I see, I think this one is kind of easy, one just need to handle:

metrics with the code you provide, ignoring feval if params has a metric key.
handle fobj if callable or string with

# objective is callable
f_obj = params['objective']
if callable(f_obj):
    for obj_alias in _ConfigAliases.get("objective"):
        params.pop(obj_alias, None)
    fobj = params['objective']
    params['objective'] = None
elif isinstance(f_obj, str):
    for obj_alias in _ConfigAliases.get("objective"):
        params.pop(obj_alias, None)

and no need to add a list of eval_functions cause Booster.__inner_eval supports it.


RFC: Attributes in function return type position

#2565 introduced attributes for function parameters. This RFC proposes the logical next step: allowing attributes for function return types. This RFC is less radical than #2602 which proposes that attributes should be allowed to be attached nearly everywhere (lifetimes, types, bounds, and constraints), which has been argued to go a bit too far resulting in too much cognitive load. This RFC hopes to increase the expressiveness of DSLs without posing too much cognitive load.
Rendered

Is there any precedent in other languages for allowing attributes on return types? It looks out of place to me, but it might just be because I'm not used to seeing attributes in that position.
Presumably if you wish to place a return type attribute on a unit-returning function, you must explicitly state the return type? ie.
fn example() -> #[attr] () {
}

Also, #2565 allows attributes on closure arguments as well as functions. This RFC should also state whether closure return types can be annotated.

So attributes on parameters were clearly helpful since there are multiple -- a function-level attribute would have had to match up the name or something, which would be awkward.
But the distinction between a function and its return type are much less clear-cut to me.  For example, I'm not sure it's clearer to say that the the Vec<Page> is returned as json than to just say that the example HTTP endpoint returns json.  Similarly, I'm not sure it'd be better to have
fn to_lowercase(&self) -> #[must_use] String;

than the current
#[must_use]
fn to_lowercase(&self) -> String;

even if you could argue that it's the return value that needs to be used.  (And I acknowledge that the RFC doesn't propose changing must_use, but it seemed a useful study.)
So I think overall my first instinct here is "weak no due to insufficient motivation".  But that's weakly held, so could change.

Small nit: could you define DSL in the RFC text please? Since I'm not quite sure what you mean there.

@Diggsey Yes as I wrote in the RFC unit-returns would need to be made explicit. I am not aware of a precedent for return type attributes in other languages, which is also why I put that very question under "unresolved questions". Thanks, good catch with the closures! I think for consistency attributes should be supported for their return types as well (I updated the RFC accordingly).
@clarfonthey Thanks, I clarified that DSL stands for domain-specific language.
@scottmcm Thanks, you raise a good points. I agree that the motivation for return type attributes is weaker than for parameter attributes but I think for certain DSLs they would still be desirable. In particular when the attribute is directly related to the return type. I agree that the json return type wasn't the best example ... I updated the motivation with a better example:
#[wasm_bindgen]
impl RustLayoutEngine {
    pub fn layout(
        &self,
        #[type = "MapNode[]"] nodes: Vec<JsValue>,
        #[type = "MapEdge[]"] edges: Vec<JsValue>
    ) -> #[type = "MapNode[]"] Vec<JsValue> {
        ..
    }
}

is in my opinion clearly preferable to
#[wasm_bindgen]
impl RustLayoutEngine {
    #[return_type = "MapNode[]"]
    pub fn layout(
        &self,
        #[type = "MapNode[]"] nodes: Vec<JsValue>,
        #[type = "MapEdge[]"] edges: Vec<JsValue>
    ) -> Vec<JsValue> {
        ..
    }
}

So I think return type attributes would primarily be useful for specifying another return type that the function return type is somehow mapped to via the generated code. In that case having both the actual and the "mapped" return types next to each other makes the code more readable and facilitates maintenance (if one is updated the other type should be updated as well, which is easier to do when they're next to each other).

Is there any precedent in other languages for allowing attributes on return types? It looks out of place to me, but it might just be because I'm not used to seeing attributes in that position.

C# allows attribute on return values https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/#attribute-targets but I don't remember any example

If you're looking for other example of confusing language that can put attributes everywhere, we can take C++
[[function]]
auto [[type1]]
my_function([[arg]] int [[type2]] * [[type3]] my_arg) [[function_type]]
        ->  int [[type4]] * [[type5]] {
    return my_arg;
}

Notice that it is hard to see what exactly is annotated. Unlike in rust, the attribute sometimes comes before, sometimes after what it describes. I'm not even quite sure about what i annotated, but i think type1 and type5  annotates the return type (int*),  and function_type annotates the function type (in this case int* (*) (int *)),  while [[function]] annotates the whole function.

https://github.com/rust-lang/rfcs/pull/3201#issuecomment-979473450 pointed out where C++ allows attributes in its syntax, but for this RFC, concrete examples of attributes that do something in return position are probably more relevant as prior art, so:

Is there any precedent in other languages for allowing attributes on return types? It looks out of place to me, but it might just be because I'm not used to seeing attributes in that position.

C++ has the [[nodiscard]] attribute, which for the purposes of this discussion is basically #[must_use]. There's also [[noreturn]], but Rust already chose a never type for that use case. I believe that's it for standardized attributes that apply to a function's return type, as opposed to the entire function.

I think this would be useful for data transformation.
For example, picture a web framework handler like so
#[handler]
async fn get_user() -> #[json] User {
    User{...}
}

I'm in favor of the spirit of this proposal (I like attributes and extensibility!) but I am concerned about a sort of "ambiguity" -- is this attribute attached to the function's return or the type that it returns. It's a subtle difference and maybe it doesn't matter, but it seems a bit ambiguous to me.
I'm thinking: I could imagine us adding attributes to types in the future. As an example, consider #[non_null] being added to *mut to indicate that it is not null (probably not a good idea in Rust, but there is a lot of precedent for this in languages like Java, so let's run with it). Then you could have fn foo(x: #[non_null] *mut T) or fn foo() -> #[non_null] *mut T. But now it's kind of ambiguous whether that non_null is attached to the return type or the return value.
This may be a distinction without a difference, I'm not sure. #[must_use] is an interesting example. We have "must use" types, and arguably it makes sense to think of -> #[must_use] String as returning a value of type #[must_use] String.
But in that case, maybe we just want to allow attributes to be attached to types instead and be done with it?
Can anyone come up with examples where these two interpretations would be in conflict?

If there were to be a difference between annotating the "return" part and the type itself, I would say that specifically annotating the return should go before the arrow, and annotating the type should go after.

@clarfonthey

If there were to be a difference between annotating the "return" part and the type itself, I would say that specifically annotating the return should go before the arrow, and annotating the type should go after.

This makes sense to me.

My concern would be how common the two use-cases are, since it feels strange and unnatural to me to annotate something I perceive to be in the same class of syntax as a curly brace or equals sign:
`fn unannotated_function() -> UnannotatedBar #[annotation_on_curly_brace] {
    // Un-annotated body
}

let unannotated_name: UnannotatedType #[annotation_on_equals] = UnannotatedType::new();

...possibly as unnatural as something like this:
let foo =(argument_to_call_equals_as_a_function) Bar::new();

I'm a bit skeptical on the practicality of annotating types specifically, since flowing them through generics properly seems very awkward.  Trying to get Vec<(A, #[non_exhaustive] B)> to work scares me, vs Vec<(A, NewType<B>)> just generally does.

A precedent for this is WGSL, they heavily use return type attributes.
This would be useful for example in rust-gpu, they currently use MaybeUninit out params instead.
Here is an example in WGSL:
@vertex
fn main_vs(
    @builtin(vertex_index) vert_id: u32
) -> @builtin(position) vec4<f32> {
    let x = f32(i32(vert_id) - 1);
    let y = f32(i32(vert_id & 1u) * 2 - 1);
    return vec4<f32>(x, y, 0.0, 1.0);
}

@fragment
fn main_fs() -> @location(0) vec4<f32> {
    return vec4<f32>(1.0, 0.0, 0.0, 1.0);
}

Here is how it looks in rust-gpu currently:
#[spirv(vertex)]
pub fn main_vs(
    #[spirv(vertex_index)] vert_id: i32,
    #[spirv(position)] out_pos: &mut Vec4,
) {
    let x = (vert_id - 1) as f32;
    let y = ((vert_id & 1) * 2 - 1) as f32;
    *out_pos = vec4(x, y, 0.0, 1.0);
}

#[spirv(fragment)]
pub fn main_fs(output: &mut Vec4) {
    *output = vec4(1.0, 0.0, 0.0, 1.0);
}

Here is how it could look:
#[spirv(vertex)]
pub fn main_vs(
    #[spirv(vertex_index)] vert_id: i32,
) -> #[spirv(position)] Vec4 {
    let x = (vert_id - 1) as f32;
    let y = ((vert_id & 1) * 2 - 1) as f32;
    vec4(x, y, 0.0, 1.0)
}

#[spirv(fragment)]
pub fn main_fs() -> Vec4 {
    vec4(1.0, 0.0, 0.0, 1.0)
}

if we use the alternative syntax from https://github.com/rust-lang/rfcs/pull/3201#issuecomment-1032849255 which does not suffer from the "don't know whether it's annotating the type or the function return" issue, the example above will become
#[spirv(vertex)]
pub fn main_vs(
    #[spirv(vertex_index)] vert_id: i32,
) #[spirv(position)] -> Vec4 {
    let x = (vert_id - 1) as f32;
    let y = ((vert_id & 1) * 2 - 1) as f32;
    vec4(x, y, 0.0, 1.0)
}

What happened if we placed #[cfg] on the return type?
fn foo() #[cfg(unix)] -> u32 {
    todo!();
}

if we follow the rule of #![feature(stmt_expr_attributes)] (rust-lang/rust#15701) this should emit an E0658 "removing the return type is not supported in this position" error.
And what if this is a proc-macro?
fn foo() #[my_crate::my_attribute] -> u32 {
    todo!();
}

I suppose this would emit the error "expected non-macro attribute, found attribute macro" similar to the argument position.


Use new async open functionality

Any update on this PR?
We're using this successfully in v3.15.0-beta.2, but holding off on the v3.15.0 release until we get confirmation that it's been merged.

@ericjordanmossman said this PR might be delayed due to the stability issues we've had with using the new asyncOpen. Though I think for us, it happens so infrequently that we'd rather keep using it, and we don't want to fall too far behind the improvements in stable updates to the client.
What do you think about including this in the next stable release not as default behavior, but as an opt-in flag (useExperimentalAsyncOpen or something like that)?

We've decided to just go ahead and release this, so it'll be in the next stable version.


Add some demo Sketch files

Describe the solution you'd like
Create a folder for some demo Sketch files can be a good idea.
Additional context
If I upload the Sketch file that create an issue the contributors can easily jump into the code.

Hi, I've added some demo sketchapp files here.
Would you be up to implement a feature where one could load a demo file, in addition to the available upload process?

@manekinekko What do you think about a select with the demo components?  Unfortunately the list must be hardcoded 😢

It's totally fine for now. Let's do it :D

Ok I will implement it. :smile:


Add table of contents to documentation

Is your feature request related to a problem? Please describe.
Add table of contents to documentation
Describe the solution you'd like
In order to quickly provide an overview to anyone looking at the documentation, provide a table of contents, which:

links to the actual section
provides a quick overview of capabilities

Once this is done, we can publish the documentation as final (no preview) so it becomes available once the modules are published onto the PowerShell Gallery.
Additional context
As an example:

You mean you want a table of contents at the index page that lists all commands?
Now we have at the index page a reference to each separate file that relates to a topic (storage, key vault...).

Isn't that enough?

What I mean is that we should have an overview of the available commands, per page.
For instance, if I browse to the Azure Key Vault-module specific page, I want to be able to quickly see what the capabilities are, instead of having to scroll through the entire page.
While currently we only have 1 or 2 operations per topic, in the future this will increase, and not having such an overview would cause people you just skip the module entirely - or at least, that's what I often think when I just see a very long page without table of contents.

I have to agree on that!
What Maxim means is that at the top of every page it should list all the modules with links to their respective docs:

This would improve discoverability instead of having to scroll through all the commands and see what it supports.
Can be as simple as this for example: (but up to Maxim)
- [**Enable the trigger of a Azure Data Factory pipeline**](foo)
- [**Disable the trigger of a Azure Data Factory pipeline**](bar)

Exactly this ^^
With the exception of foo and bar ;)


Revert "Try us-east4 for dev clusters"

This reverts commit df12b352666bff6389778539c18d9eb7420fdda7.
Back to us-east1 in the light of very global KMS 🌎

LGTM


Specify Minimum audio length in recut

What
In the re-cutting stage i would like to have an option to be able to specify minimum audio length. because the re-cutted audios are very very small and it contain only 1 word. Is it possible to recut having 2-3 words?
Why
The re-cutted audios are very very small and it contain only 1 word.

hey have you found a solution on this.
I too am looking to have an ASR thag produced studio quality SRT subtitles
for that I need a short chunk/span of text around 2-3/7-9 words long.
would be great if there could be a way to chunk them appropriately based on utterance, end of sentence based parser.

@purzelrakete hey is there a way i could get short chunks fo audio length in a way that resembles perfect subtitles SRT type audio/text timestamp chunks ? (a few 2-3  ,7-9 chunks)
as i mentioned above.


Distribute cli as an executable file

Extracted from "Getting started with the CLI"

cd detekt
gradle build
java -jar detekt-cli/build/libs/detekt-cli-[version]-all.jar [parameters]*

We are forcing to our user to clone the repo.
It would be great to have something like:

curl -sSLO https://github.com/arturbosch/detekt/releases/download/[version]/detekt && chmod a+x detekt
detekt [parameters]*

(example taken from ktlint: https://ktlint.github.io/)
To acomplish this we need to generate an executable file with ALL detekt in it.
What do you think? This will allow us to easily distribute detekt with https://brew.sh/, https://chocolatey.org/ and similars. But that's another topic.

We upload the cli-all.jar when releasing (https://github.com/arturbosch/detekt/releases/tag/v1.7.4).
Would this help?
We could also upload the distribution zip as it contains a unix and windows executable.

I think so. I'll check how can we improve this.


Update methods.md

resolves #3549
What are you changing in this pull request and why?
This PR adds the (undocumented!) resource_type method that has been possible for a long, long time.
Reason: we discovered a selection method wasn't documented! So we did 😎
Not done
#3549 mentions that there are no examples for the wildcard method that include wildcard:. This seems okay since the intent in https://github.com/dbt-labs/dbt-core/pull/6599 was to use Unix-style wildcards in conjunction with all the other selection methods.
So we're choosing not to add wildcard: examples in this PR. If needed, they can always be added later.
🎩
Preview

Checklist

[x] Review the Content style guide and About versioning so my content adheres to these guidelines.

@mirnawong1 would you be willing to give this one a look?


setup integration tests

I'm dying to rewrite more internals, but all the manual testing is too time consuming so it's time to figure out what the best way to test highly interactive, drag gesture-y and animated packages like this one.
Anything using jsdom is automatically a no go as it doesn't even try to deal with getBoundingClientRect, scrolling or animations. And cypress, puppeteer, all these e2e solutions... I have yet to find true love but maybe playwright is the one I've been looking for all along? Open for any suggestions but if nobody interjects then I think I'll try playwright 😄

I've been recently trying to write tests using react testing library and it seems impossible to get the bottom sheet to "be visible" to jsdom.
Seeing as most of my app content lives inside a bottom sheet then this makes it impossible to test well, has this been processed at all since December 2020?

We have just come across this issue too.
I came to the repo hoping there would be unit tests that could be referenced but unfortunately there's no tests at all in the codebase :(.

There is a workaround @rjohnsonbade-dcs , I found that you can mock 'react-spring' and bottom sheet relies on that for calculations. Something similar to this should get you 90% of the way...
jest.mock('react-spring', () => {
    const actualReactSpring = jest.requireActual('react-spring');

    return {
        ...actualReactSpring,
        useSpring: (): ReturnType<typeof useSpring> =>
            actualReactSpring.useSpring(() => mockSpring),
    };
});

let mockSpring: {
    y: number;
    ready: number;
    maxHeight: number;
    minSnap: number;
    maxSnap: number;
};
const maxHeight = window.innerHeight;

describe('BottomSheet', () => {
    beforeEach(() => {
        mockSpring = {
            y: maxHeight / 2,
            ready: 1,
            maxHeight,
            minSnap: maxHeight / 2,
            maxSnap: maxHeight,
        };
    });

I set as a let mockSpring (naming beginning with "mock" is important for jest's mock) as I want to be able to set the height and y positions per test. It should be self explanatory but ensure your y value is between the min and max snaps, and ready is 1. This ensures the opacity is set to 1 and then react-testing-library can tell you that it is in the document and visible.
If you want to test the interactions and swiping then you cannot do that as far as I am aware as jsdom will not do animations or layout stuff. So you may need to use something more suitable such as cypress for that but in my tests I want to be able to simply test the content renders in the Bottom Sheet.


Pod identity version update

https://github.com/Azure/aad-pod-identity/releases
https://azure.github.io/aad-pod-identity/changelog/
https://azure.github.io/aad-pod-identity/docs/
It was upadated the pod identity image, but not breking change was defined.

Missing a core security change in the manifest files for mic - Azure/aad-pod-identity#1225 readOnlyRootFilesystem: true.
Otherwise didn't see anything else in the manifest file changes that mattered

Changed, validated diff, and tested again


feat: Group recordings per test file

Description
Group recordings located in /nock to recording files per test file with decoded responses.

Motivation and Context
Growing number of recording files and visibility of recordings relevant to test.

Types of changes

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

Checklist:

[ ] I have read the CONTRIBUTING document.
[ ] I haven't repeated the code. (DRY)
[ ] I have added tests to cover my changes.
[ ] All new and existing tests passed.

@martinalbert I'm not sure about target branch of this PR.


Failed to create session. An unknown server-side error occurred while processing the command. Original error: No observatory URL matching to '/(Observatory listening on |An Observatory debugger and profiler on\s.+\sis available at: |The Dart VM service is listening on )((http|//)[a-zA-Z0-9:/=_-.[]]+)/' was found in the device log. Please make sure the application under test is configured properly according to https://github.com/appium/appium-flutter-driver#usage and that it does not crash on startup.

Hi @KazuCocoa I found this issue : please help, maybe I miss something
=============
Video
https://github.com/user-attachments/assets/bd1b5383-fb99-4964-96c3-54e291ff89c9
Failed to create session. An unknown server-side error occurred while processing the command. Original error: No observatory URL matching to '/(Observatory listening on |An Observatory debugger and profiler on\s.+\sis available at: |The Dart VM service is listening on )((http|//)[a-zA-Z0-9:/=_-.[]]+)/' was found in the device log. Please make sure the application under test is configured properly according to https://github.com/appium/appium-flutter-driver#usage and that it does not crash on startup.
=============
Initialization :
Windows 11
C:\Users\User>appium-doctor
info AppiumDoctor Appium Doctor v.1.16.0
info AppiumDoctor ### Diagnostic for necessary dependencies starting ###
info AppiumDoctor  ✔ The Node.js binary was found at: C:\Program Files\nodejs\node.EXE
info AppiumDoctor  ✔ Node version is 18.3.0
info AppiumDoctor  ✔ ANDROID_HOME is set to: C:\Users\User\AppData\Local\Android\Sdk
info AppiumDoctor  ✔ JAVA_HOME is set to: C:\Program Files\Java\jdk-17.0.5
info AppiumDoctor    Checking adb, android, emulator
info AppiumDoctor      'adb' is in C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe
info AppiumDoctor      'android' is in C:\Users\User\AppData\Local\Android\Sdk\tools\android.bat
info AppiumDoctor      'emulator' is in C:\Users\User\AppData\Local\Android\Sdk\emulator\emulator.exe
info AppiumDoctor  ✔ adb, android, emulator exist: C:\Users\User\AppData\Local\Android\Sdk
info AppiumDoctor  ✔ 'bin' subfolder exists under 'C:\Program Files\Java\jdk-17.0.5'
info AppiumDoctor ### Diagnostic for necessary dependencies completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor ### Diagnostic for optional dependencies starting ###
WARN AppiumDoctor  ✖ opencv4nodejs cannot be found.
WARN AppiumDoctor  ✖ ffmpeg cannot be found
WARN AppiumDoctor  ✖ mjpeg-consumer cannot be found.
WARN AppiumDoctor  ✖ bundletool.jar cannot be found
WARN AppiumDoctor  ✖ gst-launch-1.0.exe and/or gst-inspect-1.0.exe cannot be found
info AppiumDoctor ### Diagnostic for optional dependencies completed, 5 fixes possible. ###
info AppiumDoctor
info AppiumDoctor ### Optional Manual Fixes ###
info AppiumDoctor The configuration can install optionally. Please do the following manually:
WARN AppiumDoctor  ➜ Why opencv4nodejs is needed and how to install it: https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md
WARN AppiumDoctor  ➜ ffmpeg is needed to record screen features. Please read https://www.ffmpeg.org/ to install it
WARN AppiumDoctor  ➜ mjpeg-consumer module is required to use MJPEG-over-HTTP features. Please install it with 'npm i -g mjpeg-consumer'.
WARN AppiumDoctor  ➜ bundletool.jar is used to handle Android App Bundle. Please read http://appium.io/docs/en/writing-running-appium/android/android-appbundle/ to install it. Also consider adding the ".jar" extension into your PATHEXT environment variable in order to fix the problem for Windows
WARN AppiumDoctor  ➜ gst-launch-1.0.exe and gst-inspect-1.0.exe are used to stream the screen of the device under test. Please read https://appium.io/docs/en/writing-running-appium/android/android-screen-streaming/ to install them and for more details
info AppiumDoctor
info AppiumDoctor ###
info AppiumDoctor
info AppiumDoctor Bye! Run appium-doctor again when all manual fixes have been applied!
info AppiumDoctor
=============
detail :
PS C:\Users\User> appium
[Appium] Welcome to Appium v2.11.3
[Appium] The autodetected Appium home path: C:\Users\User.appium
[Appium] Attempting to load driver flutter...
[Appium] Attempting to load driver uiautomator2...
[Appium] Attempting to load driver windows...
[Appium] Requiring driver at C:\Users\User.appium\node_modules\appium-flutter-driver\build\lib\driver.js
[Appium] Requiring driver at C:\Users\User.appium\node_modules\appium-windows-driver\build\index.js
[Appium] Requiring driver at C:\Users\User.appium\node_modules\appium-uiautomator2-driver\build\index.js
[Appium] FlutterDriver has been successfully loaded in 2.023s
[Appium] WindowsDriver has been successfully loaded in 2.023s
[Appium] AndroidUiautomator2Driver has been successfully loaded in 2.023s
[Appium] Attempting to load driver chromium...
[Appium] Requiring driver at C:\Users\User.appium\node_modules\appium-chromium-driver\index.js
[Appium] ChromiumDriver has been successfully loaded in 0.419s
[Appium] Appium REST http interface listener started on http://<IP_ADDRESS>:4723
[Appium] You can provide the following URLs in your client code to connect to this server:
http://192.XXX.XX.1:4723/
http://192.XXX.XX.2:4723/
http://192.XXX.XX.16:4723/
http://<IP_ADDRESS>:4723/ (only accessible from the same host)
[Appium] Available drivers:
[Appium]   -<EMAIL_ADDRESS>(automationName 'Flutter')
[Appium]   -<EMAIL_ADDRESS>(automationName 'UiAutomator2')
[Appium]   -<EMAIL_ADDRESS>(automationName 'Windows')
[Appium]   -<EMAIL_ADDRESS>(automationName 'Chromium')
[Appium] No plugins have been installed. Use the "appium plugin" command to install the one(s) you want to use.
[HTTP] --> POST /session {"capabilities":{"alwaysMatch":{"platformName":"Android","appium:platformVersion":"14","appium:deviceName":"Emulator_test_123","appium:noReset":"true","appium:appActivity":".MainActivity","appium:appPackage":"com.example.github_actions_example","appium:automationName":"flutter","appium:ignoreHiddenApiPolicyError":true,"appium:ensureWebviewsHavePages":true,"appium:nativeWebScreenshot":true,"appium:newCommandTimeout":3600,"appium:connectHardwareKeyboard":true},"firstMatch":[{}]},"desiredCapabilities":{"platformName":"Android","appium:platformVersion":"14","appium:deviceName":"Emulator_test_123","appium:noReset":"true","appium:appActivity":".MainActivity","appium:appPackage":"com.example.github_actions_example","appium:automationName":"flutter","appium:ignoreHiddenApiPolicyError":true,"appium:ensureWebviewsHavePages":true,"appium:nativeWebScreenshot":true,"appium:newCommandTimeout":3600,"appium:connectHardwareKeyboard":true}}
[AppiumDriver@be97] Calling AppiumDriver.createSession() with args: [{"platformName":"Android","appium:platformVersion":"14","appium:deviceName":"Emulator_test_123","appium:noReset":"true","appium:appActivity":".MainActivity","appium:appPackage":"com.example.github_actions_example","appium:automationName":"flutter","appium:ignoreHiddenApiPolicyError":true,"appium:ensureWebviewsHavePages":true,"appium:nativeWebScreenshot":true,"appium:newCommandTimeout":3600,"appium:connectHardwareKeyboard":true},null,{"alwaysMatch":{"platformName":"Android","appium:platformVersion":"14","appium:deviceName":"Emulator_test_123","appium:noReset":"true","appium:appActivity":".MainActivity","appium:appPackage":"com.example.github_actions_example","appium:automationName":"flutter","appium:ignoreHiddenApiPolicyError":true,"appium:ensureWebviewsHavePages":true,"appium:nativeWebScreenshot":true,"appium:newCommandTimeout":3600,"appium:connectHardwareKeyboard":true},"firstMatch":[{}]}]
[AppiumDriver@be97] Event 'newSessionRequested' logged at<PHONE_NUMBER>108 (15:39:25 GMT+0700 (Western Indonesia Time))
[Appium] Attempting to find matching driver for automationName 'flutter' and platformName 'Android'
[Appium] The 'flutter' driver was installed and matched caps.
[Appium] Will require it at C:\Users\User.appium\node_modules\appium-flutter-driver
[Appium] Requiring driver at C:\Users\User.appium\node_modules\appium-flutter-driver\build\lib\driver.js
[AppiumDriver@be97] Appium v2.11.3 creating new FlutterDriver (v2.9.2) session
[AppiumDriver@be97] Checking BaseDriver versions for Appium and FlutterDriver
[AppiumDriver@be97] Appium's BaseDriver version is 9.11.3
[AppiumDriver@be97] FlutterDriver's BaseDriver version is 9.11.3
[FlutterDriver@8431]
[FlutterDriver@8431] Creating session with W3C capabilities: {
"alwaysMatch": {
"platformName": "Android",
"appium:platformVersion": "14",
"appium:deviceName": "Emulator_test_123",
"appium:noReset": "true",
"appium:appActivity": ".MainActivity",
"appium:appPackage": "com.example.github_actions_example",
"appium:automationName": "flutter",
"appium:ignoreHiddenApiPolicyError": true,
"appium:ensureWebviewsHavePages": true,
"appium:nativeWebScreenshot": true,
"appium:newCommandTimeout": 3600,
"appium:connectHardwareKeyboard": true
},
"firstMatch": [
{}
]
}
[FlutterDriver@8431] Capability 'noReset' changed from string to boolean. This may cause unexpected behavior
[FlutterDriver@8431] The following provided capabilities were not recognized by this driver:
[FlutterDriver@8431]   deviceName
[FlutterDriver@8431]   appActivity
[FlutterDriver@8431]   appPackage
[FlutterDriver@8431]   ignoreHiddenApiPolicyError
[FlutterDriver@8431]   ensureWebviewsHavePages
[FlutterDriver@8431]   nativeWebScreenshot
[FlutterDriver@8431]   connectHardwareKeyboard
[505401b8][FlutterDriver@8431] Session created with session id: 505401b8-da19-459c-92ce-3506d5546be0
[505401b8][FlutterDriver@8431] Starting an Android proxy session
[505401b8][AndroidUiautomator2Driver@c92b]
[505401b8][AndroidUiautomator2Driver@c92b] Creating session with W3C capabilities: {
"alwaysMatch": {
"platformName": "Android",
"appium:platformVersion": "14",
"appium:deviceName": "Emulator_test_123",
"appium:noReset": "true",
"appium:appActivity": ".MainActivity",
"appium:appPackage": "com.example.github_actions_example",
"appium:automationName": "flutter",
"appium:ignoreHiddenApiPolicyError": true,
"appium:ensureWebviewsHavePages": true,
"appium:nativeWebScreenshot": true,
"appium:newCommandTimeout": 3600,
"appium:connectHardwareKeyboard": true
},
"firstMatch": [
{}
]
}
[505401b8][AndroidUiautomator2Driver@c92b] Capability 'noReset' changed from string to boolean. This may cause unexpected behavior
[505401b8][AndroidUiautomator2Driver@c92b] The following provided capabilities were not recognized by this driver:
[505401b8][AndroidUiautomator2Driver@c92b]   connectHardwareKeyboard
[b7d99cd8][AndroidUiautomator2Driver@c92b] Session created with session id: b7d99cd8-1517-4fcd-bfed-9ef1ecbb5916
[b7d99cd8][ADB] Found 2 'build-tools' folders under 'C:\Users\User\AppData\Local\Android\Sdk' (newest first):
[b7d99cd8][ADB]     C:\Users\User\AppData\Local\Android\Sdk\build-tools\33.0.0
[b7d99cd8][ADB]     C:\Users\User\AppData\Local\Android\Sdk\build-tools\30.0.3
[b7d99cd8][ADB] Using 'adb.exe' from 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 start-server'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Retrieving device list
[b7d99cd8][ADB] Trying to find connected Android devices
[b7d99cd8][ADB] Getting connected devices
[b7d99cd8][ADB] Connected devices: [{"udid":"emulator-5554","state":"device"}]
[b7d99cd8][AndroidUiautomator2Driver@c92b] Looking for a device with Android '14.0.0'
[b7d99cd8][ADB] Setting device id to emulator-5554
[b7d99cd8][ADB] Getting device platform version
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell getprop ro.build.version.release'
[b7d99cd8][ADB] Current device property 'ro.build.version.release': 14
[b7d99cd8][AndroidUiautomator2Driver@c92b] Using device: emulator-5554
[b7d99cd8][ADB] Using 'adb.exe' from 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 start-server'
[b7d99cd8][ADB] Setting device id to emulator-5554
[b7d99cd8][AndroidUiautomator2Driver@c92b] Starting 'com.example.github_actions_example' directly on the device
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell getprop ro.build.version.sdk'
[b7d99cd8][ADB] Current device property 'ro.build.version.sdk': 34
[b7d99cd8][ADB] Getting device platform version
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell getprop ro.build.version.release'
[b7d99cd8][ADB] Current device property 'ro.build.version.release': 14
[b7d99cd8][ADB] Device API level: 34
[b7d99cd8][AndroidUiautomator2Driver@c92b] Relaxing hidden api policy
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell 'settings put global hidden_api_policy_pre_p_apps 1;settings put global hidden_api_policy_p_apps 1;settings put global hidden_api_policy 1''
[b7d99cd8][AndroidUiautomator2Driver@c92b] No app sent in, not parsing package/activity
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 wait-for-device'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell echo ping'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Pushing settings apk to the device...
[b7d99cd8][ADB] Getting package info for 'io.appium.settings'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys package io.appium.settings'
[b7d99cd8][ADB] Using 'aapt2.exe' from 'C:\Users\User\AppData\Local\Android\Sdk\build-tools\33.0.0\aapt2.exe'
[b7d99cd8][ADB] Reading package manifest: 'C:\Users\User\AppData\Local\Android\Sdk\build-tools\33.0.0\aapt2.exe dump badging C:\Users\User\.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\io.appium.settings\apks\settings_apk-debug.apk'
[b7d99cd8][ADB] The version code of the installed 'io.appium.settings' is greater than the application version code (103 > 98)
[b7d99cd8][ADB] There is no need to downgrade 'io.appium.settings'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys activity services io.appium.settings'
[b7d99cd8][AndroidUiautomator2Driver@c92b] io.appium.settings is already running. There is no need to reset its permissions.
[b7d99cd8][Logcat] Starting logs capture with command: C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 logcat -v threadtime
[b7d99cd8][AndroidUiautomator2Driver@c92b] Forwarding UiAutomator2 Server port 6790 to local port 8229
[b7d99cd8][ADB] Forwarding system: 8229 to device: 6790
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 forward tcp:8229 tcp:6790'
[b7d99cd8][ADB] Getting package info for 'io.appium.uiautomator2.server'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys package io.appium.uiautomator2.server'
[b7d99cd8][ADB] Getting install status for io.appium.uiautomator2.server.test
[b7d99cd8][AndroidUiautomator2Driver@c92b] No app capability. Assuming it is already on the device
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell cmd package list packages'
[b7d99cd8][ADB] Reading package manifest: 'C:\Users\User\AppData\Local\Android\Sdk\build-tools\33.0.0\aapt2.exe dump badging C:\Users\User\.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-v7.0.21.apk'
[b7d99cd8][ADB] 'io.appium.uiautomator2.server.test' is installed
[b7d99cd8][ADB] The version name of the installed 'io.appium.uiautomator2.server' is greater or equal to the application version name ('7.0.21' >= '7.0.21')
[b7d99cd8][AndroidUiautomator2Driver@c92b] Server packages status: [{"installState":"sameVersionInstalled","appPath":"C:\Users\User\.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-v7.0.21.apk","appId":"io.appium.uiautomator2.server"},{"installState":"sameVersionInstalled","appPath":"C:\Users\User\.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-debug-androidTest.apk","appId":"io.appium.uiautomator2.server.test"}]
[b7d99cd8][AndroidUiautomator2Driver@c92b] Server packages are not going to be (re)installed
[b7d99cd8][AndroidUiautomator2Driver@c92b] Waiting up to 30000ms for services to be available
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell pm list instrumentation'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Instrumentation target 'io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner' is available
[b7d99cd8][ADB] Adding packages ["io.appium.settings","io.appium.uiautomator2.server","io.appium.uiautomator2.server.test"] to Doze whitelist
[b7d99cd8][ADB] Got the following command chunks to execute: [["dumpsys","deviceidle","whitelist","+io.appium.settings",";","dumpsys","deviceidle","whitelist","+io.appium.uiautomator2.server",";","dumpsys","deviceidle","whitelist","+io.appium.uiautomator2.server.test",";"]]
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys deviceidle whitelist +io.appium.settings ; dumpsys deviceidle whitelist +io.appium.uiautomator2.server ; dumpsys deviceidle whitelist +io.appium.uiautomator2.server.test ;'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Performing shallow cleanup of automation leftovers
[b7d99cd8][AndroidUiautomator2Driver@c92b] The following obsolete sessions are still running: ["eb1bc555-5e10-4592-adc2-d207c0e6c13e"]
[b7d99cd8][AndroidUiautomator2Driver@c92b] Cleaning up 1 obsolete session
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell am force-stop io.appium.uiautomator2.server'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell am force-stop io.appium.uiautomator2.server.test'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Starting UIAutomator2 server 7.0.21
[b7d99cd8][AndroidUiautomator2Driver@c92b] Using UIAutomator2 server from 'C:\Users\User.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-v7.0.21.apk' and test from 'C:\Users\User.appium\node_modules\appium-flutter-driver\node_modules\appium-uiautomator2-driver\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-debug-androidTest.apk'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Waiting up to 30000ms for UiAutomator2 to be online...
[b7d99cd8][ADB] Creating ADB subprocess with args: ["-P","5037","-s","emulator-5554","shell","am","instrument","-w","-e","disableAnalytics","true","io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner"]
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/status' to command name 'getStatus'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /status] to [GET http://<IP_ADDRESS>:8229/status] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] socket hang up
[b7d99cd8][AndroidUiautomator2Driver@c92b] [Instrumentation]
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/status' to command name 'getStatus'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /status] to [GET http://<IP_ADDRESS>:8229/status] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] socket hang up
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/status' to command name 'getStatus'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /status] to [GET http://<IP_ADDRESS>:8229/status] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"None","value":{"message":"UiAutomator2 Server is ready to accept commands","ready":true}}
[b7d99cd8][AndroidUiautomator2Driver@c92b] The initialization of the instrumentation process took 2136ms
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/session' to command name 'createSession'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [POST /session] to [POST http://<IP_ADDRESS>:8229/session] with body: {"capabilities":{"firstMatch":[{"platformName":"Android","platformVersion":"14","deviceName":"emulator-5554","noReset":true,"appActivity":".MainActivity","appPackage":"com.example.github_actions_example","automationName":"flutter","ignoreHiddenApiPolicyError":true,"ensureWebviewsHavePages":true,"nativeWebScreenshot":true,"newCommandTimeout":3600,"connectHardwareKeyboard":true,"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"platformName":"Android","platformVersion":"14","deviceName":"Emulator_test_123","noReset":true,"appActivity":".MainActivity","appPackage":"com.example.github_actions_example","automationName":"flutter","ignoreHiddenApiPolicyError":true,"ensureWebviewsHavePages":true,"nativeWebScreenshot":true,"newCommandTimeout":3600,"connectHardwareKeyboard":true},"deviceUDID":"emulator-5554"}],"alwaysMatch":{}}}
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"593d02ee-4f74-4f4a-9754-0855b9e2ea0e","value":{"capabilities":{"firstMatch":[{"platformName":"Android","platformVersion":"14","deviceName":"emulator-5554","noReset":true,"appActivity":".MainActivity","appPackage":"com.example.github_actions_example","automationName":"flutter","ignoreHiddenApiPolicyError":true,"ensureWebviewsHavePages":true,"nativeWebScreenshot":true,"newCommandTimeout":3600,"connectHardwareKeyboard":true,"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"platformName":"Android","platformVersion":"14","deviceName":"Emulator_test_123","noReset":true,"appActivity":".MainActivity","appPackage":"com.example.github_actions_example","automationName":"flutter","ignoreHiddenApiPolicyError":true,"ensureWebviewsHavePages":true,"nativeWebScreenshot":true,"newCommandTimeout":3600,"connectHardwareKeyboard":true},"deviceUDID":"emulator-55...
[b7d99cd8][AndroidUiautomator2Driver@c92b] Determined the downstream protocol as 'W3C'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /appium/device/pixel_ratio] to [GET http://<IP_ADDRESS>:8229/session/593d02ee-4f74-4f4a-9754-0855b9e2ea0e/appium/device/pixel_ratio] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/appium/device/system_bars' to command name 'getSystemBars'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /appium/device/system_bars] to [GET http://<IP_ADDRESS>:8229/session/593d02ee-4f74-4f4a-9754-0855b9e2ea0e/appium/device/system_bars] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] Matched '/window/current/size' to command name 'getWindowSize'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /window/current/size] to [GET http://<IP_ADDRESS>:8229/session/593d02ee-4f74-4f4a-9754-0855b9e2ea0e/window/current/size] with no body
[b7d99cd8][AndroidUiautomator2Driver@c92b] Proxying [GET /appium/device/info] to [GET http://<IP_ADDRESS>:8229/session/593d02ee-4f74-4f4a-9754-0855b9e2ea0e/appium/device/info] with no body
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys window'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell dumpsys power'
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"593d02ee-4f74-4f4a-9754-0855b9e2ea0e","value":2.75}
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"593d02ee-4f74-4f4a-9754-0855b9e2ea0e","value":{"height":2280,"width":1080}}
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"593d02ee-4f74-4f4a-9754-0855b9e2ea0e","value":{"statusBar":83}}
[b7d99cd8][AndroidUiautomator2Driver@c92b] Got response with status 200: {"sessionId":"593d02ee-4f74-4f4a-9754-0855b9e2ea0e","value":{"androidId":"0c4366abb8f3e683","apiVersion":"34","bluetooth":{"state":"ON"},"brand":"google","carrierName":"","displayDensity":440,"locale":"en_US","manufacturer":"Google","model":"sdk_gphone64_x86_64","networks":[{"capabilities":{"SSID":null,"linkDownBandwidthKbps":30000,"linkUpstreamBandwidthKbps":12000,"networkCapabilities":"NET_CAPABILITY_NOT_METERED,NET_CAPABILITY_INTERNET,NET_CAPABILITY_NOT_RESTRICTED,NET_CAPABILITY_TRUSTED,NET_CAPABILITY_NOT_VPN,NET_CAPABILITY_VALIDATED,NET_CAPABILITY_NOT_ROAMING,NET_CAPABILITY_FOREGROUND,NET_CAPABILITY_NOT_CONGESTED,NET_CAPABILITY_NOT_SUSPENDED","signalStrength":-50,"transportTypes":"TRANSPORT_WIFI"},"detailedState":"CONNECTED","extraInfo":"","isAvailable":true,"isConnected":true,"isFailover":false,"isRoaming":false,"state":"CONNECTED","subtype":-1,"subtypeName":"","type":1,"typeName":"WIFI"}],"platformVersion":"14","realDisplaySize":"1080x2280","timeZone":"Asia/Bangkok"}}
[b7d99cd8][AndroidUiautomator2Driver@c92b] Screen already unlocked, doing nothing
[b7d99cd8][AndroidUiautomator2Driver@c92b] Starting 'com.example.github_actions_example/.MainActivity and waiting for 'com.example.github_actions_example/.MainActivity'
[b7d99cd8][ADB] Getting IDs of all 'com.example.github_actions_example' processes
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell 'pgrep --help; echo $?''
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell pgrep -f ([[:blank:]]|^)com.example.github_actions_example([[:blank:]]|$)'
[b7d99cd8][ADB] Running 'C:\Users\User\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s emulator-5554 shell am start -W -n com.example.github_actions_example/.MainActivity -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000'
[b7d99cd8][FlutterDriver@8431] Deleting Flutter Driver session
[b7d99cd8][FlutterDriver@8431] Cleanup the port forward
[b7d99cd8][AppiumDriver@be97] Event 'newSessionStarted' logged at<PHONE_NUMBER>912 (15:39:29 GMT+0700 (Western Indonesia Time))
[b7d99cd8][AppiumDriver@be97] Encountered internal error running command: Error: No observatory URL matching to '/(Observatory listening on |An Observatory debugger and profiler on\s.+\sis available at: |The Dart VM service is listening on )((http|//)[a-zA-Z0-9:/=_-.[]]+)/' was found in the device log. Please make sure the application under test is configured properly according to https://github.com/appium/appium-flutter-driver#usage and that it does not crash on startup.
at FlutterDriver.getObservatoryWsUri (C:\Users\User.appium\node_modules\appium-flutter-driver\lib\sessions\android.ts:85:13)
at FlutterDriver.connectAndroidSession (C:\Users\User.appium\node_modules\appium-flutter-driver\lib\sessions\android.ts:48:28)
at FlutterDriver.startAndroidSession (C:\Users\User.appium\node_modules\appium-flutter-driver\lib\sessions\android.ts:38:5)
at FlutterDriver.createSession (C:\Users\User.appium\node_modules\appium-flutter-driver\lib\sessions\session.ts:45:43)
at AppiumDriver.createSession (C:\Users\User\AppData\Roaming\npm\node_modules\appium\lib\appium.js:731:35)
[b7d99cd8][HTTP] <-- POST /session 500 4815 ms - 1378

Could you share the adb logcat as well?
Removing "appium:noReset": "true" and adding "appium:forceAppLaunch": true would also help to ensure the app process restart.

Please make sure the target app process stops before starting the target app with the above.

https://github.com/appium/appium-flutter-driver?tab=readme-ov-file#several-ways-to-start-an-application

still issue :
#video :
https://github.com/user-attachments/assets/09bbd483-6d90-4912-a975-7f91b8b8114e
#detail ADB Logcat :
https://gist.github.com/DianPermana/032b3f1114b4e1cd672ec440d8e1485c

Thanks, but the attached link was not adb logcat. You would need to get it via https://github.com/appium/appium-uiautomator2-driver?tab=readme-ov-file#mobile-startlogsbroadcast or https://developer.android.com/studio/debug/logcat

ups,  @sorry @KazuCocoa . here's the update :
video
https://github.com/user-attachments/assets/71cf6457-501c-4e9a-9274-024ad2d6fd13
adb logcat :
https://gist.github.com/DianPermana/29f6b9031f0859e3a0a5091dd8126eeb
appium Log :
https://gist.github.com/DianPermana/60b012f6ce1b02ace9c397e708e99f3c

The shared logcat didn't have any observatory URL, which started with http:// and matched with the given error message, so the error itself was expected.
Have you started the installed app before the automation? Maybe Flutter doesn't log observatory URL for apps which are already running in the background. The app also needs to be debuggable app.
https://github.com/appium/appium-flutter-driver?tab=readme-ov-file#several-ways-to-start-an-application

Please make sure the target app process stops before starting the target app with the above.


Support having multiple examples for a schema in our API documentation generator.

Currently our API documentation generator only handles having a single example in a schema and does not handle having multiple examples for a schema. While the OpenAPI specification provides a perfectly good standard way to encode multiple examples: https://spec.openapis.org/oas/v3.0.3#example-object.
CZO thread
This is most clearly apparent in our documentation of error responses, where we use oneOf to document multiple error responses that often have the same schema like the two examples below. Instead, we should update our API documentation generator to support parsing and rendering examples.
UserNotAuthorizedError:
{
    "code": "BAD_REQUEST",
    "msg": "User not authorized for this query",
    "result": "error"
}

InvalidApiKeyError:
{
    "code": "INVALID_API_KEY",
    "msg": "Invalid API key",
    "result": "error"
}

Example from current zerver/openapi/zulip.yaml:
      responses:
        "400":
          description: |
            Bad request.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: "#/components/schemas/InvalidApiKeyError"
                  - $ref: "#/components/schemas/UserNotAuthorizedError"

Above example that instead has multiple examples for the single schema:
      responses:
        "400":
          description: |
            Bad request.
          content:
            application/json:
              schema:
                  $ref: "#/components/schemas/CodedErrorSchema"
              examples:
                  invalid-api-key-error
                      $ref: "#/components/examples/InvalidApiKeyError"
                  user-not-authorized-error
                      $ref: "#/components/examples/UserNotAuthorizedError"

Hey, So the possible solution for this is to only change the current api structure for 400 status code to the multiple examples structure provided by open api ?

No, the solution involves updating our API documentation generator to handle both example and examples, both of which are in the OpenAPI spec. Currently, we only handle example.


No data for United States

This API appears to work in Europe, Asia, but there is no data for anywhere within the United States, resulting in a 404.

Oops, this is my bad! I forgot to put a negative sign for the longitude.

Glad it worked out! Unfortunately for most locations outside of Germany the DWD only supplies forecasts (as part of MOSMIX), and no current or historical observations.


AMD GPU device not found, but GPU test passed

System Info:
OS: Ubuntu 16.04
CUDA version: None
GPU: Advanced Micro Devices, Inc. [AMD/ATI] Richland [Radeon HD 8650G]
TensorFlow Build: Source
I ran the bazel gpu test with the command:
bazel test -c opt  --verbose_failures --test_timeout 3600 //tensorflow/python/kernel_tests:basic_gpu_test
which it passed.
However, I am trying to run someone else's code found here:
https://github.com/cysmith/neural-style-tf
command I run is:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
which gives me the error:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot assign a device for operation 'Variable': Operation was explicitly assigned to /device:GPU:0 but available devices are [ /job:localhost/replica:0/task:0/device:CPU:0 ]. Make sure the device specification refers to a valid device.
[[Node: Variable = VariableV2container="", dtype=DT_FLOAT, shape=[1,512,512,3], shared_name="", _device="/device:GPU:0"]]
How should I change the code to get it to work with my AMD GPU?

The latest OpenCL for TensorFlow work now lives here https://github.com/codeplaysoftware/tensorflow You can follow the guide here https://developer.codeplay.com/products/computecpp/ce/guides/tensorflow-guide/tensorflow-generic-setup


Add Euclidean Algorithm in Emojicode.

Here wo go again ^^

@thbwd Thanks again for the review! You rock!


Falco pod could not start on 5.8.13 kernel

Hi All,
I could not run the falco pod on my kubernetes cluster.
My nodes kernal version is 5.8.13.
Is there any workaround to solve this issue
Following is the Logs from Falco pod
* Setting up /usr/src links from host
* Running falco-driver-loader with: driver=module, compile=yes, download=yes
* Unloading falco module, if present
* Trying to dkms install falco module with GCC /usr/bin/gcc
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc)
* Trying to dkms install falco module with GCC /usr/bin/gcc-8
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-8)
* Trying to dkms install falco module with GCC /usr/bin/gcc-6
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-6)
* Trying to dkms install falco module with GCC /usr/bin/gcc-5
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-5)
* Trying to load a system falco driver, if present
* Trying to find locally a prebuilt falco module for kernel 5.8.13-1.el7.elrepo.x86_64, if present
* Trying to download prebuilt module from https://dl.bintray.com/falcosecurity/driver/2aa88dcf6243982697811df4c1b484bcbe9488a2/falco_centos_5.8.13-1.el7.elrepo.x86_64_1.ko
curl: (22) The requested URL returned error: 404 Not Found
Download failed, consider compiling your own falco module and loading it or getting in touch with the Falco community
Wed Oct  7 09:48:58 2020: Falco version 0.26.1-1+8b56360 (driver version 2aa88dcf6243982697811df4c1b484bcbe9488a2)
Wed Oct  7 09:48:58 2020: Falco initialized with configuration file /etc/falco/falco.yaml
Wed Oct  7 09:48:58 2020: Loading rules from file /etc/falco/falco_rules.yaml:
Wed Oct  7 09:48:59 2020: Loading rules from file /etc/falco/falco_rules.local.yaml:
Wed Oct  7 09:49:00 2020: Unable to load the driver.
Wed Oct  7 09:49:00 2020: Runtime error: error opening device /host/dev/falco0. Make sure you have root credentials and that the falco module is loaded.. Exiting.
[root@punoptkubmtr01 falco]# wget https://dl.bintray.com/falcosecurity/driver/2aa88dcf6243982697811df4c1b484bcbe9488a2/falco_centos_5.8.13-1.el7.elrepo.x86_64_1.ko
--2020-10-07 05:51:47--  https://dl.bintray.com/falcosecurity/driver/2aa88dcf6243982697811df4c1b484bcbe9488a2/falco_centos_5.8.13-1.el7.elrepo.x86_64_1.ko
Resolving dl.bintray.com (dl.bintray.com)... <IP_ADDRESS>, <IP_ADDRESS>, <IP_ADDRESS>, ...
Connecting to dl.bintray.com (dl.bintray.com)|<IP_ADDRESS>|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2020-10-07 05:51:48 ERROR 404: Not Found.

[root@punoptkubmtr01 falco]# kubectl logs -f falco1-wsc6x
* Setting up /usr/src links from host
* Running falco-driver-loader with: driver=module, compile=yes, download=yes
* Unloading falco module, if present
* Trying to dkms install falco module with GCC /usr/bin/gcc
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc)
* Trying to dkms install falco module with GCC /usr/bin/gcc-8
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-8)
* Trying to dkms install falco module with GCC /usr/bin/gcc-6
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-6)
* Trying to dkms install falco module with GCC /usr/bin/gcc-5
DIRECTIVE: MAKE="'/tmp/falco-dkms-make'"
* Running dkms build failed, couldn't find /var/lib/dkms/falco/2aa88dcf6243982697811df4c1b484bcbe9488a2/build/make.log (with GCC /usr/bin/gcc-5)
* Trying to load a system falco driver, if present
* Trying to find locally a prebuilt falco module for kernel 5.8.13-1.el7.elrepo.x86_64, if present
* Trying to download prebuilt module from https://dl.bintray.com/falcosecurity/driver/2aa88dcf6243982697811df4c1b484bcbe9488a2/falco_centos_5.8.13-1.el7.elrepo.x86_64_1.ko
curl: (22) The requested URL returned error: 404 Not Found
Download failed, consider compiling your own falco module and loading it or getting in touch with the Falco community
Wed Oct  7 10:17:42 2020: Falco version 0.26.1-1+8b56360 (driver version 2aa88dcf6243982697811df4c1b484bcbe9488a2)
Wed Oct  7 10:17:42 2020: Falco initialized with configuration file /etc/falco/falco.yaml
Wed Oct  7 10:17:42 2020: Loading rules from file /etc/falco/falco_rules.yaml:
Wed Oct  7 10:17:43 2020: Loading rules from file /etc/falco/falco_rules.local.yaml:
Wed Oct  7 10:17:44 2020: Unable to load the driver.
Wed Oct  7 10:17:44 2020: Runtime error: error opening device /host/dev/falco0. Make sure you have root credentials and that the falco module is loaded.. Exiting.

How to reproduce it
Run the falco pod on 5.8.3 version kernel
Expected behaviour
Pod should start without any issue

Same issue on 5.8.0-050800-generic

It look like the same issue as #1390 and #1432

@kannanvr do you have the kernel headers on your host machine?

On CentOS it can be done with yum -y install kernel-devel-$(uname -r)

Opened an issue on driverkit to get the prebuilt drivers working on newer CentOS kernels. https://github.com/falcosecurity/falco/issues/1433

What gcc version was the kernel compiled with? (See /proc/version)
Looks like you're using the docker image, which is missing gcc-9 and gcc-10
You can try building an image from Dockerfile in #1344 to see if it works

What gcc version was the kernel compiled with? (See /proc/version)
Looks like you're using the docker image, which is missing gcc-9 and gcc-10
You can try building an image from Dockerfile in #1344 to see if it works

The ubuntu docker build gives the same output. Problem is still exist.

Issues go stale after 90d of inactivity.
Mark the issue as fresh with /remove-lifecycle stale.
Stale issues rot after an additional 30d of inactivity and eventually close.
If this issue is safe to close now please do so with /close.
Provide feedback via https://github.com/falcosecurity/community.
/lifecycle stale

Stale issues rot after 30d of inactivity.
Mark the issue as fresh with /remove-lifecycle rotten.
Rotten issues close after an additional 30d of inactivity.
If this issue is safe to close now please do so with /close.
Provide feedback via https://github.com/falcosecurity/community.
/lifecycle rotten

Rotten issues close after 30d of inactivity.
Reopen the issue with /reopen.
Mark the issue as fresh with /remove-lifecycle rotten.
Provide feedback via https://github.com/falcosecurity/community.
/close

@poiana: Closing this issue.

In response to this:

Rotten issues close after 30d of inactivity.
Reopen the issue with /reopen.
Mark the issue as fresh with /remove-lifecycle rotten.
Provide feedback via https://github.com/falcosecurity/community.
/close

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.


add built-in kafka mirror-maker integration

moved to https://github.com/kudobuilder/operators/issues/146


[SPARK-48583][SQL][TESTS] Replace deprecated classes and methods of commons-io called in Spark

What changes were proposed in this pull request?

This pr replaces deprecated classes and methods of commons-io  called in Spark：

writeStringToFile(final File file, final String data) -> writeStringToFile(final File file, final String data, final Charset charset)
CountingInputStream -> BoundedInputStream

Why are the changes needed?

Clean up deprecated API usage.
Does this PR introduce any user-facing change?

No.
How was this patch tested?

Passed related test cases in UDFXPathUtilSuite and XmlSuite.
Was this patch authored or co-authored using generative AI tooling?

No.

Is this the only case related to commons-io?

Is this the only case related to commons-io?

For FileUtils#writeStringToFile, this is the only one left. Do we need to fix all other deprecated methods of commons-io called in Spark?

Yes, if there are other cases related to commons-io, let's fix them together all in one

@wayneguow seems there are other cases related to commons-io in org.apache.spark.sql.execution.datasources.xml.XmlRecordReader

@LuciferYang Thank you for pointing that out. I'll fix this and other left in a batch.

@LuciferYang I made a double check, the following commons-io classes are used in Spark:

org.apache.commons.io.filefilter.TrueFileFilter
org.apache.commons.io.FilenameUtils
org.apache.commons.io.FileUtils
org.apache.commons.io.input.CountingInputStream
org.apache.commons.io.IOUtils
org.apache.commons.io.output.ByteArrayOutputStream
org.apache.commons.io.output.TeeOutputStream

In the build log, only FileUtils and CountingInputStream appear with deprecated prompts.

Merged into master for Spark 4.0. Thanks @wayneguow


fix file handler lookups with pseudo parameters

If the file lookup includes a reference with :: in it (e.g.
AWS::Region), the regex currently doesn't extract it.

@phobologic good thought -- I've added a new commit expanding this lookups' test to explicitly test what should & shouldn't match.


instanceid returned as providerID as incorrect format

While attempting to use the cloud controller manager I ran into some complications on what to use as the instance names. @gujingit was kind enough to show me the documentation on what is expected by the provider. For simplicity, I'll paste it here:
Update kubelet info with provider id info and restart kubelet: You should provide --hostname-override=${REGION_ID}.${INSTANCE_ID} --provider-id=${REGION_ID}.${INSTANCE_ID} arguments in all of your kubelet unit file. The format is ${REGION_ID}.${INSTANCE_ID}. See kubelet.service for more details.

When setting the instance name in this format, the code changes this providerID value to an instance.instanceID here:
https://github.com/openshift/cloud-provider-alibaba-cloud/blob/master/cloud-controller-manager/alicloud.go#L523

I'll attempt to explain the long call chain in detail.
nodeName=<region>.<instanceId>
The calls proceed as follows:
doAddCloudNode then calls
getProviderID then calls
cloudprovider.GetInstanceProviderID then calls
instances.InstanceID then calls
c.climgr.Instances().findInstancesByNodeName which calls
s.findInstanceByProviderID which takes the nodeName and converts it to a providerID. At this point providerID=<region>.<instanceID>.  We then call nodeFromProviderID.
nodeFromProviderID This expects the providerID to be in the format of alicloud://<region>.<instanceID> or <region>.<instanceID>. This returns region, instanceid as separate values. These will be used to fetch the instance.
We then fetch the instance by using the region and the instanceID here:
s.getInstances
We then return the instance from findInstanceByProviderID to findInstanceByNodeName to
c.climgr.Instances().findInstancesByNodeName who returns the instance.InstanceId
This instance.InstanceId is no longer in the desired providerId format of the <region>.<instanceId> that is expected.  The providerID is now set to the value of instance.InstaneID (e.g. i-0xii1bq9ydmbcpwxbfse). We then return to GetInstanceProviderID which prepends alicloud:// to the providerID.
ProviderID is now set to alicloud://<instanceId>. Notice there is no <REGION> in the providerID because it was created from instance.InstanceID. Continuing on...
The next call is that is made upon returning the original getProviderID is the call to getCloudInstance using the providerID set to alicloud://<instanceID>.
This calls ins.ListInstances with the providerID set to alicloud://<instanceID>.
ListInstances now calls nodeFromProviderID which is nodeFromProviderID with the providerID set to alicloud://<instanceID>. This function fails here because it does not include the region as part of the providerID.

cc @elmiko @JoelSpeed
ProviderID format gets changed from <region>.<instanceid> to alicloud://<instanceID> which removes the <region>. This causes the nodeFromProviderID to fail.


proxy integration tests

Create a test suite for just proxy.
Files for tests: *.spec-proxy.ts and a spec/jasmine-proxy.json
Proxy server: spec/proxy/

Should make requests against local http server via header, environment variables, etc.
Should make requests against github and cloud storage for both gecko driver, chromedriver, selenium server, and ie server driver.
Should have a test against npm api to use the proxy.


Add more DNS configuration fields to ServiceEntry when resolution: DNS

(This is used to request new product features, please visit https://github.com/istio/istio/discussions for questions on using Istio)
Describe the feature request
Currently, when we use resolution: DNS ServiceEntry, there is little way to control the DNS lookup behavior. As mentioned by https://istio.io/latest/docs/ops/configuration/traffic-management/dns/, if we need to reduce the DNS server overhead, we have to:

reduce the usage of resolution: DNS ServiceEntry
reduce the TTL in domain's DNS record

However, in the real world, if we need to use DNS to connect a domain, it's probable that the team maintains the Istio doesn't own the domain. Therefore we can't reduce the TTL of the DNS record from the source.
Moreover, sometimes we need to configure a separate DNS failure refresh rate of a domain, to archive a better fail-over.
Envoy's CDS supports configuring DNS refresh rate per cluster, so what we need is to provide an equivalent configuration in Istio.
Describe alternatives you've considered
Use EnvoyFilter to modify the cluster resource generated from the ServiceEntry.
Affected product area (please put an X in all that apply)
[ ] Ambient
[ ] Docs
[ ] Dual Stack
[ ] Installation
[x] Networking
[ ] Performance and Scalability
[ ] Extensions and Telemetry
[ ] Security
[ ] Test and Release
[ ] User Experience
[ ] Developer Infrastructure
Affected features (please put an X in all that apply)
[ ] Multi Cluster
[ ] Virtual Machine
[ ] Multi Control Plane
Additional context

does https://github.com/envoyproxy/envoy/issues/20562,which is in progress, meet your needs? It's a bit orthogonal but the same goal of reduced DNS load

@howardjohn
Thanks for your suggestion!
However, "reduce the DNS server overhead" is just an example of customizing DNS configuration. What we actually want to do is the opposite - reduce the DNS TTL to get a faster fail-over. We also plan to configure a higher failure refresh rate so the down of the DNS server won't affect the proxy immediately.


Webull is not remembering my device after MFA authentication

hello, I am having trouble staying logged in my webull account. My login attempt fails when I use this command.
Attempt 1:
wb = webull()
login_attempt =<EMAIL_ADDRESS>'pa$$w0rd')
print(login_attempt)

output: {'msg': 'login failed.', 'traceId': '62bb81743a047a95c73daf5', 'code': 'app.device.control'}

I can only login webull by doing MFA with auth code but the auth code only last 30 minutes. It seems to me when I use the auth code it will login but doesn't remember the device. So when I go and try the first attempt again it fails. Even though I already authenticated myself.
Attempt 2:
<EMAIL_ADDRESS>then typing,
wb = webull()
login_attempt =<EMAIL_ADDRESS>'pa$$w0rd', 'my_computer', 'auth_code_here')
print(login_attempt)

output: {'msg': 'login success.'}

I see.
I am guessing is part of Webull's API specification.
After some trial and errors, I recommend to keep the AccessToken and RefreshToken saved and use those to access your account later, RefreshToken will be refreshed if you use the API within 90 days, so ideally you will never need to login again.

90 days of not logging in sounds good to me. Can you give me a small template to follow when using this RefreshToken function?

credentials_webull.json should contain the credential data that you first login from wb.login(), and you should save new refresh token to credentials_webull.json after you successfully call refresh_login()
file = open('credentials_webull.json', 'r')
data = json.load(file)
file.close()

webull._refresh_token = data['refreshToken']
webull._access_token = data['accessToken']
webull._token_expire = data['tokenExpireTime']
webull._uuid = data['uuid']

n_data = webull.refresh_login()
data['refreshToken'] = n_data['refreshToken']
data['accessToken'] = n_data['accessToken']
data['tokenExpireTime'] = n_data['tokenExpireTime']

file = open('credentials_webull.json', 'w')
json.dump(data, file)
file.close()

webull.get_account_id()
webull.get_trade_token(webull_token)
webull._account_id = webull.get_account_id()

account = webull.get_account()

When I call get_security, I receive:
[{'questionId': '1001', 'questionName': "What's your birth month and day?"}]
But then I receive the following response from login after adding security question id and answer:
{'msg': 'user security question expired', 'traceId': '7f2720b72b81406194f65993d9b8e0a0', 'code': 'user.security.question.expired'}

@zhujiacn
Hi there, can you give this a try?
print(check_security(username='', question_id='1001', question_answer='0101'))  #change username to your username, 0101 to your birthday
What does this give you?
If you login to app.webull.com from a new computer, what security question do you get?

I figured it out. using the following endpoint will get me correct security question:
def get_security(self, username, account_type, region_code, event) :
    return f'{self.base_userfintech_url}/user/risk/getSecurityQuestion?account={username}&accountType={account_type}&event={event}&v={datetime.now().timestamp()*1000}'

thank you! Interesting... I don't see the v variable in my account.
Let me monitor more.

merged
https://github.com/tedchou12/webull/pull/165


Style footer

Refer to comps:
https://www.dropbox.com/s/b4vcpak4dvqjux8/Home.png?dl=0
https://www.dropbox.com/s/86f7walarvqrp2a/Search Results.png?dl=0

Specs are here: https://www.dropbox.com/sh/fcm6w8d2rkrct64/AACyIGU8wq2LC5Sd8MSAzo_ua?dl=0
Holler if anything is janky

Links:
ABOUT THIS SITE

Code for Gainesville: http://c4gnv.com/
Code for America: https://www.codeforamerica.org/
City of Gainesville: http://www.cityofgainesville.org

GET ASSISTANCE

Department of Doing: No link yet
Business USA: https://business.usa.gov/
Center for Innovation & Economic Development: http://www.sfcollege.edu/cied/
Gainesville Technology Entrepreneurship Center: http://www.sfcollege.edu/cied/incubator/index.php?section=gtec
Center for Entrepreneurship & Innovation: http://warrington.ufl.edu/centers/cei/
Small Business Development Center: https://www.sba.gov/tools/local-assistance/sbdc
SCORE: https://www.score.org
Gainesville Enterprise Zone Map: http://www.cityofgainesville.org/Portals/0/plan/docs/GIS_Enterprise_Zone.pdf
Gainesville Innovation Zone: http://www.cityofgainesville.org/EconomicDevelopmentandInnovation/InnovationEconomy.aspx
SBA Loan Program: https://www.sba.gov/loans-grants/see-what-sba-offers/sba-loan-programs

THIRD COLUMN

Github: https://github.com/c4gnv/business-web/
contribution guidelines: https://github.com/c4gnv/business-web/blob/develop/CONTRIBUTING.md
Disclaimer: ?
Privacy Policy: ?
Accessibility: ?

Maybe @gotoplanb or @samanthawolfe can direct you to the Department of Doing, Disclaimer, Privacy Policy and Accessibility links?

In progress on the footer branch. Will await to complete when I get the remaining links.

Continued in #112


Issues with accuracy in change history

Currently many inaccuracies in change history (new, not migrated) around which user is making changes. Can provide examples as needed.

@bchiaruttini is this still an issue. Do we have any recent examples?

Not consistent issue. Asked staff for examples if they see them and will reopen as needed.


Cargo build failed to parse the edition key

Hello
i'm trying to build the demo project,
I got the following error when i running "cargo build"
warning: Patch `polling v2.1.0 (https://github.com/esp-rs-compat/polling#260dded7)` was not used in the crate graph.
Check that the patched package version and available features are compatible
with the dependency requirements. If the patch has a different version from
what is locked in the Cargo.lock file, run `cargo update` to use the new
version. This may also occur with an optional dependency that is not enabled.
error: failed to download `esp-idf-sys v0.29.1`

Caused by:
  unable to get packages from source

Caused by:
  failed to parse manifest at `/root/.cargo/registry/src/github.com-1ecc6299db9ec823/esp-idf-sys-0.29.1/Cargo.toml`

Caused by:
  failed to parse the `edition` key

Caused by:
  supported edition values are `2015` or `2018`, but `2021` is unknown

I'm not a rust and cargo guru but i thook it maybe came from the following change here : https://github.com/esp-rs/esp-idf-sys/commit/acb86d2b47c33a52e059cb5a0de02159532f9957#diff-2e9d962a08321605940b5a657135052fbcef87b5e360662bb527c96d9a615542
Edition of the cargo.toml change from 2018 to 2021
Can you help me ?
Thanks
Simon

You have to use latest rust nightly (works for esp32c3 only) or the Rust toolchain provided by Espressif. The demo readme contains information how to do both.

@simon0356 Did you try with rust compiler as explained above ^^^?

Yes it compile like a charm when i follow your instruction.
I have not flashed the ESP yet.
Sorry, i was following instruction from a deprecated article  (https://kerkour.com/rust-on-esp32/ and https://kerkour.com/compile-rust-for-esp32-xtensa-on-raspberry-pi-aarch64/ )
Thanks :)


Added a semicolon to a for statement

Added a semicolon to a for statement as it was missing.

Learn Build status updates of commit 8085f35:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

docs-ref-conceptual/azure-cli-learn-bash.md
:white_check_mark:Succeeded
View

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the learn.microsoft.com contributor guidesPost your question in the Learn support channel


State why SHA update needs developer confirmation

In addition to specifying what needs to be done, I think it would be wise to specify why.
At the moment the Handbrake malware incident is fresh in people's minds but at some point in future this will be just another checklist item that someone wants to get done and the significance could easily be missed.
It might even be worth highlighting this further or providing more explanation but this is a starting point.
The wording I have used is based on the message in the audit tool: https://github.com/Homebrew/brew/commit/473bdadbcd0f87fdeda98f73b25bb47a14221281#diff-bd0ba063e0f8aeb1f4a3997d34914c0cR755
If there’s a checkbox you can’t complete for any reason, that's okay, just explain in detail why you weren’t able to do so.
After making all changes to the cask:

[ ] brew cask audit --download {{cask_file}} is error-free. (Not applicable. Documentation change only.)
[ ] brew cask style --fix {{cask_file}} reports no offenses. (Not applicable. Documentation change only.)
[ ] The commit message includes the cask’s name and version. (Not applicable. Documentation change only.)

Additionally, if updating a cask:

[ ] If the sha256 changed but the version didn’t,
provide public confirmation by the developer: {{link}}

Additionally, if adding a new cask:

[ ] Named the cask according to the token reference.
[ ] brew cask install {{cask_file}} worked successfully.
[ ] brew cask uninstall {{cask_file}} worked successfully.
[ ] Checked there are no open pull requests for the same cask.
[ ] Checked the cask was not already refused in closed issues.
[ ] Checked the cask is submitted to the correct repo.

(As a related example of the need for clarifying the "why", see: https://github.com/Homebrew/homebrew-core/pull/13492#issuecomment-300991777.)


Update react-autowhatever to v10.1.2

Update react-autowhatever to v10.1.2
This PR patch updates the react-autowhatever package for accessibility improvements in OSX mentioned here in much greater detail, but mainly moves some aria tags to the container instead of the input, following the ARIA 1.1 specification.
I've also updated the faililng tests that were occuring because of these changes.

@moroshko No problem, thank you!


[Snyk] Security upgrade python from 3.6 to 3.13.0rc2

Snyk has created this PR to fix 3 vulnerabilities in the dockerfile dependencies of this project.
Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.
Snyk changed the following file(s):

components/kubeflow/launcher/Dockerfile

We recommend upgrading to python:3.13.0rc2, as this image has only 187 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.
Vulnerabilities that will be fixed with an upgrade:

Issue
Score

Out-of-bounds Write SNYK-DEBIAN11-GLIBC-5927133
  829

Out-of-bounds Write SNYK-DEBIAN11-GLIBC-5927133
  829

Out-of-bounds Write SNYK-DEBIAN11-GLIBC-5927133
  829

Out-of-bounds Write SNYK-DEBIAN11-LIBWEBP-5893094
  829

CVE-2023-44487 SNYK-DEBIAN11-NGHTTP2-5953384
  829

[!IMPORTANT]

Check the changes in this PR to ensure they won't cause issues with your project.
Max score is 1000. Note that the real score may have changed since the PR was raised.
This PR was automatically created by Snyk using the credentials of a real user.

Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.
For more information:
🧐 View latest project report
📜 Customise PR templates
🛠 Adjust project settings
📚 Read about Snyk's upgrade logic

Learn how to fix vulnerabilities with free interactive lessons:
🦉 Learn about vulnerability in an interactive lesson of Snyk Learn.

A set of new images have been built to help with testing out this PR:
API Server: quay.io/opendatahub/ds-pipelines-api-server:pr-110
DSP DRIVER: quay.io/opendatahub/ds-pipelines-driver:pr-110
DSP LAUNCHER: quay.io/opendatahub/ds-pipelines-launcher:pr-110
Persistence Agent: quay.io/opendatahub/ds-pipelines-persistenceagent:pr-110
Scheduled Workflow Manager: quay.io/opendatahub/ds-pipelines-scheduledworkflow:pr-110
MLMD Server: quay.io/opendatahub/mlmd-grpc-server:latest
MLMD Envoy Proxy: registry.redhat.io/openshift-service-mesh/proxyv2-rhel8:2.3.9-2
UI: quay.io/opendatahub/ds-pipelines-frontend:pr-110

An OCP cluster where you are logged in as cluster admin is required.
The Data Science Pipelines team recommends testing this using the Data Science Pipelines Operator.  Check here for more information on using the DSPO.
To use and deploy a DSP stack with these images (assuming the DSPO is deployed), first save the following YAML to a file named dspa.pr-110.yaml:
apiVersion: datasciencepipelinesapplications.opendatahub.io/v1alpha1
kind: DataSciencePipelinesApplication
metadata:
  name: pr-110
spec:
  dspVersion: v2
  apiServer:
    image: "quay.io/opendatahub/ds-pipelines-api-server:pr-110"
    argoDriverImage: "quay.io/opendatahub/ds-pipelines-driver:pr-110"
    argoLauncherImage: "quay.io/opendatahub/ds-pipelines-launcher:pr-110"
  persistenceAgent:
    image: "quay.io/opendatahub/ds-pipelines-persistenceagent:pr-110"
  scheduledWorkflow:
    image: "quay.io/opendatahub/ds-pipelines-scheduledworkflow:pr-110"
  mlmd:
    deploy: true  # Optional component
    grpc:
      image: "quay.io/opendatahub/mlmd-grpc-server:latest"
    envoy:
      image: "registry.redhat.io/openshift-service-mesh/proxyv2-rhel8:2.3.9-2"
  mlpipelineUI:
    deploy: true  # Optional component
    image: "quay.io/opendatahub/ds-pipelines-frontend:pr-110"
  objectStorage:
    minio:
      deploy: true
      image: 'quay.io/opendatahub/minio:RELEASE.2019-08-14T20-37-41Z-license-compliance'

Then run the following:
cd $(mktemp -d)
git clone git@github.com:opendatahub-io/data-science-pipelines.git
cd data-science-pipelines/
git fetch origin pull/110/head
git checkout -b pullrequest 334c7493efe24f1298e951dc0e9a4a9ea2f005f4
oc apply -f dspa.pr-110.yaml

More instructions here on how to deploy and test a Data Science Pipelines Application.


[v1.7] Reduce operator memory usage when CNP status updates are disabled

The code for handling CNP status updates from other nodes via the
kvstore was previously not covered by the same option that enables this
functionality in the cilium-agent daemon. As such, this could cause the
logic to run, including goroutines for each CNP, in scenarios where this
logic is not in use.
Improve memory usage by disabling this functionality when it is disabled.
Backports #13135
$ for pr in 13135; do contrib/backporting/set-labels.py 13135 done v1.7; done

Why are the changes to operator/ccnp_event.go from #13135 not backported?

@pchaigno fixed. Initially I thought CCNP wasn't present in v1.7, but I was mistaken. I've updated it to match the other PR.

test-backport-1.7

test-upstream-k8s

restart-ginkgo

test-upstream-k8s

CI has passed on master (modulo some CI infra issues), and mostly passed except one specific test in one run in the previous attempt here. Also passed managed etcd test here, so should be good to merge.
https://jenkins.cilium.io/job/Cilium-PR-Ginkgo-Tests-K8s/3503/execution/node/242/log/
I'll reword the commit to pull in the master sha for reference, push & merge.


Revise CONTRIBUTING.md contents

Signed-off-by: woofyzhao<EMAIL_ADDRESS>Issue Number: close #14031
What's Changed:

Explicitly mention protoc as one of the prerequisites to build tikv in doc.
Fix some typo in doc.
Fix dead hyper links.

Release note
NONE

/release-note-none

/check-issue-triage-complete

/cc @3pointer
/cc @BusyJay
/cc @zz-jason

Only markdown doc is modified but Jekins CI keeps failing, is this normal?

/merge


Contrasting Scrollbar

I was about to add the /t and +cmd to open in new tab features, but you added em 🥲

making the manifest compatible with firefox

Seems like this makes some progress toward completing #6 as well


Re-write CodeCommit instructions

Provides new step by step guidance specifically for 2nd line drills, to minimise the risk of mistakes being made
Removes 'repository-mirroring.html' file which contained useful information that was easy to miss. Consolidates that info into this main doc instead.
Sets up redirect from 'repository-mirroring.html' to 'github-unavailable.html' in case people have it bookmarked.
Greatly simplifies the actual steps involved in pushing content to CodeCommit.
Greatly simplifies the workflow around release tagging, on the basis that GitHub outages or sensitive PRs are short-lived in nature, so can be reasonably managed with hotfix branches that can then be merged upstream later and automatically given their own release tag as normal.

I'll hold off merging until @AgaDufrat and @catalinailie have had a chance to follow these instructions in a drill this shift 👍


readme refresh

Beef up the readme, add cephfs and verification sections.
Drive-by blackening.

Failing tests are unrelated to this PR; pulling this doc change in and addressing failures in subsequent commit.


Safe lookup

In the case there are two nodes and one of them is a client node, if the not-client node goes down, the client node will throw an exception here:
https://github.com/upringjs/swim-hashring/blob/6d0a92dc958ce45b4623bad50afd761e72e8dfc9/hashring.js#L213
Because it's searching the key peer on and undefined object.
I'm having some trouble to test this, any suggestion?
Do we agree on the fix?

@mcollina I would like to do it, but I'm having some issue to reproduce the error outside of a project which I'm working on.
This is what I've done so far, but is not working (the close callback is never called):
test('gracefully shutdown a client if there are no more node in the ring', t => {
  t.plan(1)

  const peer = hashring({
    joinTimeout: 1000
  })

  peer.on('up', () => {
    console.log('peer up')
    const client = hashring({
      joinTimeout: 1000,
      client: true,
      base: [peer.whoami()]
    })

    client.on('up', () => {
      console.log('client up')
      peer.close(() => {
        console.log('peer closed')
      })
    })
  })
})