Webhook middleware for GitHub events

Greetings!
This is a middleware for responding to events on github using webhooks.
This PR adds handlers for the push and release events.
On receiving a handled event, the middleware executes the following steps:

First, it first tries to validate the sha1 signature if one is present (if the secret was set in GH).
If a signature and a secret is present and it fails to validate the signature, the middleware will exit immediately!
Then it pulls the current release or the head of the tracking branch into a directory.
The middleware supports the same configuration arguments as the git middleware (it uses the middleware internally for pulling) as well as a few new ones.

A typical configuration would look like this:
ghdeploy {
	repo			https://github.com/xenolf/Spoon-Knife
	branch			master
	path			subfolder
	urlPath 		"/github_deploy"
	hookSecret		totallysecret
	then			hugo --destination=/home/user/hugosite/public
}

Excellent work!
Can we combine this with the git middleware? From the user's perspective, the only difference is that this one pulls after a push rather than at a regular interval.
Consider a Caddyfile like this:
git github.com/user/site {
    hook /github_deploy "totallysecret"
    path ../
    then hugo --destination=/home/user/hugosite/public
}

Notice the hook keyword. The first argument is the path of the hook, and the second is the optional secret. What do you think?

Hey!
I thought about this as well, but then decided against it.
The reasoning behind it was that the code in this PR is GitHub only and won't work with any other git hosting provider.
What I could see working is putting it behind a "githubHook" setting or similar. Then we could also have a "bitbucketHook" and so on.

Ah, good point - how about this then for the hook line (and sinker :laughing:)?
hook github /github_deploy "totallysecret"

I imagine that whether it's GitHub or something else, there will always be a URL and an optional secret? Still, this is probably a great place for an interface type so that the underlying service can be swapped out in the future when we add support for other providers.
Think this could work?

Yeah that might work a lot better actually. Now that I think of it, we might not actually need the provider switch at all if we use header indication.
I will make the changes and update the PR.

@xenolf Thanks for this.
I also prefer it to go with the git middleware and the hook keyword.

Alright, the new implementation is up.
The new configuration looks like this:
git https://github.com/xenolf/Spoon-Knife {
    branch master
    hook /github_deploy supersecret
    path	subfolder
}

There is no need to specify a provider name as this is abstracted away.
The provider is asked if it wants to handle a certain request (based on headers) and if yes, it handles it.

Thanks for this. You just marked an item off my todo list for the next release. :+1:


Support API Test for profile Discovery Service Specification V3.0 Profile SSP-001

Support API Test agains profile Discovery Service Specification V3.0 Profile SSP-001
So far it seems that profile testing is not supported. For certification profiles are the most relevant.
High priority profile to be testable:
Discovery Service Specification V3.0 Profile SSP-001

Thanks for reporting this, we will focus on the repository profiles first and later on the registry profiles


PixelCoordToWorldCoord function is not exact

PixelCoordToWorldCoord  when I use this function the position in the world is not at all what it should be. Is there any way to improve the performance, maybe calibrate the camera?

The PixelCoordToWorldCoord function is used in ProjectionExample, and in my testing this example works fine.
If you are not getting the correct values for cameraToWorldMatrix and projectionMatrix, "3.Add Define Symbols:" setting in your setup may be incorrect.


fix(array io): remove artifact types from array ItemTypes

Array should only be from a parameter type

Pull Request Test Coverage Report for Build 456954507

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.06%) to 49.453%

Totals

Change from base Build 453916855:
-0.06%

Covered Lines:
1356

Relevant Lines:
2742

💛  - Coveralls

Pull Request Test Coverage Report for Build 456954507

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.06%) to 49.453%

Totals

Change from base Build 453916855:
-0.06%

Covered Lines:
1356

Relevant Lines:
2742

💛  - Coveralls


Window is not defined error

I'm using version 5.1.2 with Next.js but the error Server Error ReferenceError: window is not defined is thrown when trying to use this component. I'm aware this was a closed issue but the problem has not been resolved.

Hello @laura-sgn. Please check the latest release.
Thank you.

Fix worked! Thank you.


Edit middle dock view (SceneView/CodeEditor) can't scale down past a certain size

Godot version
v4.2.stable.mono.official [46dc27791]
System information
v4.2.stable.mono.official [46dc27791]
Issue description
The editor middle dock view (SceneView/CodeEditor) can't scale down past a 900/400 and will take all the space it can to remain that size. If scaled down enough even the scene view will overflow.
When I want to have my Ide on one side of the screen Godot is nearly unusable and take more that half the screen.

Steps to reproduce
Try scaling down Godot editor window the right side panel will overflow and the left panel will shrink and at a certain size.
Better viewed on a 1920/1080 or smaller screen.
Minimal reproduction project
N/A

related: https://github.com/godotengine/godot-proposals/issues/7156


sum(distinct) support

Which issue does this PR close?

Closes #2404 .
Rationale for this change

For now, DataFusion hasn't support sum(distinct) yet. Though optimizer SingleDistinctToGroupBy (#1315) supports single distinct usage, there are more SQL scenes have not been covered.
For example,  runs the following unit test,
#[tokio::test]
async fn query_sum_distinct() -> Result<()> {
    let schema = Arc::new(Schema::new(vec![
        Field::new("c1", DataType::Int64, true),
        Field::new("c2", DataType::Int64, true),
    ]));

    let data = RecordBatch::try_new(
        schema.clone(),
        vec![
            Arc::new(Int64Array::from(vec![
                Some(0),
                Some(1),
                None,
                Some(3),
                Some(3),
            ])),
            Arc::new(Int64Array::from(vec![
                None,
                Some(1),
                Some(1),
                Some(2),
                Some(2),
            ])),
        ],
    )?;

    let table = MemTable::try_new(schema, vec![vec![data]])?;
    let ctx = SessionContext::new();
    ctx.register_table("test", Arc::new(table))?;

    let sql = "SELECT AVG(c1), SUM(DISTINCT c2) FROM test";
    let actual = execute_to_batches(&ctx, sql).await;
    Ok(())
}

