[$1000] Web - User details tooltip in workspace members list is different

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

Action Performed:

Go to any workspace
Go to members
Hover over the members icon

Expected Result:
Tooltip should show display name in bold and login in gray
Actual Result:
Only login is shown in gray, no display name
Workaround:
Unknown
Platforms:

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

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

Version Number: 1.3.35-5
Reproducible in staging?: y
Reproducible in production?: y
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos: Any additional supporting documentation
https://github.com/Expensify/App/assets/93399543/437075f5-6f14-41d6-a587-2844acc84037
https://github.com/Expensify/App/assets/93399543/871c9eb7-f3cb-437b-b172-a790cfa9be5e
Expensify/Expensify Issue URL:
Issue reported by: @chiragxarora
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1688199036733839
View all open jobs on GitHub
Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~01c11ba48600bf6205
Upwork Job ID:<PHONE_NUMBER>947235840
Last Price Increase: 2023-07-04

Proposal
Please re-state the problem that we are trying to solve in this issue.
user details tooltip in workspace members list is different, display name is not present
What is the root cause of that problem?
Root cause of the issue is the missing accountID in the icons prop of <OptionRow/> here
https://github.com/Expensify/App/blob/c0ece67e0edcb725d8f72cf57cd40d98854c552c/src/pages/workspace/WorkspaceMembersPage.js#L323-L340
The icons prop is passed to <OptionRow/> which passes the data in icons prop to <MultipleAvatar/> component which finally renders the <UserDetailsTooltip/>
<UserDetaisTooltip/> fetches the display name using the accountID which it expects in its icons prop.
https://github.com/Expensify/App/blob/c0ece67e0edcb725d8f72cf57cd40d98854c552c/src/components/MultipleAvatars.js#L83-L83
So when we don't pass accountID in the icons prop of <OptionRow/>, missing id field finally lands in <UserDetailsTooltip/> because of which it fails to render the display name.
What changes do you think we should make in order to solve the problem?
As explained above, icons prop expects an id field which carries accountID for that member, so we need to provide that.
We are using item object to render details of each member which already has the accountID stored in it. We are also using that accountID to fetch the avatar of that member. So along with that, we can pass it to icons prop too to solve our issue.
<OptionRow
    boldStyle
    isDisabled={disabled}
    option={{
        text: props.formatPhoneNumber(item.displayName),
        alternateText: props.formatPhoneNumber(item.login),
        participantsList: [item],
        icons: [
            {
                id: item.accountID,
                source: UserUtils.getAvatar(item.avatar, item.accountID),
                name: item.login,
                type: CONST.ICON_TYPE_AVATAR,
            },
        ],
        keyForList: item.accountID,
    }}
    onSelectRow={() => toggleUser(item.accountID, item.pendingAction)}
/>

Results
https://github.com/chiragxarora/pdf-download/assets/54641656/89ba8cef-29a2-46aa-9957-632d6a8c17ad

What alternative solutions did you explore? (Optional)
None

Proposal
Please re-state the problem that we are trying to solve in this issue.
The tooltip in the WorkspaceMembersPage is missing displayName
What is the root cause of that problem?
Coming from the PR https://github.com/Expensify/App/pull/21696 I included the fix of searching by ID but the actual issue is not sending the id, that is part of the migration to accountID, the real issue here is the inconsistency between different pages and components. My original issue was in the search. Even though sending the id is a workaround the root cause is not reusing the code that already exists for this getIcons in the ReportUtils class. Hence, avoiding the anti-pattern of duplicating code. In the future if we want to change how the icon information is loaded we only have to change a single place.
What changes do you think we should make in order to solve the problem?
Remove the manual creation of the icons in WorkspaceMembersPage
https://github.com/Expensify/App/blob/7e908b17565e7bf659309f4b4d95141e70094ab9/src/pages/workspace/WorkspaceMembersPage.js#L323-L340
And reuse the util code in ReportUtils
icons: ReportUtils.getIcons(undefined, props.personalDetails, UserUtils.getAvatar(item.avatar, item.accountID), false, item.login, item.accountID),

Video of solution working:
New Recording - 4_7_2023, 19_37_59.webm
What alternative solutions did you explore? (Optional)
Just proposing to avoid code duplication no other alternatives explored.

Yeah it is actually an old method. I recommend deep diving into similar components for a more valuable proposal, Also I don't think you can just take another proposal and use it as an alternative solution. I'll just let the C+ decide which proposal is better/simpler.

How is it an expansion if it is my own solution from https://github.com/Expensify/App/pull/21696 😂? We even have different RCA. Again, I think it is in the hands of the C+ in charge 😀

Also **RCA is missing accountID
That is where you are wrong.

Man, check my PR, you were literally one blame away from seeing that I changed the line of getDisplayNameForParticipant. The root cause as I mentioned in https://github.com/Expensify/App/pull/21696 is the migration that occurred in https://github.com/Expensify/App/pull/21026 here everything changed from login to accountID! That is the real root cause: duplicated code + refactor. Since that change, this issue started happening. That's why BZ List is so important, you didn't even find the original PR that introduced the issue before proposing the solution.
If you had really read my proposal you would see that it enters the first if, because here there is no report.

 Including additional parameters isn't the solution if we want to unify it we should send the personalDetail object and get out the information there or create an specific method like getIconWithPersonalDetail but I'm thinking about the future. If it is a method at least you know that you have to check all places where the method is called, that is the main added value.  Without it you would have to manually search all places where information is sent to MultipleAvatars, even though it is a workaround it is easier for future developers that touch the code! Just thinking about future coding and devs. Maybe it can be another util or maybe it can be adding the additional parameter if things are not going to change for that component but since recently there was the update of UserDetailsTooltip I'm afraid it can happen again.
You are right the idea is to force it so it is clear whenever someone touches again this part of the code.
I'm just claiming it is a different solution than yours with different purposes, as you have stated, nothing else. You were right regarding my RCA that's why I updated it! Thanks for pointing that out.

@rushatgabhane can we please get reviews?

The problem is with MultipleAvatars. For example DisplayNames has an implementation that receives displayNamesWithToolTips via params:
https://github.com/Expensify/App/blob/c0ece67e0edcb725d8f72cf57cd40d98854c552c/src/components/OptionRow.js#L213-L216
On the other side MultipleAvatars only receives the icons prop, which doesn't even contain the displayName and builds the information manually here:
https://github.com/Expensify/App/blob/c0ece67e0edcb725d8f72cf57cd40d98854c552c/src/components/MultipleAvatars.js#L72-L87
We could definitely send the displayName via props on the icon but it would also require a lot of changes for consistency in points like: SearchPage state, ReportParticipantsPage, BaseReactionList or we could do something like
displayName: props.icons[0].displayName || ReportUtils.getDisplayNameForParticipant(props.icons[0].id),

For retrocompat Still the main idea is to unify the way icons are built through the different instances of OptionRow ideally with a util method to ensure future changes in the behavior of tooltips.
@rushatgabhane

@rushatgabhane let's get an update today!

Hey there! So @chiragxarora was the first to propose! But his proposal was just sending the ID to MultipleAvatars. I discovered the real root cause and explained why it was required in other instances. He then created a new proposal based on our discussion but it was my idea to reuse a Util in the different places to avoid future issues he later proposed using a different util instead of just the id. To be clear. I just think this is unnecessary we should assign @chiragxarora and move over 😂 I just wanted to fix the real issue from its root!
Cc @rushatgabhane

Thanks for the update @chiragxarora! Just commented on the offending PR, they caused a regression! Regarding RCA It is this commit As explained in my proposal. The component started failing after the migration from login to accountId. I like your idea of the util better and it is important to include in this PR that all the calls in OptionRow should use the same method to generate the user icons! @amyevans whenever you can give it a check please assign @chiragxarora who proposed first and improved his solution as expected.

@rushatgabhane can we get a reply on the above comment today? Thank you!!

Copying over from slack - https://expensify.slack.com/archives/C01GTK53T8Q/p1689152366088119?thread_ts=1689077322.531679&cid=C01GTK53T8Q

Reviewing today!

@rushatgabhane @chiragxarora mind recapping where we're at here?

@chiragxarora what action is pending?

@chiragxarora we can pay for the reporting bonus! Have you applied?

bump @chiragxarora

@dylanexpensify this bug was fixed elsewhere, can you pay the $250 reporting bonus and then we can close this out?

Yes! @chiragxarora will pay out for both

Done!


Rename "And" Function to "FunctionChain"

To avoid confusion with the And predicate, the And function should be renamed to FunctionChain.

Merged into develop


World hopping

Hello.
I wanted to request for option for world hopping in friends list screen. if i right click friends name I would like to see option to: Hop to world.

Duplicate of #1617
You can give a thumbs up to that issue to show you are also interested in it


change message reports to error reports

where relevant

this issue has been resolved. it is possible that messaging exists in the model where error messaging would be more helpful, but the methods that spurred this issue now have error messaging


Update to openssl 1.0.2e.

New upstream release today. Issues seem to be a weakness with DHE and a couple of crash bugs. https://openssl.org/news/secadv/20151203.txt
r? @edunham

:+1:


Is there any way to return job id

hi
Is there anyway to return salt job id , say for example when highstating a server though salt api and return job id for that ,

Unfortunately at the moment no, the API doesn't return the jid for the call this library is making.
I will be implementing the POST /minion API call soon for these cases where you want to start something without waiting for the results immediately.

For reference: https://docs.saltstack.com/en/latest/ref/netapi/all/salt.netapi.rest_cherrypy.html#salt.netapi.rest_cherrypy.app.Minions.POST

This will be implemented in #19


python311Packages.dvc-objects: 3.0.3 -> 3.0.6

Automatic update generated by nixpkgs-update tools. This update was made based on information from passthru.updateScript.
meta.description for python311Packages.dvc-objects is: Library for DVC objects
meta.homepage for python311Packages.dvc-objects is: https://github.com/iterative/dvc-objects
meta.changelog for python311Packages.dvc-objects is: https://github.com/iterative/dvc-objects/releases/tag/3.0.6
Updates performed

Ran passthru.UpdateScript

To inspect upstream changes
Impact
Checks done

built on NixOS
The tests defined in passthru.tests, if any, passed
found 3.0.6 with grep in /nix/store/md4kiacgd93bsgwhgdpsbkq1wqsvk26z-python3.11-dvc-objects-3.0.6
found 3.0.6 in filename of file in /nix/store/md4kiacgd93bsgwhgdpsbkq1wqsvk26z-python3.11-dvc-objects-3.0.6

Rebuild report (if merged into master) (click to expand)

15 total rebuild path(s)

15 package rebuild(s)

