[cherry pick] Use PorterDuff blend mode when below Android 29

Part of: https://github.com/flutter/flutter/issues/108136
Pre-launch Checklist

[x] I read the Contributor Guide and followed the process outlined there for submitting PRs.
[x] I read the Tree Hygiene wiki page, which explains my responsibilities.
[x] I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
[x] I signed the CLA.
[x] I listed at least one issue that this PR fixes in the description above.
[x] I updated/added relevant documentation (doc comments with ///).
[x] I added new tests to check the change I am making, or this PR is test-exempt.
[x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

umm looks like some tests are failing

The failures looks like they are unrelated to the engine change in my specific PR. I'm assuming this could be caused by the other engine changes that are included in using this specific commit. Would the solution to this be to find the earliest engine commit that passes tests and includes the cherry-picked PR?

The failures looks like they are unrelated to the engine change in my specific PR. I'm assuming this could be caused by the other engine changes that are included in using this specific commit. Would the solution to this be to find the earliest engine commit that passes tests and includes the cherry-picked PR?

umm this doesn't sound correct to me, maybe @itsjustkevin and @CaseyHillers would have better idea?

@bparrishMines you'll need to open the engine PR, and then manually roll the branched engine change into this branch.
In its current state, you're fast forwarding the engine to the commit on ToT.


[BUG] Document Intelligence operation returning 404

Library name and version
Azure.AI.DocumentIntelligence 1.0.0-beta.3
Describe the bug
I have asp.net web app with following code which works in local system (Mac OS) but didn't work in Azure Web App (Linux) after deployment.
I checked the api key and api endpoint with logging and they are correct.
Expected behavior
Generate markdown file after publish like local
Actual behavior
AnalyzeFileAsync -> Resource not found
Status: 404 (Not Found)
ErrorCode: 404
Content:
{"error":{"code":"404","message":"Resource not found"}}
Headers:
Date: Tue, 01 Oct 2024 20:43:28 GMT
Content-Length: 55
Content-Type: application/json
Reproduction Steps
async Task<AnalyzeDocumentResult> AnalyzeDocumentAsync(string filePath)
            {

                var config = ((IConfigurationRoot)_config).GetRequiredSection("DocumentIntelligence").Get<DocumentIntelligenceConfig>();
                var credential = new AzureKeyCredential(config?.ApiKey ?? string.Empty);

                var options = new DocumentIntelligenceClientOptions(DocumentIntelligenceClientOptions.ServiceVersion.V2024_07_31_Preview);
                var client = new DocumentIntelligenceClient(new Uri(config?.EndPoint ?? string.Empty), credential, options);

                var file = new AnalyzeDocumentContent()
                    {
                        Base64Source = BinaryData.FromBytes(await File.ReadAllBytesAsync(filePath))
                    };

                var operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", file.Content, outputContentFormat: ContentFormat.Markdown);

                if (!operation.HasValue)
                {
                    _logger.LogError($"File doesn't have data: trackingCode: {trackingCode}");
                    return new AnalyzeDocumentResult(false, file.FilePath, null);
                }
                if (!operation.HasCompleted)
                {
                    _logger.LogError($"File doesn't completed: trackingCode: {trackingCode}");
                    return new AnalyzeDocumentResult(false, file.FilePath, null);
                }
                await File.WriteAllTextAsync(file.FilePath.Replace(".pdf", ".md"), operation.Value.Content);
                return new AnalyzeDocumentResult(true, file.FilePath, operation.Value.Content);
            }

Environment
Local:
.NET SDK:
Version:           8.0.204
Commit:            c338c7548c
Workload version:  8.0.200-manifests.9f663350
Runtime Environment:
OS Name:     Mac OS X
OS Version:  15.0
OS Platform: Darwin
RID:         osx-arm64
Base Path:   /usr/local/share/dotnet/sdk/8.0.204/
.NET workloads installed:
There are no installed workloads to display.
Host:
Version:      8.0.4
Architecture: arm64
Commit:       2d7eea2529
.NET SDKs installed:
7.0.408 [/usr/local/share/dotnet/sdk]
8.0.204 [/usr/local/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 7.0.18 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.4 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 7.0.18 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.4 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
None
Environment variables:
Not set
global.json file:
Not found
Learn more:
https://aka.ms/dotnet/info
Download .NET:
https://aka.ms/dotnet/download
Azure:
{
  "id": "****",
  "name": "****",
  "type": "Microsoft.Web/sites",
  "kind": "app,linux",
  "location": "Germany West Central",
  "tags": {
  },
  "properties": {
      "name": "****",
      "state": "Running",
      "hostNames": [
          "****.azurewebsites.net"
      ],
      "webSpace": "****",
      "selfLink": "****",
      "repositorySiteName": "***",
      "owner": null,
      "usageState": 0,
      "enabled": true,
      "adminEnabled": true,
      "siteScopedCertificatesEnabled": false,
      "afdEnabled": false,
      "enabledHostNames": [
          "****.azurewebsites.net",
          "****.scm.azurewebsites.net"
      ],
      "siteProperties": {
          "metadata": null,
          "properties": [
              {
                  "name": "LinuxFxVersion",
                  "value": "DOTNETCORE|8.0"
              },
              {
                  "name": "WindowsFxVersion",
                  "value": null
              }
          ],
          "appSettings": null
      },
      "availabilityState": 0,
      "sslCertificates": null,
      "csrs": [],
      "cers": null,
      "siteMode": null,
      "hostNameSslStates": [
          {
              "name": "****.azurewebsites.net",
              "sslState": 0,
              "ipBasedSslResult": null,
              "virtualIP": null,
              "virtualIPv6": null,
              "thumbprint": null,
              "certificateResourceId": null,
              "toUpdate": null,
              "toUpdateIpBasedSsl": null,
              "ipBasedSslState": 0,
              "hostType": 0
          },
          {
              "name": "***.azurewebsites.net",
              "sslState": 0,
              "ipBasedSslResult": null,
              "virtualIP": null,
              "virtualIPv6": null,
              "thumbprint": null,
              "certificateResourceId": null,
              "toUpdate": null,
              "toUpdateIpBasedSsl": null,
              "ipBasedSslState": 0,
              "hostType": 1
          }
      ],
      "computeMode": null,
      "serverFarm": null,
      "serverFarmId": "****",
      "reserved": true,
      "isXenon": false,
      "hyperV": false,
      "lastModifiedTimeUtc": "2024-10-01T11:01:46.8933333",
      "storageRecoveryDefaultState": "Running",
      "contentAvailabilityState": 0,
      "runtimeAvailabilityState": 0,
      "dnsConfiguration": {},
      "vnetRouteAllEnabled": false,
      "containerAllocationSubnet": null,
      "useContainerLocalhostBindings": null,
      "vnetImagePullEnabled": false,
      "vnetContentShareEnabled": false,
      "outboundVnetRouting": null,
      "siteConfig": {
          "numberOfWorkers": 1,
          "defaultDocuments": null,
          "netFrameworkVersion": null,
          "phpVersion": null,
          "pythonVersion": null,
          "nodeVersion": null,
          "powerShellVersion": null,
          "linuxFxVersion": "DOTNETCORE|8.0",
          "windowsFxVersion": null,
          "windowsConfiguredStacks": null,
          "requestTracingEnabled": null,
          "remoteDebuggingEnabled": null,
          "remoteDebuggingVersion": null,
          "httpLoggingEnabled": null,
          "azureMonitorLogCategories": null,
          "acrUseManagedIdentityCreds": false,
          "acrUserManagedIdentityID": null,
          "logsDirectorySizeLimit": null,
          "detailedErrorLoggingEnabled": null,
          "publishingUsername": null,
          "publishingPassword": null,
          "appSettings": null,
          "metadata": null,
          "connectionStrings": null,
          "machineKey": null,
          "handlerMappings": null,
          "documentRoot": null,
          "scmType": null,
          "use32BitWorkerProcess": null,
          "webSocketsEnabled": null,
          "alwaysOn": true,
          "javaVersion": null,
          "javaContainer": null,
          "javaContainerVersion": null,
          "appCommandLine": null,
          "managedPipelineMode": null,
          "virtualApplications": null,
          "winAuthAdminState": null,
          "winAuthTenantState": null,
          "customAppPoolIdentityAdminState": null,
          "customAppPoolIdentityTenantState": null,
          "runtimeADUser": null,
          "runtimeADUserPassword": null,
          "loadBalancing": null,
          "routingRules": null,
          "experiments": null,
          "limits": null,
          "autoHealEnabled": null,
          "autoHealRules": null,
          "tracingOptions": null,
          "vnetName": null,
          "vnetRouteAllEnabled": null,
          "vnetPrivatePortsCount": null,
          "publicNetworkAccess": null,
          "cors": null,
          "push": null,
          "apiDefinition": null,
          "apiManagementConfig": null,
          "autoSwapSlotName": null,
          "localMySqlEnabled": null,
          "managedServiceIdentityId": null,
          "xManagedServiceIdentityId": null,
          "keyVaultReferenceIdentity": null,
          "ipSecurityRestrictions": null,
          "ipSecurityRestrictionsDefaultAction": null,
          "scmIpSecurityRestrictions": null,
          "scmIpSecurityRestrictionsDefaultAction": null,
          "scmIpSecurityRestrictionsUseMain": null,
          "http20Enabled": false,
          "minTlsVersion": null,
          "minTlsCipherSuite": null,
          "scmMinTlsCipherSuite": null,
          "supportedTlsCipherSuites": null,
          "scmSupportedTlsCipherSuites": null,
          "scmMinTlsVersion": null,
          "ftpsState": null,
          "preWarmedInstanceCount": null,
          "functionAppScaleLimit": 0,
          "elasticWebAppScaleLimit": null,
          "healthCheckPath": null,
          "fileChangeAuditEnabled": null,
          "functionsRuntimeScaleMonitoringEnabled": null,
          "websiteTimeZone": null,
          "minimumElasticInstanceCount": 1,
          "azureStorageAccounts": null,
          "http20ProxyFlag": null,
          "sitePort": null,
          "antivirusScanEnabled": null,
          "storageType": null,
          "sitePrivateLinkHostEnabled": null,
          "clusteringEnabled": false
      },
      "functionAppConfig": null,
      "daprConfig": null,
      "deploymentId": "***",
      "slotName": null,
      "trafficManagerHostNames": null,
      "sku": "Basic",
      "scmSiteAlsoStopped": false,
      "targetSwapSlot": null,
      "hostingEnvironment": null,
      "hostingEnvironmentProfile": null,
      "clientAffinityEnabled": false,
      "clientAffinityProxyEnabled": false,
      "blockPathTraversal": false,
      "clientCertEnabled": false,
      "clientCertMode": 0,
      "clientCertExclusionPaths": null,
      "hostNamesDisabled": false,
      "ipMode": "IPv4",
      "vnetBackupRestoreEnabled": false,
      "domainVerificationIdentifiers": null,
      "customDomainVerificationId": "***",
      "kind": "app,linux",
      "managedEnvironmentId": null,
      "workloadProfileName": null,
      "resourceConfig": null,
      "inboundIpAddress": "***",
      "possibleInboundIpAddresses": "***",
      "ftpUsername": "***",
      "ftpsHostName": "***",
      "outboundIpAddresses": "***",
      "possibleOutboundIpAddresses": "****",
      "containerSize": 0,
      "dailyMemoryTimeQuota": 0,
      "suspendedTill": null,
      "siteDisabledReason": 0,
      "functionExecutionUnitsCache": null,
      "maxNumberOfWorkers": null,
      "homeStamp": "waws-prod-fra-037",
      "cloningInfo": null,
      "hostingEnvironmentId": null,
      "tags": {
      },
      "resourceGroup": "rg-test-os",
      "defaultHostName": "app-test-os.azurewebsites.net",
      "slotSwapStatus": null,
      "httpsOnly": false,
      "endToEndEncryptionEnabled": false,
      "functionsRuntimeAdminIsolationEnabled": false,
      "redundancyMode": 0,
      "inProgressOperationId": null,
      "geoDistributions": null,
      "privateEndpointConnections": [],
      "publicNetworkAccess": "Enabled",
      "buildVersion": null,
      "targetBuildVersion": null,
      "migrationState": null,
      "eligibleLogCategories": "AppServiceAppLogs,AppServiceAuditLogs,AppServiceConsoleLogs,AppServiceHTTPLogs,AppServiceIPSecAuditLogs,AppServicePlatformLogs,ScanLogs,AppServiceAuthenticationLogs",
      "inFlightFeatures": [
          "SiteContainers"
      ],
      "storageAccountRequired": false,
      "virtualNetworkSubnetId": null,
      "keyVaultReferenceIdentity": "SystemAssigned",
      "autoGeneratedDomainNameLabelScope": null,
      "defaultHostNameScope": 0,
      "privateLinkIdentifiers": null,
      "sshEnabled": null
  },
  "identity": {
      "type": "SystemAssigned",
      "tenantId": "XXX",
      "principalId": "YYY"
  }
}

Hi @imranshams.   Thanks for reaching out and we regret that you're experiencing difficulties.   When the Azure SDK client invokes a service operation, it makes an HTTP call to the service and then returns the response from that call.   The client has no insight nor influence over the response.   Unfortunately, this means that the maintainers of the Azure SDK are unable to assist with your inquiry.
There's not enough information to conclusively say whether you're seeing a 404 because your application host's network cannot see the Document Intelligence service or if the service itself is returning a 404 for some reason.  From the JSON packaging of the exception, I suspect it's the latter.   I'd recommend confirming that you can ping/trace a call from the host environment to the service.  If so, you'll need the Document Intelligence service team to help you understand why the service returns a 404.  To ensure that the service team has visibility and can help, your best path forward for would be to open an Azure support request or inquire on the Microsoft Q&A site.
I'm going to close this out; if I've misunderstood what you're describing, please let us know in a comment and we'd be happy to assist as we're able.

Hi @jsquire. Thanks for your support, I have some new informations base my new test, I use the app locally with a doc intg service which is deployed in westeurope and my deployment in azure is located in germanywestcentral. I can test the service locally with a instance which is in Germany.

I'm not sure if this is directly related to this repository, but the issue I encountered was with the Germany West Central region. After redeploying Doc Intelligence in West Europe, everything is working fine now!
I couldn't find any documentation explaining the differences or specific issues between regions. If anyone else is facing a similar problem, consider redeploying to a different region, as it might resolve the issue.

Public preview version 2023-10-31-preview is currently only available in the following Azure regions:
East US
West US2
West Europe
https://learn.microsoft.com/en-us/answers/questions/1514842/document-intelligence-ai-returns-404


[Bug] ProducerManager groupChannelTable key leaks when connect and close frequently

Before Creating the Bug Report

[X] I found a bug, not just asking a question, which should be created in GitHub Discussions.

[X] I have searched the GitHub Issues and GitHub Discussions  of this repository and believe that this is not a duplicate.

[X] I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.

Runtime platform environment
every
RocketMQ version
every
JDK Version
every
Describe the Bug
2024-01-09 17:31:15 WARN NettyServerCodecThread_3 - event queue size [10001] over the limit [10000], so drop this event NettyEvent [type=CLOSE, remoteAddr=<IP_ADDRESS>:24254, channel=[id: 0xf5169ee0, L:/xxxx:8911 ! R:/xxxx:24254]]

there are many empty value in groupChannelTable
`---ts=2024-01-09 17:38:37;thread_name=NettyEventExecutor;id=2f;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@58134517
    `---[24.812301ms] org.apache.rocketmq.broker.client.ClientHousekeepingService:onChannelClose()
        +---[0.02% 0.004639ms ] org.apache.rocketmq.broker.BrokerController:getProducerManager() #72
        +---[99.67% 24.730868ms ] org.apache.rocketmq.broker.client.ProducerManager:doChannelCloseEvent() #72
        +---[0.02% 0.004308ms ] org.apache.rocketmq.broker.BrokerController:getConsumerManager() #73
        +---[0.03% 0.006361ms ] org.apache.rocketmq.broker.client.ConsumerManager:doChannelCloseEvent() #73
        +---[0.01% 0.003326ms ] org.apache.rocketmq.broker.BrokerController:getFilterServerManager() #74
        `---[0.01% 0.003547ms ] org.apache.rocketmq.broker.filtersrv.FilterServerManager:doChannelCloseEvent() #74

and will more slow with time fly
Steps to Reproduce
no need
What Did You Expect to See?
normal
What Did You See Instead?
leak
Additional Context
we can fix inn scanNotActiveChannel, which is a simple way
Iterator<Entry<String, ConcurrentHashMap<Channel, ClientChannelInfo>>> iter = this.groupChannelTable.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<String, ConcurrentHashMap<Channel, ClientChannelInfo>> entry = iter.next();
            ConcurrentHashMap<Channel, ClientChannelInfo> chlMap = entry.getValue();
            if (chlMap != null && chlMap.isEmpty()) {
                iter.remove();
            }
        }

fixed in https://github.com/apache/rocketmq/commit/e44f29a64328f671ee26e3e14446d857f0a531e0#diff-27fd65aea88712ddb752ce8ab34e4aef99cb5e3797ed2604daf04c0703ee2e0bR92


UAR-168: Add Feature flag for ROE Update and Remove

JIRA link
UAR-168
Change description
Adding feature flag for ROE Update and remove

looks ok to me

actually just spotted something with the naming so don't merge just yet


Feature | Add new SSO users for binbashers onboarding

What?
Adding  new sso users
[devops]

<EMAIL_ADDRESS><EMAIL_ADDRESS>
Why?
New binbash colaborators onboarding

TF plan
╰─❯ leverage terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_identitystore_group_membership.default["ariel.jalil_devops"] will be created
  + resource "aws_identitystore_group_membership" "default" {
      + group_id          = "64b8e4d8-2021-7077-f761-7e9cb2c9b7ea"
      + id                = (known after apply)
      + identity_store_id = "d-906752b26f"
      + member_id         = (known after apply)
      + membership_id     = (known after apply)
    }

  # aws_identitystore_group_membership.default["federico.losso_devops"] will be created
  + resource "aws_identitystore_group_membership" "default" {
      + group_id          = "64b8e4d8-2021-7077-f761-7e9cb2c9b7ea"
      + id                = (known after apply)
      + identity_store_id = "d-906752b26f"
      + member_id         = (known after apply)
      + membership_id     = (known after apply)
    }

  # aws_identitystore_user.default["ariel.jalil"] will be created
  + resource "aws_identitystore_user" "default" {
      + display_name      = "Ariel Jalil"
      + external_ids      = (known after apply)
      + id                = (known after apply)
      + identity_store_id = "d-906752b26f"
      + user_id           = (known after apply)
      + user_name         =<EMAIL_ADDRESS>
      + emails {
          + primary = true
          + value   =<EMAIL_ADDRESS>        }

      + name {
          + family_name = "Jalil"
          + given_name  = "Ariel"
        }
    }

  # aws_identitystore_user.default["federico.losso"] will be created
  + resource "aws_identitystore_user" "default" {
      + display_name      = "Federico Losso"
      + external_ids      = (known after apply)
      + id                = (known after apply)
      + identity_store_id = "d-906752b26f"
      + user_id           = (known after apply)
      + user_name         =<EMAIL_ADDRESS>
      + emails {
          + primary = true
          + value   =<EMAIL_ADDRESS>        }

      + name {
          + family_name = "Losso"
          + given_name  = "Federico"
        }
    }

Plan: 4 to add, 0 to change, 0 to destroy.

Off-boarding Gonzalo Gasperini
TF apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # aws_identitystore_group_membership.default["gonzalo.gasperini_devops"] will be destroyed
  # (because key ["gonzalo.gasperini_devops"] is not in for_each map)
  - resource "aws_identitystore_group_membership" "default" {
      - group_id          = "64b8e4d8-2021-7077-f761-7e9cb2c9b7ea" -> null
      - id                = "d-906752b26f/f4d8f4e8-c0b1-7027-50e8-6653cca19fa8" -> null
      - identity_store_id = "d-906752b26f" -> null
      - member_id         = "74c8e418-3021-7046-4193-efbfff57952c" -> null
      - membership_id     = "f4d8f4e8-c0b1-7027-50e8-6653cca19fa8" -> null
    }

  # aws_identitystore_user.default["gonzalo.gasperini"] will be destroyed
  # (because key ["gonzalo.gasperini"] is not in for_each map)
  - resource "aws_identitystore_user" "default" {
      - display_name      = "Gonzalo Gasperini" -> null
      - external_ids      = [] -> null
      - id                = "d-906752b26f/74c8e418-3021-7046-4193-efbfff57952c" -> null
      - identity_store_id = "d-906752b26f" -> null
      - user_id           = "74c8e418-3021-7046-4193-efbfff57952c" -> null
      - user_name         =<EMAIL_ADDRESS>-> null

      - emails {
          - primary = true -> null
          - value   =<EMAIL_ADDRESS>-> null
        }

      - name {
          - family_name = "Gasperini" -> null
          - given_name  = "Gonzalo" -> null
        }
    }

Plan: 0 to add, 0 to change, 2 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_identitystore_group_membership.default["gonzalo.gasperini_devops"]: Destroying... [id=d-906752b26f/f4d8f4e8-c0b1-7027-50e8-6653cca19fa8]
aws_identitystore_group_membership.default["gonzalo.gasperini_devops"]: Destruction complete after 2s
aws_identitystore_user.default["gonzalo.gasperini"]: Destroying... [id=d-906752b26f/74c8e418-3021-7046-4193-efbfff57952c]
aws_identitystore_user.default["gonzalo.gasperini"]: Destruction complete after 0s
Releasing state lock. This may take a few moments...

Apply complete! Resources: 0 added, 0 changed, 2 destroyed.


Facebook Login

Hey,
are there plans to integrate facebook as a provider?

Should be quite easy, PR is welcome :)

Hi guys, I will take this task

Hello @marcushohlbein, there is a new version v0.0.24 with Facebook provider out of the box. The implementation example is in the playground folder.
I hope it will make your life easier :)


Fetching asynchronous data

I've gone through the issues and nothing is ever answered in a way that makes this work for me.
Basic example:
var loadData = function() {
   var deferred = $q.defer();
   $http.get('/api/data')
       .then(function (res) {
           deferred.resolve(res.data);
        }, function (res) {
           deferred.reject();
        });
   };
   return deferred.promise;
}

This doesn't work. The file immediately gets downloaded with 0 data. Can someone please tell me if there is another way to do it for ng-csv? I looked at the lazy-load example but I'm not sure what the purpose of that is.

I've exactly the same issue with the latest version..
I've tried returning a $promise or an array after the request has been successful.

@daniel-van-niekerk we have actually the same issue as https://github.com/asafdav/ng-csv/issues/89 posted end of March :(

I actually found the solution. Try this code:
var loadData = function () {
    var deferred = $q.defer();
    $http.get('/api/data')
        .then(function (res) {
            $q.when(res).then(function () {
                deferred.resolve(res.data);
             });
          }, function (res) {
              deferred.reject();
          });
     return deferred.promise;
};

Note the use of $q.when(res).then

Did anybody solve this issue? No matter what I try the csv-file is dowloaded before my data comes back. Tried many examples but all of them failed :(

I found this, facing the same question in my project, and the $q.defer() pattern in @daniel-van-niekerk 's comment solved it for me. However, during the same search I discovered (thanks to this blog) that promise-chaining can accomplish the same thing much more simply:
var loadData = function () {
    return $http.get('/api/data').then(function (res) {
        return res.data;
    });
};

I updated my own application to use that pattern, and it works perfectly.

Thank you so much @ryan-hunter-pc. Spent many hours yesterday without any success and this mornnig it works perfectly thanks to you!

I had the same issue, I was using the service like this:
<button ng-csv="getArray" filename="file.csv">export</button>
and the getArray is a function that returns a promise which is resolved with the data.
actually I have solved this issue by setting the ng-csv directive to call the function getArray() so the button will look like this:
<button ng-csv="getArray()" filename="file.csv">export</button>

$q.when   solution

Just to help...
Here is my code using $resource
$scope.csv = function() {

  //Init scope defer
  $scope.itemsToExport = $q.defer()

  //Fetch data from inside module api
  manageModules.bigdata.query({
    ids: ids
  }).$promise.then(function(response){

    //When promise the result, resolve the defer()
    $q.when(response).then(function() {
      $scope.itemsToExport.resolve(response)
     })

  })

  return $scope.itemsToExport.promise

}

Html
<button type="button" ng-csv="csv()" lazy-load="true" filename="report.csv" field-separator=";">Download</button>


Make Horizons queries robust to target name

Target names could resolve to multiple objects and/or orbits.  The Horizons code needs to be able to handle this possibility and make the user aware of the result.   Here are some examples:

Europa is the name of a satellite of Jupiter and asteroid 52.  astroquery's id_type can be used to get one or the other.
Encke is the name of a comet (2P/Encke) and an asteroid (9134 Encke).  Again, use id_type  here.
2P will also return many orbits for this comet.  Use closest_apparition=True and id_type="designation" to pick the most current orbit.
73P will return many orbits for this comet, but also many fragments.  To avoid fragment matching, add no_fragments=True

I will change the input information (targets.csv). So far the columns look like this: # target, start_time, end_time, step
I will insert +1 column as "target_type" which can be asteroid or comet. By modifying the Horizons (and Miriade) interface one can set the appropriate options for the query.

I have changed the QueryInput data. It should now contain a keyword for the object type. Currently it still follows the Horizons keywords like smallbody, asteroid_name, comet_name, designation, but I will change that.
If you want to retrieve comet ephemeris data, miriade_interface will call the find_sso method from astroquery.ESASky to retrieve the corresponding name.
Unfortunately, for Miriade I couldn't find any switches like in Horizons (closest_apparition, no_fragments) so this needs to be tested to see how it works in such boundary cases.


ci: fix docker multi-arch build

see https://github.com/muonsoft/openapi-mock/pull/80#issuecomment-1331059180. Sets arch/os specific environment variable for go build (GOOS=$TARGETOS GOARCH=$TARGETARCH). Build succesfully testet with Docker Desktop on Win 10.

Still not working.... unfortunately 🤔


Camera content-token raise error on expiry

So if we get an http error trying to get the snapshot image, we raise that to the caller/integration so we can from there get a new content-token from the yale home server and do a retry.
So this will require a change in the august integration as well once merged.

for information i have a suggested integration change for PR into home-assistant later
https://github.com/abjorck/homeassistant-core/commit/40100e302d966d8554d8c95c1c12a2efe94077f9

New exception is a breaking change so I'll bump the major version


[Crash] chip::Controller::DeviceCommissioner::ContinueCommissioningAfterDeviceAttestationFailure

Problem
Seeing this crash reported during testing on iOS/tvOS. This is seen as recent as TE9 SHA cfc35951be66a664a6efdadea56d1b8ea6e63e96.
Thread 3 Crashed::   Dispatch queue: com.zigbee.chip.framework.controller.workqueue
0   CHIP                          	       0x108128f28 chip::Controller::DeviceCommissioner::ContinueCommissioningAfterDeviceAttestationFailure(chip::DeviceProxy*, chip::Credentials::AttestationVerificationResult) + 192 (connectedhomeip/src/controller/CHIPDeviceController.cpp:727)
1   CHIP                          	       0x107cc1260 __83-[CHIPDeviceController continueCommissioningDevice:ignoreAttestationFailure:error:]_block_invoke + 96 (connectedhomeip/src/darwin/Framework/CHIP/CHIPDeviceController.mm:435)
2   CHIP                          	       0x107cc1260 __83-[CHIPDeviceController continueCommissioningDevice:ignoreAttestationFailure:error:]_block_invoke + 96 (connectedhomeip/src/darwin/Framework/CHIP/CHIPDeviceController.mm:435)
3   libdispatch.dylib             	       0x19be730f4 _dispatch_client_callout + 20
4   libdispatch.dylib             	       0x19be8262c _dispatch_lane_barrier_sync_invoke_and_complete + 56
5   CHIP                          	       0x107cc115c -[CHIPDeviceController continueCommissioningDevice:ignoreAttestationFailure:error:] + 272 (connectedhomeip/src/darwin/Framework/CHIP/CHIPDeviceController.mm:428)
6   CHIPPlugin                    	       0x107004024 __71-[CHIPPluginAttestationStatus deviceAttestation:failedForDevice:error:]_block_invoke + 332
7   libdispatch.dylib             	       0x19be715cc _dispatch_call_block_and_release + 32
8   libdispatch.dylib             	       0x19be730f4 _dispatch_client_callout + 20
9   libdispatch.dylib             	       0x19be7a7ac _dispatch_lane_serial_drain + 672
10  libdispatch.dylib             	       0x19be7b32c _dispatch_lane_invoke + 436
11  libdispatch.dylib             	       0x19be85ebc _dispatch_workloop_worker_thread + 652
12  libsystem_pthread.dylib       	       0x216416040 _pthread_wqthread + 288
13  libsystem_pthread.dylib       	       0x216415de0 start_wqthread + 8

Crashing line is:
    CommissioneeDeviceProxy * commissioneeDevice = FindCommissioneeDevice(device->GetDeviceId());

I wonder whether the controller is shut down already or something...  But we're supposed to have checks for that....

This is no longer showing up in crashes, closing


feat: add xml schema for <sitemapindex> like <urlset>

🔗 Linked issue

❓ Type of change

[ ] 📖 Documentation (updates to the documentation or readme)
[ ] 🐞 Bug fix (a non-breaking change that fixes an issue)
[x] 👌 Enhancement (improving an existing functionality)
[ ] ✨ New feature (a non-breaking change that adds functionality)
[ ] 🧹 Chore (updates to the build process or auxiliary tools and libraries)
[ ] ⚠ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description
https://www.sitemaps.org/protocol.html#validating
https://github.com/nuxt-modules/sitemap/blob/a619116fbe0581c9737618f090491341425133d5/src/runtime/nitro/sitemap/builder/sitemap.ts#L142

Hi, thanks for the PR. Is there something that this fixes? This sitemap implementation is based on Yoast, I'd presume they can be trusted.

Having xmlns:xsi would be better.

Better for what? I'm still yet to see the issue this is solving


Fix issues with default object params in async functions

This fixes the other half of #92
const a = async ({bar = "bar"}) => {}

It was throwing an error because shorthands were not allowed in this scenario, by setting the correct params for parseExprListItem() when it is an async function fixes the problem.
Fix #92

Current coverage is 96.91% (diff: 100%)

Merging #96 into master will not change coverage

@@             master        #96   diff @@
==========================================
  Files            19         19
  Lines          2922       2922
  Methods           0          0
  Messages          0          0
  Branches          0          0
==========================================
  Hits           2832       2832
  Misses           90         90
  Partials          0          0

Powered by Codecov. Last update b649671...3d502a8


AttributeError: 'PacketOut' object has no attribute 'instructions'

As a consequence of the problem documented in kytos-ng/of_lldp#68, we are seeing the following error on the logs:
2022-11-07 16:04:00,921 - ERROR [kytos.core.helpers] (thread_pool_sb_3) listen_to handler: <function Main.on_handle_errors at 0x7fcd906b8700>, args: (<Main(flow_manager, stopped<PHONE_NUMBER>71168)>, KytosEvent('kytos/of_core.v0x04.messages.in.ofpt_error', {'message': ErrorMsg(xid=UBInt32(2997175759)), 'source': Connection('<IP_ADDRESS>', 43596, <asyncio.TransportSocket fd=116, family=[AddressFamily.AF](http://addressfamily.af/)_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('<IP_ADDRESS>', 6653), raddr=('<IP_ADDRESS>', 43596)>, Switch('00:00:00:00:00:00:00:02'), <ConnectionState.ESTABLISHED: 2>)}, -1050)) traceback: Traceback (most recent call last):,   File "/root/dev/kytos/kytos/core/helpers.py", line 126, in handler_context,     result = handler(*args),   File "/root/dev/kytos-environment/var/lib/kytos/napps/kytos/flow_manager/main.py", line 783, in on_handle_errors,     self.handle_errors(event),   File "/root/dev/kytos-environment/var/lib/kytos/napps/kytos/flow_manager/main.py", line 805, in handle_errors,     for instruction in error_packet.instructions:, AttributeError: 'PacketOut' object has no attribute 'instructions',

This is happening because the way we handle OF_ERRORS: https://github.com/kytos-ng/flow_manager/blob/c0b4732f596e5802d298176eaa8799df7a8b7b15/main.py#L805-L813
We assume the existence of instructions in the PacketOut message, which is not the case for the situation above.

Thanks for reporting this @italovalcy.
Reviewing the entire error handling part of it was trying to also set the interface PotConfig.OFPPC_NO_FWD but since no PortMod is sent then it's essentially not effectively performing any operation. With that said, I htink we could remove this part for now, that way it'll also fix this, and then if we need to start supporting PortMod for this part which is also partly related to this issue https://github.com/kytos-ng/flow_manager/blob/master/main.py#L806-L817, then I think we could start a lightweight blueprint for this, wdyt?
@Alopalao could you help out with this fix?


reshape error

Traceback (most recent call last):
File "main.py", line 212, in
trt_result = profile_trt(build_engine(onnx_path, using_half), batch_size, 10, 100)
File "main.py", line 160, in profile_trt
return [np.array(yolo_outputs[0].host.reshape(1, -1, 85))]
ValueError: cannot reshape array of size 123480 into shape (1,newaxis,85)
Segmentation fault (core dumped)

https://github.com/TrojanXu/yolov5-tensorrt/issues/10 related to this one. I will push a new commit to fix this later. For now, please change 85 to nc+5.

thanks!


Request repo archival to SoftwareHeritage.org

Related to (& dependent on) #1643.
As a researcher browsing a GitHub repo that is not archived by SwH yet, I would like to get a 1-click option to "[r]equest the saving of a software origin into the archive" so that I can cite a long-term preserved copy of the code.
Since their "visit" might take a while, some kind of monitoring & notification by refined-github could additionally be convenient. However, the MVP would be to open the SwH tab in the background ;-)

Same answer as https://github.com/sindresorhus/refined-github/issues/1643#issuecomment-442859536


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

Request type

[ ] Please close this issue, I accidentally submitted it without adding any details
[ ] New documentation
[x] Correction or update

Details

The example listed for explaining the significance of initialValue seems to be incorrect for the first case. The result NaN is got not because of lack of initialValue but because maxCallback is not returning an object having property x. Please review.

@chrisdavidmills : I can pick this up and fix it. Since I am just starting out, could you please let me know what is the process like?

Hi @Prerna237 !
The following contribute page explains how the process should work for fixing MDN content bugs like these: https://developer.mozilla.org/en-US/docs/MDN/Contribute/Fixing_MDN_content_bugs
Usually you'd first of all say that you want to take on a bug, and then I'd assign it to you to fix. But In this case you've just jumped in and fixed it anyway, which is also fine ;-)
I've reviewed your work and it looks good, and I've also assigned you to this bug so it easier to see which ones you've worked on (credit where credit is due, etc.)
Thanks so much for providing a fix for this; you rock!


Reorganize test and release code

Proposed Changes
This patch reorganizes files for testing and releasing our components.
In particular:

move our libraries for building data plane and
control plane from test/<componen>/library.sh to
hack/<componen>.sh.
remove some usages of deprecated functions of knative/pkg
rename kafka-ephemeral-single.yaml to kafka-ephemeral.yaml
since it's not a single node Kafka cluster.
dedup relabeling logic in its own script.
reorganize some other test files.

/area release test
/kind cleanup

/lgtm
/approve


[Enhancement] Possible null pointer dereference due to return value of called method [SessionSender]

Search before asking

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

Enhancement Request

located at:
org/apache/eventmesh/runtime/core/protocol/tcp/client/session/send/SessionSender.java line 108 124 132 139 165
analysis and explanation:
The return value from a method is dereferenced without a null check, and the return value of that method is one that should generally be checked for null. This may lead to a NullPointerException when the code is executed.
Describe the solution you'd like
add NPE exception check.
Are you willing to submit PR?

[ ] Yes I am willing to submit a PR!

I would like to work on this issue


feat(other): end-to-end testing tools

🍰 Pullrequest

Issues

relates #139

Todo

[X] None

This has been reworked in #1011


could you add information related to Occurrences in this page? what is 0:1 ? What is 1:1?

What does it mean for the "Occurrences" is 0:1 ?
What is 1:1?
Could you please add information related Occurrences in this document.

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.
ID: 578ef1cc-087a-8f03-ec33-5c451e778d84
Version Independent ID: 42b674d2-5a04-4fac-d913-d8177e19488a
Content: TrustFrameworkPolicy - Azure Active Directory B2C
Content Source: articles/active-directory-b2c/trustframeworkpolicy.md
Service: active-directory
Sub-service: b2c
GitHub Login: @kengaderdus Derdus Kenga FTE
Microsoft Alias: kengaderdus

@kengaderdus
Can you please check and add your comments on this doc update request as applicable.
@DaCao please follow here for further updates.

@SaibabaBalapur-MSFT
Thanks for pointing this to us.
Occurrences refers to how many child elements can or must a parent element have.
For example, 1:1 means that the parent element must have one child and 0:1- parent element has 0 or 1 child element.
We'll update the docs to other Occurrences options #please-close.


[SUGGESTION] Add StatTrak for items

I think i have an idea on how to implement StatTrak on items. Maybe you can have variables assigned to skins and they detect it during the game when they get kills and they store it and the next time we load the config, it could add the stored variable to the already existing kills.
I am not sure how feasible it is but i think i should just suggest it.
Thank you :)

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

You mean like this? -> StatTrak: 0

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

You mean like this? -> StatTrak: 0

yes

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

You mean like this? -> StatTrak: 0

yes, "StatTrak": 0

Okay, thank you :)

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

You mean like this? -> StatTrak: 0

yes, "StatTrak": 0

oh btw, do i need to save the config everytime i close cs go to retain the stattrak kills?

Dude, StatTrak is already implemented.
For it to work, you need to write "StatTrak 0" in the config.

You mean like this? -> StatTrak: 0

yes, "StatTrak": 0

oh btw, do i need to save the config everytime i close cs go to retain the stattrak kills?

yes


Fixed matrix.dotnet-version key

Changed matrix.dotnet key to matrix.dotnet-version

Why:
There was a small bug in the docs.

What's being changed:
Changed matrix.dotnet key to matrix.dotnet-version

Check off the following:

[x] I have reviewed my changes in staging (look for "Automatically generated comment" and click Modified to view your latest changes).
[x] For content changes, I have completed the self-review checklist.

Writer impact (This section is for GitHub staff members only):

[ ] This pull request impacts the contribution experience

[ ] I have added the 'writer impact' label
[ ] I have added a description and/or a video demo of the changes below (e.g. a "before and after video")

@weineran
Thanks so much for opening a PR! I'll get this triaged for review :zap:

@weineran Thanks so much for opening a PR! I'll get this triaged for review ⚡

@ramyaparimi No problem! It's a super short review, but let me know if there are any questions/comments/concerns.


[BUG]  meson's dependency() fails to find installed Gstreamer files

I have a 64 bit Gentoo Linux, Linux GenPi64 5.10.92-v8-p4 #1 SMP PREEMPT Thu Mar 10 12:18:30 UTC 2022 aarch64 GNU/Linux, running on a Raspberry Pi 4.  (The image also runs on the Raspberry Pi Zero 2 W, but I'm developer on the more powerful RPi4.)
I have compiled and installed a recent. within the last two weeks, high watermark of gstreamer v. 20.
Here is a screenshot demonstrating gstreamer installed and runs.

When I build libcamera, the meson dependency check fails to find both gstreamer.pc files and consequently libcamera's Gstreamer is disabled.  I am trying to run gstreamer using libcamera and believe I need the Gstreamer support.
libcamera_meson_reconfigure.txt
Specifically, the points of failure are at meson's dependency function:
GenPi64 /usr/local/src/libcamera # head src/gstreamer/meson.build
# SPDX-License-Identifier: CC0-1.0

glib_dep = dependency('glib-2.0', required : get_option('gstreamer'))

gst_dep_version = '>=1.14.0'
gstvideo_dep = dependency('gstreamer-video-1.0', version : gst_dep_version,
                          required : get_option('gstreamer'))
gstallocator_dep = dependency('gstreamer-allocators-1.0', version : gst_dep_version,
                              required : get_option('gstreamer'))

GenPi64 /usr/local/src/libcamera #

Line 11 of src/gstreamer/meson.build calls the found() method on both gstvideo_dep and gstallocator_dep objects and both return false when they should return true.
So, the problem is that pkconfig is not finding the .pc files.
The gstreamer layout on the Gentoo system
The pkconfig files are present in /usr/local/lib64/pkgconfig:
GenPi64 /home/jlpoole/mesontut1 # ls -la /usr/local/lib64/pkgconfig/gstreamer-allocators-1.0.pc
-rw-r--r-- 1 root root 552 Mar 13 01:08 /usr/local/lib64/pkgconfig/gstreamer-allocators-1.0.pc
GenPi64 /home/jlpoole/mesontut1 # ls -la /usr/local/lib64/pkgconfig/gstreamer-video-1.0.pc
-rw-r--r-- 1 root root 612 Mar 13 01:08 /usr/local/lib64/pkgconfig/gstreamer-video-1.0.pc
GenPi64 /home/jlpoole/mesontut1 #

The compiled run-time executables are in /usr/local/bin:
GenPi64 /usr/local/src/libcamera # ls -la /usr/local/bin
total 3132
drwxr-xr-x 1 root root    938 Mar 13 01:16 .
drwxr-xr-x 1 root root     74 Mar 13 01:06 ..
-rwxr-xr-x 1 root root  44976 Mar 13 01:15 fribidi
-rwxr-xr-x 1 root root 241280 Mar 13 01:16 ges-launch-1.0
-rwxr-xr-x 1 root root  53048 Mar 13 01:15 gst-device-monitor-1.0
-rwxr-xr-x 1 root root  80008 Mar 13 01:15 gst-discoverer-1.0
-rwxr-xr-x 1 root root 183312 Mar 13 01:15 gst-inspect-1.0
-rwxr-xr-x 1 root root 100248 Mar 13 01:15 gst-launch-1.0
-rwxr-xr-x 1 root root 135584 Mar 13 01:15 gst-play-1.0
-rwxr-xr-x 1 root root  95096 Mar 13 01:15 gst-stats-1.0
-rwxr-xr-x 1 root root  30072 Mar 11 10:24 gst-tester-1.0
-rwxr-xr-x 1 root root  76256 Mar 13 01:16 gst-transcoder-1.0
-rwxr-xr-x 1 root root  39464 Mar 13 01:15 gst-typefind-1.0
-rwxr-xr-x 1 root root  75464 Mar 13 01:16 gst-validate-1.0
-rwxr-xr-x 1 root root 142936 Mar 13 01:16 gst-validate-images-check-1.0
-rwxr-xr-x 1 root root   1949 Mar 11 10:19 gst-validate-launcher
-rwxr-xr-x 1 root root  29632 Mar 13 01:16 gst-validate-media-check-1.0
-rwxr-xr-x 1 root root  27072 Mar 13 01:16 gst-validate-rtsp-server-1.0
-rwxr-xr-x 1 root root  53672 Mar 13 01:16 gst-validate-transcoding-1.0
-rwxr-xr-x 1 root root 169552 Mar 13 01:15 hb-ot-shape-closure
-rwxr-xr-x 1 root root 193736 Mar 13 01:15 hb-shape
-rwxr-xr-x 1 root root 201176 Mar 13 01:15 hb-subset
-rwxr-xr-x 1 root root 323568 Mar 13 01:15 hb-view
-rwxr-xr-x 1 root root  34048 Mar 13 01:16 json-glib-format
-rwxr-xr-x 1 root root  24464 Mar 13 01:16 json-glib-validate
-rw-r--r-- 1 root root      0 Jan 17 00:52 .keep
-rwxr-xr-x 1 root root  56936 Mar 13 01:15 orc-bugreport
-rwxr-xr-x 1 root root 152488 Mar 13 01:15 orcc
-rwxr-xr-x 1 root root  32264 Mar 13 01:15 pango-list
-rwxr-xr-x 1 root root  30096 Mar 13 01:15 pango-segmentation
-rwxr-xr-x 1 root root 149920 Mar 13 01:15 pango-view
-rwxr-xr-x 1 root root  98152 Mar 13 01:16 playout
-rwxr-xr-x 1 root root 150640 Mar 12 06:35 stunbdc
-rwxr-xr-x 1 root root 126240 Mar 12 06:35 stund
GenPi64 /usr/local/src/libcamera #

In case one wonders about "Run-time dependency", I tried this variant and got the same result: failed to find gstreamer:
GenPi64 /usr/local/src/libcamera # export PKG_CONFIG_PATH=/usr/local/bin
GenPi64 /usr/local/src/libcamera # date; echo $PKG_CONFIG_PATH; meson --reconfigure build
Wed Mar 16 05:01:11 AM UTC 2022
/usr/local/bin
...
    GStreamer support        : NO

To simulate the problem in this environment, I created a simple meson project of "hello world" in c.  I then created a simple meson file and added a dependency of "gstreamer-1.0":
GenPi64 /usr/local/src/libcamera # cat /home/jlpoole/mesontut1/meson.build
project('tutorial', 'c')
#
# add a dependency
#
gstreamdep = dependency('gstreamer-1.0')
executable('demo', 'main.c')
GenPi64 /usr/local/src/libcamera #

The project failed.  So I set my environment to point to the location where Gentoo has the configuration files:
GenPi64 /home/jlpoole/mesontut1 # echo $PKG_CONFIG_PATH
/usr/local/lib64/pkgconfig
GenPi64 /home/jlpoole/mesontut1 #

Then I ran "meson build" on my test tutorial, and this time my sample project successfully was built.  Thinking that $PKG_CONFIG_PATH might solve the problem, I returned to libcamera and tried to build again and unfortunately the meson functions appear not to be finding gstreamer.
I realize this may be a bug in meson, but since libcamera relies on meson to find packages, I'm raising it here.  I also me be missing something very fundamental about libcamera's implementation of meson.

Unfortunately this is not something we would be able to help with directly.  You probably want to ping this to either Gentoo Distribution maintainers or possibly the libcamera development list at https://lists.libcamera.org/listinfo.

Can you confirm that gstvideo_dep.found() returns true on your build?

I would expect this to be a configuration issue in gentoo here. We wouldn't put in specific overrides for libcamera - so this should be solved by either meson or gentoo.
I can confirm I can build with gstreamer support on a bullseye install on RPi.

Can you confirm how you set your PKG_CONFIG_PATH when reconfiguring meson?
I believe distros have ways to add extra search paths to the default pkg-config path - but that will be gentoo specific


2022-09-21 equity dashboard chart data update

Equity dashboard stats updates in this PR may be reviewed on staging - here.
After reviewing, if all looks well, approve BUT DO NOT MERGE this Pull Request.
If there are issues with the data:

Note concerns or issues here by commenting on this PR
Work with CDPH directly to resolve data issues
Alert the COVID19 site team in Slack (in the Equity page channel)

Data is not ready yet - closing this automated PR.


feat: allow importing schema from other package

experiment for supporting monorepos

Don't give it up! A very important feature!

Hi @knaeckeKami, I think this would be a top feature for monorepos
Do you think that there is still much to do to ship this feature ?

IMO it won't take much more to ship this, but I kinda abandoned it since there is an issue:
The current architecture uses built_value, it generates a Serializers object which knows how to serialize each generated built_value type.
ferry currently assumes that this serializers type can serialize all types - at least for offline mutations that's required.
But in a monorepo, every repo would generate its own Serializers instance, which only knows how to serialize the types form this repo.
I don't have a good solution for this right now.

It's not possible to have each package generating their own Serializers and merge it with the as you mentioned here :

feature packages depend on the schema file and import the generated .schema.gql.dart file instead of generating their own. They also generate their own Serializers class and merge it with the Serializers (pub.dev/documentation/built_value/latest/serializer/Serializers/merge.html ) from the schema in order so ensure that they can fully serialize all required types.

It's not possible to have each package generate its own Serializers and merge it with the one from the schema?
As you mentioned here:

feature packages depend on the schema file and import the generated .schema.gql.dart file instead of generating their own. They also generate their own Serializers class and merge it with the Serializers (pub.dev/documentation/built_value/latest/serializer/Serializers/merge.html ) from the schema in order so ensure that they can fully serialize all required types.

That might be possible, but that would introduce cyclic dependencies; the final Serializers  would need to depend on every  repository in the monorepo.
And then, what's the point of having a monorepo?

fixed by #606


OpenGL renderer is a lot faster than DX 11.

Is this a known issue?

me too

Not an issue, different renderers have different performance characteristic due to drivers (OS, GPU Vendor, driver, etc.). OpenGL doesn't need to conform to Windows Display Driver Model which makes it faster on Windows.


[BUG] nodestream remove command wipes the config sections

Describe the bug
When running the nodestream remove pipeline command wipes the config values out of the pipeline yaml file.
To Reproduce
Steps to reproduce the behavior:

Go to '...'
Click on '....'
Scroll down to '....'
See error

Expected behavior
A clear and concise description of what you expected to happen.
Additional context
Add any other context about the problem here.

Steps:

Update your nodestream.yaml file with targets etc after the pipelines
run the following

poetry run nodestream remove default sample

Schedule for fixing in 0.10.0


Checking for name change is possibly problematic

Patching Dialog_NamePawn.DoWindowContents() runs the patch code every frame, but it is only needed once. The functional call is currently light, but would be better if it would only run when the window is closed. The class is a subclass of Window, which has virtual "PreClose" and "PostClose" functions that would be nice to patch- if only it actually overrode the virtual definitions. Patching Window seems like a non-starter since only Dialog_NamePawn has the pawn info we want, and hides it as a private field.

Now that I can handle transpiling code, this could be a use case- insert a check on the exit of window. Priority is pretty low.

Deciding against this. Cost is low enough that it doesn't make sense to trade the extra instability for minor improvement.


Update aws-java-sdk-bundle to 1.12.337

Updates com.amazonaws:aws-java-sdk-bundle from 1.12.330 to 1.12.337.
I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.
If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.
Configure Scala Steward for your repository with a .scala-steward.conf file.
Have a fantastic day writing Scala!

Adjust future updates
Add this to your .scala-steward.conf file to ignore future updates of this dependency:
updates.ignore = [ { groupId = "com.amazonaws", artifactId = "aws-java-sdk-bundle" } ]

Or, add this to slow down future updates of this dependency:
dependencyOverrides = [{
  pullRequests = { frequency = "@monthly" },
  dependency = { groupId = "com.amazonaws", artifactId = "aws-java-sdk-bundle" }
}]

labels: library-update, early-semver-patch, semver-spec-patch, commit-count:1

Superseded by #2391.


Add benchmark cases

Per #94, add some cases for performance.

Coverage: 96.191%. Remained the same when pulling 9855b9a5c51b717b3b0b022623856376d11891df on feature-benchmark into 1191d338f5ce9eebc4a1ce2c6f8fa5a8b8910850 on master.

Help wanted in this PR. I know current test cases are incomplete. I need some one to contribute more and representative cases.


fix(proxyHandler): Mutators handled in model

Proposed changes
Mutators do not work in lucid models without converting them to objects first.
Fixes #490
Types of changes
What types of changes does your code introduce?

[x] Bugfix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklist
Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code.

[x] I have read the CONTRIBUTING doc
[x] Lint and unit tests pass locally with my changes
[ ] I have added tests that prove my fix is effective or that my feature works.
[x] I have added necessary documentation (if appropriate)

Further comments
I think mutators should work without converting model instance to object which is why I created this pull request.

Coverage decreased (-0.1%) to 96.39% when pulling 361c869be5d08e6fbf3342786ba7f0d5a6cc6d4d on chirgjin:develop into 6cd666df9534a981f4bd99ac0812a44d1685728a on adonisjs:develop.


wip - Fail correctly

What is this PR About?
I've noticed that for methods which return something (i.e.: a path), if they fail, its swallowed/hidden.
the below shows this behaviour.
test/fail-correctly.sh
@springdo ; any thoughts? the working option which fails correctly is the if example, but that's a bit weird to add to the bats tests, as it would need to be added to all things which return...
cc: @redhat-cop/bats-library

DONT MERGE


Use config.json instead of config.js

With config.js we usually load modules. It'll be great, if we can do this with a simple .json file.
We could also support pattern based file loading.
This will simplify things.
If the user needs, he could use import a .js file of his own and do any custom JS stuff as well.

json is a pretty poor format for manual configuration in my humble opinion:

no comments
no variables
freaking qoutes everywhere
no trailing comma's allowed

I think we're doing everyone a favour by not having them deal with that 🤗


[WIP] Simplify --platform flag for ketpn install

Work in Progress for #1967.
Will add more detail on this later.
Signed-off-by: Imre Nagi<EMAIL_ADDRESS>

@christian-kreuzberger-dtx I created some commits to finish Definition of Done number 1,3 and 4. Is there any comment so far for this WIP PR?


Line and area charts with two discretes on the same axis doesn't work well

https://www.kaggle.com/dvidandrsvgh/issue-170

Closing due to inactivity.


gff2fasta gives wrong sequence if samtools index is used

gff2fasta needs and indexed fasta file to get the sequence from. It gets this using CGAT.IndexedFasta.
CGAT.IndexedFasta will accept either a cgat or samtools index for the fasta, however, the sequence output is only correct if the index is a cgat index, not if it is a samtools index.
I am thinking that almost all of the CGATPipelines that use gff2fasta are going to be pulling from directories with samtools indexes on the fastas.
Several pipelines have "/ifs/mirror/genomes/faidx" set as the genome_dir and even those that don't often refer to genomes with the extension ".fa" (the cgat indexed genomes in /ifs/mirror/genomes/plain use the extension .fasta"). I have in particular noticed that all the alignement free stuff from rnaseqdiffexpression is wrong because it uses a geneset gtf to generate the salmon/kalisto index and because it assumes a ".fa" suffix, it is assume a genome from the samtools indexed directories.
Note this is not easy to spot because although the salmon logs do have a mapping rate, we don't pull that out and display it anywhere in the report. (my mapping rate on a recent run was 35%,)
Take for example the following two commands:
cgat gff2fasta --genome-file=/ifs/mirror/genomes/plain/hg19.fasta --is-gtf -S test1fa.gz --fold-at=60 -I /ifs/projects/proj028/annotations/ensembl.dir/geneset_exons.gtf.gz

cgat gff2fasta --genome-file=/ifs/mirror/genomes/faidx/hg19.fa --is-gtf -S test2.fa.gz --fold-at=60 -I /ifs/projects/proj028/annotations/ensembl.dir/geneset_exons.gtf.gz

They should give the same output file, but if you compare the sequence of ENST00000327669 in test1 and test2 we see they are not the same:
$ zgrep -A 2 ENST00000327669 test1.fa.gz
>ENST00000327669 chr2:-:45439-46385;38813-41627
ATGCGCGCCCTGGCGGCCCTGAGCGCGCCCCCGAACGAGCGGCTCCTTCCCCGGGACCCC
GCGGCTACCCGGGACCCCGACGCCGCGCGGCCGGCGCGCAGGAGCGCAGTGGAGAGGCTG

$  zgrep -A 2 ENST00000327669 test2.fa.gz
>ENST00000327669 chr2:-:45439-46385;38813-41627
CTCCAGCGTCGAGAGCCTGGGGCAGCCTTCCTGAGCCTGGGTTTCCTCGACTCTCAGGTT
CTTCTCTCTCCGAAATCCCATGCCACACCATTGGTTTAGATTTGCATATTATGATGGTGG

If we look in the original ENSEMBL fasta, we can see that the first of these is correct
$ zgrep -A 2 ENST00000327669 /ifs/mirror/ensembl/hg19/Homo_sapiens.GRCh37.75.cdna.all.fa.gz
>ENST00000327669 cdna:known chromosome:GRCh37:2:38814:46385:-1 gene:ENSG00000184731 gene_biotype:protein_coding transcript_biotype:protein_coding
ATGCGCGCCCTGGCGGCCCTGAGCGCGCCCCCGAACGAGCGGCTCCTTCCCCGGGACCCC
GCGGCTACCCGGGACCCCGACGCCGCGCGGCCGGCGCGCAGGAGCGCAGTGGAGAGGCTG

At first I thought it might be the genes on the minus strand that were different, but although all the differences I've seen are on the minus strand, not all minus strand genes seem to be different.

Thanks, I will look into this and fix.

Hi @IanSudbery , I think we have an issue with the indices:
  ll /ifs/mirror/genomes/faidx/hg19.fa*
-rw-rw-r-- 1 andreas usersfgu 3.0G Jun 28  2016 /ifs/mirror/genomes/faidx/hg19.fa
-rw-rw-r-- 1 andreas usersfgu 3.5K Jan 12  2011 /ifs/mirror/genomes/faidx/hg19.fa.fai
(cgat-s) andreas@cgath2[0]: /ifs/devel/andreas/cgat/t >
  ll /ifs/mirror/genomes/index/hg19.fa*
-rw-rw-r-- 1 michaelm usersfgu 3.0G Jun 28  2016 /ifs/mirror/genomes/index/hg19.fa
-rw-rw-r-- 1 andreas  usersfgu  785 Jun 28  2016 /ifs/mirror/genomes/index/hg19.fa.fai

As you can see, one index is older than the actual file and the other index is truncated. I reindexed and now I get the same result.

Closing this for now, but reopen if this was not the issue.


Include list layout in list/list-variables

Please include an image describing the list basic cell layout so the examples below in the page are easier to understand by readers

Already done weeks ago.


Exported node array doesn't allow to assign in editor

Godot version
4.0.3
System information
Windows 10, all renderers, Nvidia GTX2070
Issue description
Exporting a Node in a script allows to assign a Node from inspector but exporting an Array[Node] does not allow to assign nodes in the editor.
Steps to reproduce
Add an exported variable to a script with type Array[Node]
Try to assign node from inspector.
Minimal reproduction project
ExportedNodes.zip

Seems like a duplicate to #62916


Throwing "ReferenceError: window is not defined" on Next.js with SSR

The library fails to work with the Next.js framework ("next": "^12.1.6") while SSR.
The issue is caused by the missing window object within the file<EMAIL_ADDRESS>and it occurs at the time of import.
Ref: https://github.com/twa-dev/SDK/blob/master/src/sdk.ts
Transpiled file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebApp = void 0;
require("./telegram-web-apps");
var telegramWindow = window; // Seems to be the line causing the problem
exports.WebApp = telegramWindow.Telegram.WebApp;
//# sourceMappingURL=sdk.js.map

Demo app:
import WebApp from '@twa-dev/sdk'; // Happens at the time of import

const MiniApp = () => {
  return (

      ...
      <button onClick={() => WebApp.showAlert(`Hello World!`)}>
        Show Alert
      </button>

  );
};

export default MiniApp;

Console output
Uncaught ReferenceError: window is not defined
    at <unknown> (file:///Users/ivan/code/communa/frontend/node_modules/@twa-dev/sdk/dist/telegram-web-apps.js:248:5)
    at Object.<anonymous> (file:///Users/ivan/code/communa/frontend/node_modules/@twa-dev/sdk/dist/telegram-web-apps.js:274:3)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Module.require (node:internal/modules/cjs/loader:1231:19)
    at require (node:internal/modules/helpers:177:18)
    at Object.<anonymous> (file:///Users/ivan/code/communa/frontend/node_modules/@twa-dev/sdk/dist/sdk.js:4:1)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)

@ivanproskuryakov I am experiencing the same, let me know if you find a good fix.
I am able to use Next's Script tag to load the TWA script and then do the JS there, but I would like to use this SDK.

@kevcube Sure, I'll open a PR with a patch.
Meanwhile, can you post your workaround for this error, please?

@ivanproskuryakov
"use client";
import Script from "next/script";

import { Telegram } from "@twa-dev/types";

declare global {
  interface Window {
    Telegram: Telegram;
  }
}

let count = 0;

export default function Page() {
  return (


Add html highlighting for html tagged template strings

Would you be open to adding html highlighting to tagged template strings that have a tag function named html ?  The package currently has this feature for css tagged template strings with css.  The default atom JS highlighter used to have both, but they couldn't get css to work correctly.  You have css working, but not html.
Here is how the default highlighter does it.  https://github.com/atom/language-javascript/blob/d59666cab4275033d15d938d9d60a6ee99905924/grammars/javascript.cson#L1378-L1425

See https://github.com/gandm/language-babel#javascript-tagged-template-literal-grammar-extensions

Fantastic.  Missed this feature all together.


Some enhancements that i found.

tools
Found some fennel tools in compiler's wiki. Ones that i use are:

Antifennel Compile Lua to Fennel.
fnlfmt fennel Formatter
fennel-test Unit testing library

code
Found way to check if arg to macro is a function at compile time.
(fn function? [f]
  "checks if a 'f' is function."
  (let [ref (?. f 1 1)]
    (or (= ref :hashfn)
        (= ref :fn))))

how it works:
Fennel Passes variable as table:
{ "hashfn", -- it indexes this val.
    byteend = 78,
    bytestart = 73,
    line = 4,
    prefix = "hashfn",
    <metatable> = <1>{ "SYMBOL",
      __eq = <function 1>,
      __fennelview = <function 2>,                                      __lt = <function 3>,
      __tostring = <function 2>
   }
}

Caveats
Won't work if function is indirectly passed.
Eg-
(fn name []
  (do-something))

(macro-name name) ;; will not work

(macro-name #(name)) ;; will work

example of macro taken from my dotfiles.
(fn M.map- [args fs ts]
  (let [(modes opts) (keymap-options args)
        fs (tostring fs)]
    (if (function? ts)
        (def-fn-map modes fs ts opts)
        (def-map modes fs (tostring ts) opts))))

Hey,
I've thought adding a check like this, but the caveat you mentioned causes a behavior that's very unintuitive: inline functions work, functions passed as variables do not.
Right now, although it isn't perfect, I feel it's better to keep the distinction between def-keymap and def-keymap-fn. The first takes a string (or something that evaluates into a string, like a variable or a function call), the latter takes a function body. At the same time. passing a function as a variable can be accomplished with vlua.

I have another dirty solution:
(fn function [])

(mac-  ,function)  ; pass it as (unquote (function))

;; Implementation
(fn unquote? [sb]
  "checks if sym 'sb' is unquote"
  (let [ref (?. sb 1 1)]
    (= ref :unquote)))

; inside macro
  (if (unquote? variable)
    (call-fn-macro (. variable 1 2))
    (call-macro variable))

My reasoning is having inline function gives more native feeling than having to use many different macros.

Okay, so I was playing around with the unquote hack, and it's very clever!
(fn M.unquote? [sy]
  (let [ref (?. sy 1 1)]
    (= ref :unquote)))

(fn M.test [f]
  (if (M.unquote? f)
    `(print "function" ,(. f 2))
    `(print "string" ,f)))

; functions
(test ,(fn [] (print)))
(test ,my_function)

; strings
(test my_string)
(test (.. "_" my_string))

This will produce:
local function _0_() end
print("function", _0_)
print("function", my_function)
print("string", my_string)
print("string", ("_" .. my_string))

This gave me an idea, what if by default zest converted symbols to strings, unless they're unquoted?
(def-keymap <c-m> [n] j) ; => vim.api.nvim_set_keymap("n", "<c-m>", "j", {noremap = true})
(def-keymap ,from [n] ,to) ; => vim.api.nvim_set_keymap("n", from, to, {noremap = true})

This could be used for autocmd events and selectors, augroup and other names, etc. This would reduce the amount of : and "" across the board. I think it makes sense to use unquote to differentiate between literals and variables.
Now, about functions vs strings.
Experiment 1: define a new wrapper macro
(fn M._ [f]
  f)

(fn M.test [data]
  (print data)
  (if (= (. data 1 1) :_)
    `(print "function" ,(. data 2))
    `(print "string" ,data)))

(test (_ x))) ; => print("function", x)
(test y) ; => print("string", y)

Caveat: the wrapper macro, _ in this case, cannot be aliased. That breaks everything. Also, the extra set of parens looks bad. Dismissing this idea.
Experiment 2: use tables to wrap functions
So, here's a thought: there's no use case I can think of when one would want to bind a table to a keymap or autocmd or whatever else. Which means:
(fn M.test [data]
  (let [f (require :zest.fennel)]
    (if (f.sequence? data)
      `(print "function" ,(unpack data))
      `(print "string" ,data))))

(test [x]) ; => print("function", x)
(test y) ; => print("string", y)

This essentially mean that we can do this:
(def-keymap :<c-m> [nvo]
  my_string)

(def-keymap :<c-m> [nvo]
  [my_function])

(def-keymap :<c-m> [nvo]
  [(fn [] (print "fn"))])

What do you think?

Using table to wrap string.

Looks good to me but you can also use:
(local str :str)

(mac- 'str) ;; pass it as (quote str)

using unquote for function and quote for string keeps syntax more cleaner.

Here is an example of it on action:
(local pattern "*.fnl")

(fn print-hello []
  (print :Hello!))

(au- [:BufRead] 'pattern `print-hello)

Btw merge #2 pull request to add syntax highlighting in github. It becomes easier to read code in browser that way.

Hello!
This has been a good discussion and it has given me quite a few ideas. I will be deprecating the -fn macros like you suggested, but I don't have an ETA yet.
Thanks!

Looking forward to it.

Hey,
Just wrote a macro for Emacs-like (use-package)
;; Usage
(use-package :package/source
  :run ":commands"
  :branch "master"
  :config #(require :config))

(use-package :kevinhwang91/rnvimr
  :config #(require :plugins.ranger))

;; Implementation
(macro use-package [name ...]
  (let [rest [...]
        conf {1 name}]
    (each [idx val  (ipairs rest)]
      (when (= 1 (% idx 2)) ;; odd? [idx]
        ; set val -> (next item in array)
        (tset conf val (. rest (+ idx 1)))))
    `(use ,conf)))

Helper to find fennel type easily :
;; utils
(fn function? [f]
  "checks if a 'f' is function."
  (let [ref (?. f 1 1)]
    (or (= ref :hashfn)
        (= ref :fn))))

(fn function-call? [f]
  (let [ref (?. f 1)]
    (and (list? f)
         (sym? ref)
         (in-scope? ref))))

(fn is-sym? [name x]
  (let [ref (?. x 1)
        ref-name (?. ref 1)
        sb (?. x 2)]
    (and (= ref-name name)
         (sym? ref)
         (in-scope? sb))))

; main helper
(fn fnl-type [x]
  "returns fennel type of 'x'"
  (if
    (= (type x) :string) "string"
    (is-sym? :unquote x) "unquote"
    (is-sym? :quote   x) "quote"
    (function-call?   x) "function-call"
    (function? x)        "function"
    (sym? x)             "symbol"
    "invalid"))

(fnl-type) returns following types and also checks if a variable is in scope.

string
function -> #(do) or (fn [])
function-call -> (fnc arg)  :: scoped
unquote :: scoped
quote  :: scoped
symbol
invalid -> 'x' not in scope

usage:
(match (fnl-type variable)
  ;; do something
)

an easy to use wrapper over "fnl-type"
(fn switch-macro [str-macro fn-macro fx ...]
  "switchs macros based on typeof 'fx'."
  (match (fnl-type fx)
    "string"  (str-macro fx ...)
    "quote"   (str-macro (. fx 2) ...)
    "symbol"  (str-macro (tostring fx) ...)

    ; handel functions
    "function" (fn-macro fx ...)
    "unquote"  (fn-macro (. fx 2) ...)
    "function-call" (fn-macro (fn [] fx) ...)

    ; error handling
    "nil"     (print "[macro] can't pass nil.")
    "invalid" (print "[macro] variable: " fx " is not in scope.")
    _ (print "[macro] invalid input: " fx)))

usage:
; inside macro
(switch-macro def-cmd def-fn-cmd fx  ; main pivot
     <other config> ...opts)

here is a working macro:
(fn def-map [ts modes fs opts]
  "define a normal vim mapping."
  (let [out []]
    (each [m (string.gmatch modes ".")]
      (table.insert out `(vim.api.nvim_set_keymap ,m ,fs ,ts ,opts)))
    (if (> (length out) 1)
        `(do ,(unpack out))
        `,(unpack out))))

(fn def-fn-map [fx modes LHS opts]
  "define vim map with function 'f' binded to [v:lua]."
  (let [maps []]
    (each [m (string.gmatch modes ".")]
      (table.insert maps `(vim.api.nvim_set_keymap ,m ,LHS RHS# ,opts)))
    `(do
       (local RHS# (string.format
                    ,(if opts.expr "%s()" ":call %s()<cr>")
                    ,(vlua fx)))
       ,(unpack maps))))

(fn M.map [args lhs rhs]
  (let [(modes opts) (keymap-options args)
        fs (tostring fs)]
    (switch-macro def-map def-fn-map rhs modes lhs opts)))

Usage:
; directly calling function
(map [n] :h (print :hello))

; using a local variable
(local lhs (vim.api.use__something))

(map [n :expr] 'lhs
    (if (> vim.v.count 0) "k" "gk"))

; using local function
(fn tab-complete []
   (tc- "<C-n"))

(map [is] <Tab>  ,tab-complete)

It will also throw error if local var/function is not in scope or doesn't exist.

Simple uuid v4 generator
(fn uuid []
  (math.randomseed (.. (os.time) (math.random 100000)))
  (let [template :uxxxxxxx_xxxx_4xxx_xxxx_xxxxxxxxxxxx]
    (string.gsub template "x"
                 #(let [v (math.random 0 15)]
                       (string.format "%x" v)))))

You should use uuid to generate v:lua id at compile time rather than doing it at runtime.
It will make output more cleaner to read.
right now, my outputted lua is a mess to read.
Here is comparison:
at runtime:
do
    local CMD_0_
    local function _2_(...)
      local ID_NUM_0_ = (_G._fnl["#"] or 1)
      local ID_0_ = ("id_" .. ID_NUM_0_)
      _G._fnl[ID_0_] = cmd_eval
      _G._fnl["#"] = (1 + ID_NUM_0_)
      return ("v:lua._fnl." .. ID_0_)
    end
    CMD_0_ = string.format(":call %s()", _2_(...))
    vim.cmd(("autocmd FileType fennel " .. CMD_0_))
end

at compile-time:
do
    _G.fnl['u8c70001-e9d0-4033-9dc0-25e058d6db9d'] = cmd_eval
    vim.cmd("autocmd FileType fennel :call v:lua._fnl.u8c70001-e9d0-4033-9dc0-25e058d6db9d()")
end

If you are worried about collision the collision rate of v4 uuid id extremely low:
50% probability of at least one collision after 2.71 quintillion generations.

Compile time ids make it impossible to use the def-autocmd macro in a loop or a function, as each subsequent call will replace the previously stored function. A more concise run time solution would be to use metatables in _G.zest, but I haven't experimented with it much yet.

Hmm, I could leverage this through a call such as local zest_id = _G.zest.store(f). Then again, it's not immediately apparent what store() does.
I might simply wrap the current implementation in fold comments:
do
  local zest_id
  -- {{{ zest.id
  <code>
  -- }}}
end

So that it's hidden by default.

Hey,
can you give me an example of macro in a loop or a function it is kinda hard for me to visualise.

Just tested it inside a loop.
It won't cause error if same function is referenced.
(each [_ k (ipairs [:h :l])]
  (map [n] k (print :works)))
  ; here <rhs> shadows <rhs> so no problem.

If for some wierd reason 'rhs' is looped as a function. It will cause bugs.
(fn h-func [])
(fn j-func [])

(each [k v (pairs [{:h h-func :j j-func}])]
  (map [n] k (vlua v)))

But then again I had to use <current>(vlua) to make it loop through function,
we can expose this <current>(vlua) as (generated-vlua) and use  <uuid>(vlua) for rest as this edge case was really not practical.

Here is my current setup for now when checking functions.
First case:
(fn tab-complete [] )

(mac- (tab-complete)) ;; we can directly call it here

Here because the function accepts no args we can directly bind v:lua.
second case
(lambda reusable [x y])

(mac- (reusable 2 4))

Here it requires args to work so we have to wrap it around (fn [] ...).
so here it how it goes:

check if it is (list?).
check if (. list 1) is sym?
if (length "list") is 1 then return first item. ie: directly bind it.
else wrap it around (fn [] list).

This remove the need to use unquote and make them easier to read.

Here it is in practice:
  (fn function? [f]
    "checks if 'f' is function."
    (let [ref (?. f 1 1)]
      (or (= ref :hashfn)
          (= ref :fn)
          (= ref :partial))))
    ; can also be written as
    ; (vim.tbl_contains [:partial :fn :hashfn] ref)
    ; with the downside that it can be compiled outside of vim.

  (fn function-call? [f]
    (let [ref (?. f 1)]
      (and (list? f)
           (sym? ref))))

  (fn zfc [fc]
    "treat function-call for binding."
    (let [single? (= (length fc) 1)]
      (if (single?)
          (. fc 1)
         '(fn [] ,fc))))

  (fn zfn [fx]
    (if (function? fx) fx
        (function-call? fx) (zfc fx)))

here is more consise version:
  (fn zfc [fc]
    "treat function-call for binding."
    (let [single? (= (length fc) 1)]
      (if single?
          (. fc 1)
         '(fn [] ,fc))))

  (fn zfn [fx]
    (let [ref  (?. fx 1)
          refn (?. ref 1)]
      (if (or (= refn :hashfn)
              (= refn :fn)
              (= refn :partial)) fx
          (and (list? fx)
               (sym? ref)) (zfc fx))))

Discovered a fun thing while experimenting:
Lispy arrays
(mac- (:lisp :in :fennel)  ...)

; It can be simply converted to normal array by:
[(unpack @lisp)]

(Just (fun) (((to)) use (-> complete
((((lispy))))((((code))))((((((((((((()))))))))))))
;; Some of current macros without [] goodness.

(opt-append completeopt ("menuone" "noselect"))

(def-keymap :H (:nv :slient)"0")

(map- (:is :silent) <TAB> (tab-complete))

I've reached the point where I'm happy with the new zest.pure macros, so I decided to experiment with run time.
I basically rewrote def-keymap and def-autocmd as run time functions:
https://github.com/tsbohc/zest.nvim/blob/ec6c36599764939fe7f337703d46c8d0c7956886/fnl/zest/init.fnl#L59-L64
And pointed some macros to them:
https://github.com/tsbohc/zest.nvim/blob/ec6c36599764939fe7f337703d46c8d0c7956886/fnl/zest/test-macros.fnl#L20-L24
The call macro outputs something like this: require("zest")["def-keymap"](...)
After benchmarking the two compiled configs a few times, I can't really say there's a noticeable difference. I am running a good machine, but yeah.
It was fun solving so many problems while being limited to compile time, but I speaking pragmatically, I don't think it's worth it. The lua output is very neat, but apart of that... I don't know.
And so I might me converting everything to run time in the end and using macros just as syntactic sugar.
And yeah, that is pretty cool. It seems fennel stays very true to being a lisp.

Here it is:

show lua

local fennel = require("compiler")
local fnl_files = "~/cool/dotfiles/nvim/fnl/**.fnl,~/cool/dotfiles/nvim/init.fnl"
local cmd_compile
local function _0_()
  local CMD_0_
  local function _1_()
    local ID_NUM_0_ = (_G._fnl["#"] or 1)
    local ID_0_ = ("id_" .. ID_NUM_0_)
    local function _2_()
      return fennel.compileBuffer()
    end
    _G._fnl[ID_0_] = _2_
    _G._fnl["#"] = (1 + ID_NUM_0_)
    return ("v:lua._fnl." .. ID_0_)
  end
  CMD_0_ = string.format(":call %s()", _1_())
  return vim.cmd(("command!" .. " -buffer " .. "FnlCompileBuffer" .. " " .. CMD_0_))
end
cmd_compile = _0_
local cmd_eval
local function _1_()
  local CMD_0_
  local function _2_()
    local ID_NUM_0_ = (_G._fnl["#"] or 1)
    local ID_0_ = ("id_" .. ID_NUM_0_)
    local function _3_()
      return fennel.evalBuffer()
    end
    _G._fnl[ID_0_] = _3_
    _G._fnl["#"] = (1 + ID_NUM_0_)
    return ("v:lua._fnl." .. ID_0_)
  end
  CMD_0_ = string.format(":call %s()", _2_())
  return vim.cmd(("command!" .. " -buffer " .. "FnlEvalBuffer" .. " " .. CMD_0_))
end
cmd_eval = _1_
do
  vim.cmd("augroup fennel-commands")
  vim.cmd("autocmd!")
  do
    do
      local CMD_0_
      local function _2_(...)
        local ID_NUM_0_ = (_G._fnl["#"] or 1)
        local ID_0_ = ("id_" .. ID_NUM_0_)
        _G._fnl[ID_0_] = cmd_compile
        _G._fnl["#"] = (1 + ID_NUM_0_)
        return ("v:lua._fnl." .. ID_0_)
      end
      CMD_0_ = string.format(":call %s()", _2_(...))
      vim.cmd(("autocmd " .. "BufRead,BufNewFile" .. " " .. fnl_files .. " " .. CMD_0_))
    end
    local CMD_0_
    local function _2_(...)
      local ID_NUM_0_ = (_G._fnl["#"] or 1)
      local ID_0_ = ("id_" .. ID_NUM_0_)
      _G._fnl[ID_0_] = cmd_eval
      _G._fnl["#"] = (1 + ID_NUM_0_)
      return ("v:lua._fnl." .. ID_0_)
    end
    CMD_0_ = string.format(":call %s()", _2_(...))
    vim.cmd(("autocmd " .. "FileType" .. " " .. "fennel" .. " " .. CMD_0_))
  end
  vim.cmd("augroup END")
end
do
  local CMD_0_
  local function _2_(...)
    local ID_NUM_0_ = (_G._fnl["#"] or 1)
    local ID_0_ = ("id_" .. ID_NUM_0_)
    local function _3_()
      return fennel.compileAll()
    end
    _G._fnl[ID_0_] = _3_
    _G._fnl["#"] = (1 + ID_NUM_0_)
    return ("v:lua._fnl." .. ID_0_)
  end
  CMD_0_ = string.format(":call %s()", _2_(...))
  vim.cmd(("command!" .. " " .. "FnlCompileAll" .. " " .. CMD_0_))
end
do
  local CMD_0_
  local function _2_(...)
    local ID_NUM_0_ = (_G._fnl["#"] or 1)
    local ID_0_ = ("id_" .. ID_NUM_0_)
    local function _3_()
      return fennel.sync()
    end
    _G._fnl[ID_0_] = _3_
    _G._fnl["#"] = (1 + ID_NUM_0_)
    return ("v:lua._fnl." .. ID_0_)
  end
  CMD_0_ = string.format(":call %s()", _2_(...))
  vim.cmd(("command!" .. " " .. "FnlSync" .. " " .. CMD_0_))
end
vim.cmd("augroup fennel-save")
vim.cmd("autocmd!")
do
  local CMD_0_
  local function _2_(...)
    local ID_NUM_0_ = (_G._fnl["#"] or 1)
    local ID_0_ = ("id_" .. ID_NUM_0_)
    local function _3_()
      return fennel.compileBuffer()
    end
    _G._fnl[ID_0_] = _3_
    _G._fnl["#"] = (1 + ID_NUM_0_)
    return ("v:lua._fnl." .. ID_0_)
  end
  CMD_0_ = string.format(":call %s()", _2_(...))
  vim.cmd(("autocmd " .. "BufWritePost" .. " " .. fnl_files .. " " .. CMD_0_))
end
return vim.cmd("augroup END")

As far as performance is concerned it doesn't really matter as lua is really simple (compiler wise).

Just wanted to ask why not use "LIST" instead of "SEQUENCE" for passing function.
with current method "LIST" is still passed inside "SEQUENCE".
ie:
(mac- [(some-function :x)])

it is passed as:
{
  {
    {
      "some-function",
      <metatable> = { "SYMBOL" }
    },
    <metatable> = { "LIST" }
  },
  <metatable> = { "SEQUENCE" }
}

while it can be directly passed without interference with other types:
{
  {
    "some-function",
    <metatable> = { "SYMBOL" }
  },
  <metatable> = { "LIST" }
},

Here is language docs for list:

lists are compile-time concepts that don’t exist at runtime; they are implemented as tables which have a special metatable to distinguish them from regular tables
(list) - return a list, which is a special kind of table used for code

It's just something I like visually, e.g:
(ki- [x] :*
  [(let [p (vim.fn.getpos ".")]
     (vim.cmd "norm! gvy")
     (vim.cmd (.. "/" (vim.api.nvim_eval "@\"")))
     (vim.fn.setpos "." p))])

The #() notation messes up treesitter highlighting, and the (fn []) one introduces an extra level of indentation.

I think I'll move most of the processing to run time, and store tables containing some data about the function, like:
_G.zest.keymap.nvo_23c43m54 = { mod = "nvo", lhs = "<c-m>", rhs = function <...>, opt = <...> }

But, the same example looks much more natural without []'s
(ki- [x] :*
  (let [p (vim.fn.getpos ".")]
     (vim.cmd "norm! gvy")
     (vim.cmd (.. "/" (vim.api.nvim_eval "@\"")))
     (vim.fn.setpos "." p)))

that's just a personal preference I like have more clean layout but everyone has different flavours I guess.

Normally I'm evaluating the rhs and binding the result, while the contents of the seq, ([(print :foo) (print :bar)] become
(fn [] (print :foo) (print :bar))

And are bound as a function.

But that can just be done with:(do (print :foo) (print :bar))

Sorry I just keep clicking on close with comment.

In majority of my use cases I write function outside of macro and then pass it.
I like to do separations of concern but with your [seq] example it seems fine use case for me too.
So, Ok.

That introduces an indentation level and there's no way to tell how it should be bound:
This evaluates foo, binding the result:
(ki- [x] :<c-m> (foo)

This creates a function (fn [] (foo)) and binds that:
(ki- [x] :<c-m>
  [(foo)])

That is, it's synonymous to
(ki- [x] :<c-m>
  (fn []
    (foo)))

Or #()

Emacs users have been using function call inside of configuration for long time so it doesn't seem like much of problem to me, but we can still keep sequence macro and add few line for parsing LIST here if you like:
https://github.com/tsbohc/zest.nvim/blob/ec6c36599764939fe7f337703d46c8d0c7956886/fnl/zest/test-macros.fnl#L15-L18

Something like this:
(fn parse-fn [f]
  (if
    (sequence? f)
      '(fn [] ,(unpack f))
    (function-call? f)
       (zfc f)
    f))

Do you mean checking if a function was passed?

I meant check if a function-call ie:  (do something) was passed.

Why though?

This evaluates foo, binding the result:
(ki- [x] :<c-m>
  (foo))

This allows binding strings like so:
(ki- [x] :<c-m> (.. "!" my-shell-executable " %:p"))

I think that's a good expected behavior.

Or even:
(fn my-cmd-gen [param]
  (.. foo " " param))

(ki- [x] :<c-m> (my-cmd-gen :foo))

Or list macro can just be kept I just don't like the extra binding it does to already made functions.
(fn example [])

(mac- [example])
; It does not tell that the function is being called.

(mac- [(example)])
; this wrappes it inside another function.

(mac- (example))
; this is more explicit that function is being called and also does not double wrap.

the wrapping behaviour can be removed by:
(fn seq-to-fn [f]
  (let [ref (?. f 1)
        single? (= (length ref) 1)]
    (if (sequence? f)
        (if single? f
           '(fn [] ,(unpack f)))
      f)))

So, yeah LIST macro can be kept for now.

(fn my-cmd-gen [param]
  (.. cmd " " param))

(ki- [x] :<c-m> (my-cmd-gen :foo))

Now that I think about it,
This is really useful like you can use:
(fn do-completion [type]
    ; checks
    (termcode type))

(map [is] :<TAB>   (do-completion "<TAB"))
(map [is] :<S-TAB> (do-completion "<S-TAB"))

I think we might be misunderstanding each other. This is the behavior I want to achieve:
(ki- "foo")               ; => bind "foo" as a str
(ki- foo)                 ; => bind foo which can be a str of a fn
(ki- (foo))               ; => bind the resulf of evaluating (foo), which can be a str or a fn

(ki- [(foo) (bar)])       ; => bind (fn [] (foo) (bar))
(ki- (fn [] (foo) (bar))) ; => bind (fn [] (foo) (bar))
(ki- #((foo) (bar)))      ; => bind (fn [] (foo) (bar))

To be clear, this is the behavior I want to achieve:
(ki- "foo")               ; => bind "foo" as a str
(ki- foo)                 ; => bind foo which can be a str of a fn
(ki- (foo))               ; => bind the resulf of evaluating (foo), which can be a str or a fn

(ki- [(foo) (bar)])       ; => bind (fn [] (foo) (bar))
(ki- (fn [] (foo) (bar))) ; => bind (fn [] (foo) (bar))
(ki- #((foo) (bar)))      ; => bind (fn [] (foo) (bar))

Yeah this is what I also realized now after this conversation.
(xxx) can compile down to
some_api_fn(args, xxx())

And [(xxx)] to:
some_api_fn(args, ":call v:lua.id_xxxx")

The only thing that I don't like is wrapping I mentioned above:
Like this is what output looks like:
function example()
  print "works"
end
do
  function _0_()
     return example(); -- this part annoys me
  end
  bind = _0_ -- here example should have been present.
  ...rest
end

-- it should directly bind the pre defined function. Like:
bind = example

it can easily be fixed as mentioned above:

(fn seq-to-fn [f]
  (let [ref (?. f 1)
        single? (= (length ref) 1)]
    (if (sequence? f)
        (if single? f
           '(fn [] ,(unpack f)))
      f)))

What fennel code causes this currently?

This only happens in developing test-macros so I doesn't cause much problem now but may cause when goes main.

Could you give a specific example?

It is 10:30 pm here so I will find the bug in morning. Sorry for the wait.

It's all right, leave a message when you can!

Thanks

Here is it:
test-macros.fnl
Input:
(fn example [] (yoo))

(def-keymap [n] :n [(example)])

Output:
local function example()
  return print("yoo")
end
local function _0_() -- wrap
  return example()
end
do end (require("zest"))["def-keymap"]("n", {expr = false, noremap = true}, "n", _0_)

Problem:
https://github.com/tsbohc/zest.nvim/blob/ec6c36599764939fe7f337703d46c8d0c7956886/fnl/zest/test-macros.fnl#L15-L18
Fix:
(fn seq-to-fn [f]
  (let [ref (?. f 1)
        single? (= (length ref) 1)]
    (if (sequence? f)
        (if single?
            (. ref 1)
           '(fn [] ,(unpack f)))
      f)))

Fix-Output
local function example()
  return print("yoo")
end
do end (require("zest"))["def-keymap"]("n", {expr = false, noremap = true}, "n", example) -- directly binds example

macros.fnl
all of the -fn macros wrap any input they get into (fn [] ...) that cause anything that you pass to be wrapped.
example:
inline
(def-keymap-fn :a [n] (fn [] (print :yoo)))

; out -> (fn [] (fn [] (print :yoo)))

same case for hasfn.
external
(fn example [] (yoo))

(def-keymap-fn :a [n] (example))

; out -> `same as test-macros`
; (fn example [])
; (fn [] (example))

Bug:
this line in let statement of every macro:
https://github.com/tsbohc/zest.nvim/blob/ec6c36599764939fe7f337703d46c8d0c7956886/fnl/zest/macros.fnl#L114
can be fixed by zfn but not needed as these will get deprecated soon.

Got it, thanks a bunch. Yeah, I'll add a check to prevent unnecessary wrapping.

I just wrote a new feature-full compiler for zest.
It still has some rough edges but still way better than the current implementation.
Available in this fork.
features

compile and sources init.fnl in root directory.
package.path is patched so you can now put .lua files in /fnl dir and require it.
diffs all /fnl files and compile the stale one, does this entire process in 0.2 sec.

it achieves this by marking all compiled files.
marker looks like this -- :fennel:<source-ftime>
it matches source ftime with target.

setup
local compiler = require"zest"

zest.setup({
  global_macros={
    ['let-g']="g-",
    ['def-keymap']="map",
  }, -- can pass "all" string to require all zest macros globally.
  compile={
    onsave={
      type='diff', -- can pass 'current' to only compile current.
      verbose=true,
      reload_macros=true, -- reloads macro every save so you don't have to quit vim.
    },
    onload=false -- under development
  },
  init_source="~/.config/nvim/init.fnl",
  init_module="init", -- module that is required.
  source="~/.config/nvim/fnl/",
  target="~/.config/nvim/lua/"
})

zest.compiler provides the api table:
{
  ; provides way to get the config.
  :env _getter_
  ; patched package.path
  :path "abc/?.lua"
  :eval {
    :string eval.eval-string
    :file   eval.eval-file
    :buffer eval.eval-buffer
    :range  eval.eval-range
  }
  :compile {
    :string comp.compile-string
    :file   comp.compile-file
    :buffer comp.compile-buffer
    :all    comp.compile-all
    :diff   comp.compile-diff
  }
}

Here are some highlights of api:
eval

eval.range -> select some lines in V-Line mode and have them evaluated.
eval.buffer -> really useful used it like 100 - 200 times while making this, does what it says evaluates current buffer.

compile

compile.buffer -> compiles current buffer.
compile.diff -> default function that runs on save.

Example vim config:
command! FnlEnv :lua compiler.api.env()

command! FnlCompileBuffer :lua compiler.api.compile.buffer()
command! FnlCompileDiff :lua compiler.api.compile.diff()
command! FnlCompileAll :lua compiler.api.compile.all()

command! -nargs=* Fnl :lua compiler.api.eval.string(<q-args>)
command! -range=0 FnlEvalRange :lua compiler.api.eval.string(<line1>, <line2>, <count>)
command! -complete=file -nargs=1 FnlFile :lua compiler.api.eval.file(<q-args>)
command! FnlEvalBuffer :lua compiler.api.eval.buffer()

Just added ability to put compiled lua files in local dir so you don't have to see them.
option can be set by:
-- inside setup function
zest.setup {
  target="~/.local/share/nvim/zest",
}

it will also source init.fnl automatically.
Also added command FnlGotoOutput to open file containing compiled lua for current buffer.

Deleted that fork, wrote a separate plugin for just that tangerine.nvim.
What are your thoughts about the plugin.

I'll have to take a more thorough look at it later, but I can tell it's very cool. I like the eval stuff!
To be honest, I did not intend the included compiler to be featureful, as most people are already using aniseed or something else. In fact, I'll most likely be removing it entirely. I intend the next iteration to be runtime based (+ macros, of course) and compatible with lua. I have some of it done already.
Myself, I now run a bash script (see https://github.com/tsbohc/.garden/blob/master/bin/bayleaf). It recompiles the whole config into a separate directory, launches as headless instance of neovim in the background, and checks the output. That way it's impossible to introduce a breaking change. It was a experiment I tried on a whim, but it ended up working out fairly well.
I was going to suggest you turning it into a separate plugin, so I'm glad you've arrived at the same conclusion. I'll include the link to tangerine in the readme. A very cute name, by the way!
Also, I want you to know, I really appreciate your continued interest in zest! I didn't think anyone would be so engaged with my work!

Thanks,
I have been thinking for while now rather than using macro for runtime just provide function that users can require directly, having macros that relies on runtime just beats purpose of having them. Something like this:
(local {: def-keymap} (require :zest.utils))

It will do the same thing without any side effects.
My entire purpose of using macros was that it did all the stuff on compile-time so It didn't had to re-calculated on every load.
Having function for runtime also keeps lua clean like:
(def-keymap [:n] :H some_var)

def_keymap({"n"}, "H", some_var)

But then again you can't just do [n], [:n] has to be passed or lua will think it is an variable.
and here also string has to be passed:
(g- :some_global_var "string")

(set-opt :nonumber)

It is kinda going full circle.

I see it something like this. Not final by any means.
Being lua compatible is neat:
zest.def_keymap('n', { noremap = true }, '<c-m>', function()
  print('foo')
end)

Fennel makes it nicer:
(zest.def-keymap "n" {:noremap true} "<c-m>"
  (fn [] (print "foo")))

Macros make it nicer yet:
(def-keymap [n :noremap] "<c-m>"
  (fn [] (print "foo")))

The best part of exposing runtime stuff is that it's very difficult to support variables everywhere. There are just too make checks to make and the code grows ever uglier. If going pure macros was the crazy idea, doing it this way is a sensible (and easily maintainable) solution.

Also, some things aren't going into the runtime. There's no point in wrapping vim.opt at runtime as the api is simple and good enough already. Macros make it (in my opinion) even better:
(se- [g :append] shortmess :I) ; => vim.opt_global.shortmess:append("I")

Just wrote template string macro for fennel.
(lambda f [str]
  (let [xs []]
    (each [v (str:gmatch "${(.-)}")]
      (table.insert xs (sym v)))
    '(string.format
       ,(str:gsub "${.-}" "%%s")
       ,(unpack xs))))


Version 1.7.10

Is Minecraft version 1.7.10 supported?

yes, versions 1.0-1.17 inclusive are supported


Add new volunteer Nkiruka Ebele

Hey @nkirukka looks good thanks for sharing :)

Thank you @nkirukka :)


[AIRFLOW-XXX] Fix failing PubSub tests on Python3

Correct failing tests due to not explicitly using b'' string when b64encoding.
Make sure you have checked all steps below.
JIRA

[ ] My PR addresses the following Airflow JIRA issues and references them in the PR title. For example, "[AIRFLOW-XXX] My Airflow PR"

https://issues.apache.org/jira/browse/AIRFLOW-XXX

Description

[X] Here are some details about my PR, including screenshots of any UI changes:
Correct failing tests due to not explicitly using b'' string when b64encoding. These were previously not being encountered because of the gcp_pubsub_hook test module being incorrectly named.

Tests

[ ] My PR adds the following unit tests OR does not need testing for this extremely good reason:

Commits

[X] My commits all reference JIRA issues in their subject lines, and I have squashed multiple commits if they address the same issue. In addition, my commits follow the guidelines from "How to write a good git commit message":

Subject is separated from body by a blank line
Subject is limited to 50 characters
Subject does not end with a period
Subject uses the imperative mood ("add", not "adding")
Body wraps at 72 characters
Body explains "what" and "why", not "how"

[X] Passes git diff upstream/master -u -- "*.py" | flake8 --diff

Codecov Report

Merging #2893 into master will increase coverage by 0.03%.
The diff coverage is n/a.

@@            Coverage Diff            @@
##           master   #2893      +/-   ##
=========================================
+ Coverage   73.17%   73.2%   +0.03%
=========================================
  Files         160     160
  Lines       12179   12179
=========================================
+ Hits         8912    8916       +4
+ Misses       3267    3263       -4

Impacted Files
Coverage Δ

airflow/configuration.py
84.97% <0%> (+0.85%)
:arrow_up:

airflow/www/app.py
96.55% <0%> (+2.29%)
:arrow_up:

Continue to review full report at Codecov.

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

Merged! Thanks for fixing.


bugfix: fix file exists error while creating pod

Pull Request Description
Describe what this PR does / why we need it
Does this pull request fix one issue?

Describe how you did it
Describe how to verify it
Special notes for reviews

Codecov Report

Merging #193 (cf49e32) into main (da88868) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##             main     #193   +/-   ##
=======================================
  Coverage   27.74%   27.74%
=======================================
  Files          23       23
  Lines        1651     1651
=======================================
  Hits          458      458
  Misses       1141     1141
  Partials       52       52

Flag
Coverage Δ

unittests
27.74% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Continue to review full report at Codecov.

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