then error raises like
NotImplemented(\"SUM(DISTINCT) aggregations are not available\") at Creating physical plan for 'SELECT AVG(c1), SUM(DISTINCT c2) FROM test': Projection: #AVG(test.c1), #SUM(DISTINCT test.c2)\n  Aggregate: groupBy=[[]], aggr=[[AVG(#test.c1), SUM(DISTINCT #test.c2)]]\n    TableScan: test projection=Some([0, 1])

What changes are included in this PR?

Introduces expressions::DistinctSum into DF

Maintains a HashSet to record unique numeric list, update HashSet when new item input.
Aggregate state stores in ScalarValue::List, which Built from HashSet.
During Final aggregate, evaluates DistinctSum by computing sum from numeric stored in HashSet

Are there any user-facing changes?

No.

cc @andygrove @alamb @yjshen
Please have a review, thank you.

cc @andygrove @tustvold @Dandandan
PTAL, thank you

Thanks @WinkerDu for the code and @yjshen   @Ted-Jiang and @xudong963 for the reviews.
It will be nice to clean up some of the coercion logic -- @WinkerDu  let me know if I should file a ticket to track that work

@WinkerDu let me know if I should file a ticket to track that work

Thank you all
It would be good if you can help me filing the ticket, thank you @alamb

It would be good if you can help me filing the ticket, thank you @alamb

I filed  https://github.com/apache/arrow-datafusion/issues/2447 though in so doing I realized I don't fully understand if there is any change needed or if the coercion is required.


fix: adds limited manifest retries to add reliability

What

adds limited manifest retries to add reliability

:tada: This PR is included in version 1.0.3 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Can't find any proof to the plugin stealing any tokens, although other apps might be able to steal them if they are not encrypted.


Add rock paper scissors game

We dont accept these type of Pull Requests. Hence I will be closing this pull request.


Possible duplicate sections

There seems to be duplicate sections for managed identities and CORS. The wording is a little different in each section, but the content seems to be similar.

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.

ID: 77fc49b6-8652-e740-aab9-b00df8de5ac5
Version Independent ID: 38a06554-d181-4697-9c93-32a97330abb4
Content: Securing Azure Functions
Content Source: articles/azure-functions/security-concepts.md
Service: azure-functions
GitHub Login: @ggailey777
Microsoft Alias: glenga

@lilyjma
Thanks for your feedback! We will investigate and update as appropriate.

ggailey777 Can you please share your thought on this as it looks good to me.


fix(RHINENG-11976): fix loading states across app

/retest

@xmicha82 you have broken tests here, check if you can fix them

/retest

/retest

Codecov Report
Attention: Patch coverage is 8.53659% with 75 lines in your changes missing coverage. Please review.

Project coverage is 8.20%. Comparing base (4af45be) to head (9dd452c).

Files with missing lines
Patch %
Lines

src/Components/ClusterRules/ClusterRules.js
0.00%
14 Missing :warning:

src/Components/WorkloadRules/WorkloadRules.js
0.00%
14 Missing :warning:

.../Components/ClustersListTable/ClustersListTable.js
0.00%
10 Missing :warning:

...omponents/WorkloadsListTable/WorkloadsListTable.js
0.00%
10 Missing :warning:

src/Components/RecsListTable/RecsListTable.js
0.00%
9 Missing :warning:

...nts/AffectedClustersTable/AffectedClustersTable.js
50.00%
7 Missing :warning:

.../AffectedClustersTable/AffectedClustersTable.cy.js
0.00%
4 Missing :warning:

src/Components/ClusterRules/ClusterRules.cy.js
0.00%
4 Missing :warning:

...mponents/ClustersListTable/ClustersListTable.cy.js
0.00%
3 Missing :warning:

Additional details and impacted files
@@            Coverage Diff            @@
##           master    #843      +/-   ##
=========================================
- Coverage    8.27%   8.20%   -0.07%
=========================================
  Files          68      68
  Lines        3953    3962       +9
  Branches      864     863       -1
=========================================
- Hits          327     325       -2
- Misses       3626    3637      +11

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

:tada: This PR is included in version 1.46.2 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


[Android][Canary] AutoLayout test failure

The Toolkit Canaries are failing for a specific AutoLayout UI Test on Android

Failing Tests: 	1. When_Hug_With_CounterAlignment() --- 	Details: Failed: When_Hug_With_CounterAlignment() [AssertFailedException] Expected value to approximate 0.0 +/- 1.0, but 107.0 differed by 107.0.

https://dev.azure.com/uno-platform/Uno Platform/_TestManagement/Runs?runId=2681092&_a=resultSummary&resultId=100000
This is only failing on the canaries so we need to take the latest main of the Toolkit repo and identify what later version of the packages (probably Uno.WinUI) that this test starts failing with.
Last known version of Uno.WinUI that this seemed to be working with was 5.2.0-dev.124. Let's identify which -dev package this test starts failing with

Starting from the merge of the multi-window work, we no longer wrap the Window content in a root Border element anymore and since the affected runtime test was using the RequiresFullWindowAttribute, we were setting the app's Window.Content to the AutoLayout and, in the end, it was now becoming the direct element of the Activity's ContentView. So there seems to be some sort of AutoLayout issue when it doesn't have a UIElement as a direct parent, perhaps.
For now, we wrap the AutoLayout in a Border in the runtime test to workaround the issue but this would need to be investigated further to fix.
cc: @carldebilly / @Robert-Louis


Pub year indexing needs more sanity checking

ocn676863700 has publication date "Minguo 9 [1920]", should be indexed as 1920 but is indexed as 91920

Fixed with move to traject


Proposal: Allow relative image URIs in chapter JSON

I believe this could make chapter definitions a lot more portable in certain situations. The image URIs should be relative to the location of the chapters.json file.
Examples:
// chapters.json located at https://example.com/assets/podcasts/episode-1234/chapters.json
{
  "chapters" : [
    {
      "startTime" : 0,
      "img" : "some-image.jpg"
      //resolves to https://example.com/assets/podcasts/episode-1234/some-image.jpg
    },
    {
      "startTime" : 60,
      "img" : "./some-image.jpg"
      //also resolves to https://example.com/assets/podcasts/episode-1234/some-image.jpg
    },
    {
      "startTime" : 120,
      "img" : "media/another-image.jpg"
      //resolves to https://example.com/assets/podcasts/episode-1234/assets/media/another-image.jpg
    },
    {
      "startTime" : 300,
      "img" : "https://example.com/another-folder/media/absolute-image.jpg"
      //resolves to https://example.com/another-folder/media/absolute-image.jpg
    }
  ]
}

I support this.
(But it's not a chapters file! It's a file that can hold all kinds of episode meta data, including but not limited to chapters.)


🐛 The camera's displayed image is flattened

What's happening?
I wanted to take a photo. But when I open the camera, the displayed image is flattened on android.
I created a project from scratch and the problem persists. I tried on two different android devices. I don't tried on IOS.
When I open the camera in the app, the image becomes flattened. If I do a hot reload or open another app with a camera and return to my app, the image returns to normal..
I took two screenshot from app to show the error. First image is flattened and second image is normal after make a hot reload. These images were not photos taken, they are just a screenshot of the app.
       |
In device log the sensorOrientation is ** landscape-left**, but I have it set to portrait orientation
dependencies
{ "react": "18.2.0", "react-native": "0.72.9", "react-native-vision-camera": "^3.7.0" }
Reproduceable Code
const device = useCameraDevice('front');

<Camera
  style={StyleSheet.absoluteFill}
  photo={true}
  device={device}
  isActive={true}
  orientation="portrait"
/>

Relevant log output
Android logcat

2024-01-11 13:03:07.756 23316-23316 PreviewView             com.testingvisioncamera              I  Creating PreviewView...
2024-01-11 13:03:07.756 23316-23316 PreviewView             com.testingvisioncamera              I  Content Size: 1920x1080 (0.5625) | Container Size: 0x0 (NaN)
2024-01-11 13:03:07.757 23316-23316 PreviewView             com.testingvisioncamera              I  PreviewView is 0x0, rendering 1920x1080 content. Resizing to: 0x0 (COVER)
2024-01-11 13:03:07.758 23316-23316 CameraView              com.testingvisioncamera              I  Updating CameraSession...
2024-01-11 13:03:07.764 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Waiting for lock...
2024-01-11 13:03:07.766 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=true, outputsChanged=true, sidePropsChanged=true, isActiveChanged=true)
2024-01-11 13:03:07.766 23316-28160 CameraSession           com.testingvisioncamera              I  isActive is false, skipping CameraDevice configuration.
2024-01-11 13:03:07.766 23316-28160 CameraSession           com.testingvisioncamera              I  isActive is false, skipping CameraCaptureSession configuration.
2024-01-11 13:03:07.766 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully updated CameraSession Configuration! isActive: false
2024-01-11 13:03:07.779 23316-23316 CameraView              com.testingvisioncamera              I  Updating CameraSession...
2024-01-11 13:03:07.779 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Waiting for lock...
2024-01-11 13:03:07.779 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=true, outputsChanged=true, sidePropsChanged=true, isActiveChanged=true)
2024-01-11 13:03:07.780 23316-28160 CameraSession           com.testingvisioncamera              I  Need to rebuild CameraDevice and CameraCaptureSession...
2024-01-11 13:03:07.780 23316-23316 PreviewView             com.testingvisioncamera              I  Content Size: 1920x1080 (0.5625) | Container Size: 1080x2055 (0.5255474452554745)
2024-01-11 13:03:07.780 23316-23316 PreviewView             com.testingvisioncamera              I  PreviewView is 1080x2055, rendering 1920x1080 content. Resizing to: 1156x2055 (COVER)
2024-01-11 13:03:07.780 23316-28160 CameraSession           com.testingvisioncamera              I  Configuring Camera #1...
2024-01-11 13:03:07.783 23316-28160 CameraManager           com.testingvisioncamera              I  Camera #1: Opening...
2024-01-11 13:03:07.775 23316-23316 sionCamera.main         com.testingvisioncamera              W  type=1400 audit(0.0:25252): avc: denied { read } for name="u:object_r:persist_camera_prop:s0" dev="tmpfs" ino=22306 scontext=u:r:untrusted_app:s0:c133,c257,c512,c768 tcontext=u:object_r:persist_camera_prop:s0 tclass=file permissive=0
2024-01-11 13:03:07.788 23316-28160 libc                    com.testingvisioncamera              E  Access denied finding property "persist.vendor.camera.privapp.list"
2024-01-11 13:03:07.794 23316-23316 CameraSession           com.testingvisioncamera              I  PreviewView Surface created! Surface(name=null)/@0x8724d4a
2024-01-11 13:03:07.794 23316-23316 CameraSession           com.testingvisioncamera              I  Setting Preview Output...
2024-01-11 13:03:07.794 23316-23316 CameraSession           com.testingvisioncamera              I  PreviewView Surface updated! Surface(name=null)/@0x8724d4a 1156 x 2055
2024-01-11 13:03:07.797 23316-28060 CameraDevices           com.testingvisioncamera              I  Camera #1 is now unavailable.
2024-01-11 13:03:07.829 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Waiting for lock...
2024-01-11 13:03:07.830 23316-28160 CameraManager           com.testingvisioncamera              I  Camera #1: Opened!
2024-01-11 13:03:07.834 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully configured Camera #1!
2024-01-11 13:03:07.834 23316-28160 CameraSession           com.testingvisioncamera              I  Destroying previous outputs...
2024-01-11 13:03:07.836 23316-28160 CameraSession           com.testingvisioncamera              I  Creating outputs for Camera #1...
2024-01-11 13:03:07.837 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Camera #1: Creating Capture Session #1... (Hardware Level: 3 | Outputs: [])
2024-01-11 13:03:07.838 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Using new API (>=28)
2024-01-11 13:03:07.843 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Camera #1: Successfully created CameraCaptureSession #1!
2024-01-11 13:03:07.843 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully configured Session with 0 outputs for Camera #1!
2024-01-11 13:03:07.843 23316-28160 CameraSession           com.testingvisioncamera              I  CameraSession has no repeating outputs (Preview, Video, CodeScanner), skipping CaptureRequest...
2024-01-11 13:03:07.843 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully updated CameraSession Configuration! isActive: true
2024-01-11 13:03:07.843 23316-28160 CameraView              com.testingvisioncamera              I  invokeOnInitialized()
2024-01-11 13:03:07.844 23316-28160 CameraSession           com.testingvisioncamera              I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=false, outputsChanged=true, sidePropsChanged=true, isActiveChanged=false)
2024-01-11 13:03:07.844 23316-28160 CameraSession           com.testingvisioncamera              I  Destroying previous outputs...
2024-01-11 13:03:07.846 23316-28160 CameraSession           com.testingvisioncamera              I  Creating outputs for Camera #1...
2024-01-11 13:03:07.849 23316-28160 CameraSession           com.testingvisioncamera              I  Adding 1440x1080 Preview Output...
2024-01-11 13:03:07.850 23316-23316 PreviewView             com.testingvisioncamera              I  Resizing PreviewView to 1440 x 1080...
2024-01-11 13:03:07.852 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Camera #1: Creating Capture Session #2... (Hardware Level: 3 | Outputs: [PREVIEW (1440 x 1080)])
2024-01-11 13:03:07.852 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Using new API (>=28)
2024-01-11 13:03:07.860 23316-23316 CameraSession           com.testingvisioncamera              I  PreviewView Surface updated! Surface(name=null)/@0x8724d4a 1440 x 1080
2024-01-11 13:03:07.861 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Camera #1: Successfully created CameraCaptureSession #2!
2024-01-11 13:03:07.861 23316-28160 CreateCaptureSession    com.testingvisioncamera              I  Camera #1: CameraCaptureSession #1 has been closed.
2024-01-11 13:03:07.861 23316-28160 CameraSession           com.testingvisioncamera              I  Camera Session android.hardware.camera2.impl.CameraCaptureSessionImpl@a104dd8 has been closed.
2024-01-11 13:03:07.861 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully configured Session with 1 outputs for Camera #1!
2024-01-11 13:03:07.865 23316-28160 CameraView              com.testingvisioncamera              I  invokeOnStarted()
2024-01-11 13:03:07.866 23316-28160 CameraSession           com.testingvisioncamera              I  Successfully updated CameraSession Configuration! isActive: true

Camera Device
{
  "sensorOrientation": "landscape-left",
  "hardwareLevel": "full",
  "maxZoom": 8,
  "minZoom": 1,
  "maxExposure": 12,
  "supportsLowLightBoost": false,
  "neutralZoom": 1,
  "physicalDevices": [
    "wide-angle-camera"
  ],
  "supportsFocus": true,
  "supportsRawCapture": true,
  "isMultiCam": false,
  "minExposure": -12,
  "name": "FRONT (1)",
  "hasFlash": false,
  "hasTorch": false,
  "position": "front",
  "id": "1"
}

Device
Oneplus A5010 (Android 10); Xiaomi Mi 9 Lite (Android 9)
VisionCamera Version
3.7.0
Can you reproduce this issue in the VisionCamera Example app?
No, I cannot reproduce the issue in the Example app
Additional information

[ ] I am using Expo
[ ] I have enabled Frame Processors (react-native-worklets-core)
[X] I have read the Troubleshooting Guide
[X] I agree to follow this project's Code of Conduct
[X] I searched for similar issues in this repository and found none.

Edit 1
I recorded my device's screen to show what is happen.
Steps on video: I open my app and the image is flattened, so I open other app that use camera, and when back to my app the image is normal.

Error that appears in the final video:
Camera.onError(unknown/unknown): [unknown/unknown] CAMERA_IN_USE (4): connectHelper:1516: Higher-priority client using camera, ID "1" currently unavailable [unknown/unknown: [unknown/unknown] CAMERA_IN_USE (4): connectHelper:1516: Higher-priority client using camera, ID "1" currently unavailable]