First fifty rebuilds by attrpath
dvc
dvc-with-remotes
python311Packages.dvc
python311Packages.dvc-azure
python311Packages.dvc-data
python311Packages.dvc-gdrive
python311Packages.dvc-gs
python311Packages.dvc-hdfs
python311Packages.dvc-http
python311Packages.dvc-objects
python311Packages.dvc-s3
python311Packages.dvc-ssh
python311Packages.dvclive
python311Packages.gto
python311Packages.scmrepo

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/md4kiacgd93bsgwhgdpsbkq1wqsvk26z-python3.11-dvc-objects-3.0.6 \
  --option binary-caches 'https://cache.nixos.org/ https://nix-community.cachix.org/' \
  --option trusted-public-keys '
  nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(The Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A python311Packages.dvc-objects https://github.com/r-ryantm/nixpkgs/archive/cd6b5abb53539c6e552640798922cc7b76ea919e.tar.gz

Or:
nix build github:r-ryantm/nixpkgs/cd6b5abb53539c6e552640798922cc7b76ea919e#python311Packages.dvc-objects

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/md4kiacgd93bsgwhgdpsbkq1wqsvk26z-python3.11-dvc-objects-3.0.6
ls -la /nix/store/md4kiacgd93bsgwhgdpsbkq1wqsvk26z-python3.11-dvc-objects-3.0.6/bin

Pre-merge build results
We have automatically built all packages that will get rebuilt due to
this change.
This gives evidence on whether the upgrade will break dependent packages.
Note sometimes packages show up as failed to build independent of the
change, simply because they are already broken on the target branch.
Result of nixpkgs-review run on x86_64-linux 1

14 packages built:

dvc (python311Packages.dvc)
dvc-with-remotes
python311Packages.dvc-azure
python311Packages.dvc-data
python311Packages.dvc-gdrive
python311Packages.dvc-gs
python311Packages.dvc-hdfs
python311Packages.dvc-http
python311Packages.dvc-objects
python311Packages.dvc-s3
python311Packages.dvc-ssh
python311Packages.dvclive
python311Packages.gto
python311Packages.scmrepo

Maintainer pings
cc @fabaff for testing.

@ofborg build dvc-with-remotes

shortuuid seems to have been dropped: https://github.com/iterative/dvc-objects/compare/3.0.3...3.0.6

Oh, even 5.1.0 is out...


Cannot assert Path content when using Jimfs file system.

Jimfs is an in memory file system from google for testing purposes. Its implementation of java.nio.Path.toFile() throws an UnsupportedOperationException. This is actually completely legit (implementations are not required to support toFile() according to javadoc)
The assertion on a Path's contents, however, appears to use toFile() to get to the contents. So my assertion on this file fails.
Path's assertions should not rely on java.nio.Path.toFile()

java.lang.UnsupportedOperationException
	at com.google.common.jimfs.JimfsPath.toFile(JimfsPath.java:397)
	at org.assertj.core.internal.Paths.assertHasContent(Paths.java:277)
	at org.assertj.core.api.AbstractPathAssert.hasContent(AbstractPathAssert.java:257)
    ...

As a workaround I read the contents of the file myself, and use an assertion on String equality.

hmm ... sneaky one ! I have to agree, we should probably use Path URI to read the content.

Use Path URI, or simply java.nio.Files.newInputStream(Path)

Using Path URI may also not be a good idea. I've tried doing this using Jimfs and got : "unknown protocol: jimfs".
So better to use java.nio.Files.newInputStream(Path) I think.

Thanks Pascal !

I'll give it a whirl after my holidays, in the mean time, thanks a lot!


Process VT100 data

Windows Terminal version
1.13.11432.0
Windows build number
10.0.22000.739
Other Software
No response
Steps to reproduce
My program(test5.exe) loads the file 'tmp2.txt' and prints each character, At the end of the file, The terminal processing characters '\1b[34;1H' incorrect, It doesn't jump to line 34, Line 33 jumped to.   And some characters of line 33 were overwritten.

Codes of the test:
#include <Windows.h>
#include <stdio.h>
#include <assert.h>

int main(int argc, char* argv[])
{
    DWORD  settings;
    HANDLE hConsole;
    bool success;

    //output
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    assert(hConsole != INVALID_HANDLE_VALUE);
    success = GetConsoleMode(hConsole, &settings);
    assert(success);
    settings |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    success = SetConsoleMode(hConsole, settings);
    assert(success);

    FILE* pf;
    int err = fopen_s(&pf, "e:/tmp2.txt", "rb");
    assert(!err);

    do
    {
        unsigned ch;
        int ret = fread(&ch, 1, 1, pf);
        if (ret <= 0)
            break;
        printf("%c", ch);
    } while (true);
    fclose(pf);
    return 0;
}

Expected Behavior
Output characters to line 34.
Actual Behavior
Output characters to line 33.

So there's https://terminalnuget.blob.core.windows.net/packages/TerminalSequences.html, which lists what WT supports. However it has been awhile since that document was generated and number of changes have been made since then. It would be nice if a new document was generated to list the current support of WT. For example, none of the OSC sequences are even listed such as hyperlink support.  WT also now supports DRCS but that isn't listed on the document due to it's age. Adding the ConEmu custom sequences currently supported to that list would also be helpful.

Can you share the test file as well? I have a couple questions that it could answer 😄

I'm assuming your code page is 936, but it would help if you could confirm that, because that might be a factor (just type chcp at the cmd prompt to see the active code page).
But I suspect the problem is that your screen height was set to 32 lines or less when you ran the test, because that's the only way I can reproduce the output you're seeing.
The \1b[34;1H escape sequence is trying to move to line 34, but if there aren't 34 lines on the screen it's just going to move down as far as it can go. And at that point in time, the last line is 5 涓洰褰?67,369,209,856 鍙敤瀛楄妭, so that's why that line is overwritten.

I'm assuming your code page is 936, but it would help if you could confirm that, because that might be a factor (just type chcp at the cmd prompt to see the active code page).
But I suspect the problem is that your screen height was set to 32 lines or less when you ran the test, because that's the only way I can reproduce the output you're seeing.
The \1b[34;1H escape sequence is trying to move to line 34, but if there aren't 34 lines on the screen it's just going to move down as far as it can go. And at that point in time, the last line is 5 涓洰褰?67,369,209,856 鍙敤瀛楄妭, so that's why that line is overwritten.

Yes, You are right. I ran the test codes(a little changes for the codes) on Ubuntu 20.04, , It's not pretty also.

In fact, 'tmp2.txt' is the output of ConPTY typing some commands after executing 'cmd.exe'.
The output looks likely not good for the test codes:
#include <Windows.h>
#include <stdio.h>
#include <assert.h>
#include <string>
#include <memory>

int main(int argc, char* argv[])
{

    HPCON hPC = 0;
    PROCESS_INFORMATION pi = {0};
    HANDLE outPipeOurSide = nullptr, inPipeOurSide = nullptr;
    HANDLE outPipePseudoConsoleSide = nullptr, inPipePseudoConsoleSide = nullptr;
    int err;
    bool success;

    // create pty
    CreatePipe(&inPipePseudoConsoleSide, &inPipeOurSide, NULL, 0);
    CreatePipe(&outPipeOurSide, &outPipePseudoConsoleSide, NULL, 0);

    err = CreatePseudoConsole(COORD{ 800, 600 }, inPipePseudoConsoleSide, outPipePseudoConsoleSide, 0, &hPC);
    assert(err == S_OK);

    STARTUPINFOEXW  si;
    memset(&si, 0, sizeof(si));
    si.StartupInfo.cb = sizeof(STARTUPINFOEXW);

    size_t size;
    InitializeProcThreadAttributeList(NULL, 1, 0, &size);
    si.lpAttributeList = reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(new BYTE[size]);
    success = InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, (PSIZE_T)&size);
    assert(success);

    success = UpdateProcThreadAttribute(
        si.lpAttributeList,
        0,
        PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,
        hPC,
        sizeof(hPC),
        NULL,
        NULL);
    assert(success);

    std::wstring commandline = L"cmd.exe";
    std::unique_ptr<wchar_t> bufCommandline(new wchar_t[commandline.length() + 1]);
    memcpy(bufCommandline.get(), commandline.c_str(), (commandline.length() + 1) * sizeof(wchar_t));
    success = CreateProcessW(
        nullptr,
        bufCommandline.get(),
        nullptr,
        nullptr,
        TRUE,
        EXTENDED_STARTUPINFO_PRESENT,
        nullptr,
        nullptr,
        &si.StartupInfo,
        &pi);

    assert(success);
    DeleteProcThreadAttributeList(si.lpAttributeList);

    //type command
    std::string cmdListDir = "dir\r\n";
    DWORD l;
    success = WriteFile(inPipeOurSide, cmdListDir.c_str(), cmdListDir.length(), &l, nullptr);
    assert(success && l == cmdListDir.length());

    success = WriteFile(inPipeOurSide, cmdListDir.c_str(), cmdListDir.length(), &l, nullptr);
    assert(success && l == cmdListDir.length());

    DWORD  settings;
    HANDLE hConsole;

    //change code page
    system("chcp  65001 > nul");    // utf-8

    //print output
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    assert(hConsole != INVALID_HANDLE_VALUE);
    success = GetConsoleMode(hConsole, &settings);
    assert(success);
    settings |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    success = SetConsoleMode(hConsole, settings);
    assert(success);

    const int BUF_LEN = 4096;
    std::unique_ptr<char> buf(new char[BUF_LEN]);
    do
    {
        DWORD n = 0;
        success = PeekNamedPipe(outPipeOurSide, nullptr, 0, nullptr, &n, nullptr);
        assert(success);

        if (n)
        {
            if (n > BUF_LEN)
                n = BUF_LEN;

            DWORD l;
            success = ReadFile(outPipeOurSide, buf.get(), n, &l, nullptr);
            assert(success);

            for (int i = 0; i < l; i ++)
                printf("%c", buf.get()[i]);
        }
    } while (true);

    CloseHandle(pi.hProcess);

    CloseHandle(outPipeOurSide);
    CloseHandle(inPipeOurSide);
    CloseHandle(outPipePseudoConsoleSide);
    CloseHandle(inPipePseudoConsoleSide);

    ClosePseudoConsole(hPC);
    return 0;
}

I tried to  simulate  the above test and ran the PTY on Linux, print the output on Windows,  It's looks every good.

I don't know what I missed.

Yea I mean, this definitely just looks like this was ConPTY output that was recorded at one buffer size, and then replayed at another. Theoretically, conpty should be a bit more resistant to something like that, it could maybe output something a bit more...
Hmm. Y'know, I'm pretty confident ConPTY actually should emit \r\n's at the end of lines, rather that positioning the cursor manually. At least in the case here we probably should... Hmm.
I wonder if this is just because conpty is moving two lines down. Because it's not just "on to the next line", we instead choose to optimize, and send the  instead of \r\n\r\n. You can see that other places too, like  near the top.
I suppose it actually always makes sense to optimize out "move two lines down" into nl/cr pairs. Heck, even 3 lines is equally optimal, and more literal. I wonder if there's anything horrifying that would regress if we did that.

For OP's sake: You'll probably have better results making sure that any verbatim conpty output is replayed in a terminal window of the exact same dimensions. ConPTY isn't really meant to be replayed. It's more designed to be used interactively.


Tooltip unused var; Nub outerWidth

Removed unused variable. Fixed nubWidth using outerHeight instead of outerWidth.  Fortunately most of the time they are equal.

Another good one! Thanks!


Create blank view state fix

Fixed a small issue with the createBlankViewState. The view flags were being set incorrectly, which caused the renderMode and the grid flags to be stuck as default.

Just adding a link in this pr, so we remember to come back aand update this when we bump our core ver when this is released. https://github.com/imodeljs/imodeljs/pull/964


Documentation

TSP-API Docs

Codecov Report

:exclamation: No coverage uploaded for pull request base (main@a9fec3c). Click here to learn what that means.
The diff coverage is n/a.

@@           Coverage Diff           @@
##             main       #3   +/-   ##
=======================================
  Coverage        ?   74.44%
=======================================
  Files           ?        6
  Lines           ?       90
  Branches        ?        6
=======================================
  Hits            ?       67
  Misses          ?       18
  Partials        ?        5

Continue to review full report at Codecov.

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


How to run two models at the same time on android?

Hello, I really need help
I need to collect the coordinates of the points of both hands and face from one frame. I have combined the code to search for face points and hand points.
Now I have two FaceLandmarkerHelper and HandLandmarkerHelper files in my project. Nothing has changed in them, except the name of the inherited LandmarkerListener functions: onError, onResults, onEmpty. Now it's onErrorFace/onErrorHand, onResultsFace/onResultsHand, onEmptyFace/onEmptHand.
In the CameraFragment, I similarly divided the variables into hands and face: imageAnalyzer, backgroundExecutor. And added a variable handLandmarkerHelper, faceLandmarkerHelper. The class itself inherits from HandLandmarkerHelper.LandmarkerListener и FaceLandmarkerHelper.LandmarkerListener.
All separated variables have duplicated code.
Declaring variables:
private lateinit var handLandmarkerHelper: HandLandmarkerHelper
private lateinit var faceLandmarkerHelper: FaceLandmarkerHelper

private val viewModel: MainViewModel by activityViewModels()
private var preview: Preview? = null

private var handIimageAnalyzer: ImageAnalysis? = null
private var faceImageAnalyzer: ImageAnalysis? = null

private var camera: Camera? = null
private var cameraProvider: ProcessCameraProvider? = null
private var cameraFacing = CameraSelector.LENS_FACING_FRONT

private lateinit var handBackgroundExecutor: ExecutorService
private lateinit var faceBackgroundExecutor: ExecutorService

In the function onViewCreated:
    super.onViewCreated(view, savedInstanceState)

    // Initialize our background executor
    backgroundExecutor = Executors.newSingleThreadExecutor()
    faceBackgroundExecutor = Executors.newSingleThreadExecutor()

    // Wait for the views to be properly laid out
    fragmentCameraBinding.viewFinder.post {
        // Set up the camera and its use cases
        setUpCamera() // метод setUpCamera текущего класса
    }

    // Create the HandLandmarkerHelper that will handle the inference
    handBackgroundExecutor.execute {
        handLandmarkerHelper = HandLandmarkerHelper(
            context = requireContext(),
            runningMode = RunningMode.LIVE_STREAM,
            minHandDetectionConfidence = viewModel.currentMinHandDetectionConfidence,
            minHandTrackingConfidence = viewModel.currentMinHandTrackingConfidence,
            minHandPresenceConfidence = viewModel.currentMinHandPresenceConfidence,
            maxNumHands = viewModel.currentMaxHands,
            currentDelegate = viewModel.currentDelegate,
            handLandmarkerHelperListener = this
        )
    }
    faceBackgroundExecutor.execute {
        faceLandmarkerHelper = FaceLandmarkerHelper(
            context = requireContext(),
            runningMode = RunningMode.LIVE_STREAM,
            minFaceDetectionConfidence = viewModel.currentMinFaceDetectionConfidence,
            minFaceTrackingConfidence = viewModel.currentMinFaceTrackingConfidence,
            minFacePresenceConfidence = viewModel.currentMinFacePresenceConfidence,
            maxNumFaces = viewModel.currentMaxFaces,
            currentDelegate = viewModel.currentDelegate,
            faceLandmarkerHelperListener = this
        )
    }

Part of the function bindCameraUseCases:
    // ImageAnalysis. Using RGBA 8888 to match how our models work
    handImageAnalyzer =
        ImageAnalysis.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            // The analyzer can then be assigned to the instance
            .also {
                it.setAnalyzer(handBackgroundExecutor) { image ->
                    detectHand(image)
                }
            }

    faceImageAnalyzer =
        ImageAnalysis.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            // The analyzer can then be assigned to the instance
            .also {
                it.setAnalyzer(faceBackgroundExecutor) { image ->
                    detectFace(image)
                }
            }

    // Must unbind the use-cases before rebinding them
    cameraProvider.unbindAll()

Is it possible to pass two analyzers to bindToLifcycle?  Continuation of the function bindCameraUseCases:
    try {
        // A variable number of use-cases can be passed here -
        // camera provides access to CameraControl & CameraInfo
        camera = cameraProvider.bindToLifecycle(
            this, cameraSelector, preview, handImageAnalyzer (or faceImageAnalyzer)
        )

        // Attach the viewfinder's surface provider to preview use case
        preview?.setSurfaceProvider(fragmentCameraBinding.viewFinder.surfaceProvider)
    } catch (exc: Exception) {
        Log.e(TAG, "Use case binding failed", exc)
    }

Or maybe somehow combine both analyzers in one?
imageAnalyzer = handImageAnalyzer + faceImageAnalyzer
If you create one imageAnalyzer and one backgroundExecutor, then in this code:
    imageAnalyzer =
        ImageAnalysis.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            // The analyzer can then be assigned to the instance
            .also {
                it.setAnalyzer(backgroundExecutor) { image ->
                    detectFace(image)
                }
                it.setAnalyzer(backgroundExecutor) { image ->
                    detectHand(image)
                }
            }

the latter method will prevail (now detectHand)

So I haven't tried this, but I'm curious if you can pass the original image into the results method for face detection, then rather than doing the callback immediately, call hand detection on that image to combine the information into one overall object before returning.
That said, that's a gigantic pain and terrible user experience. I just messaged our relevant eng team to find out if we're working on a combined holistic API like we did with the legacy MP solution. I think there's a solid value there and hopefully I have an answer soon.

Alright got confirmation - holistic is on a todo list for converting to the current MediaPipe Solutions framework, but I can't really give a timeline unfortunately. I'm really hoping the chaining through results idea works, otherwise this will be easier to do later in the developer preview stage. Sorry about that!


Setting debuggerAddress

Hello
Is it possible to set chromeOptions.debuggerAddress ?  We need to launch our app outside of ChromeDriver so we can set custom Chromium command options.
Thanks for the great tool

Is it possible to set chromeOptions.debuggerAddress ?

You can set the host and port via https://github.com/electron/spectron#new-applicationoptions
Is that what you are looking for?
Do you have an example of the command line option usage?

Hello Kevin
Thank you for the quick response.
I created PR for the change I was referring to.   It's for setting debuggerAddress (https://sites.google.com/a/chromium.org/chromedriver/capabilities) so our app can be lauched outside of ChromeDriver, even on a different machine.
Thanks


Should OHIF Viewer version be clarified?

Should the OHIF Viewer version be clarified for compatibility reasons?

Hi @arturojain
I have tried with version<EMAIL_ADDRESS>onwards.
Previous versions I have not tested the compatibility.


feat: Support python version

Description
Currently the python version is fixed at https://github.com/tensorchord/envd/blob/main/pkg/lang/ir/system.go#L114
Related: https://github.com/tensorchord/envd/pull/567

Message from the maintainers:
Love this enhancement proposal? Give it a 👍. We prioritise the proposals with the most 👍.

BTW, installing Python through apt is not a good practice.

https://pythonspeed.com/articles/official-python-docker-image/
https://pythonspeed.com/articles/importerror-docker/

BTW, installing Python through apt is not a good practice.

https://pythonspeed.com/articles/official-python-docker-image/
https://pythonspeed.com/articles/importerror-docker/

Could you please explain more about it? I did not find why not to use apt to install python in these two articles.

Could you please explain more about it? I did not find why not to use apt to install python in these two articles.

apt source is not the latest one

https://github.com/tensorchord/envd/issues/580#issuecomment-1178835413  is still 3.8.10 while the latest one is 3.8.13, check https://www.python.org/downloads/

https://frostming.com/2022/03-27/python-on-debian/  apt source is special

Maybe we can use conda to manage python in the envd environment. We create a conda env in every envd image fs, and use this env to launch the shell program. Users always use conda python instead of the system python.

I think in most cases, conda env manager is a enough solution.

https://github.com/tensorchord/envd/pull/602 solved this problem in most cases. Maybe more documentation needed.

conda is a good solution, but conda's environment solving speed is horrable. Maybe we can also support mamba or micromamba

It is a good idea to use mamba because I used it too.
IMO, we'd better add a extra option for user to use. conda is popular at least for our users.


Call setComponent globally once with elementui and work everywhere

Hi,
First, thank you for all the hard work. This module really saved a lot of my time and effort in development.
I saw the element-ui demo and I was wondering if there is any way I can do FormSchema.setComponent('form', 'el-form')... globally so that I don't need to repeat this code in every component that requires a form. What would be the best practices? Thanks again.

Yes, calling FormSchema.setComponent() globally let you customize rendering for all form-schema instances. If all your forms have the same rendering, you should make one global call.

Hi, sorry I was not being clear about the question. I was not sure how to do the implementation of calling globally. Could you give me an example? From what I read from example and document, it seems that I need to call this function in every component that I want to use the form.

Define your global calls in the main.js file


xiaomi aqara sensors unavailable

Home Assistant release with the issue:
0.95.4
Last working Home Assistant release (if known):
0.94
Operating environment (Hass.io/Docker/Windows/etc.):
hassio docker
Component/platform:
xiaomi aqara
Description of problem:
Xiaomi aqara sensors become unavailable after 2  hours, that was a previous issue and in 0.95.4 it appear again, no logs
Problem-relevant configuration.yaml entries and (fill out even if it seems unimportant):

Traceback (if applicable):

Additional information:

You need routers that hold Xiaomi devices. This is a known issue with xiaomi sensors and there is nothing that we can do about it from a coding perspective.

You need to be more specific: what kind of sensor? Aquara has a few types of sensors.
2nd, if there are no logs and there's nothing in the logs (enable debug logging, see https://www.home-assistant.io/components/logger/) when you press a button on the device, that means the Xiaomi has fell off the network, because xiaomi suxx. See https://community.hubitat.com/t/xiaomi-devices-are-they-pairing-staying-connected-for-you/623 for explanation.
It is not an issue in ZHA or Zigpy.

Confirming issue.
My Mijia button (round one) switch became unavailable after upgrade from 0.94.3 to 0.95.4.
When I try to add it again, appears 2 found enities with NWK 0x9532, 0xa55c, but I cannot find it in the list afterwards. When I delete and add it again - it never appears in the list of devices.
Don't know how to get it back to work.
Quirk: zhaquirks.xiaomi.mija.sensor_switch.MijaButton
In entities I see just "zha.lumi_lumi_sensor_switch" but not the switch entity.
Pairing log
LUMI lumi.sensor_switch: started configuration
LUMI lumi.sensor_switch: channel: zdo-LUMI lumi.sensor_switch_ZDO async_configure stage succeeded
0x95e0:1:0x0000: finished channel configuration
0x95e0:1:0x0001: finished channel configuration
LUMI lumi.sensor_switch: channel: power-0x95e0:1:0x0001 async_configure stage succeeded
0x95e0:1:0x0005: finished channel configuration
LUMI lumi.sensor_switch: channel: scenes-0x95e0:1:0x0005 async_configure stage succeeded
0x95e0:1:0x0006: finished channel configuration
LUMI lumi.sensor_switch: channel: event_relay-0x95e0:1:0x0006 async_configure stage succeeded
0x95e0:1:0x0008: finished channel configuration
LUMI lumi.sensor_switch: channel: event_relay-0x95e0:1:0x0008 async_configure stage succeeded
[0xa55c:1:0x0000] ZCL request 0x000a: [[<Attribute attrid=5 value=>]]
[0xa55c:1:0x0000] Attribute report received: model=lumi.sensor_switch
[0xa55c:1:0x0000] ZCL request 0x000a: [[<Attribute attrid=1 value=>]]
[0xa55c:1:0x0000] Attribute report received: app_version=10
[0xa55c:1:0x0000] ZCL request 0x000a: [[<Attribute attrid=65282 value=<TypeValue type=LVList, value=[, , , , , ]>>]]
[0xa55c:1:0x0000] Attribute report received: 65282=[, , , , , ]
[0xa55c:zdo] ZDO request 0x0013: [0xa55c, 00:15:8d:00:02:0f:xx:yy, 128]
initializing channel: basic from_cache: False
LUMI lumi.sensor_switch: channel: basic-0x95e0:1:0x0000 async_configure stage succeeded
LUMI lumi.sensor_switch: completed configuration
LUMI lumi.sensor_switch: stored in registry: ZhaDeviceEntry(name='LUMI lumi.sensor_switch', ieee='00:15:8d:00:02:0f:xx:yy', last_seen=1562098701.1759727)

There were no "switch" entities for button remotes and binary_sensor were removed. You need to use ZHA events instead.
Also, xiaomi are picky about Zigbee routers on the network and will become unavailable if they join through a xiaomi incompatible router.

I have elelabs gpio zigbee. Without router. Tried zha events, didn't succeed. Could you please show example of automation with new zha events, which we should use now?

go to dev tools panel -> Events -> enter zha_event into "event to subscribe to" and start listening. If remote sends any events, you should see those here

example of automations https://community.home-assistant.io/t/zha-zigbee-tested-devices-please-add-your-device-results/17718/1033

@Adminiuga - thanks! Listening to events in dev tools works perfectly!! Fixed my automation in 5 seconds!

Are we good to close this? I believe everything is functioning as intended.

closing as everything appears to be functioning as expected.


[migrator] Filter out diag::wrong_argument_labels for the fixit pass

The migrator only applies changes from the APIDiffMigratorPass in the primary file. This means that if a nominal type was renamed, for example, any members users have added in an extension in a separate file won't be visible, because the extension would still have the old name. This can result in 'wrong/extraneous/missing argument label' errors with fixits to change the argument labels that, when applied by the fixit pass, change which function was being called and cause post-migration errors.
This patch updates the fixit pass to ignore fixits from diag::wrong_argument_labels. diag::extra_argument_labels and diag::missing_argument_labels were already filtered out for other reasons.
Resolves rdar://problem/40170377

@swift-ci please smoke test


Custom inspection API?

From observablehq/notebook#210:

It’d be need to have an equivalent to Node’s custom util.inspect hook.

Moved to observablehq/notebook-inspector#14.


Fix repeating plugin path issue in 'icon' path

During the development of a plugin, I found a bug which cause path.join icon path multiple times if the icon is relative path.
At first, the result from the plugin is correct:
{
  "results": [{
    "icon": "/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQMusic.app-5d7f27eea6e5a52399ea9800df1dc7b0cc3f071c.png",
    "title": "QQMusic",
    "subtitle": "Version: 39619",
    "value": "/Applications/QQMusic.app",
    "id": "/Applications/QQMusic.app",
    "pluginName": "tinytacoteam/zazu-file-finder",
    "blockId": "FindApp"
  }, {
    "icon": "/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQ.app-778713fb2c944199fef524595356bf1c6c991e36.png",
    "title": "QQ",
    "subtitle": "Version: 24630",
    "value": "/Applications/QQ.app",
    "id": "/Applications/QQ.app",
    "pluginName": "tinytacoteam/zazu-file-finder",
    "blockId": "FindApp"
  }],
  "plugin": "tinytacoteam/zazu-file-finder",
  "block": "FindApp",
  "level": "info",
  "message": "Script Results",
  "timestamp": "2017-01-31T07:33:41.482Z"
}

The icon path is correct the first time: /Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQMusic.app-5d7f27eea6e5a52399ea9800df1dc7b0cc3f071c.png.
Then, the second time I use the plugin for the same search string, the result will be:
{
  "results": [{
    "icon": "/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQMusic.app-5d7f27eea6e5a52399ea9800df1dc7b0cc3f071c.png",
    "title": "QQMusic",
    "subtitle": "Version: 39619",
    "value": "/Applications/QQMusic.app",
    "id": "/Applications/QQMusic.app",
    "pluginName": "tinytacoteam/zazu-file-finder",
    "blockId": "FindApp"
  }, {
    "icon": "/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQ.app-778713fb2c944199fef524595356bf1c6c991e36.png",
    "title": "QQ",
    "subtitle": "Version: 24630",
    "value": "/Applications/QQ.app",
    "id": "/Applications/QQ.app",
    "pluginName": "tinytacoteam/zazu-file-finder",
    "blockId": "FindApp"
  }],
  "plugin": "tinytacoteam/zazu-file-finder",
  "block": "FindApp",
  "level": "info",
  "message": "Script Results",
  "timestamp": "2017-01-31T07:33:45.634Z"
}

As you can see, the icon path contains multiple plugin path: /Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/Users/taowang/.zazu/plugins/tinytacoteam/zazu-file-finder/data/icons/QQMusic.app-5d7f27eea6e5a52399ea9800df1dc7b0cc3f071c.png
I fixed this bug by checking whether the icon already contains the plugin path, however, it's might be better to Object.assign({}, icon), so the result will be immutable. Just let me know what do you think.
Signed-off-by: Tao Wang<EMAIL_ADDRESS>

As discussed in https://github.com/tinytacoteam/zazu/issues/181, should we allow absolute path for the icon to support Linux?

I'll take a look tonight, thank you for your contribution!

Looks good to me. Thank you for the fix!


viewer hangs indefinitely if multies cannot connect to a remote  node.

If a host in multies cannot be reached, then viewer hangs indefinitely. Please note the timeout in the sessions.js in the viewer.log entry. The first log is from multies.log.

Request error with node <IP_ADDRESS>:9200 { [Error: connect ECONNREFUSED <IP_ADDRESS>:9200]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '<IP_ADDRESS>,
port: 9200 }
Mon, 16 Oct 2017 12:46:42 GMT clarkej1 GET /moloch/sessions.json?bounding=last&facets=1&fields=pr,tipv61-term,tipv62-term&flatten=1&length=50&order=fp:asc&startTime=1508153854&stopTime=1508157454 - - bytes - ms
sessions.json error { [Error: Request Timeout after 300000ms]
status: 408,
displayName: 'RequestTimeout',
message: 'Request Timeout after 300000ms' } null

Elasticsearch version: ES5
Moloch version: 19.1
OS name and version: RHEL 7.4
How was Moloch built/installed: (rpm, deb, singlehost built, ...) rpm
Provide logs, stack traces and steps to reproduce: Stand up multies. Disable a remote node. Multiviewer will no longer be accessible.

This was fixed


Extensions can't install csharpier in the dotnet format repo

It appears to have something to do with the global.json file that they use. VS can't install globally or locally.
Rider seems to be able to install it globally, haven't tested locally.
Haven't tested VSCode

I'm seeing this issue with VSCode.  Not sure if it's related to global.json, but csharpier repeatedly prompts with notification to install globally or locally.  After choosing either, it still doesn't install.  Tried reinstalling, restarting VSCode, and adding explicit csharp formatter settings.  Fresh install of VSCode 1.78.2 (user setup) Windows 11.


Remove effect chance

If you've played with the Rats mod, you might know that it adds a plague effect and some remedy items that have a chance to remove that effect; the same goes with milk in vanilla for most potion effects. I say you could expand this behavior using this mod to define the following:
Food Cure Effect: List of entries including the item, potion effect to be cured, up to what amplifier level it can cure the effect (-1 for any), and the chance to cure.
Format: String itemId, Int metadata (-1 for any), String potionId, Int amplifier, Float chance
Example: minecraft:beetroot, -1, rats:plague, 2, 0.5
This can further be used with mods that nerf milk to specify different food items to counter different negative effects.

Added and expanded on this in 6e50a7c , thanks for the suggestion.


Changing tabs intermittently throws exception

How to reproduce?
https://bitbucket.org/Veriphi/graphbug/
Pressing the buttons on the left rapidly should throw an exception very similar to the one I am experiencing.
It should plot a graph on startup also.
Extra notes
   at LiveCharts.Geared.GearedValues`1.e.b()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LiveCharts.Geared.GearedValues`1.GetPoints(ISeriesView series)
   at LiveCharts.Geared.GearedSeries.a(Boolean A_0)
   at LiveCharts.Geared.GearedSeries.Erase(Boolean removeFromView)
   at LiveCharts.Wpf.Charts.Base.Chart.OnSeriesChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) in c:\Users\btord\Documents\Projects\LiveCharts\WpfView\Charts\Base\Chart.cs:line 169
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.Activate(Object item)
   at System.Windows.Data.BindingExpression.OnDataContextChanged(DependencyObject contextElement)
   at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.TreeWalkHelper.OnInheritablePropertyChanged(DependencyObject d, InheritablePropertyChangeInfo info, Boolean visitedViaVisualTree)

I am using

Live-Charts version
LiveCharts.Wpf v0.9.6

.Net Version
4.5.2

Windows
10

Extra notes:

System.IndexOutOfRangeException occurred
HResult=0x80131508
Message=Index was outside the bounds of the array.
Source=

Notice I've seen this errors before, the library was thread safe.
This normally happens when ChartValues goes out of sync.
If you are updating the chart from multiple threads, its is important to keep your chart values safe, since 0.9.3, I made ChartValues thread safe (at least for most cases) but you must help the library to (I know this needs to be documented, I am reviewing all the docs right now...)
Here is a sample that does update the chart from multiple threads in a short period of time. I ran this for at least 20 hours without any exception (with 8 Tasks).
https://lvcharts.net/App/examples/v1/wpf/Constant Changes II
Notice the note:

//when multi threading avoid indexed calls like -> Values[0]
//instead enumerate the collection
//ChartValues/GearedValues returns a thread safe copy once you enumerate it.
//TIPS: use foreach instead of for
//LINQ methods also enumerate the collections

Yes, I suspect it is a threading issue.
I don't make any calls like Values[0] but I do this sort of thing as I have a dynamic number of series:
 for (int i = 0; i < foo.Count; i++)
 {
   TempSeriesCollection[i].Values.Add(new TimePoint(DateTime.Now, foo[i].Temperature));
 }

Is this ok?

Ok I found where it happens. It's when I set a SeriesCollection property to a new SeriesCollection instance.
private SeriesCollection currentDataSeries;
public SeriesCollection CurrentDataSeries
{
  get
  {
    return currentDataSeries;
  }
  private set
  {
    SetProperty(ref currentDataSeries, value);
  }
}

private void TestController_TestComplete(object sender, EventArgs e)
{
  Application.Current.Dispatcher.Invoke(() => UpdateGraph());
}

private void UpdateGraph()
{
  CurrentDataSeries = graphGenerator.GenerateGraph();
}

How does geared values function differently to the chart values? I swapped the geared library for the source code on your repository in an attempt to get more debugging information, but I can't get it to throw the exception with the standard library.

Thanks for the project you created, I was able to identify and fix the issue,  it will be included in the next release of the library, should be published this weekend.

Awesome, that will help a lot! Cheers


Update CI workflows

Need to wait for Arrow wheels for Python 3.13 to become available.

Building all wheels (including arm64 wheels) takes over 2h.
Maybe it is time to consider running cibuildwheel in parallel using a job matrix.
See e.g. https://iscinumpy.dev/post/cibuildwheel-2-10-0/#only-210.


jellybeans theme statusbar is red after update

Please update, this should have been fixed with the last PR.

Thanks, all sorted


train.json and val.json?

hi, can u share yours train.json and val.json of SPEED?

Unfortunately,
Before sharing the processed SPEED data, I'd have to make license changes to this repo. I hope to do it sometime.
In the mean time you can generate your own, using the SPEED annotations provided with the dataset:
https://kelvins.esa.int/satellite-pose-estimation-challenge/data/
I've updated convert2COCO.py and added dataset_coco_preprocess.ipynb.
Together with minimal modifications, you should be able to generate your own COCO train and val annotations.


Use keycloak as OIDC/IdP provider but cannot access to users list

I setup superset to authenticate the users with keycloak as IdP.
I'm able to connect to superset after validating a login/pwd on keycloak but I cannot access the users list page (/users/list) as an Admin.
How to reproduce the bug
Setup superset as described in "Additional context".
Connect to superset through keycloak as an Admin
Click on the menu Settings > List Users
Expected results
See the users list
Actual results
I'm back on the welcome page (/superset/welcome/) with a message saying "Access is Denied".
Screenshots
n/a
Environment
(please complete the following information):

browser type and version:
Brave Version 1.37.109 Chromium: 100.0.4896.60 (Build officiel) (64 bits)
superset version: superset version
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Superset 1.4.2
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
python version: python --version
Python 3.8.12
node.js version: node -v
n/a
any feature flags active:
ALERT_REPORTS

Checklist
Make sure to follow these steps before submitting your issue - thank you!

[X] I have checked the superset logs for python stacktraces and included it here as text if there are any.
No stacktrace
[X] I have reproduced the issue with at least the latest released version of superset.
[X] I have checked the issue tracker for the same issue and I haven't found one similar.

Additional context
I have a keycloak setup with the url: https://auth.mydomain.com/
I create a realm named "demo" and a user on this realm.
I add a client named "superset" (client ID) on this realm with a Client Protocol "openid-connect" and a Root URL "https://superset.demo.mydomain.com/"
My superset is accessible with the url: https://superset.demo.mydomain.com/
I use the Docker version of superset deployed on a Docker Swarm cluster. I use Traefik to route the HTTP requests to the containers (superset and keycloak).
To setup superset with keycloak, I follow these posts:

https://github.com/apache/superset/discussions/13915
https://stackoverflow.com/questions/54010314/using-keycloakopenid-connect-with-apache-superset/54024394#54024394

But I modify some files so I describe below my whole configuration.
Content of /app/docker/requirements-local.txt:
clickhouse-driver>=0.2.0
clickhouse-sqlalchemy>=0.1.6,<0.2.0
mysql-connector-python
flask-oidc==1.3.0

The first 2 packages are used to connect to my clickhouse database. The third one is used to have the superset database on MySQL (instead of postgres).
Only the fourth one is related to keycloak to enable OIDC (OpenID Connect).
Content of /app/pythonpath/superset_config.py:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# This file is included in the final Docker image and SHOULD be overridden when
# deploying the image to prod. Settings configured here are intended for use in local
# development environments. Also note that superset_config_docker.py is imported
# as a final step as a means to override "defaults" configured here
#
import logging
import os
from datetime import timedelta
from typing import Optional

from cachelib.file import FileSystemCache
from celery.schedules import crontab

logger = logging.getLogger()

def get_env_variable(var_name: str, default: Optional[str] = None) -> str:
    """Get the environment variable or raise exception."""
    try:
        return os.environ[var_name]
    except KeyError:
        if default is not None:
            return default
        else:
            error_msg = "The environment variable {} was missing, abort...".format(
                var_name
            )
            raise EnvironmentError(error_msg)

DATABASE_DIALECT = get_env_variable("DATABASE_DIALECT")
DATABASE_USER = get_env_variable("DATABASE_USER")
DATABASE_PASSWORD = get_env_variable("DATABASE_PASSWORD")
DATABASE_HOST = get_env_variable("DATABASE_HOST")
DATABASE_PORT = get_env_variable("DATABASE_PORT")
DATABASE_DB = get_env_variable("DATABASE_DB")

# The SQLAlchemy connection string.
SQLALCHEMY_DATABASE_URI = "%s://%s:%s@%s:%s/%s" % (
    DATABASE_DIALECT,
    DATABASE_USER,
    DATABASE_PASSWORD,
    DATABASE_HOST,
    DATABASE_PORT,
    DATABASE_DB,
)

REDIS_HOST = get_env_variable("REDIS_HOST")
REDIS_PORT = get_env_variable("REDIS_PORT")
REDIS_CELERY_DB = get_env_variable("REDIS_CELERY_DB", "0")
REDIS_RESULTS_DB = get_env_variable("REDIS_RESULTS_DB", "1")

##### Change from original file
#RESULTS_BACKEND = FileSystemCache("/app/superset_home/sqllab")
# Put results on Redis not on a file that is not shared among container on Swarm stack
from cachelib.redis import RedisCache
RESULTS_BACKEND = RedisCache(host=REDIS_HOST, port=REDIS_PORT, key_prefix='superset_results')
##### End of change

class CeleryConfig(object):
    BROKER_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_CELERY_DB}"
    CELERY_IMPORTS = ("superset.sql_lab", "superset.tasks")
    CELERY_RESULT_BACKEND = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_RESULTS_DB}"
    CELERYD_LOG_LEVEL = "DEBUG"
    CELERYD_PREFETCH_MULTIPLIER = 1
    CELERY_ACKS_LATE = False
    CELERYBEAT_SCHEDULE = {
        "reports.scheduler": {
            "task": "reports.scheduler",
            "schedule": crontab(minute="*", hour="*"),
        },
        "reports.prune_log": {
            "task": "reports.prune_log",
            "schedule": crontab(minute=10, hour=0),
        },
    }