I found a same issue. 👀
I tried the new version 3.7.1 with the fix but the issue still.

Can you upgrade to VisionCamera 3.7.1 to see if this PR: https://github.com/mrousavy/react-native-vision-camera/pull/2377 fixed the issue?

My App has the screen orientation fixed to landscape and i have the same problem (VisionCamera 3.7.1)

Orientation does not work yet. This is mentioned in the # 1 pinned issue https://github.com/mrousavy/react-native-vision-camera/issues/1891

Still present on 3.7.1 :(
After the photo is taken, the resulting image is flipped to the left for some reason (Samsung A52, Frontal camera)

I don't know if it can help to fix the bug but when you switch to the other camera and come back to the previous one, the camera is correct.
front (flattened) => back => front (perfect)

Can you upgrade to VisionCamera 3.7.1 to see if this PR: #2377 fixed the issue?

Unfortunately it didn't resolve

Can you upgrade to VisionCamera 3.7.1 to see if this PR: #2377 fixed the issue?

Unfortunately it didn't resolve

+1

`const device = useCameraDevice(cameraType);
const format = useCameraFormat(device, [
{ videoResolution: { width: 1280, height: 720 } },
{ fps: 30 }
])`
I had the same issue, during the first render of the camera, initially the camera is "front", the preview is stretched vertically, when i switch to back camera and then to front, the stretch is gone.
Using the above code, it fixed the stretch issue in the initial render itself.

The bug still persists in 3.8.2, tested on both Android & iOS, happens only on Android.
If you change something in the code while having the camera open, the fast refresh temporarily fixes the flattening, however on the next camera activation, the flattening is back. When you take a photo, it is good - with the "correct" resolution.

Did a bunch of testing to figure out what's going on here. The solution I ended up on is this:
const [isCameraInitialized, setIsCameraInitialized] = useState(false)
const [isActive, setIsActive] = useState(true)
const squishFixRef = useRef(false)

const initCallback = useCallback(() => {
  if (isCameraInitialized && !squishFixRef.current) {
    squishFixRef.current = true
    setTimeout(() => {
      setIsActive(true)
    }, 150)
    setIsActive(false)
  }
  setIsCameraInitialized(true)
}, [isCameraInitialized])

return (
  <View style={$root}>
    <Camera
      // ...props
      device={device}
      isActive={isCameraInitialized && isActive}
      onInitialized={initCallback}
    />
  </View>
)

Essentially, once the camera is initialized, I flip isActive to false for 150 milliseconds and set it back to true. On my test devices, onInitialized was being called twice (not sure why), but since flipping the camera off and on just once fixes it, I tossed in a ref to ensure it only does so once.

I'm doing the same kind of tricks for Android. Starting with a camera on "front" position then switching to "back" atfer 200ms and the image is good. I'm using the last version, 3.8.2 with React Native in 0.72.4., not using reanimated, the bug is only on android. Good luck for the debug

Also having this issue on Android.

I tried @theabhishek2511 mitigation method but for me even that wasn't working reliably. Usually it doesn't appear when Camera first appears but then when I retake photo it's most likely stretched. For use it then just switches from CameraPreview component back to Camera component.
<Camera
  photo={true}
  style={styles.camera}
  ref={camera}
  device={device}
  isActive={true}
  audio={false}
  resizeMode="cover"
/>

"react-native-vision-camera": "^3.8.2"
"react-native": "0.73.2",
Test device Samsung A33

Duplicate of https://github.com/mrousavy/react-native-vision-camera/issues/2142 but let's still keep it open for discussion

Did a bunch of testing to figure out what's going on here. The solution I ended up on is this:
const [isCameraInitialized, setIsCameraInitialized] = useState(false)
const [isActive, setIsActive] = useState(true)
const squishFixRef = useRef(false)

const initCallback = useCallback(() => {
  if (isCameraInitialized && !squishFixRef.current) {
    squishFixRef.current = true
    setTimeout(() => {
      setIsActive(true)
    }, 150)
    setIsActive(false)
  }
  setIsCameraInitialized(true)
}, [isCameraInitialized])

return (
  <View style={$root}>
    <Camera
      // ...props
      device={device}
      isActive={isCameraInitialized && isActive}
      onInitialized={initCallback}
    />
  </View>
)

Essentially, once the camera is initialized, I flip isActive to false for 150 milliseconds and set it back to true. On my test devices, onInitialized was being called twice (not sure why), but since flipping the camera off and on just once fixes it, I tossed in a ref to ensure it only does so once.

This implementation work in my project. I used the Oneplus A5010 (Android 10);

Still present on 3.7.1 :( After the photo is taken, the resulting image is flipped to the left for some reason (Samsung A52, Frontal camera)

I had the same issue. I searched and found others discussions with same problem:  #1401 #146
I use this workaround. When the width is greater than the height, I rotate the image by 90 degrees with the react-native-image-resizer library and it works

Created a PR to fix this issue once and for all: https://github.com/mrousavy/react-native-vision-camera/pull/2519 💪🚀
Thanks to everyone who sponsored me on GitHub to fix this bug!! 💖
Try the PR and see if it works (by checking out that branch and running the example app)

VisionCamera 3.9.2, still facing issue

VisionCamera 3.9.2, still facing issue
There have been countless new versions of VisionCamera, 4.0.0, 4.0.1, 4.1.0, 4.2.0 etc etc we're at 4.5.0 now. This issue is long fixed.

VisionCamera 3.9.2, still facing issue
There have been countless new versions of VisionCamera, 4.0.0, 4.0.1, 4.1.0, 4.2.0 etc etc we're at 4.5.0 now. This issue is long fixed.

I'm using version 3.9.2 because the project I'm working on is not compatible with the Java version required by VisionCamera starting from version 4.0.0.


Unable to Stream quotes after 9.0

Hi, this is my first time posting a Github issue so please let me know if i am leaving things out.
I am making a GUI that works with Tastytrade with a small wrapper around Tastytrade itself.  After upgrading to 9.0 and applying the fixes for the breaking changes i saw, i still can not request quotes.
Here is the applicable part of my wrapper.
This is inside of a larger async application as well that uses DearPyGUI:
https://github.com/hoffstadt/DearPyGui

As well as a modified version of this:
https://github.com/CasuallyCalm/dearpygui-async

add_newlines = lambda string, every: '\n'.join([string[i:i+every] for i in range(0, len(string), every)])
class Tasty_Async:

    def __init__(self, log, debug=True, queue=None):
        self.streamer = None  # We only want one of these.
        # I may make a factory method to create to create listeners for different symbols.
        # These listeners will share the same streamer.
        self.debug = None
        self.session = None
        self.log = log
        self.process_pool = None
        self.queue = queue
        self.subs_list = ['MSFT']  # Example subscription list
        self.set_debug(debug)  # set the debug mode to True or False
        self.last_weekday=self.get_last_weekday()

    async def create_streamer(self):
        if self.session is None:
            self.log.error('Tasty_Interface.create_streamer: session is None')
            return False
        self.streamer = await DXLinkStreamer(self.session)

    async def get_quotes(self, timeout=1000):
        if self.session is None:
            self.log.log_error('Tasty_Interface.start_streamer: session is None')
            return False, {}
        # if the streamer is None, start the streamer
        if self.streamer is None:
            print('Tasty_Interface.start_streamer: About to make the streamer')
            self.log.log_info(add_newlines('Tasty_Interface.start_streamer: About to make the streamer', 50))
            await self.create_streamer()
            print('Tasty_Interface.start_streamer: Streamer created')
            self.log.log_info(add_newlines('Tasty_Interface.start_streamer: Streamer created', 50))
        try:
            await self.streamer.subscribe(Quote, self.subs_list)
            self.log.log_info(add_newlines('Tasty_Interface.start_streamer: Streamer started and subscribed to quotes', 50))

            # Add timeout to listen_to_quote_streamer
            try:
                quotes = await asyncio.wait_for(self.listen_to_quote_streamer(), timeout)
            except asyncio.TimeoutError:
                self.log.log_error('Tasty_Interface.get_quotes: Timeout while listening to quote streamer')
                return False, {}

            # Print the type of the quotes for each symbol in the dictionary
            '''for symbol in quotes:
                self.log.log_info(f'Tasty_Interface.start_streamer: type of quote for {symbol}: {type(quotes[symbol])}')
                with open(f'{symbol}_quote.pkl', 'wb') as f:
                    pickle.dump(quotes[symbol], f)'''
            # unsubscribe from the quotes
            await self.streamer.unsubscribe(Quote, self.subs_list)
            return True, quotes
        except Exception as e:
            self.log.log_error(add_newlines(f"Tasty_Interface.start_streamer: Failed to start streamer: {e}", 50))
            # raise e # we do not want to raise an exception in DPG. Just print it to the log.
            return False, {}

    async def listen_to_quote_streamer(self):
        quotes = {}
        self.log.log_info(add_newlines(f'Tasty_Interface.listen_to_quote_streamer: About to listen to streamer', 50))
        try:
            async for quote in self.streamer.listen(Quote):
                self.log.log_info(add_newlines(f'Tasty_Interface.listen_to_quote_streamer: Listening to streamer', 50))
                quotes[quote.event_symbol] = quote
                self.log.log_info(add_newlines(f"Tasty_Interface.listen_to_streamer: Received quote: {quote}", 50))
                if len(quotes) >= len(self.subs_list):
                    break
            self.log.log_info(add_newlines(f"Tasty_Interface.listen_to_streamer: Final quotes: {quotes}", 50))
            return quotes
        except Exception as e:
            self.log.log_error(add_newlines(f"Tasty_Interface.listen_to_streamer: Error while listening to streamer: {e}", 50))
            raise e

The code seems to break when i try to make the streamer:
self.streamer = await DXLinkStreamer(self.session)

I turned on logging:
2024-12-30 12:46:43,391 - asyncio - DEBUG - Using proactor: IocpProactor
Event loop:  <ProactorEventLoop running=False closed=False debug=False>
plot val:  257
Window_List:  ['22', '259', '282']
Received Callback:  method
2024-12-30 12:47:01,438 - httpcore.connection - DEBUG - connect_tcp.started host='api.tastyworks.com' port=443 local_address=None timeout=5.0 socket_options=None
2024-12-30 12:47:01,488 - httpcore.connection - DEBUG - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEC947FA0>
2024-12-30 12:47:01,488 - httpcore.connection - DEBUG - start_tls.started ssl_context=<ssl.SSLContext object at 0x000002DFEC917DC0> server_hostname='api.tastyworks.com' timeout=5.0
2024-12-30 12:47:01,518 - httpcore.connection - DEBUG - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEB322830>
2024-12-30 12:47:01,519 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-30 12:47:01,520 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:01,521 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-30 12:47:01,521 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:01,522 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-30 12:47:01,628 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 401, b'Unauthorized', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:02 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP')])
2024-12-30 12:47:01,629 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions "HTTP/1.1 401 Unauthorized"
2024-12-30 12:47:01,630 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-30 12:47:01,630 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:01,631 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:01,632 - httpcore.http11 - DEBUG - response_closed.complete
Received Callback:  method
2024-12-30 12:47:09,243 - httpcore.connection - DEBUG - connect_tcp.started host='api.tastyworks.com' port=443 local_address=None timeout=5.0 socket_options=None
2024-12-30 12:47:09,262 - httpcore.connection - DEBUG - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEC9E4E20>
2024-12-30 12:47:09,263 - httpcore.connection - DEBUG - start_tls.started ssl_context=<ssl.SSLContext object at 0x000002DFEC9B8C40> server_hostname='api.tastyworks.com' timeout=5.0
2024-12-30 12:47:09,292 - httpcore.connection - DEBUG - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEC9E4DF0>
2024-12-30 12:47:09,293 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,293 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:09,294 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,294 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:09,294 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,396 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:10 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'e783fedf8970b6f09b91f6ff0e2c5366')])
2024-12-30 12:47:09,398 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions "HTTP/1.1 201 Created"
2024-12-30 12:47:09,399 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,415 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:09,415 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:09,416 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-30 12:47:09,416 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,418 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:09,418 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,419 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:09,419 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,450 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:10 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'd4a513f45e3418e323ebd3f9424ade92')])
2024-12-30 12:47:09,451 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions/validate "HTTP/1.1 201 Created"
2024-12-30 12:47:09,451 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,452 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:09,452 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:09,452 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-30 12:47:09,465 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'GET']>
2024-12-30 12:47:09,465 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:09,466 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'GET']>
2024-12-30 12:47:09,467 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:09,468 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'GET']>
2024-12-30 12:47:09,517 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:10 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'e979a80ce194d081d5e9a463f1600f40'), (b'Content-Encoding', b'gzip')])
2024-12-30 12:47:09,518 - httpx - INFO - HTTP Request: GET https://api.tastyworks.com/quote-streamer-tokens "HTTP/1.1 200 OK"
2024-12-30 12:47:09,519 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'GET']>
2024-12-30 12:47:09,519 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:09,520 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:09,520 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-30 12:47:09,523 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,524 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:09,524 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,525 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:09,525 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-30 12:47:09,550 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:10 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'ef5564dc015439d99049fd2c74c1abf7')])
2024-12-30 12:47:09,551 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions/validate "HTTP/1.1 201 Created"
2024-12-30 12:47:09,553 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-30 12:47:09,554 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:09,554 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:09,555 - httpcore.http11 - DEBUG - response_closed.complete
Tasty_Interface.login: session is valid
Received Callback:  method
Running:  <bound method User_Interface.Tasty_Quotes of <GUI_Setup_12_7_2024.User_Interface object at 0x000002DFEB321090>> with args:  [105]
Tasty_Interface.start_streamer: About to make the streamer
2024-12-30 12:47:22,085 - websockets.client - DEBUG - = connection is CONNECTING
2024-12-30 12:47:22,121 - websockets.client - DEBUG - > GET /delayed HTTP/1.1
2024-12-30 12:47:22,121 - websockets.client - DEBUG - > Host: tasty-demo-ws.dxfeed.com
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > Upgrade: websocket
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > Connection: Upgrade
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > Sec-WebSocket-Key: 88kt7uOnM+MblNP+Z28aUQ==
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > Sec-WebSocket-Version: 13
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
2024-12-30 12:47:22,122 - websockets.client - DEBUG - > User-Agent: Python/3.10 websockets/14.1
Connection timed out
2024-12-30 12:47:32,047 - websockets.client - INFO - connect failed; reconnecting in 2.0 seconds: asyncio.exceptions.TimeoutError: timed out during handshake
2024-12-30 12:47:32,234 - websockets.client - DEBUG - > EOF
2024-12-30 12:47:32,235 - websockets.client - DEBUG - < EOF
2024-12-30 12:47:32,235 - websockets.client - DEBUG - = connection is CLOSED
2024-12-30 12:47:34,114 - websockets.client - DEBUG - = connection is CONNECTING
2024-12-30 12:47:34,141 - websockets.client - DEBUG - > GET /delayed HTTP/1.1
2024-12-30 12:47:34,141 - websockets.client - DEBUG - > Host: tasty-demo-ws.dxfeed.com
2024-12-30 12:47:34,143 - websockets.client - DEBUG - > Upgrade: websocket
2024-12-30 12:47:34,143 - websockets.client - DEBUG - > Connection: Upgrade
2024-12-30 12:47:34,143 - websockets.client - DEBUG - > Sec-WebSocket-Key: d0FjQ8830HG0oURNHstNbg==
2024-12-30 12:47:34,144 - websockets.client - DEBUG - > Sec-WebSocket-Version: 13
2024-12-30 12:47:34,144 - websockets.client - DEBUG - > Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
2024-12-30 12:47:34,145 - websockets.client - DEBUG - > User-Agent: Python/3.10 websockets/14.1
2024-12-30 12:47:44,074 - websockets.client - INFO - connect failed; reconnecting in 3.1 seconds: asyncio.exceptions.TimeoutError: timed out during handshake
2024-12-30 12:47:44,256 - websockets.client - DEBUG - > EOF
2024-12-30 12:47:44,258 - websockets.client - DEBUG - < EOF
2024-12-30 12:47:44,259 - websockets.client - DEBUG - = connection is CLOSED
2024-12-30 12:47:47,201 - websockets.client - DEBUG - = connection is CONNECTING
2024-12-30 12:47:47,234 - websockets.client - DEBUG - > GET /delayed HTTP/1.1
2024-12-30 12:47:47,234 - websockets.client - DEBUG - > Host: tasty-demo-ws.dxfeed.com
2024-12-30 12:47:47,235 - websockets.client - DEBUG - > Upgrade: websocket
2024-12-30 12:47:47,235 - websockets.client - DEBUG - > Connection: Upgrade
2024-12-30 12:47:47,236 - websockets.client - DEBUG - > Sec-WebSocket-Key: 7k+RkZ69Pg/mNgqFmnwFyQ==
2024-12-30 12:47:47,236 - websockets.client - DEBUG - > Sec-WebSocket-Version: 13
2024-12-30 12:47:47,236 - websockets.client - DEBUG - > Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
2024-12-30 12:47:47,236 - websockets.client - DEBUG - > User-Agent: Python/3.10 websockets/14.1
Received Callback:  method
Running:  <bound method User_Interface.Tasty_User_Logout of <GUI_Setup_12_7_2024.User_Interface object at 0x000002DFEB321090>> with args:  [74]
2024-12-30 12:47:50,538 - httpcore.connection - DEBUG - close.started
2024-12-30 12:47:50,539 - httpcore.connection - DEBUG - close.complete
2024-12-30 12:47:50,539 - httpcore.connection - DEBUG - connect_tcp.started host='api.tastyworks.com' port=443 local_address=None timeout=5.0 socket_options=None
2024-12-30 12:47:50,565 - httpcore.connection - DEBUG - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEB322EC0>
2024-12-30 12:47:50,566 - httpcore.connection - DEBUG - start_tls.started ssl_context=<ssl.SSLContext object at 0x000002DFEC9B8C40> server_hostname='api.tastyworks.com' timeout=5.0
2024-12-30 12:47:50,596 - httpcore.connection - DEBUG - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x000002DFEC9A7C40>
2024-12-30 12:47:50,596 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'DELETE']>
2024-12-30 12:47:50,597 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-30 12:47:50,598 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'DELETE']>
2024-12-30 12:47:50,598 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-30 12:47:50,600 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'DELETE']>
2024-12-30 12:47:50,631 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 204, b'No Content', [(b'Server', b'nginx'), (b'Date', b'Mon, 30 Dec 2024 17:47:51 GMT'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'1639c44246b8d27105dcaeaa544da880')])
2024-12-30 12:47:50,633 - httpx - INFO - HTTP Request: DELETE https://api.tastyworks.com/sessions "HTTP/1.1 204 No Content"
2024-12-30 12:47:50,633 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'DELETE']>
2024-12-30 12:47:50,633 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-30 12:47:50,634 - httpcore.http11 - DEBUG - response_closed.started
2024-12-30 12:47:50,634 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-30 12:47:57,167 - websockets.client - INFO - connect failed; reconnecting in 5.0 seconds: asyncio.exceptions.TimeoutError: timed out during handshake
2024-12-30 12:47:57,352 - websockets.client - DEBUG - > EOF
2024-12-30 12:47:57,353 - websockets.client - DEBUG - < EOF
2024-12-30 12:47:57,354 - websockets.client - DEBUG - = connection is CLOSED