CELERY_CONFIG = CeleryConfig

FEATURE_FLAGS = {"ALERT_REPORTS": True}
ALERT_REPORTS_NOTIFICATION_DRY_RUN = True
WEBDRIVER_BASEURL = "http://superset:8088/"
# The base URL for the email report hyperlinks.
WEBDRIVER_BASEURL_USER_FRIENDLY = WEBDRIVER_BASEURL

SQLLAB_CTAS_NO_LIMIT = True

#
# Optionally import superset_config_docker.py (which will have been included on
# the PYTHONPATH) in order to allow for local settings to be overridden
#
try:
    import superset_config_docker
    from superset_config_docker import *  # noqa

    logger.info(
        f"Loaded your Docker configuration at " f"[{superset_config_docker.__file__}]"
    )
except ImportError:
    logger.info("Using default Docker config...")

Content of /app/pythonpath/superset_config_docker.py:
import os
from typing import Optional

def get_env_variable(var_name: str, default: Optional[str] = None) -> str:
    """Get the environment variable or raise exception."""
    try:
        return os.environ[var_name]
    except KeyError:
        if default is not None:
            return default
        else:
            error_msg = "The environment variable {} was missing, abort...".format(
                var_name
            )
            raise EnvironmentError(error_msg)

# The allowed translation for you app
LANGUAGES = {
    "en": {"flag": "us", "name": "English"},
    #"es": {"flag": "es", "name": "Spanish"},
    #"it": {"flag": "it", "name": "Italian"},
    "fr": {"flag": "fr", "name": "French"},
    #"zh": {"flag": "cn", "name": "Chinese"},
    #"ja": {"flag": "jp", "name": "Japanese"},
    #"de": {"flag": "de", "name": "German"},
    #"pt": {"flag": "pt", "name": "Portuguese"},
    #"pt_BR": {"flag": "br", "name": "Brazilian Portuguese"},
    #"ru": {"flag": "ru", "name": "Russian"},
    #"ko": {"flag": "kr", "name": "Korean"},
    #"sk": {"flag": "sk", "name": "Slovak"},
    #"sl": {"flag": "si", "name": "Slovenian"},
}