To complicate matters further, I had gotten an email that my account was restricted because of odd (development) activity.  I have since called Tastyworks support and they said it is working normally now.  I still have an email open with the API support as well to make sure nothing is resetricted.
Thanks for your help

Hello! It looks like you're using a method of creating the streamer that was added in v9.4, which is explained in the release notes here: https://github.com/tastyware/tastytrade/releases/tag/v9.4
So you can either upgrade to a later version, or use the old DXLinkStreamer.create functionality.
If you're going to be using an older version, you'll notice that on the documentation page there is a version picker, which you can use to make sure the examples you're seeing match the version you're on.
Hope this helps!

I should have mentioned I am using the most recent version.  My title was missleading.  I was just refering to the new breaking changes in 9.0.

pip show tastytrade

Name: tastytrade
Version: 9.5
Summary: An unofficial, sync/async SDK for Tastytrade!
Home-page: https://github.com/tastyware/tastytrade
Author:
Author-email: Graeme Holliday<EMAIL_ADDRESS>License: MIT License

I see, thanks for the extra context!
The main red flag I see is the websocket URL: tasty-demo-ws.dxfeed.com. It should be tasty-live-ws.dxfeed.com! Are you using a sandbox account? Are you able to run these tests? Can I see the code you're using to create the session?

This is the callback for my login button.  My debug mode just sleeps for 3 seconds.  It is for testing the GUI.  Some of the comments are from an older
Imports:
import asyncio
#from tastytrade.dxfeed import EventType #removed in new version
from tastytrade.dxfeed import Quote, Candle
from tastytrade import DXLinkStreamer
from datetime import datetime
from datetime import timedelta
from typing import Optional
import pickle

#new way
#Going to change over to this one, it is getting more updates and now Boyan's is working on it too:
# https://github.com/tastyware/tastytrade/tree/master
# It is based on the new tastyworks API which is mostly public now.
# It has docs, yay!
# https://tastyworks-api.readthedocs.io/en/latest/sessions.html
#from tastytrade import CertificationSession  #test session, my username and password don't work
from tastytrade import Session  #real session
from tastytrade.utils import TastytradeError
#from tastytrade import ProductionSession  #real session

from dearpygui import dearpygui as dpg
import time as t

  async def login(self, username, password):
      #check if username and password are set
      if username is None or password is None:
          #print an error to the log and return
          self.log.error('Tasty_Interface.login: username or password is None')
          return
      #make sure that the session is not None
      #if it is None, that means we logged out and we can log back in
      if self.session is None:
          #create a new session
          #this is a blocking call so we need to run it in a thread
          #it uses the requests library which is blocking
          #first test this in debug mode using a sleep(3) instead of the session creation
          if self.debug:
              self.log.log_info('Tasty_Interface.login: creating new session - DEBUG MODE')
              await asyncio.to_thread(t.sleep,3)
              self.log.log_info('Tasty_Interface.login: slept for 3 seconds')
              return None
          else:
              try:
                  self.log.log_info('Tasty_Interface.login: creating new session - New API')
                  # Run the blocking CertificationSession creation in a separate thread
                  self.session = await asyncio.to_thread(Session, username, password)
                  #^^ I may need to change this to ProductionSession
                  # I think that the CertificationSession is for development and the ProductionSession is for production
                  # Validate the session asynchronously
                  is_valid = await asyncio.to_thread(self.session.validate)
                  if is_valid:
                      self.log.log_info('Tasty_Interface.login: session is valid')
                      print('Tasty_Interface.login: session is valid')
                      #print('Tasty_Interface.login: Token:', self.session.session_token)
                      return True
                  else:
                      self.log.log_error('Tasty_Interface.login: session is invalid')
                      return False
              except TastytradeError as e:
                  self.log.log_error(add_newlines(f"Failed to create session: {e}",50))
                  return False
      #if the session is not None, that means we are already logged in
      #so we tell the user that they are already logged in and return
      self.log.warning('Tasty_Interface.login: already logged in')
      return False