ENABLE_PROXY_FIX = True

#---------------------------KEYCLOACK ----------------------------
# See: https://github.com/apache/superset/discussions/13915
# See: https://stackoverflow.com/questions/54010314/using-keycloakopenid-connect-with-apache-superset/54024394#54024394

from keycloak_security_manager  import  OIDCSecurityManager
from flask_appbuilder.security.manager import AUTH_OID

OIDC_ENABLE = get_env_variable("OIDC_ENABLE", 'False')

if OIDC_ENABLE == 'True':
    AUTH_TYPE = AUTH_OID
    SECRET_KEY = get_env_variable("SECRET_KEY", 'ChangeThisKeyPlease')
    OIDC_CLIENT_SECRETS = get_env_variable("OIDC_CLIENT_SECRETS", '/app/pythonpath/client_secret.json')
    OIDC_ID_TOKEN_COOKIE_SECURE = False
    OIDC_REQUIRE_VERIFIED_EMAIL = False
    OIDC_OPENID_REALM = get_env_variable("OIDC_OPENID_REALM")
    OIDC_INTROSPECTION_AUTH_METHOD = 'client_secret_post'
    CUSTOM_SECURITY_MANAGER = OIDCSecurityManager
    AUTH_USER_REGISTRATION = True
    AUTH_USER_REGISTRATION_ROLE = get_env_variable("AUTH_USER_REGISTRATION_ROLE", 'Admin')