'''

I funded the account with $10 and now it seems to be working.  I think i remember reading about that in your unit tests that you need to fund the account.

neDrive/Documents/DS_App0_7/main12-29-2024.py
2024-12-31 16:16:42,385 - asyncio - DEBUG - Using proactor: IocpProactor
Event loop:
plot val:  257
Window_List:  ['22', '259', '282']
Received Callback:  method
2024-12-31 16:16:50,331 - httpcore.connection - DEBUG - connect_tcp.started host='api.tastyworks.com' port=443 local_address=None timeout=5.0 socket_options=None
2024-12-31 16:16:50,400 - httpcore.connection - DEBUG - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x0000025BEDD73790>
2024-12-31 16:16:50,401 - httpcore.connection - DEBUG - start_tls.started ssl_context=<ssl.SSLContext object at 0x0000025BEDCE7BC0> server_hostname='api.tastyworks.com' timeout=5.0
2024-12-31 16:16:50,424 - httpcore.connection - DEBUG - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x0000025BEC6F3280>
2024-12-31 16:16:50,424 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,425 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-31 16:16:50,425 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,425 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-31 16:16:50,427 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,545 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Tue, 31 Dec 2024 21:16:50 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b''), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'0aa9f0eef3e0466bac8117b4dbf22175')])
2024-12-31 16:16:50,547 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions "HTTP/1.1 201 Created"
2024-12-31 16:16:50,548 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,548 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-31 16:16:50,549 - httpcore.http11 - DEBUG - response_closed.started
2024-12-31 16:16:50,549 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-31 16:16:50,552 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,553 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-31 16:16:50,554 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,555 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-31 16:16:50,555 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,585 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Tue, 31 Dec 2024 21:16:50 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b''), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'9493e3e49fc3937f5b4a29a5f9c55d8a')])
2024-12-31 16:16:50,586 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions/validate "HTTP/1.1 201 Created"
2024-12-31 16:16:50,587 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,588 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-31 16:16:50,589 - httpcore.http11 - DEBUG - response_closed.started
2024-12-31 16:16:50,589 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-31 16:16:50,602 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'GET']>
2024-12-31 16:16:50,603 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-31 16:16:50,604 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'GET']>
2024-12-31 16:16:50,604 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-31 16:16:50,604 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'GET']>
2024-12-31 16:16:50,678 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Server', b'nginx'), (b'Date', b'Tue, 31 Dec 2024 21:16:50 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b''), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'454f375d01046ffe1a18f99ee37e4ab5'), (b'Content-Encoding', b'gzip')])
2024-12-31 16:16:50,679 - httpx - INFO - HTTP Request: GET https://api.tastyworks.com/quote-streamer-tokens "HTTP/1.1 200 OK"
2024-12-31 16:16:50,681 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'GET']>
2024-12-31 16:16:50,683 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-31 16:16:50,683 - httpcore.http11 - DEBUG - response_closed.started
2024-12-31 16:16:50,684 - httpcore.http11 - DEBUG - response_closed.complete
2024-12-31 16:16:50,685 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,686 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-31 16:16:50,687 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,687 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-31 16:16:50,688 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'POST']>
2024-12-31 16:16:50,717 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 201, b'Created', [(b'Server', b'nginx'), (b'Date', b'Tue, 31 Dec 2024 21:16:50 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b''), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'ec57070175d0b467b3eaa03ccc3d5f72')])
2024-12-31 16:16:50,718 - httpx - INFO - HTTP Request: POST https://api.tastyworks.com/sessions/validate "HTTP/1.1 201 Created"
2024-12-31 16:16:50,719 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'POST']>
2024-12-31 16:16:50,721 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-31 16:16:50,721 - httpcore.http11 - DEBUG - response_closed.started
2024-12-31 16:16:50,721 - httpcore.http11 - DEBUG - response_closed.complete
Tasty_Interface.login: session is valid
Received Callback:  method
Running:  <bound method User_Interface.Tasty_Quotes of <GUI_Setup_12_7_2024.User_Interface object at 0x0000025BEC6F1060>> with args:  [105]
Tasty_Interface.start_streamer: About to make the streamer
2024-12-31 16:17:00,661 - websockets.client - DEBUG - = connection is CONNECTING
2024-12-31 16:17:00,775 - websockets.client - DEBUG - > GET /realtime HTTP/1.1
2024-12-31 16:17:00,775 - websockets.client - DEBUG - > Host: tasty-live-ws.dxfeed.com
2024-12-31 16:17:00,776 - websockets.client - DEBUG - > Upgrade: websocket
2024-12-31 16:17:00,776 - websockets.client - DEBUG - > Connection: Upgrade
2024-12-31 16:17:00,777 - websockets.client - DEBUG - > Sec-WebSocket-Key: cbeFlrqyaQDkPnE8Pd/6BQ==
2024-12-31 16:17:00,777 - websockets.client - DEBUG - > Sec-WebSocket-Version: 13
2024-12-31 16:17:00,777 - websockets.client - DEBUG - > Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
2024-12-31 16:17:00,777 - websockets.client - DEBUG - > User-Agent: Python/3.10 websockets/14.1
2024-12-31 16:17:00,901 - websockets.client - DEBUG - < HTTP/1.1 101 Switching Protocols
2024-12-31 16:17:00,901 - websockets.client - DEBUG - < upgrade: websocket
2024-12-31 16:17:00,901 - websockets.client - DEBUG - < connection: upgrade
2024-12-31 16:17:00,902 - websockets.client - DEBUG - < sec-websocket-accept: FHxbih1pPbmtWb7BQC6U2xrOB48=
2024-12-31 16:17:00,902 - websockets.client - DEBUG - = connection is OPEN
2024-12-31 16:17:00,902 - websockets.client - DEBUG - > TEXT '{"type": "SETUP", "channel": 0, "keepaliveTimeo... "0.1-js/1.0.0-beta.4"}' [119 bytes]
2024-12-31 16:17:00,934 - websockets.client - DEBUG - < TEXT '{"type":"SETUP","channel":0,"keepaliveTimeout":...1.2.4-20240923-144609"}' [116 bytes]
2024-12-31 16:17:00,935 - tastytrade - DEBUG - received: {'type': 'SETUP', 'channel': 0, 'keepaliveTimeout': 60, 'acceptKeepaliveTimeout': 60, 'version': '1.0-1.2.4-20240923-144609'}
2024-12-31 16:17:00,936 - websockets.client - DEBUG - > TEXT '{"type": "AUTH", "channel": 0, "token": "dGFzdH...3lROjvkfTtlrYP0dcQfUI"}' [182 bytes]
2024-12-31 16:17:00,936 - websockets.client - DEBUG - < TEXT '{"type":"AUTH_STATE","channel":0,"state":"UNAUTHORIZED"}' [56 bytes]
2024-12-31 16:17:00,938 - tastytrade - DEBUG - received: {'type': 'AUTH_STATE', 'channel': 0, 'state': 'UNAUTHORIZED'}
2024-12-31 16:17:00,975 - websockets.client - DEBUG - < TEXT '{"type":"AUTH_STATE","channel":0,"state":"AUTHO...6cf-bdba-14da9dbd34b9"}' [102 bytes]
2024-12-31 16:17:00,976 - tastytrade - DEBUG - received: {'type': 'AUTH_STATE', 'channel': 0, 'state': 'AUTHORIZED', 'userId': '189f91de-acd3-46cf-bdba-14da9dbd34b9'}
2024-12-31 16:17:00,976 - tastytrade - DEBUG - Websocket connection established.
2024-12-31 16:17:00,977 - tastytrade - DEBUG - sending keepalive message: {'type': 'KEEPALIVE', 'channel': 0}
2024-12-31 16:17:00,977 - websockets.client - DEBUG - > TEXT '{"type": "KEEPALIVE", "channel": 0}' [35 bytes]
Tasty_Interface.start_streamer: Streamer created
2024-12-31 16:17:00,999 - tastytrade - DEBUG - sending subscription: {'type': 'CHANNEL_REQUEST', 'channel': 7, 'service': 'FEED', 'parameters': {'contract': 'AUTO'}}
2024-12-31 16:17:00,999 - websockets.client - DEBUG - > TEXT '{"type": "CHANNEL_REQUEST", "channel": 7, "serv...: {"contract": "AUTO"}}' [96 bytes]
2024-12-31 16:17:01,092 - websockets.client - DEBUG - < TEXT '{"type":"CHANNEL_OPENED","channel":7,"service":...O","subFormat":"LIST"}}' [106 bytes]
2024-12-31 16:17:01,092 - tastytrade - DEBUG - received: {'type': 'CHANNEL_OPENED', 'channel': 7, 'service': 'FEED', 'parameters': {'contract': 'AUTO', 'subFormat': 'LIST'}}
2024-12-31 16:17:01,094 - tastytrade - DEBUG - Channel opened: {'type': 'CHANNEL_OPENED', 'channel': 7, 'service': 'FEED', 'parameters': {'contract': 'AUTO', 'subFormat': 'LIST'}}
2024-12-31 16:17:01,220 - tastytrade - DEBUG - setting up feed: {'type': 'FEED_SETUP', 'channel': 7, 'acceptAggregationPeriod': 10, 'acceptDataFormat': 'COMPACT', 'acceptEventFields': {'Quote': ['eventSymbol', 'eventTime', 'sequence', 'timeNanoPart', 'bidTime', 'bidExchangeCode', 'askTime', 'askExchangeCode', 'bidPrice', 'askPrice', 'bidSize', 'askSize']}}
2024-12-31 16:17:01,221 - websockets.client - DEBUG - > TEXT '{"type": "FEED_SETUP", "channel": 7, "acceptAgg..."bidSize", "askSize"]}}' [294 bytes]
2024-12-31 16:17:01,223 - tastytrade - DEBUG - sending subscription: {'type': 'FEED_SUBSCRIPTION', 'channel': 7, 'add': [{'symbol': 'MSFT', 'type': 'Quote'}]}
2024-12-31 16:17:01,223 - websockets.client - DEBUG - > TEXT '{"type": "FEED_SUBSCRIPTION", "channel": 7, "ad...FT", "type": "Quote"}]}' [89 bytes]
2024-12-31 16:17:01,256 - websockets.client - DEBUG - < TEXT '{"type":"FEED_CONFIG","channel":7,"dataFormat":...ggregationPeriod":10.0}' [82 bytes]
2024-12-31 16:17:01,257 - tastytrade - DEBUG - received: {'type': 'FEED_CONFIG', 'channel': 7, 'dataFormat': 'COMPACT', 'aggregationPeriod': 10.0}
2024-12-31 16:17:01,258 - tastytrade - DEBUG - Feed configured: {'type': 'FEED_CONFIG', 'channel': 7, 'dataFormat': 'COMPACT', 'aggregationPeriod': 10.0}
2024-12-31 16:17:01,289 - websockets.client - DEBUG - < TEXT '{"type":"FEED_CONFIG","channel":7,"dataFormat":...,"bidSize","askSize"]}}' [258 bytes]
2024-12-31 16:17:01,291 - websockets.client - DEBUG - < TEXT '{"type":"FEED_DATA","channel":7,"data":["Quote"...1.65,421.95,41.0,5.0]]}' [99 bytes]
2024-12-31 16:17:01,291 - tastytrade - DEBUG - received: {'type': 'FEED_CONFIG', 'channel': 7, 'dataFormat': 'COMPACT', 'aggregationPeriod': 10.0, 'eventFields': {'Quote': ['eventSymbol', 'eventTime', 'sequence', 'timeNanoPart', 'bidTime', 'bidExchangeCode', 'askTime', 'askExchangeCode', 'bidPrice', 'askPrice', 'bidSize', 'askSize']}}
2024-12-31 16:17:01,291 - tastytrade - DEBUG - Feed configured: {'type': 'FEED_CONFIG', 'channel': 7, 'dataFormat': 'COMPACT', 'aggregationPeriod': 10.0, 'eventFields': {'Quote': ['eventSymbol', 'eventTime', 'sequence', 'timeNanoPart', 'bidTime', 'bidExchangeCode', 'askTime', 'askExchangeCode', 'bidPrice', 'askPrice', 'bidSize', 'askSize']}}
2024-12-31 16:17:01,292 - tastytrade - DEBUG - received: {'type': 'FEED_DATA', 'channel': 7, 'data': ['Quote', ['MSFT', 0, 0, 0, 0, 'Q', 0, 'Q', 421.65, 421.95, 41.0, 5.0]]}
2024-12-31 16:17:01,292 - tastytrade - DEBUG - received message: ['Quote', ['MSFT', 0, 0, 0, 0, 'Q', 0, 'Q', 421.65, 421.95, 41.0, 5.0]]
2024-12-31 16:17:01,295 - tastytrade - DEBUG - sending subscription: {'type': 'FEED_SUBSCRIPTION', 'channel': 7, 'remove': [{'symbol': 'MSFT', 'type': 'Quote'}]}
2024-12-31 16:17:01,296 - websockets.client - DEBUG - > TEXT '{"type": "FEED_SUBSCRIPTION", "channel": 7, "re...FT", "type": "Quote"}]}' [92 bytes]
2024-12-31 16:17:20,903 - websockets.client - DEBUG - % sending keepalive ping
2024-12-31 16:17:20,903 - websockets.client - DEBUG - > PING 22 c9 f1 1f [binary, 4 bytes]
2024-12-31 16:17:20,940 - websockets.client - DEBUG - < PONG 22 c9 f1 1f [binary, 4 bytes]
2024-12-31 16:17:20,941 - websockets.client - DEBUG - % received keepalive pong
2024-12-31 16:17:30,939 - websockets.client - DEBUG - < TEXT '{"type":"KEEPALIVE","channel":0}' [32 bytes]
2024-12-31 16:17:30,941 - tastytrade - DEBUG - received: {'type': 'KEEPALIVE', 'channel': 0}
2024-12-31 16:17:30,963 - tastytrade - DEBUG - sending keepalive message: {'type': 'KEEPALIVE', 'channel': 0}
2024-12-31 16:17:30,965 - websockets.client - DEBUG - > TEXT '{"type": "KEEPALIVE", "channel": 0}' [35 bytes]
2024-12-31 16:17:40,907 - websockets.client - DEBUG - % sending keepalive ping
2024-12-31 16:17:40,908 - websockets.client - DEBUG - > PING 22 91 b4 01 [binary, 4 bytes]
2024-12-31 16:17:40,944 - websockets.client - DEBUG - < PONG 22 91 b4 01 [binary, 4 bytes]
2024-12-31 16:17:40,944 - websockets.client - DEBUG - % received keepalive pong
Received Callback:  method
Running:  <bound method User_Interface.Tasty_User_Logout of <GUI_Setup_12_7_2024.User_Interface object at 0x0000025BEC6F1060>> with args:  [74]
2024-12-31 16:17:42,147 - httpcore.connection - DEBUG - close.started
2024-12-31 16:17:42,147 - httpcore.connection - DEBUG - close.complete
2024-12-31 16:17:42,149 - httpcore.connection - DEBUG - connect_tcp.started host='api.tastyworks.com' port=443 local_address=None timeout=5.0 socket_options=None
2024-12-31 16:17:42,234 - httpcore.connection - DEBUG - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x0000025BEDDB8D90>
2024-12-31 16:17:42,235 - httpcore.connection - DEBUG - start_tls.started ssl_context=<ssl.SSLContext object at 0x0000025BEDCE7BC0> server_hostname='api.tastyworks.com' timeout=5.0
2024-12-31 16:17:42,262 - httpcore.connection - DEBUG - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x0000025BEDD73B50>
2024-12-31 16:17:42,262 - httpcore.http11 - DEBUG - send_request_headers.started request=<Request [b'DELETE']>
2024-12-31 16:17:42,263 - httpcore.http11 - DEBUG - send_request_headers.complete
2024-12-31 16:17:42,263 - httpcore.http11 - DEBUG - send_request_body.started request=<Request [b'DELETE']>
2024-12-31 16:17:42,263 - httpcore.http11 - DEBUG - send_request_body.complete
2024-12-31 16:17:42,264 - httpcore.http11 - DEBUG - receive_response_headers.started request=<Request [b'DELETE']>
2024-12-31 16:17:42,297 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 204, b'No Content', [(b'Server', b'nginx'), (b'Date', b'Tue, 31 Dec 2024 21:17:42 GMT'), (b'Connection', b'keep-alive'), (b'Access-Control-Allow-Origin', b'*'), (b'Access-Control-Allow-Credentials', b'true'), (b'Access-Control-Allow-Methods', b'GET, POST, OPTIONS, PUT, PATCH, DELETE'), (b'Access-Control-Allow-Headers', b'Accept-Version,Authorization,Cache-Control,Content-Type,If-Modified-Since,Keep-Alive,User-Agent,X-Castle-Request-Token,X-Requested-With,X-Tastyworks-OTP'), (b'Access-Control-Expose-Headers', b'X-Tastyworks-OTP'), (b'X-Request-Id', b'd7a600921671c31435a67cc2c13d7b80')])
2024-12-31 16:17:42,298 - httpx - INFO - HTTP Request: DELETE https://api.tastyworks.com/sessions "HTTP/1.1 204 No Content"
2024-12-31 16:17:42,299 - httpcore.http11 - DEBUG - receive_response_body.started request=<Request [b'DELETE']>
2024-12-31 16:17:42,299 - httpcore.http11 - DEBUG - receive_response_body.complete
2024-12-31 16:17:42,299 - httpcore.http11 - DEBUG - response_closed.started
2024-12-31 16:17:42,301 - httpcore.http11 - DEBUG - response_closed.complete
PS C:\Users\khazy\OneDrive\Documents\DS_App0_7>

I think i am ok now.  I hope this helps my other issue of the candle data having gaps when i get it returned to me.  Strange that this was not an issue before.  I am not sure why it worked with an unfunded account before.  Thanks

Glad you got it figured out! I actually didn't know you needed to fund an account to get API access but makes sense. The unit test thing was because some of the tests place orders.
Good luck trading!


New version: JFrog.Conan version 1.58.0

Result: Installation Failed

Manifest
Add/Remove Programs

Name
Conan Package Manager

Version
1.58.0

Publisher
JFrog

ProductCode

Auto-updated by vedantmgoyal2009/winget-pkgs-automation in workflow run 5667
Microsoft Reviewers: Open in CodeFlow

@wingetbot run


Formatter can't recognize newline missing

Description
Now the rust formatter can't recognize the necessary newline missing, e.g.:
use crate::{
    instance::{Instance, InstanceRef},
    mysql::{error::*, worker::MysqlWorker},
};
pub struct MysqlService<C, Q> {

Make the formatter can fix this case.

Proposal
No proposal yet.

Additional context

There is a tracking issue in rustfmt:

https://github.com/rust-lang/rustfmt/issues/3382

current version of blank_lines_lower_bound is not what we want: https://rust-lang.github.io/rustfmt/?version=v1.5.0&search=#blank_lines_lower_bound
its example behavior is a bit wired
fn foo() {

    println!("a");
}

fn bar() {

    println!("b");

    println!("c");
}

current version of blank_lines_lower_bound is not what we want

This comment says it's already been fixed in this https://github.com/rust-lang/rustfmt/pull/4295, just not released...

I think rust-lang/rustfmt#4295 is merged to the rustfmt-v2-rc branch, which is not going to release.
So the current release(rustfmt-v1) does not contain this patch.
rustfmt-v2 tracking issue:
rust-lang/rustfmt#3887

Closing since this won't be fix with rustfmt-v1


Custom Trace Spans Not Showing in StackDriver

Please answer these questions before submitting a bug report.
What version of OpenCensus are you using?
0.15
What JVM are you using (java -version)?
1.8.0_162
What did you do?
I am trying to incorporate OpenCensus into my Standard Java8 Google App Engine instance.  This is the suggested way to add custom trace information into StackDriver (https://cloud.google.com/trace/docs/setup/java).
I have followed the instructions to initialize the StackDriver exporter
StackdriverTraceExporter.createAndRegister(                     StackdriverTraceConfiguration.builder().setProjectId(projectId).build());
I then got the Tracer element and have been using it to create and complete spans
tracer = Tracing.getTracer(); Span span = tracer.spanBuilder(spanName).setSampler(Samplers.alwaysSample()).startSpan() ..some work... span.end();
What did you expect to see?
I expected to see my custom spans displayed in the StackDriver console.
What did you see instead?
When I do this I am not seeing my custom spans in the StackDriver trace console.  I am seeing the Google App Engine traces (Memcache, Datastore, etc).
Based on previous conversation, I know there is a flush delay.  GAE is definitely not stopping, but not sure about each request Thread. That being said Google SDK is able to record spans in the same environment, I have also confirmed Trace API is enabled for the project.  I initially did not include the project id (as it was suggested that GAE could handle it based on the environment), but after that didn't work I have tried it with the project id with no change.

I tried sample example on GAE with OpenCensus + StackDrive and it worked for me. Please find below sample code. Let us know if you still face the issue.
https://cloud.google.com/appengine/docs/standard/java/quickstart
package com.example.appengine.java8;

// [START example]
import com.google.appengine.api.utils.SystemProperty;
import io.opencensus.common.Scope;
import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration;
import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter;
import io.opencensus.trace.*;
import io.opencensus.trace.config.TraceConfig;
import io.opencensus.trace.samplers.Samplers;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required.
@WebServlet(name = "HelloAppEngine", value = "/hello")
public class HelloAppEngine extends HttpServlet {

  private static final Tracer tracer = Tracing.getTracer();

  static {
    try {
      setupOpenCensusAndStackdriverExporter();
    } catch (IOException e) {
      System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e);
    }
  }

  private static String processLine(String line) {
    try (Scope ss = tracer.spanBuilder("processLine").startScopedSpan()) {
      return line.toUpperCase();
    }
  }

  private static void readEvaluateProcessLine(String in) throws IOException {
    try (Scope ss = tracer.spanBuilder("repl").startScopedSpan()) {
      String line = in;

      // Annotate the span to indicate we are invoking processLine next.
      Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>();
      attributes.put("len", AttributeValue.longAttributeValue(line.length()));
      attributes.put("use", AttributeValue.stringAttributeValue("repl"));
      Span span = tracer.getCurrentSpan();
      span.addAnnotation("Invoking processLine", attributes);

      String processed = processLine(line);
      System.out.println("< " + processed + "\n");
    }
  }

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {
    Properties properties = System.getProperties();

    readEvaluateProcessLine("hello APP Engine");

    response.setContentType("text/plain");
    response.getWriter().println("Hello App Engine - Standard using "
            + SystemProperty.version.get() + " Java "
            + properties.get("java.specification.version"));
  }

  public static String getInfo() {
    return "Version: " + System.getProperty("java.version")
          + " OS: " + System.getProperty("os.name")
          + " User: " + System.getProperty("user.name");
  }

  private static void setupOpenCensusAndStackdriverExporter() throws IOException {
    TraceConfig traceConfig = Tracing.getTraceConfig();
    // For demo purposes, lets always sample.
    traceConfig.updateActiveTraceParams(
            traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build());

    StackdriverTraceExporter.createAndRegister(
            StackdriverTraceConfiguration.builder()
                    .build());
  }

}
// [END example]

@mayurkale22 Thank you very much for putting together a sample to run!  I took what you had and found that if you run in a single thread this does work.  Unfortunately, my environment is multithreaded (called threadsafe on google app engine).  I believe this spawns a new Thread for each request.  In this environment, the traces are not getting reported, I imagine due to the 5 second flush delay.
Can I change the name to this issue to denote it as a feature request to allow StackDriver exporter to work in a multi threaded environment?  If not, I definitely don't mind opening another issue to track the feature request.
Thanks again for the help!

@briantq I would suggest you to make your thread sleep for sometime (>5 secs) to see the behavior, otherwise open new feature request.

@mayurkale22 Thanks for the suggestion but since I am trying to be as performant as possible, making request Threads live 10+ time longer than just to get trace information will cost me much more in extra resources that it's not a viable option.  I will open a feature request.
Thank you for your help!!


Avoid holding a lock during agas::incref while doing a credit split

Do all tests pass for this?

Yes, all tests pass.

I'm still not convinced that competing incref requests do not lead to out of order decref requests, especially when several localities are involved. I'm hesitant to agree to merging this.

I am. I successfully ran hello_world on several numbers of localities: 2, 4, 8, 16, 32, 64, 128, 256 and 512. Hello world ran successfully ten times on each number of localities. Note that hello_world requires credit splitting with 16 localities and up. I didn't have a single failure. How do you think out of order decrefs might happen?

Ok, I'm not able to think of anything bad at this point. Let's go ahead and merge this. I'll keep an eye open, though.


Test search ride

Search Ride and Search Ride Filter are 100% tested*, and I kept the test file just under 1000 lines!

I found one (VERY minor) with the spacing in the indicator row.
I refactored the swap start and destination button into the StartDestinationTimeline.
The price is now actually dependent on the distance. I needed that in order to test the ordering by price. Because we want to test every function we add from now on, I also tested the Position model.
I added a goodie: If you look for a ride and there is one present but not at the time you selected, it will tell you to try another time, now (instead of the "Relax your filters" text, which I noticed while testing wasn't really fitting). If you tap on the text, it will automatically take you to the next-best time.

* If you test this between 00:00 and 00:10, there is one line that isn't tested. The line in question is the validator telling you to choose a valid time, as you chose a time more than 10 minutes ago. Because we use DateTime.now() in that test and I didn't find a good way to mock that online, I thought I'd leave it as is for now. The internet recommends using dart.clock if you want to mock the time afaik.

the searchFillter sort price test has a warning. Can you remove that?

I tried around a little bit and can't seem to figure out what causes the behavior the warning describes. Unfortunately, I am unable to work on this much in the coming days, so I'm considering skipping the test and dealing with it later

When I searched for rides with the whole day option activated when I selected the next day the ride from the day before is still displayed. Is this behaviour right?

When I searched for rides with the whole day option activated when I selected the next day the ride from the day before is still displayed. Is this behaviour right?

Depends. Right now we are checking if the start time OR end time of a drive fits, so if the start and end times are on different days, it's intended behavior. Was that the case?

It is a bit hard to explain, maybe I can just show you?


Sanitize input files for !inspiration

Hi,
This PR addresses a bug in the !inspiration command. Due to the way the input files are parsed, a certain pair of inspirations would be parsed as a single one:
 !inspiration
 When I'm ready to make a photograph, I think I quite obviously see in my minds
 eye something that is not literally there in the true meaning of the word. I'm
 interested in something which is built up from within, rather than just
 extracted from without.
         ― Ansel Adams
 %%
 When in doubt, tell the truth.
         ― Mark Twain
This fix sanitizes both the inspirations and the inspiration index to address this issue.

cough tests cough

#52 is coming back from the dead. . .maybe :)


If a worker times out and the task is marked as "FAILED", the history still shows it as "RUNNING"

Steps:

Start a task via command line that will take a while
Wait a few seconds (so it registers with the scheduler), then kill the task (control+C)
Wait 60 seconds
Go to the scheduler UI/API - the task shows as "FAILED", and the logs show "INFO: Worker Worker(...) timed out (no contact for >=60.0s)"
HOWEVER - if you go to /history, the status shows as "RUNNING" and is never updated
Even if you restart luigid, the task will forever show as RUNNING in /history

Looks like the history feature is not properly being updated, even though the UI is.
(EDIT: luigi 2.1.1)

Can you share some code to replicate the problem ?

closing this issue.

[x] It has been inactive for +4 months.
[ ] It's not about luigi core, so not as many users are affected about this.
[ ] The change seems quite big, it's unlikely to be sporadically picked up.
[x] The owner haven't responded or disappeared.
[ ] I don't understand what this issue is about.
[ ] There exists a reasonable workaround for this.
[x] We need to check if this hasn't been fixed by now (for old issues).
[ ] This is kind of by design and not a bug.
[ ] Resolving this would probably add a lot of complexity.

Every open issue adds some clutter, and we try to make the issues fewer and make it easier for new collaborators to find. Currently we try to close any issue that meets the first checkbox + one other.
Feel free to reopen this issue at any point if you have the intent to continue to work this. :)


Launch checklist

In order to launch we should have:

[x] scheme as a submodule in x-api
[ ] at least 10 problems
[ ] a "how to get started" topic in the help repo repo (app/pages/languages/getting-started-with-scheme.md)
[ ] one to a handful of people willing to check exercism regularly (daily?) for nitpicks to ensure that the track gets off on the right foot
[ ] toggle "active" to true in config.json

Some tracks have been more successful than others, and I believe the key features of the successful tracks are:

Each submission receives feedback quickly, preferably within the first 24 hours.
The nitpicks do not direct users to do specific things, but rather ask questions challenging people to think about different aspects of their solution, or explore new aspects of the language.

@kytrinyx working on the getting-started topic, what should the value of "ordinal" be in the YAML front matter?

For now I've been assigning ordinals such that the languages end up in alphabetical order.

Gotcha. So for the moment I'll use something between 'scala' and 'swift', closer to Scala :)
I think I'm going to go ahead and write it for Guile, and update if #11 leads to a consensus that another Scheme is more optimal. So expect a PR before too long :smiley_cat:

That sounds good, thanks!

80% there on problem count, I think as soon as I finish with this sprint at work I'll try to knock out two more and get teh SETUP.md finished. Wish me luck :tired_face:

w00t :) (and good luck!)

1 problem to go...

Well, last thing on the checklist is toggling active to true...
I'll check for submissions at least every 24-48 hours and actively recruit others, maybe some of the active Lisp and Clojure folks will jump in. I'm not above cajoling.

Ugh... @kytrinyx maybe blocking for #21 - Add submodule was checked off (pretty sure it wasn't me) but I don't see it in x-api - am I missing something?

I did that a while back. Now it'll just go live the next time I update the submodules (which is in 30 seconds).

I was wrong, I didn't do it a while back. Fixing it now.

Deployed. exercism fetch scheme gives me the first exercise.

w00t!


Difference in RSA Signature on macOS vs Ubuntu

New Issue Checklist

[x] I'm using the latest version of Swift Crypto (main branch)
[x] I read the Contribution Guidelines
[x] I searched for existing GitHub issues

Expected behavior
When generating a signature using _RSA.Signing.PrivateKey(pemRepresentation:).signature(for:padding:), the method should generate identical signatures on macOS 14.6.1 (development machine) versus Ubuntu 22.04.4 LTS.
Actual behavior
When generating a signature using _RSA.Signing.PrivateKey(pemRepresentation:).signature(for:padding:), the method generates different outputs on macOS 14.6.1 (development machine) versus Ubuntu 22.04.4 LTS.
Steps to reproduce
Test case code for reproducing the behaviour:
final class SignatureValidatorTests: XCTestCase {

  func testGeneratingSignatureHeader() throws {
    let digest = "dJZMgTHg+E8GHSUfoZmlcNHmemgyb73xYXuSu6kuGS4="
    let date = "Wed, 11 Sep 2024 07:20:22 GMT"
    // what should be generated + is generated on macOS
    let expected = "Jk+0f4MPcFHewm7x+nHxYjCXNRoEwGVUz9SpKNFh9DWbQRQwy/e/SG5T1QKDnigvVI8tWDGFPTSS2AvLPud5KKzWFrps29AkRooc2bz1ONchCZRr4HC6bHi9LwALoZgnhzy04P0Esn4AfNRCi6KlFcJNi2jUDxNzgGpF5a1LHPmLmN5VldySzFmXMQe5M5MK7c9nImfhfgivr9CuxZxLnuHuotHhawn0Tv20bXvOWK1LJMLIw6UI2Ofq8Gfr3K2AYpoP/sJfETfw0kMorbj38tSjXgu4PVkL5FER3OZqNzU7i5HJEkjTdjusD7txkTP4/eO7oCoyD3pzwZ+xtknrYg=="
    // what gets generated on Ubuntu
    let actual = "dCPLJ7FOn9hkRuNOpCbM2RXrD/YOrbD4yhX7Ify3B9XrGZ/amrw/xnK6HS+W6/817iTbpi61G1NQAovi2wOVs7gR4DtP+fNxQv/3oaQmyN4PWnUBsOFnPRpISiy9b6SuEEba+se19GocZOnAtkCVHdAzvPLvX7xrPMBBmTaHfaiIDFapB8dW7zDX+7IrbleGRUwitwLH8bG8T9+SGmD48p7bFbqHiZ9B2VpV91HhhR7TJ5SzEDhHcrGRJxrXOZ1Tfftn3dJKYZIpQ8Cq61Ox65D99z6UpReav2nZK80+32c02Av95Nk22uzdiidPI0mNE/WIgOn3bkjSFLtBH4ws3A=="

    let stringToSign = """
(request-target): post /inbox
host: mastodon.social
date: \(date)
digest: SHA-256=\(digest)
"""

    let stsData = stringToSign.data(using: .utf8)!
    let privateKey = try _RSA.Signing.PrivateKey(pemRepresentation: privateKeyPEM)
    let signatureData = try privateKey.signature(for: stsData, padding: .insecurePKCS1v1_5)
    let signature = Data(signatureData.rawRepresentation).base64EncodedString()

    XCTAssertEqual(signature, actual)       // passes on macOS, fails on Ubuntu
    XCTAssertEqual(signature, expected)  // passes on Ubuntu, fails on macOS
  }

  // MARK: -
  let privateKeyPEM = """
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0oZMFXQadnV7K03Dy3ZJBdYPb/8aJputrykCecEv+CRZIRyu
+v+F75nZx7aeu0Mz61onAINhIrQSwpT3HkqDB1XfNEwFE2VubgK/b8MvC07hXrVl
scYITyiDy2836bwvkr7w2T1jxCjBcrBKM+7/atFKuRRQhW2FXqfD/24UToo4nW3w
Qo/e8JlAhcq7y0Mx4KqU8zCw8f0VGl1FnaWpS0x1YRESgvet1vXtST/uAUz2SOV0
DyqpPHvhyQSr+4iwm+3WoSgKn67PQ4gxdIccqXNh+YnZAo0+nQ9rp+jlRfJEMnda
aTsWmCx2L40nWQUXd8mRnNiBMdZtqD3R+JTg9QIDAQABAoIBABobO04hwrJT6T06
fIA7n9yQagOqb9S/0274N+1fTpKH92GKzAwmKbbHrmD8vXxdXg/ecx22LRJ/oB/v
FyHzfYIoXPCASNTZ7DLKNnEmlCvj0UDMX9sGwrsGPCm7FgTvKDsbYISf/0IxB6Qw
RlNgXN4jLA/9e+q/5R0S0tRXEz+V3Lu09T59SzV9Yd2BOb5G2PbhIE81YCIjXwTA
g1cyHY+FLyn4GVQVGXpkgKk6c24V4ngagLm2jiUcdVX/N3MQt/ZGyw1TAZo3L372
q5ERCXeiihjdW2Tx9ap0U0HZQKg2IfoogQjM0gUKDt9y0km7GJgzyH+j2gxvViJ/
1vzmFiECgYEA9SpizlCaGxNWjdDfTyc2FBn073e/+22m7oEDDH8Cjp/uHjioIsaw
1ylvIPpTK3Vvy0TEQvYaHa+8WP8YKekfkYcbBcYFohLyw4U4qie+8GvT1jD/6DXk
kHCz3cIGQBddhQ74gTwLU9UF03sJXHUwEVTMlSKw8Y4Ohcbf1er4v60CgYEA29QC
kO/VJAJJLQZH9qBQzVV+9OILpX+wrTnT75ulYT2heg4RU2VCqbZArXJj50o1SZJK
Lbh6GxsDr6U1gsmb5gDsWhj3ig8GZRKRWMBWEC9CUIz9WSYzu7yYnDmYmr2pDuMo
T9vTqSAzBI86gB+LPali9gGf7qJyHQ6yQ1iDr2kCgYEAtrYyEOSNFSSiWuqRomHs
sapumpE6aN1djV5ksUlu1HBoe+lplRFS9eeRRJiKp1bMTEchpW3YJMu1qPXkQkfV
GRYBk5ny1MkeV4zPoDAi4vbZV0YJUjvn7aWwxtI06kr/jYyMs3PWVVHrF6MYZOmJ
O0Fhfrvt9vgR5q1CYCDP5bkCgYBh4yttXM6dZUMugHCFGuhANwT8iLfE73I+ANUm
Cjn/bhE8p40BhMLFjbmJQrnH4VyPMUxExbPh5AqlKT0Fyz7XkauthxabbItdcII2
chcgx9qQweeCzicVPyr5zg/tP+1LCs4FmY7L7eGp8xmKugEn6Qh/IUQVYFLOK6An
qv+gmQKBgQC5iHye6Tvv+wfZ0BntAM6yQbLhGLeOSzRRAd58pAN7uWugmZaAzQ7h
63ghGvEHjLVTthWcMWzpcuxNI2EE84sjYZg3noyYzYB5s9QFURft8ppu2b6zj5so
HvFrfdu4DUI4b5rTXLNRxDeDsYTwAUghy9Ds5V5qqoTepuDaPSgFdg==
-----END RSA PRIVATE KEY-----
"""

}

Swift Crypto version/commit hash
https://github.com/apple/swift-crypto/commit/ce204da6f612dbcf131afda1f208115202eae644
Environment

Swift version: Swift version 5.10 (swift-5.10-RELEASE)
Target: x86_64-unknown-linux-gnu
Unix version: Linux ip-172-30-3-16 6.5.0-1016-aws #16~22.04.1-Ubuntu SMP Wed Mar 13 18:54:49 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

I hit this bug on a production server.
So to verify, I tunnelled my dev setup to a temporary remote host to verify, and it works as expected, no changes in code.
I forgot to mention in the OP: the local code, running on macOS, is a debug build, while the server build is a release/production build, if that is of any consequence.

I'm really struggling to find a way to make this reproduce at all. Does your xctest actually fail on your Linux node? Are you actually running Crypto from main?

Does your xctest actually fail on your Linux node?

Yes

Are you actually running Crypto from main?

Yes, the specific commit mentioned in the OP.
I'll setup Ubuntu 22.04.4 LTS in UTM as a VM tomorrow morning to figure out if I can reproduce this locally as well, and get back to you with my findings.

Thank you, that would be helpful. I tried the 5.10 docker image, both arm64 and amd64, without success.

I can reproduce this on a Ubuntu 22.04.4 VM running in UTM (host: macOS 14.6.1 ARM) :

➜  testPKG ./.build/release/CryptoMe
Actual true
Expected false
➜  testPKG ./.build/checkouts/swift-crypto/scripts/environment.sh
This will replace your current pasteboard. Continue? [y/n]y
Swift version: Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: aarch64-unknown-linux-gnu
Unix version: Linux ubuntuutm 6.8.0-40-generic #40~22.04.3-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 30 17:53:10 UTC 2 aarch64 aarch64 aarch64 GNU/Linux
Your pasteboard now contains debug info, paste it on Github

Creating a debug build has no impact on this:

➜  testPKG ./.build/debug/CryptoMe
Actual true
Expected false

@Lukasa I've created a more condensed sample code and it validates correctly on all three platforms: macOS (local), Ubuntu (UTM VM), and the production server (UTM VM).
I apologise for the confusion, and I appreciate your patience.
I'm closing this thread, as I continue to investigate this further on my end.

No need to apologise, raising it here was absolutely the right thing to do. I hope you were able to get pointed in the right direction! Thanks for the issue. ✨


Interactive graph example

Hi!
I made an example of interactive graphs for displaying data using plotly
The example shows laptime evolution during a race and can be filtered to compare different drivers.
As I was not sure if there was a plotly supported template, I made a custom one, but it can be removed and replaced by default plotly templates (I recommend using dark ones).
I also have a jupyter notebook version of the example, and a py script that exports the graph into an interactive html file.
Here are some screenshots of the graph:

Hi, this looks really cool!
I have two things to note for now. First, as you mentioned as well, I think it might be preferable to not define a custom plotly template. In my opinion, it makes the example a bit too bloated.
Second, the example is currently not rendered correctly in the docs. There is no plotting output shown. You can compare your code to examples/plot_results_tracker.py which is another plotly based example.
Also, it might be nice to break your code into sections with short explanations as well.

I have two things to note for now. First, as you mentioned as well, I think it might be preferable to not define a custom plotly template. In my opinion, it makes the example a bit too bloated.

Sure, it's better to use a built-in template.

Second, the example is currently not rendered correctly in the docs. There is no plotting output shown. You can compare your code to examples/plot_results_tracker.py which is another plotly based example. Also, it might be nice to break your code into sections with short explanations as well.

Fixed as the example, thanks!

Also, I noticed it was not quite friendly having on the first render all of the drivers shown.
I changed visibility to 'legendonly' and then changed visibility only for two drivers.

The example is still not being rendered correctly in the documentation.
Show Image

I'm not really sure why that is the case, without digging any further right now. Ideally, you could try to build the documentation locally as that would be the quickest way to figure this out.
See https://docs.fastf1.dev/contributing/documenting_fastf1.html
Alternatively, the CI generates the documentation as a build artifact that you can download from the CI run summary. But this being your first pull request, I need to manually approve each CI run for every new change that you push. So this slows things down quite a bit.


Update to v0.1.0-beta.9

Check core files in original english package and update with necessary changes.

I Update Soon

Okay, if you want add me as reviewer in the related PR.

@jslirola Can test the new version compatible with beta9? Thanks