#--------------------------------------------------------------

Content of /app/pythonpath/keycloak_security_manager.py:
from flask_appbuilder.security.manager import AUTH_OID
from superset.security import SupersetSecurityManager
from flask_oidc import OpenIDConnect
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib.parse import quote
from flask_appbuilder.views import ModelView, SimpleFormView, expose
import logging
from flask import redirect, request

class OIDCSecurityManager(SupersetSecurityManager):

    def __init__(self, appbuilder):
        super(OIDCSecurityManager, self).__init__(appbuilder)
        if self.auth_type == AUTH_OID:
            self.oid = OpenIDConnect(self.appbuilder.get_app)
        self.authoidview = AuthOIDCView

class AuthOIDCView(AuthOIDView):

    @expose('/login/', methods=['GET', 'POST'])
    def login(self, flag=True):
        sm = self.appbuilder.sm
        oidc = sm.oid

        @self.appbuilder.sm.oid.require_login
        def handle_login():
            user = sm.auth_user_oid(oidc.user_getfield('email'))

            if user is None:
                info = oidc.user_getinfo(['preferred_username', 'given_name', 'family_name', 'email'])
                user = sm.add_user(info.get('preferred_username'), info.get('given_name'), info.get('family_name'),
                                   info.get('email'), sm.find_role('Admin'))

            login_user(user, remember=False)
            return redirect(self.appbuilder.get_url_for_index)

        return handle_login()

    @expose('/logout/', methods=['GET', 'POST'])
    def logout(self):
        oidc = self.appbuilder.sm.oid

        oidc.logout()
        super(AuthOIDCView, self).logout()
        redirect_url = request.url_root.strip('/') + self.appbuilder.get_url_for_login

        return redirect(
            oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout?redirect_uri=' + quote(redirect_url))

Content of /app/pythonpath/client_secret.json:
{
  "web": {
      "issuer": "https://auth.mydomain.com/realms/demo",
      "auth_uri": "https://auth.mydomain.com/realms/demo/protocol/openid-connect/auth",
      "client_id": "superset",
      "client_secret": "<Client Secret>",
      "redirect_uris": [
          "https://superset.demo.mydomain.com/*"
      ],
      "userinfo_uri": "https://auth.mydomain.com/realms/demo/protocol/openid-connect/userinfo",
      "token_uri": "https://auth.mydomain.com/realms/demo/protocol/openid-connect/token",
      "token_introspection_uri": "https://auth.mydomain.com/realms/demo/protocol/openid-connect/token/introspect"
  }
}

The environment variables I pass to my Docker Swarm service:
FLASK_ENV=production
SUPERSET_ENV=production
SUPERSET_LOAD_EXAMPLES=no
CYPRESS_CONFIG=false
SUPERSET_PORT=8088
OIDC_ENABLE=True
OIDC_OPENID_REALM=demo

NOTA: I remove my environment variables related to mysql and redis.
Thanks for your help. Tell me if some information is missing.

Questions which I think are helpful for debugging:

What roles does your user on IDP has?
Is Admin an actual role in the IDP or not? If not, do you have the mapping from IDP roles to FAB roles somewhere?
Does the role of the admin user you are using to login is the one you expect in the superset/FAB backend db? Check which role this user has just by looking at the backend db (MySQL in your case, since you cannot check the users list from UI...)
These are just to start with, first sanity checks.

Thanks @fedepad.
In fact, I change the role of my user with the superset UI and give him the Admin role.
Here is how I do that:

I start my stack with OIDC_ENABLE=False so I can connect with the default Admin account (stored in the DB) and I change its password
I update my stack with OIDC_ENABLE=True and connect with a keycloak account. A new user was created in superset DB
I change back to OIDC_ENABLE=False, connect with the default Admin account and change the role of my keycloak user to Admin
Finally, I change again to OIDC_ENABLE=True, connect with my keycloak account and have the access issue (to the users list page)

I have no specific roles for my keycloak user. I think he has the default keycloak roles but I do not know if those roles are sent to superset. I think roles on keycloak and roles on superset are not related (but I'm not sure).

@fedepad @PatBriPerso
I created same user in keycloak and superset eventhough im able to see None user inevent log and througing timeout error any help regarding this.
Seeing  below error.

@PatBriPerso are you still facing this issue, or should we close it?

Hi,
I got the same issue when i integrate with Zitadel is there any solution for this.

Having the same issue as OP. Unable to access User List as Admin.
Unable to access User Info as Admin, Alpha and Gamma. Symptoms similar to described as above.
Any advise given will be appreciated.

I confirm I have the same issue, if I disable OIDC auth, then I can access user list and user info. If I enable it then I get an "Access Denied".
Superset version: 4.1.1
keycloak version: 26.0.5
I use some kind of role mapping between the roles in keycloak and the roles in superset. My logic is implemented in my CUSTOM_SECURITY_MANAGER.
I used to work well with superset version 2.1.0.


Problems with square brackets in streamer title

Hello,
I ran into the problem that uproot cannot interpret square brackets in the streamer title of a root file yielding the following error message (see also attached Jupyter notebook uproot_streamerproblem.zip) :
UnknownInterpretation                     Traceback (most recent call last)
Input In [14], in <module>
      1 # how it should look like
----> 2 ftshits.arrays(["FTSHit.fDx", "FTSHit.fZ"], library="pd")

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:1111, in HasBranches.arrays(self, expressions, cut, filter_name, filter_typename, filter_branch, aliases, language, entry_start, entry_stop, decompression_executor, interpretation_executor, array_cache, library, how)
   1108         return None
   1110 aliases = _regularize_aliases(self, aliases)
-> 1111 arrays, expression_context, branchid_interpretation = _regularize_expressions(
   1112     self,
   1113     expressions,
   1114     cut,
   1115     filter_name,
   1116     filter_typename,
   1117     filter_branch,
   1118     keys,
   1119     aliases,
   1120     language,
   1121     get_from_cache,
   1122 )
   1124 ranges_or_baskets = []
   1125 checked = set()

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:3327, in _regularize_expressions(hasbranches, expressions, cut, filter_name, filter_typename, filter_branch, keys, aliases, language, get_from_cache)
   3325 for expression, interp in items:
   3326     if interp is None:
-> 3327         _regularize_expression(
   3328             hasbranches,
   3329             expression,
   3330             keys,
   3331             aliases,
   3332             language,
   3333             get_from_cache,
   3334             arrays,
   3335             expression_context,
   3336             branchid_interpretation,
   3337             (),
   3338             False,
   3339             None,
   3340         )
   3341     else:
   3342         branch = hasbranches[expression]

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:3172, in _regularize_expression(hasbranches, expression, keys, aliases, language, get_from_cache, arrays, expression_context, branchid_interpretation, symbol_path, is_cut, rename)
   3170 branch = hasbranches.get(expression)
   3171 if branch is not None:
-> 3172     _regularize_branchname(
   3173         hasbranches,
   3174         expression,
   3175         branch,
   3176         branch.interpretation,
   3177         get_from_cache,
   3178         arrays,
   3179         expression_context,
   3180         branchid_interpretation,
   3181         is_primary,
   3182         is_cut,
   3183     )
   3185 else:
   3186     if expression in aliases:

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:3100, in _regularize_branchname(hasbranches, branchname, branch, interpretation, get_from_cache, arrays, expression_context, branchid_interpretation, is_primary, is_cut)
   3088 def _regularize_branchname(
   3089     hasbranches,
   3090     branchname,
   (...)
   3098     is_cut,
   3099 ):
-> 3100     got = get_from_cache(branchname, interpretation)
   3101     if got is not None:
   3102         arrays[branch.cache_key] = got

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:1101, in HasBranches.arrays.<locals>.get_from_cache(branchname, interpretation)
   1096 def get_from_cache(branchname, interpretation):
   1097     if array_cache is not None:
   1098         cache_key = "{0}:{1}:{2}:{3}-{4}:{5}".format(
   1099             self.cache_key,
   1100             branchname,
-> 1101             interpretation.cache_key,
   1102             entry_start,
   1103             entry_stop,
   1104             library.name,
   1105         )
   1106         return array_cache.get(cache_key)
   1107     else:

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/interpretation/identify.py:1184, in UnknownInterpretation.cache_key(self)
   1182 @property
   1183 def cache_key(self):
-> 1184     raise self

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/behaviors/TBranch.py:2211, in TBranch.interpretation(self)
   2209 if self._interpretation is None:
   2210     try:
-> 2211         self._interpretation = uproot.interpretation.identify.interpretation_of(
   2212             self, {}
   2213         )
   2214     except uproot.interpretation.identify.UnknownInterpretation as err:
   2215         self._interpretation = err

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/interpretation/identify.py:384, in interpretation_of(branch, context, simplify)
    380 is_double32 = (
    381     leaftype == uproot.const.kDouble32 or leaf.classname == "TLeafD32"
    382 )
    383 if is_float16 or is_double32:
--> 384     out = _float16_or_double32(branch, context, leaf, is_float16, dims)
    386 else:
    387     if (
    388         branch.member("fClassName", none_if_missing=True) == "TObject"
    389         and branch.name.split(".")[-1] == "fBits"
    390     ):

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/interpretation/identify.py:256, in _float16_or_double32(branch, context, leaf, is_float16, dims)
    249 except SyntaxError:
    250     raise UnknownInterpretation(
    251         "cannot parse streamer title {0} (as Python)".format(repr(source)),
    252         branch.file.file_path,
    253         branch.object_path,
    254     )
--> 256 transformed = ast.Expression(_float16_double32_walk_ast(parsed, branch, source))
    257 spec = eval(compile(transformed, repr(title), "eval"))
    258 if (
    259     len(spec) == 2
    260     and uproot._util.isnum(spec[0])
    261     and uproot._util.isnum(spec[1])
    262 ):

File ~/anaconda3/envs/deep_tracking/lib/python3.9/site-packages/uproot/interpretation/identify.py:214, in _float16_double32_walk_ast(node, branch, source)
    205     out = ast.List(
    206         [
    207             _float16_double32_walk_ast(node.elts[0], branch, source),
   (...)
    211         node.ctx,
    212     )
    213 else:
--> 214     raise UnknownInterpretation(
    215         "cannot compute streamer title {0}".format(repr(source)),
    216         branch.file.file_path,
    217         branch.object_path,
    218     )
    219 out.lineno, out.col_offset = node.lineno, node.col_offset
    220 return out

UnknownInterpretation: cannot compute streamer title '[cm]'

This seems to be solvable by updating the identify.py file in the interpretation directory accordingly to identify.txt but maybe you know better methods to solve this problem? Thanks!

Thanks for putting together the nice minimal reproducing example and potential solution! Usually, though, it's easier if reproducers are code in the GitHub markdown because then I can just copy-paste it, and the identify.txt (for identify.py) doesn't specify which version it is a difference relative to. I guessed that it's relative to 4.1.9, the latest release since December 8 (until today). However, it's exactly the same as identify.py from 4.1.9, so I think maybe it's not the file you intended to send. If you have a potential solution, submitting it as a pull request makes the review process super quick and easy: it even runs all the tests for you.
Anyway—no problem—I found where it's failing, it's because the leaf-type is kDouble32 (it's a TLeafD32). The titles of these branches are where their parameterization is stored—how many bits, the lowest and highest possible values—and that's why it needs to parse the title as data. Your title contains a human-readable description of the data, a reasonable-sounding thing to include in a title! So what should we do in this situation? Maybe if the title is not parsable, it should use the default parameters? That's what #561 does.
If you like that solution (e.g. it's what you intended to send in identify.txt), then we're on the same page and I'll merge it in.

Many thanks for the detailed answer and the many tips. You are right, I accidentally copied the wrong identify.py file. So here is, what we did:
We replaced the lines 244-279 from version 4.1.9 by the following lines of code
    else:
        try:
            source = title[left : right + 1]
            try:
                parsed = ast.parse(source).body[0].value
            except SyntaxError:
                raise UnknownInterpretation(
                    "cannot parse streamer title {0} (as Python)".format(repr(source)),
                    branch.file.file_path,
                    branch.object_path,
                )

            transformed = ast.Expression(_float16_double32_walk_ast(parsed, branch, source))
            spec = eval(compile(transformed, repr(title), "eval"))
            if (
                len(spec) == 2
                and uproot._util.isnum(spec[0])
                and uproot._util.isnum(spec[1])
            ):
                low, high = spec
                num_bits = None

            elif (
                len(spec) == 3
                and uproot._util.isnum(spec[0])
                and uproot._util.isnum(spec[1])
                and uproot._util.isint(spec[2])
            ):
                low, high, num_bits = spec

            else:
                raise UnknownInterpretation(
                    "cannot interpret streamer title {0} as (low, high) or "
                    "(low, high, num_bits)".format(repr(source)),
                    branch.file.file_path,
                    branch.object_path,
                )
        except (UnknownInterpretation):
            low, high, num_bits = 0, 0, "no brackets"  # distinct from "None"

So, basically we just put the existing code in a try statement and added another except (UnknownInterpretation). But your solution also seems to work for my problem, so I assume we are on the same page and you can merge it. Thank you very much for your help!


chore(sourcelabs): Upgrade Chrome and Firefox to the latest versions

This is needed before being able to land #12425

I have no idea why Travis is not updating the status, but https://travis-ci.org/lgalfaso/angular.js/builds/72532402 is the successful run with this patch

s/source/sauce

Thanks!


Error: rm: original/*.ttx: No such file or directory

I get rm: original/*.ttx: No such file or directory error when I run build.sh.
My files are otf instread of ttx.

ttx coomand was not being found. Added ttx to my PATH and fixed error.


ACE adapter code needs tests

There were length-tracking bugs in both OnChange() and Recv().

Consider Selenium WebDriver + Agouti + Sauce Labs' "Open Sauce" product?


Setup issue and PR template

Just to help with the common issues we run into (tests and commit message quality)

This is now handle at the origination level via https://github.com/pions/.github


change join

This is part 1 of https://github.com/moonbitlang/core/pull/538

Pull Request Test Coverage Report for Build 1898
Details

2 of 3 (66.67%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.06%) to 83.182%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
2
3
66.67%

Totals

Change from base Build 1895:
0.06%

Covered Lines:
2923

Relevant Lines:
3514

💛  - Coveralls

Pull Request Test Coverage Report for Build 1898
Warning: This coverage report may be inaccurate.
This pull request's base commit is no longer the HEAD commit of its target branch. This means it includes changes from outside the original pull request, including, potentially, unrelated coverage changes.

For more information on this, see Tracking coverage changes with pull request builds.
To avoid this issue with future PRs, see these Recommended CI Configurations.
For a quick fix, rebase this PR at GitHub. Your next report should be accurate.

Details

2 of 3 (66.67%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+1.1%) to 84.24%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
2
3
66.67%

Totals

Change from base Build 1895:
1.1%

Covered Lines:
3159

Relevant Lines:
3750

💛  - Coveralls

Pull Request Test Coverage Report for Build 2067
Details

3 of 4 (75.0%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.03%) to 91.114%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
3
4
75.0%

Totals

Change from base Build 2066:
-0.03%

Covered Lines:
3599

Relevant Lines:
3950

💛  - Coveralls

Pull Request Test Coverage Report for Build 2070
Details

3 of 4 (75.0%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.03%) to 91.114%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
3
4
75.0%

Totals

Change from base Build 2069:
-0.03%

Covered Lines:
3599

Relevant Lines:
3950

💛  - Coveralls

Pull Request Test Coverage Report for Build 2074
Details

3 of 4 (75.0%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.03%) to 91.118%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
3
4
75.0%

Totals

Change from base Build 2073:
-0.03%

Covered Lines:
3601

Relevant Lines:
3952

💛  - Coveralls

Pull Request Test Coverage Report for Build 2075
Details

3 of 4 (75.0%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.03%) to 91.118%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

array/array.mbt
3
4
75.0%

Totals

Change from base Build 2073:
-0.03%

Covered Lines:
3601

Relevant Lines:
3952

💛  - Coveralls


QtCore.QSocketNotifier socket param is different in PySide2

The QtCore.QSocketNotifier is supported to take an int representing the fileno of the socket as it's first param.
In all bindings except PySide2, it works.
In PySide2 it appears to call "fileno" on the first arg you pass it.
The PySide2 bug is here:

PySide2 bug #PYSIDE-629

import socket

from Qt import QtCore,QtWidgets
# from PySide2 import QtCore,QtWidgets

app = QtWidgets.QApplication([])

w_sock, r_sock = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
notifier = QtCore.QSocketNotifier(r_sock.fileno(), QtCore.QSocketNotifier.Read)
# >>> AttributeError: 'int' object has no attribute 'fileno'

What do we think we should do here?

Try to get it fixed in PySide2?
Build something in QtCompat that conforms to broken PySide2?
Build a wrapper for PySide2 that builds a socket object from the passed fileno and then pass the new socket to PySide2 to turn back into a fileno?
Other?

for number 3, here is an example of how we would turn the fd back into a socket for PySide2

def _pyside2_qtcore_qsocketnotifier(socket, notif_type, parent=None):
    import socket
    socket_obj = socket.fromfd(socket, socket.AF_UNIX, socket.SOCK_STREAM)
    mod = getattr(getattr(Qt, "_pyside2"), "QtCore")
    klass = getattr(mod, "QSocketNotifier")
    return klass(socket_obj, notif_type, parent)

I was going to say number 2 would be easy to implement by adding a QtCompat namespace decorator using the code in _pyside2_qtcore_qsocketnotifier  for PySide2 only, but then I realized that QtCore.QSocketNotifier is not a function, but a class constructor. I don't think that's currently supported by QtCompat namespacing. https://github.com/mottosso/Qt.py/blob/master/Qt.py#L1259 is a example of how we are adding a decorator for QFileDialog in PyQt4.
Perhaps we could make the QtCompat namespace objects implement a __new__(...) factory which would return a instance of the Qt class when instantiated? This would also take a decorator like the individual functions. The created instance  would be vanilla Qt and not have the custom modifications on the QtCompat namespace objects.
# PySide2, untested
>>> from Qt import QtCompat, QtCore
>>> notifier = QtCompat.QSocketNotifier(r_sock.fileno(), QtCore.QSocketNotifier.Read)
>>> print type(Qt.QtCore.QSocketNotifier)
<type 'PySide2.QtCore.QSocketNotifier'>
# this is a unmodified qt class not a QtCompat class

I enjoy that proposal, that seems slick

https://github.com/mottosso/Qt.py/blob/master/Qt.py#L1000
hmm. I wonder if the existing _build_compatibility_members would work. It's pretty generic, and wonder if adding a "new" key to the _compatibility_members dict would be all that is needed.
If you have time could you try that out? We have finally updated our studio to use Qt.py, so I can't work on it at work like I used to.

Yeah I'll give it a go.
I have limited ability at work too, if I don't get to it today, I'll hit it up after work.

So looks like if we monkey patch the __new__method like this the C++ object gets lost and we cannot use the object.
My testcase:
def _pyside2():
...

    def _qsocketnotifier_new_wrapper(func_replacement):
        def _fake_new(cls, socket, notify_type, parent=None):
            socket_fd = socket
            import socket
            socket_obj = socket.fromfd(socket_fd, socket.AF_UNIX, socket.SOCK_STREAM)
	    inst = func_replacement(getattr(Qt, "_QtCore").QSocketNotifier, socket_obj, notify_type, parent=parent)
            return inst

        _fake_new.__doc__ = func_replacement.__doc__
        _fake_new.__name__ = func_replacement.__name__

        return _fake_new

    decorators = {
        "QSocketNotifier": {
            "__new__": _qsocketnotifier_new_wrapper,
        }
    }

    _reassign_misplaced_members("PySide2")
    _build_compatibility_members("PySide2", decorators)

And when I use that
from Qt import QtCore,QtCompat
import socket

w, r = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
notif = QtCompat.QSocketNotifier(r.fileno(), QtCore.QSocketNotifier.Read)

notif.setEnabled(True)
# >>> RuntimeError: Internal C++ object (PySide2.QtCore.QSocketNotifier) already deleted.

I think we have to wait on PySide2 to fix itself.

That's too bad. Does anyone have experience with managing PySide2 memory?
Also, socket.socketpair, socket.AF_UNIX, and socket.fromfd are only available on unix.

We can't fix PySide2, because even if we do we can't change what's shipped with the various DCCs.
If we fix it, best we can hope for is compatibility with Maya 2020 and friends, which isn't ideal IMO. We'll need to stick with whatever is available in the lowest version of the VFX platform we support.

https://github.com/mottosso/Qt.py/blob/master/Dockerfile.vfxplatform2017
http://www.vfxplatform.com/

The alternative is dropping a minimum version and chasing the latest build, in which case Qt.py won't be compatible with much at all.

I think we have to wait on PySide2 to fix itself.

I'll have to cast my vote on this one. We'd be looking at quite the amount of patches if we didn't take this stand.

Maya 2018.3 was released yesterday;
>>> import PySide2
>>> PySide2.__version__
# Result: 2.0.0~alpha0 #

This means Maya is still using a really old version of PySide2 :sad:

To be fair, this code runs just fine on PySide 1.2.4 on macOS 10.10+.
import socket
from PySide import QtCore, QtGui

app = QtGui.QApplication([])

w_sock, r_sock = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
notifier = QtCore.QSocketNotifier(r_sock, QtCore.QSocketNotifier.Read)
notifier.setEnabled(True)

print type(notifier)
<type 'PySide.QtCore.QSocketNotifier'>

So, I wonder if suggesting to the PySide2 team to change the syntax was a good idea, given that they just had chosen a different constructor from the beginning (in comparison with PyQt4/PyQy5). In addition, that choice was apparently consistent with Qt (see http://doc.qt.io/qt-5/qsocketnotifier.html#QSocketNotifier).
Incidentally, the patch used to change the prototype is currently causing a segmentation fault on Python 2.7 and macOS (last comment in https://bugreports.qt.io/browse/PYSIDE-629).
If Qt.py is based on PySide2 syntax, maybe it would be better to embrace it and keep the constructor as it is in PySide1 and as it was in PySide2, so passing the socket. After all, creating a QtCompat member for PyQt4 and PyQt5 is trivial if the constructor takes the socket as one of its argument, while the opposite can be quite challenging.


BZ1299619: Business Central Repo Clone Fails To Clone SCP Style SSH URLs

See https://bugzilla.redhat.com/show_bug.cgi?id=1299619
This PR documents SCP-style GIT URL support and the related System Property
See also https://github.com/uberfire/uberfire/pull/298.

@porcelli You're probably best to review...

+1

@psiroky Updated GIT to git.. thank-you!

@psiroky @mswiderski Could you please merge when you get a chance... (I need to submit additional PRs for 6.4.x and 6.3.x once merged into master).

I am on it....


Results table sorting

What
This PR adds functionality to sort by column in the results table on the content page.
Changes include:

Adds sort class to capture behaviour relating to a sort parameter
Adds table header helper to extract header formatting logic
Fix to sort link styles
Adds sort parameter as permitted parameter in content controller
Adds sort parameter to Content Data API calls
Adds related unit and feature tests

Why
To make it easier for users to find content based on a particular metric value.
Screenshots

Review Checklist

[x] Changes in scope.
[x] Added/updated unit tests.
[x] Added/updated feature tests.
[x] Added/updated relevant documentation.
[x] Added to Trello card.

 (3) Sort table by any column (frontend)

@pmanrubia addressed your requested changes


Footer enhance

Please do not create a Pull Request without creating an issue first.
Related Issue or bug

Footer of the site looks very simple

Fixes: #[issue number that will be closed through this PR]
Describe the changes you've made
I have added logo of site along with its description and also added social icon using that user can diverted to class Deck social media make make enhancement in footer and it is responsive too
Type of change

[x] Code style update (formatting, local variables)

How Has This Been Tested?
I have tested it on my local machine on various screen sizes of desktop as well as mobile..
Checklist:

[x] Have you checked there aren't other open Pull Requests for the same update/change?
[x] My submission doesn't break any existing feature.
[x] My code follows the style guidelines of this project.
[x] I have performed a self-review of my own code.
[x] I have commented my code, particularly in hard-to-understand areas.
[x] I have made corresponding changes to the documentation.
[x] I have added tests that prove my fix is effective or that my feature works.
[x] New and existing unit tests pass locally with my changes.
[x]Any dependent changes have been merged and published in downstream modules.

Screenshots

Original
Updated

|

|

can you place this text  " ClassDeck aims to provide a virtual classroom that breaks the synchronous hurdles of location, place, student limits and cater the knowledge to the learning crowd anytime and anywhere" instead of lorem ipsum

@coding-geek21 ya sure

@coding-geek21 ya sure

Also do git pull so that your branch is updated

@coding-geek21 can u tell me how to create that .env file?

@coding-geek21


Mapped class_6479

This PR mapped class_6479 and method_37821.

Looks like this whole class has been mapped by another PR. Thanks anyway 👍


Credentials plugin hard coded

Hi,
We set a specific version of the credentials plugin, and set that version in our profile module - I've just updated to the latest version of rtyler/jenkins and it looks as though this plugin is now being hard coded into the params.pp, which means we can no longer control this plugin via our profile module (we're getting duplication error during testing). Is there any way we can make this plugin be optional, defaulting to being installed, and then we can override it in our profile module if we need to?
Thanks in advance.

Same issue here. We install jenkins plugins with checksum and version pinned with code around rtyler/jenkins. Now with 1.7.0 credentials plugin beeing managed by rtyler/jenkins and jenkins::params::default_plugins not beeing parametrizable, every puppet run restarts Jenkins, causing long running builds to die !
(Again, I don't think this puppet module does semantic versioning right, sorry for the blame)
Notice: /Stage[main]/Jenkins::Config/Jenkins::Plugin[credentials]/Archive[credentials.hpi]/ensure: replace archive: /opt/jenkins/data/plugins/credentials.hpi from (sha1)49f4e6386d284bf8468e15bcd279c4a64a37f9ab to (sha1)
Info: /Stage[main]/Jenkins::Config/Jenkins::Plugin[credentials]/Archive[credentials.hpi]: Scheduling refresh of Service[jenkins]
Notice: Notice: /Stage[main]/Jenkins::Config/Jenkins::Plugin[credentials]/File[/opt/jenkins/data/plugins/credentials.hpi]/owner: owner changed 'root' to 'jenkins'
Notice: /Stage[main]/Jenkins::Config/Jenkins::Plugin[credentials]/File[/opt/jenkins/data/plugins/credentials.hpi]/group: group changed 'root' to 'jenkins'
Notice: /Stage[main]/Jenkins::Config/Jenkins::Plugin[credentials]/File[/opt/jenkins/data/plugins/credentials.hpi]/mode: mode changed '0640' to '0644'
Notice: /Stage[main]/Jenkins::Service/Service[jenkins]: Triggered 'refresh' from 1 events

Workaround provided by https://github.com/jenkinsci/puppet-jenkins/pull/675
(set default_plugins = [] and manage yourself)

I've run into this myself needing to upgrade the version of credentials in an existing install.  The issue is that the native types are dependent upon this plugin and the goal is for the new types to replace many of the current defined types.  I'm not sure what the correct solution is.


Bump to v1.1.1

As the title says

@rhatdan @baude Someone care to hit this with an LGTM so I can push a tag for us?

/lgtm


Fix pyflakes warnings reported in non-test files

Fix all warnings reported by flake8 tool.

Looks good but on my system I got one warning.
flake8 elodie --exclude=tests
elodie/media/__init__.py:1:1: F403 'from media import *' used; unable to detect undefined names

This fixed it but I'm not sure if it's the best way.
--- a/elodie/media/__init__.py
+++ b/elodie/media/__init__.py
@@ -1 +1 @@
-from media import *
+__all__ = ["Media", "Photo", "Video"]

This fixed it but I'm not sure if it's the best way.
--- a/elodie/media/init.py
+++ b/elodie/media/init.py
@@ -1 +1 @@
-from media import *
+all = ["Media", "Photo", "Video"]

hmm can't the file be left empty?

hmm can't the file be left empty?

You're probably right. I forget why I added this in the first place.


Fix footer get_template_part() inside footer.php

Inside footer.php there is
https://github.com/infinum/wp-boilerplate/blob/aa753dccb1d3260fc4e1b20fadb1485b94b9fb27/wp-content/themes/theme_name/footer.php#L12-L14
Which should be
<?php
get_template_part( 'template-parts/footer/footer', 'content' );

get_template_part( 'template-parts/footer/foot' );

fixed


Client crash when server not active

The client side (kick/maya) crashes when there is no server active.
We need to detect this and handle it smoothly.
In the future maybe write out an exr alongside the stream?

fixed with commit:
https://github.com/Sosoyan/renderconnect/commit/f82a707f168212659117669f65e353d7c9e9a708

Changed behaviour when rendering multiple aov's into a hard crash


Feature request: private torrent support

This is a great addon, but it would be greater if it supported private torrents. Thanks for your work so far.

agree, using magneturi isn't possible in some trackers (torrent sites) and pulsar translate torrent files to magneturis.


Inconsistencies in events between operating systems

Hi, we're looking at this library to see whether it will be useful in one of our projects. A first question is whether this library is still maintained and whether people are using it, especially given that it is not that active in commits...
Since this repo does not have much documentation, we're left to figuring out how the API works and what it all does by looking at the code, unit test (single) and just experimenting (which is actually the way I prefer to do things). We're looking at a couple of scenario's right now that sparked some curiosity and raised some questions. These mainly have to do with the events that are being produces by the Observable and their differences between Mac and Windows systems.
(You can find the code for the file system monitor here)
Scenario 1: If a file exists on startup and gets changed after startup
On Mac we get a CREATE event for both the folder and the file (both with absolute path), followed by a DELETE of the file with a relative path, even though it still exists
On Windows we get only a MODIFY event, however, it contains an invalid path: if we watch the directory <project-base-dir>/target/test/FileUtils/ containing a file hello.txt, the path we get is <project-base-dir>/hello.txt. This happens in all following scenarios on Windows as well!
Scenario 2: Scenario 1 followed by another change
On Mac will add a MODIFY event for both the folder and file
On Windows will add a MODIFY event for only the file
Scenario 3: Deleting a file
On Mac will cause a MODIFY on the folder and a DELETE on the file (the latter with a relative path)
On Windows will cause a DELETE on the file alone
Scenario 4: Copy pasting a large file (3,28GB) into the monitored folder
On Mac gives a CREATE on both folder and file, immediately followed by a MODIFY on the file
On Windows gives a CREATE on the file alone, immediately followed by a MODIFY on the file and another MODIFY on the file as soon as the copy-paste has finished
Scenario 5: (only tested on Windows) writing in a file and saving it
On Windows gives inconsistently one or two MODIFY events on the file
Are we missing something here, or are these real bugs. If so, are these already known (can't find any issues on that in this repository) and are they related to either this library or the underlying java.nio.* package?
Curious to see if there are any projects that use this library and how they deal with these scenarios!

Hi @rvanheest,
Indeed, this project is not maintained anymore.
The library has been tested on macOS and Linux but never on Windows, it's possible that you find windows related bugs.
One closed-source project was relying on this library to react on modification of a memory mapped file, and as far as I know, everything was working just fine.
The code base is relatively small, and if you want you can make it your own (I can give you access to the repo, if you're interested).


Stop flowing in Microsoft.Bcl.* dependencies

Build will likely fail unless you combine this with a dependency update PR that brings in new Extensions packages (that don't reference Microsoft.Bcl.*).

From discussion in aspnet/Extensions#2527, looks like we need a change like this only in the 'master' branch.

Closing. We don't depend on these in master