Generator fails on k8s api spec

I wanted to generate Swift client from k8s api spec. It stopped with the following complaint:
swift-openapi-generator generate openapi.json --mode types --output-directory gen2 --diagnostics-output-path logs
Swift OpenAPI Generator is running with the following configuration:
- OpenAPI document path: /Users/segabor/Workspace/_kubernetes_/gen/experiment/openapi.json
- Configuration path: <none>
- Generator modes: types
- Feature flags: <none>
- Output file names: Types.swift
- Output directory: /Users/segabor/Workspace/_kubernetes_/gen/experiment/gen2
- Diagnostics output path: /Users/segabor/Workspace/_kubernetes_/gen/experiment/logs
- Current directory: /Users/segabor/Workspace/_kubernetes_/gen/experiment
- Plugin source: <none>
- Is dry run: false
- Additional imports: <none>
Error: Failed to satisfy: All Operation Ids in Document are unique at root of document

After a quick look it turned out k8s api entrypoints may have the same operatorId if they differ in version tag.
Any idea how to overcome this?

Hi @segabor! 👋
The operationId field must be unique in the whole document according to OpenAPI 3.1.0, so if there are duplicate operationId, it's not a valid OpenAPI document. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#fixed-fields-8
What's surprising is that we have the k8s API OpenAPI document in our compatibility suite and it's passing: https://github.com/apple/swift-openapi-generator/blob/04470c13a50fd00b2ad1513334e8e439084ddbd2/Tests/OpenAPIGeneratorReferenceTests/CompatabilityTest.swift#L117
Where did you get the OpenAPI document from?

After a quick look it turned out k8s api entrypoints may have the same operatorId if they differ in version tag.
Any idea how to overcome this?

While, as @czechboy0 says, this isn't permitted by OAS, one way to overcome this is to add a filter to your config file, which can filter operations by tag.
Some documentations and examples here: https://swiftpackageindex.com/apple/swift-openapi-generator/0.3.5/documentation/swift-openapi-generator/soar-0008.
Might unblock you while we look at the latest K8s OpenAPI document.

@czechboy0 there is an official way to generate k8s clients for the given API version which is set to v1.28.4. I took swagger.json.gz and converted it to openapi.json.gz using converter API.

@czechboy0 it worked like a charm! I wonder why the way k8s folks recommended didn't work. Or maybe to conversion to openapi is somewhat broken.
Anyway thanks guys.

Sorry to resurrect this topic, but I have the same problem with this swagger v2 doc: https://archive.cloudera.com/cm7/<IP_ADDRESS>/generic/jar/cm_api/apidocs/ui/swagger.json
I converted it into openapi v3 using https://converter.swagger.io and also tried to convert with swagger2openapi cli tool, but in the end I always get the Error: Failed to satisfy: All Operation Ids in Document are unique at root of document when I try to generate the code from the converted v3 openapi document.
I wrote a little script to see which operationId is duplicated because the swift-openapi-generator does not help with this:
import sys
import yaml
import json
from collections import defaultdict

def load_openapi_file(filepath):
    """Load OpenAPI 3.0 file, support both JSON and YAML formats."""
    filepath = filepath.strip()  # Remove any leading/trailing whitespace
    with open(filepath, 'r') as file:
        if filepath.endswith('.yaml') or filepath.endswith('.yml'):
            return yaml.safe_load(file)
        elif filepath.endswith('.json'):
            return json.load(file)
        else:
            raise ValueError("Unsupported file format. Please use a .yaml, .yml, or .json file.")

def find_duplicate_operation_ids(openapi_doc):
    """Find and print duplicate operation IDs in the OpenAPI 3.0 document."""
    operation_ids = defaultdict(list)  # Dictionary to track operationId and their locations

    paths = openapi_doc.get('paths', {})

    for path, methods in paths.items():
        for method, operation in methods.items():
            if 'operationId' in operation:
                operation_id = operation['operationId']
                operation_ids[operation_id].append((path, method))

    # Find duplicates
    duplicates = {op_id: locs for op_id, locs in operation_ids.items() if len(locs) > 1}

    if duplicates:
        print("Duplicate operationIds found:")
        for op_id, locations in duplicates.items():
            print(f"operationId: '{op_id}' is used in:")
            for path, method in locations:
                print(f"  - Path: {path}, Method: {method}")
    else:
        print("No duplicate operationIds found.")

if __name__ == "__main__":
    # Check if filename is provided
    if len(sys.argv) < 2:
        print("Error: Please provide the path to the OpenAPI 3.0 document.")
        sys.exit(1)

    filepath = sys.argv[1].strip()

    try:
        openapi_doc = load_openapi_file(filepath)
        find_duplicate_operation_ids(openapi_doc)
    except FileNotFoundError:
        print(f"Error: File '{filepath}' not found. Please check the path and try again.")
    except Exception as e:
        print(f"Error: {e}")

It looks like there are no duplicates in the root of the document:
python3 find_duplicate.py openapi.json                                                                                5s 03:17:42 du
Duplicate operationIds found:
operationId: 'getMetrics' is used in:
  - Path: /clusters/{clusterName}/services/{serviceName}/activities/{activityId}/metrics, Method: get
  - Path: /hosts/{hostId}/metrics, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/nameservices/{nameservice}/metrics, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/metrics, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/metrics, Method: get
operationId: 'readConfig' is used in:
  - Path: /cm/allHosts/config, Method: get
  - Path: /cm/authService/roleConfigGroups/{roleConfigGroupName}/config, Method: get
  - Path: /externalAccounts/account/{name}/config, Method: get
  - Path: /cm/service/roleConfigGroups/{roleConfigGroupName}/config, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups/{roleConfigGroupName}/config, Method: get
operationId: 'updateConfig' is used in:
  - Path: /cm/allHosts/config, Method: put
  - Path: /cm/authService/roleConfigGroups/{roleConfigGroupName}/config, Method: put
  - Path: /cm/config, Method: put
  - Path: /externalAccounts/account/{name}/config, Method: put
  - Path: /cm/service/roleConfigGroups/{roleConfigGroupName}/config, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups/{roleConfigGroupName}/config, Method: put
operationId: 'readAuthRolesMetadata' is used in:
  - Path: /authRoleMetadatas, Method: get
  - Path: /authRoles/metadata, Method: get
operationId: 'readService' is used in:
  - Path: /cm/authService, Method: get
  - Path: /cm/service, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}, Method: get
operationId: 'autoAssignRoles' is used in:
  - Path: /cm/authService/autoAssignRoles, Method: put
  - Path: /clusters/{clusterName}/autoAssignRoles, Method: put
  - Path: /cm/service/autoAssignRoles, Method: put
operationId: 'autoConfigure' is used in:
  - Path: /cm/authService/autoConfigure, Method: put
  - Path: /clusters/{clusterName}/autoConfigure, Method: put
  - Path: /cm/service/autoConfigure, Method: put
operationId: 'listActiveCommands' is used in:
  - Path: /cm/authService/commands, Method: get
  - Path: /cm/authService/roles/{roleName}/commands, Method: get
  - Path: /cm/commands, Method: get
  - Path: /clusters/{clusterName}/commands, Method: get
  - Path: /cm/service/roles/{roleName}/commands, Method: get
  - Path: /cm/service/commands, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/commands, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/commands, Method: get
operationId: 'readServiceConfig' is used in:
  - Path: /cm/authService/config, Method: get
  - Path: /cm/service/config, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/config, Method: get
operationId: 'updateServiceConfig' is used in:
  - Path: /cm/authService/config, Method: put
  - Path: /cm/service/config, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/config, Method: put
operationId: 'listRoleTypes' is used in:
  - Path: /cm/authService/roleTypes, Method: get
  - Path: /cm/service/roleTypes, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roleTypes, Method: get
operationId: 'enterMaintenanceMode' is used in:
  - Path: /cm/authService/commands/enterMaintenanceMode, Method: post
  - Path: /cm/authService/roles/{roleName}/commands/enterMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/commands/enterMaintenanceMode, Method: post
  - Path: /hosts/{hostId}/commands/enterMaintenanceMode, Method: post
  - Path: /cm/service/roles/{roleName}/commands/enterMaintenanceMode, Method: post
  - Path: /cm/service/commands/enterMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/commands/enterMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/enterMaintenanceMode, Method: post
operationId: 'exitMaintenanceMode' is used in:
  - Path: /cm/authService/commands/exitMaintenanceMode, Method: post
  - Path: /cm/authService/roles/{roleName}/commands/exitMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/commands/exitMaintenanceMode, Method: post
  - Path: /hosts/{hostId}/commands/exitMaintenanceMode, Method: post
  - Path: /cm/service/roles/{roleName}/commands/exitMaintenanceMode, Method: post
  - Path: /cm/service/commands/exitMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/commands/exitMaintenanceMode, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/exitMaintenanceMode, Method: post
operationId: 'restartCommand' is used in:
  - Path: /cm/authService/commands/restart, Method: post
  - Path: /cm/authService/roleCommands/restart, Method: post
  - Path: /clusters/{clusterName}/commands/restart, Method: post
  - Path: /cm/service/roleCommands/restart, Method: post
  - Path: /cm/service/commands/restart, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/restart, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/restart, Method: post
operationId: 'startCommand' is used in:
  - Path: /cm/authService/commands/start, Method: post
  - Path: /cm/authService/roleCommands/start, Method: post
  - Path: /clusters/{clusterName}/commands/start, Method: post
  - Path: /cm/service/roleCommands/start, Method: post
  - Path: /cm/service/commands/start, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/start, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/start, Method: post
operationId: 'stopCommand' is used in:
  - Path: /cm/authService/commands/stop, Method: post
  - Path: /cm/authService/roleCommands/stop, Method: post
  - Path: /clusters/{clusterName}/commands/stop, Method: post
  - Path: /cm/service/roleCommands/stop, Method: post
  - Path: /cm/service/commands/stop, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/stop, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/stop, Method: post
operationId: 'readRoleConfigGroups' is used in:
  - Path: /cm/authService/roleConfigGroups, Method: get
  - Path: /cm/service/roleConfigGroups, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups, Method: get
operationId: 'readRoleConfigGroup' is used in:
  - Path: /cm/authService/roleConfigGroups/{roleConfigGroupName}, Method: get
  - Path: /cm/service/roleConfigGroups/{roleConfigGroupName}, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups/{roleConfigGroupName}, Method: get
operationId: 'updateRoleConfigGroup' is used in:
  - Path: /cm/authService/roleConfigGroups/{roleConfigGroupName}, Method: put
  - Path: /cm/service/roleConfigGroups/{roleConfigGroupName}, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups/{roleConfigGroupName}, Method: put
operationId: 'readRoles' is used in:
  - Path: /cm/authService/roleConfigGroups/{roleConfigGroupName}/roles, Method: get
  - Path: /cm/authService/roles, Method: get
  - Path: /cm/service/roleConfigGroups/{roleConfigGroupName}/roles, Method: get
  - Path: /cm/service/roles, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roleConfigGroups/{roleConfigGroupName}/roles, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles, Method: get
operationId: 'createRoles' is used in:
  - Path: /cm/authService/roles, Method: post
  - Path: /cm/service/roles, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roles, Method: post
operationId: 'readRole' is used in:
  - Path: /cm/authService/roles/{roleName}, Method: get
  - Path: /cm/service/roles/{roleName}, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}, Method: get
operationId: 'deleteRole' is used in:
  - Path: /cm/authService/roles/{roleName}, Method: delete
  - Path: /cm/service/roles/{roleName}, Method: delete
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}, Method: delete
operationId: 'readRoleConfig' is used in:
  - Path: /cm/authService/roles/{roleName}/config, Method: get
  - Path: /cm/service/roles/{roleName}/config, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/config, Method: get
operationId: 'updateRoleConfig' is used in:
  - Path: /cm/authService/roles/{roleName}/config, Method: put
  - Path: /cm/service/roles/{roleName}/config, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/config, Method: put
operationId: 'getFullLog' is used in:
  - Path: /cm/authService/roles/{roleName}/logs/full, Method: get
  - Path: /cm/service/roles/{roleName}/logs/full, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/logs/full, Method: get
operationId: 'getStacksLog' is used in:
  - Path: /cm/authService/roles/{roleName}/logs/stacks, Method: get
  - Path: /cm/service/roles/{roleName}/logs/stacks, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/logs/stacks, Method: get
operationId: 'getStacksLogsBundle' is used in:
  - Path: /cm/authService/roles/{roleName}/logs/stacksBundle, Method: get
  - Path: /cm/service/roles/{roleName}/logs/stacksBundle, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/logs/stacksBundle, Method: get
operationId: 'getStandardError' is used in:
  - Path: /cm/authService/roles/{roleName}/logs/stderr, Method: get
  - Path: /commands/{commandId}/logs/stderr, Method: get
  - Path: /cm/service/roles/{roleName}/logs/stderr, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/logs/stderr, Method: get
operationId: 'getStandardOutput' is used in:
  - Path: /cm/authService/roles/{roleName}/logs/stdout, Method: get
  - Path: /commands/{commandId}/logs/stdout, Method: get
  - Path: /cm/service/roles/{roleName}/logs/stdout, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/logs/stdout, Method: get
operationId: 'getKerberosInfo' is used in:
  - Path: /cm/kerberosInfo, Method: get
  - Path: /clusters/{clusterName}/kerberosInfo, Method: get
operationId: 'inspectHostsCommand' is used in:
  - Path: /cm/commands/inspectHosts, Method: post
  - Path: /clusters/{clusterName}/commands/inspectHosts, Method: post
operationId: 'getClientConfig' is used in:
  - Path: /clusters/{clusterName}/clientConfig, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/clientConfig, Method: get
operationId: 'readTags' is used in:
  - Path: /clusters/{clusterName}/tags, Method: get
  - Path: /controlPlanes/{controlPlaneUuid}/tags, Method: get
  - Path: /hosts/{hostname}/tags, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/tags, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/tags, Method: get
operationId: 'addTags' is used in:
  - Path: /clusters/{clusterName}/tags, Method: put
  - Path: /controlPlanes/{controlPlaneUuid}/tags, Method: put
  - Path: /hosts/{hostname}/tags, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/tags, Method: put
  - Path: /clusters/{clusterName}/services/{serviceName}/tags, Method: put
operationId: 'deleteTags' is used in:
  - Path: /clusters/{clusterName}/tags, Method: delete
  - Path: /controlPlanes/{controlPlaneUuid}/tags, Method: delete
  - Path: /hosts/{hostname}/tags, Method: delete
  - Path: /clusters/{clusterName}/services/{serviceName}/roles/{roleName}/tags, Method: delete
  - Path: /clusters/{clusterName}/services/{serviceName}/tags, Method: delete
operationId: 'firstRun' is used in:
  - Path: /clusters/{clusterName}/commands/firstRun, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/firstRun, Method: post
operationId: 'rollingRestart' is used in:
  - Path: /clusters/{clusterName}/commands/rollingRestart, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/rollingRestart, Method: post
operationId: 'jmapDump' is used in:
  - Path: /cm/service/roleCommands/jmapDump, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/jmapDump, Method: post
operationId: 'jmapHisto' is used in:
  - Path: /cm/service/roleCommands/jmapHisto, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/jmapHisto, Method: post
operationId: 'jstack' is used in:
  - Path: /cm/service/roleCommands/jstack, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/jstack, Method: post
operationId: 'lsof' is used in:
  - Path: /cm/service/roleCommands/lsof, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/lsof, Method: post
operationId: 'readHistory' is used in:
  - Path: /clusters/{clusterName}/services/{serviceName}/replications/{scheduleId}/history, Method: get
  - Path: /clusters/{clusterName}/services/{serviceName}/snapshots/policies/{policyName}/history, Method: get
operationId: 'zooKeeperCleanupCommand' is used in:
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/zooKeeperCleanup, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/zooKeeperCleanup, Method: post
operationId: 'zooKeeperInitCommand' is used in:
  - Path: /clusters/{clusterName}/services/{serviceName}/roleCommands/zooKeeperInit, Method: post
  - Path: /clusters/{clusterName}/services/{serviceName}/commands/zooKeeperInit, Method: post
operationId: 'queryTimeSeries' is used in:
  - Path: /timeseries, Method: get
  - Path: /timeseries, Method: post

Filtering those also did not help:
generate:
  - types
  - client
accessModifier: internal
filter:
  operations:
    - getMetrics
    - readConfig
    - updateConfig
    - readAuthRolesMetadata
    - readService
    - autoAssignRoles
    - autoConfigure
    - listActiveCommands
    - readServiceConfig
    - updateServiceConfig
    - listRoleTypes
    - enterMaintenanceMode
    - exitMaintenanceMode
    - restartCommand
    - startCommand
    - stopCommand
    - readRoleConfigGroups
    - readRoleConfigGroup
    - updateRoleConfigGroup
    - readRoles
    - createRoles
    - readRole
    - deleteRole
    - readRoleConfig
    - updateRoleConfig
    - getFullLog
    - getStacksLog
    - getStacksLogsBundle
    - getStandardError
    - getStandardOutput
    - getKerberosInfo
    - inspectHostsCommand
    - getClientConfig
    - readTags
    - addTags
    - deleteTags
    - firstRun
    - rollingRestart
    - jmapDump
    - jmapHisto
    - jstack
    - lsof
    - readHistory
    - zooKeeperCleanupCommand
    - zooKeeperInitCommand
    - queryTimeSeries

Hi @gazsiazasz,
can you clarify your question? The output of your tool shows that there are many duplicated operationIds, which makes the OpenAPI document invalid, so it'll fail when loaded by the generator (as expected).
Every operation (path + method combination) must have a unique operationId string.

From the error message (Error: Failed to satisfy: All Operation Ids in Document are unique at root of document) I first thought that in the root there should not be duplicates, but you say that there should not be duplicates at all on any leaf.
So maybe the error message should be a bit more precise.
Also maybe there should be a list of what it found as a duplicate.
And the question is that I filtered out all the duplicated operational ids with the config yaml, but it still gives the same error message about the duplicates.
So how can I overcome this error?

The whole document is considered invalid due to the duplicate operationIds. We get this functionality from a dependency - OpenAPIKit.
The way to fix it is to change the OpenAPI document to not have duplicate operationIds, I suspect you could modify your script that printed duplicates to append an incrementing number or something.

I did as you said, I wrote a script which is renaming operation ids:
import sys
import yaml
import json
from collections import defaultdict

def load_openapi_file(filepath):
    """Load OpenAPI 3.0 file, support both JSON and YAML formats."""
    filepath = filepath.strip()  # Remove any leading/trailing whitespace
    with open(filepath, 'r') as file:
        if filepath.endswith('.yaml') or filepath.endswith('.yml'):
            return yaml.safe_load(file)
        elif filepath.endswith('.json'):
            return json.load(file)
        else:
            raise ValueError("Unsupported file format. Please use a .yaml, .yml, or .json file.")

def save_openapi_file(filepath, openapi_doc):
    """Save the modified OpenAPI document."""
    with open(filepath, 'w') as file:
        if filepath.endswith('.yaml') or filepath.endswith('.yml'):
            yaml.safe_dump(openapi_doc, file)
        elif filepath.endswith('.json'):
            json.dump(openapi_doc, file, indent=2)
        else:
            raise ValueError("Unsupported file format. Please use a .yaml, .yml, or .json file.")

def append_increment(operation_id, counter):
    """Append an incrementing number to the operationId."""
    return f"{operation_id}_{counter}"

def resolve_duplicate_operation_ids(openapi_doc):
    """Find and rename duplicate operation IDs in the OpenAPI 3.0 document."""
    operation_ids = defaultdict(list)  # Dictionary to track operationId and their locations

    def check_operation_ids_in_node(node, parent_key=''):
        """Recursively find all operationIds and their locations."""
        if isinstance(node, dict):
            for key, value in node.items():
                if key == 'operationId':
                    operation_ids[value].append((node, key, parent_key))  # Store the reference to the node and key
                else:
                    check_operation_ids_in_node(value, key)
        elif isinstance(node, list):
            for item in node:
                check_operation_ids_in_node(item, parent_key)

    # Start the check from the root of the document
    check_operation_ids_in_node(openapi_doc)

    # Resolve duplicates by renaming operationIds with an incrementing counter
    for op_id, locations in operation_ids.items():
        if len(locations) > 1:
            counter = 1
            # Keep the first one as is and rename the rest
            for i in range(1, len(locations)):
                node, key, parent_key = locations[i]
                new_op_id = append_increment(op_id, counter)
                node[key] = new_op_id
                counter += 1
                print(f"Renamed '{op_id}' in {parent_key} to '{new_op_id}'")

    return openapi_doc

if __name__ == "__main__":
    # Check if filename is provided
    if len(sys.argv) < 2:
        print("Error: Please provide the path to the OpenAPI 3.0 document.")
        sys.exit(1)

    filepath = sys.argv[1].strip()

    try:
        # Load the OpenAPI document
        openapi_doc = load_openapi_file(filepath)

        # Resolve duplicate operationIds
        modified_openapi_doc = resolve_duplicate_operation_ids(openapi_doc)

        # Save the modified OpenAPI document (overwrite the original file)
        save_openapi_file(filepath, modified_openapi_doc)

        print("Duplicate operationIds have been resolved and saved.")

    except FileNotFoundError:
        print(f"Error: File '{filepath}' not found. Please check the path and try again.")
    except Exception as e:
        print(f"Error: {e}")

Now the code generation worked fine.


Error in deployment config heketi

invalid value while creating Deployment config Heketi.
[root@master1 deploy]# oc process heketi | oc create -f  -
secret "heketi-db-backup" created
service "heketi" created
route "heketi" created
The DeploymentConfig "heketi" is invalid: spec.template.metadata.labels: Invalid value: {"glusterfs":"heketi-pod"}: selector does not match template labels
[root@master1 deploy]#
This patch (provided by Ashiq) helped:
--- a/deploy/ocp-templates/heketi-template.yaml
+++ b/deploy/ocp-templates/heketi-template.yaml
@@ -56,7 +56,7 @@ objects:
spec:
replicas: 1
selector:
---      name: heketi
+++      glusterfs: heketi-pod

@jarrpa This is caused due the changes with the PR https://github.com/gluster/gluster-kubernetes/pull/191.

@humblec @obnoxxx We need CI soon.....

@MohamedAshiqrh Agreed. I enabled travis on the repo. And see PRs #193 and #194 for a start in the code.

Even with the patch suggested I still get that error: do we need to modify the kube-templates/heketi-deployment.yaml file as well ?

@jarrpa @obnoxxx looks to me that, we need to discard the change introduced in #191  .

@humblec yeah. maybe not discard, but fix. Iirc, @jarrpa had a fix-patch pending. For the time being, does locally reverting this patch (of #191) help?

@mr-falken Can you please remove the changes in #191 in your local setup and try to deploy this project?

@humblec I can confirm that the patch suggested by @SaravanaStorageNetwork works, haven't tried from a "clean" run though: "oc edit template heketi-template" and applying the patch did the job :)
In next few days I'll try to start a brand new openshift cluster with glusterfs dyn provisioning from scratch (without #191) and give you some feedback

@mr-falken, thanks for confirming. This is essentially reverting the patch or PR #191.
As I said, José indented to provide a fix patch anyways since he had already spotted the problem. I don't see a corresponding PR yet, though. So please stay tuned... :-)


Syntax problem @onclick="Navigation.NavigateTo("/counter")"

[EDIT by guardrex to add the metadata. @yogyogi ... Please use the This page feedback form at the bottoms of topics to open issues.]
Issue description
The problem is for the syntax of onclick event for blazor routing and navigation page. The code is from "Handle/prevent location changes" section.
Software versions
Check the .NET target framework(s) being used, and include the version number(s).

[ ] .NET Core
[ ] .NET 7.0

The below code will not work as it's syntax is wrong. Double quotes inside double quotes.
<button @onclick="Navigation.NavigateTo("/counter")">
        Counter (Prevented)
    </button>

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

ID: 35474d24-8039-f04a-de14-1530b8e8506c
Version Independent ID: b6cb2574-6326-a40d-0b6c-d1661328e828
Content: ASP.NET Core Blazor routing and navigation
Content Source: aspnetcore/blazor/fundamentals/routing.md
Product: aspnet-core
Technology: aspnetcore-fundamentals
GitHub Login: @guardrex
Microsoft Alias: riande

Please re-open this issue using the This page feedback button and form at the bottom of the English-US topic. Use of the This page feedback form adds metadata to your GitHub issue that cross-links the topic and automatically pings the author.

Thanks for the report @yogyogi ... I'll fix this right now.


Query history persists across BaseQL instances

I'm assuming there's a LocalStorage namespacing thing or something, but my last query appears to follow me around from one baseql instance to another (we're currently running 3, 2 active).

Seems that graphiql-explorer (see https://github.com/BaseQL/baseql-airtable-block/issues/3#issuecomment-664759013) avoids storing the last query by default, would that help?

It would, but I'm worried that the history is getting polluted cross-instance!


New command: Remove-DbaDbTable

Type of Change

[ ] Bug fix (non-breaking change, fixes # )
[x] New feature (non-breaking change, adds functionality, fixes #8051 )
[ ] Breaking change (effects multiple commands or functionality, fixes # )
[ ] Ran manual Pester test and has passed (.\tests\manual.pester.ps1)
[ ] Adding code coverage to existing functionality
[ ] Pester test is included
[ ] If new file reference added for test, has is been added to github.com/sqlcollaborative/appveyor-lab ?
[ ] Unit test is included
[ ] Documentation
[ ] Build system

This is more or less a copy of Remove-DbaDbView

lol awesome!!! thank you 🙇🏼 🙇🏼 🙇🏼 🙇🏼 🙇🏼

added to book 🥳

Thanks again!


Paper-dialog not positioned correctly for dynamically populated content

If you have a paper-dialog element set to display dynamic content, as illustrated in the code below, it does not display correctly on the screen, not centered. It is off to the side and below somewhere. Sure, it does display correctly if it is NOT dynamically populated.
Now, although it shows up not centered on launch, if you resize the browser window, then the dialog readjusts and positions itself to the correct centered position. I am much too busy right now to re-create a jsbin for this, but this description and the code below should suffice.
  <paper-dialog heading="{content.title}}" class="scrolling" transition="core-transition-center">
     <template repeat="{{ item in content.items }}">
        // code removed for brevity
    </template>
</paper-dialog>

probably not relevant but looks like you're missing a '{' - might want to edit that (then I'll delete this comment), so it's not distracting the reader.
also, shouldn't this be file on paper-dialog? It's not related to polymer itself, is it? https://github.com/Polymer/paper-dialog/issues

I'm having a similar issue and I think it's related to https://github.com/Polymer/paper-dialog/issues/44.

Closing this issue due to age and the release of version 1 of Polymer - please feel free to re-open if this is incorrect.

Does anyone know if this was addressed? I haven't used Polymer in some time now but I'd like to know if it was.

Seems like this issue is still there in 1.0

Yes, it is still seems to be present in 1.0.  I've spent today fighting with it not thinking to look for an issue.

This issue was moved to PolymerElements/paper-dialog#68


Feature/issue13 non excel support

plink

Tested with csv files using colon, comma, semicolon and tabs as separators


Updated the add-on to support CMS 9

Converted it to be an add-on installed from Visual Studio instead of the Add-on UI.

Will this become available on NuGet feed?


.env file to load config data

Description

Type: Enhancement

The databases.md outlines steps to change which db to use but it doesn't mention having to go to the db/[database_folder] to change user/password and database name. I'm also concerned about security with this method if it's a public repo.
Is there a way to make use of a .env file to load specific information like environment data at the moment or could this a potential enhancement that could be considered?

It's up to you whether to use dotenv or not. Currently, heroku manages all process.env for reactGo demo app, so we don't need to use dotenv.


Standalone ivory compiler 'ic'

The 'ic' compiler uses hint in the common way to produce an AST leaving
the actual compilation to be done by the (non-interpreted) machine code.
I've used this strategy previously, along with cabal exec to use sandboxed libraries, in Ninjas and ShareMonad with reasonable success.  Not sure if it is fitting for the Ivory setting, discussion is welcome.

This is really cool. What is the correct way to invoke ic?
From a cabal sandbox created in ivory-backend-c with the usual make create-sandbox command:
[pat@young-flyer:ivory/ivory-backend-c]% cabal run ic -- -o example/ example/fib.hs
Preprocessing library ivory-backend-c-<IP_ADDRESS>...
In-place registering ivory-backend-c-<IP_ADDRESS>...
Preprocessing executable 'ic' for ivory-backend-c-<IP_ADDRESS>...
Running ic...
ic: example/fib.hs:5:8:
    Could not find module ‘Ivory.Language’
    Use -v to see a list of the files searched for.

example/fib.hs:6:8:
    Could not find module ‘Ivory.Artifact’
    Use -v to see a list of the files searched for.

example/fib.hs:7:18:
    Could not find module ‘Ivory.Compile.C.CmdlineFrontend’
    Use -v to see a list of the files searched for.

also, we should use the existing option parser, but thats easy enough to fix.

oops, pardon my ignorance, I didn't understand that cabal exec was different than cabal run.
so, after commenting out the unnecessary import of compile in example/fib.hs, I get the following:
[pat@young-flyer:ivory/ivory-backend-c]% cabal exec cabal run ic -- -- -o example example/fib.hs
Preprocessing library ivory-backend-c-<IP_ADDRESS>...
In-place registering ivory-backend-c-<IP_ADDRESS>...
Preprocessing executable 'ic' for ivory-backend-c-<IP_ADDRESS>...
Running ic...
ic: <no location info>:
    Could not find module ‘Ivory.Compile.C.CmdlineFrontend’
    Use -v to see a list of the files searched for.

same error if you leave the import in, except it will have location for the import of that same module.

So the idea is:
cd ivory
make
cabal exec ic -- ivory-backend-c/example/fib.hs

Will dump to stdout.  If you pull down my typo-fixing patch (2 minutes from
now) you can also do:
cabal exec ic -- -o /tmp/fib_module ./ivory-backend-c/example/fib.hs
ls /tmp/fib_module
fib_tutorial.c  fib_tutorial.h  ivory_asserts.h  ivory.h  ivory_templates.h

On Sun, Mar 22, 2015 at 1:46 PM, Pat Hickey<EMAIL_ADDRESS>wrote:

oops, pardon my ignorance, I didn't understand that cabal exec was
different than cabal run.
so, after commenting out the unnecessary import of compile in
example/fib.hs, I get the following:
[pat@young-flyer:ivory/ivory-backend-c]% cabal exec cabal run ic -- -- -o example example/fib.hs
Preprocessing library ivory-backend-c-<IP_ADDRESS>...
In-place registering ivory-backend-c-<IP_ADDRESS>...
Preprocessing executable 'ic' for ivory-backend-c-<IP_ADDRESS>...
Running ic...
ic: :
Could not find module ‘Ivory.Compile.C.CmdlineFrontend’
Use -v to see a list of the files searched for.
same error if you leave the import in, except it will have location for
the import of that same module.
—
Reply to this email directly or view it on GitHub
https://github.com/GaloisInc/ivory/pull/38#issuecomment-84701225.

Cool, this works for me. We can merge this as soon as it supports the existing option parsing - I can do that tomorrow morning.
It looks like everything used by ic must be cabal installed, not just cabal builded. That is a bit different than the sandbox build process convention we use elsewhere in the project, but lets not worry about that for the moment.
This is a great addition. Thanks for working on it.

Seems to me the world keeps turning without this, so I'll close to avoid that crufty feeling repo's can get.


Add code files src and dist folders

Hi Dear Reviewers, Welcome to my pull request for TodoList(interactive lists)
Added a new JavaScript file and import it as a module:
Add event listener to the checkbox (change).
Updated items object's value for completed key upon user actions.
Implemented a function for the "Clear all completed" button.
Stored the updated array of items in local storage, so the user gets the correct list of values after the page reloads).
Previous pull request

Unnecessary piece of code removed from index.html
Unused code removed from print.js


Fix version decoding for pg >= 10

Fix version decoding for version >= 10 as reported in issue 199
Fix a bug with devel version < 10
Fix tests

Sure, It completely slipped my mind but we already use it here.
Will look into it ASAP.


Release 2.1.82

On the docket:

[ ] Support local requirements with lockfiles #1696

Maybe:

[ ] Decouple PEX runtime interpreter selection from buildtime interpreter selection. #1020

Unlikely / backlog:

[ ] PEX_INHERIT_PATH+default shebangs don't interact well with virtualenvs #1344
[ ] Pex interpreter cache is not upgrade / downgrade safe. #1176
[ ] Provide a better resolve error message for a Platform DistributionTarget when --resolve-local-platforms. #1070
[ ] Remove PEX_PYTHON_PATH from build time interpreter selection. #1075

Split off from "Release 2.1.81 #1724" to make way for a fix for pointy-case distributions referenced with kebab-cased requirements in distribution metadata (#1726).


Better text handling in the interactive mode (adequate hyphenation and text alignment)

The end does not justify the means:

For a console application, this is not very noticeable.
For implementation, it is necessary to track the dimensions of the console and give the correct output depending on the received parameters and the response of OpenAI. IMO, this would be unnecessarily labor intensive.


Doc suggests install as a devDependency?

Is the following doc correct?
I assume the full lib should be installed (not -D)?
Thx.

Getting started
Please follow Cloudflare's Get started guide to install wrangler.
Initialize Project
wrangler init
Use of TypeScript is strongly encouraged :)
npm i -D @tsndr/cloudflare-worker-router

I think you're right. I'm gonna change it :)


Error message in Exception when Open fails

Is this really your best effort:  "Unable to load the specified metadata resource" is all I get for an error message when Entity Client can't get data?  No InnerException, no details I can troubleshoot with.

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

ID: 51ceb0f6-dc32-0f86-69d2-8a2d70052c3e
Version Independent ID: 4cab79b3-b240-e95c-835a-8b76b9979d42
Content: How to: Build an EntityConnection Connection String
Content Source: docs/framework/data/adonet/ef/how-to-build-an-entityconnection-connection-string.md
Product: dotnet-framework
GitHub Login: @douglaslMS
Microsoft Alias: douglasl

@ChuckGoehring It sounds like you may have intended to give Product Feedback (with the other link at the bottom of the article) and not documentation feedback. If that's not the case, how are you suggesting that we improve this article about building an EntityConnection connection string?

@ChuckGoehring How are you suggesting that we improve this article about building an EntityConnection connection string?

#please-close

Yeah.  Docs are not the problem.

@ChuckGoehring Don't hesitate to give Product Feedback (with the other link at the bottom of the article). We're all frustrated by unhelpful error messages!


[DEV] Store Persistant Credentials in Local Storage

Development Task 🔧
This project looks pretty interesting, may be a nice thing to try out: https://www.npmjs.com/package/local-storage
Objectives

Extract user name, and applicable personal detail to store in the local storage
Verify that this persists when the authentication token is still valid
Verify that this is cleared when the authentication token is no longer valid

This might be wrong


yt.title is printing result as YouTube

dont know why yt.title is giving output as YouTube everytime for me any help plz

See #632

try this if that doesn't work out.
put this on main.py line 114 - 117
    # Fix for KeyError: 'title' issue #434
    if "title" not in self.player_config_args:  # type: ignore
        title = json.loads(self.player_config_args['player_response'])['videoDetails']['title']
        self.player_config_args["title"] = unescape(title)

This fixed it for me

`
video = YouTube(url)
title = video.player_response['videoDetails']['title']
`
worked for me.

thanks a lot sir @gorkemt it helped me

i've just improvised something like that:
(in __main__.py)
    def descramble(self) -> None:
        """Descramble the stream data and build Stream instances.

        The initialization process takes advantage of Python's
        "call-by-reference evaluation," which allows dictionary transforms to
        be applied in-place, instead of holding references to mutations at each
        interstitial step.

        :rtype: None

        """
        logger.info("init started")

        self.vid_info = dict(parse_qsl(self.vid_info_raw))
        if self.age_restricted:
            self.player_config_args = self.vid_info
        else:
            assert self.watch_html is not None
            self.player_config_args = get_ytplayer_config(self.watch_html)["args"]

        # https://github.com/nficano/pytube/issues/165
        stream_maps = ["url_encoded_fmt_stream_map"]
        if "adaptive_fmts" in self.player_config_args:
            stream_maps.append("adaptive_fmts")

        # unscramble the progressive and adaptive stream manifests.
        for fmt in stream_maps:
            if not self.age_restricted and fmt in self.vid_info:
                apply_descrambler(self.vid_info, fmt)
            apply_descrambler(self.player_config_args, fmt)

            if not self.js:
                if not self.embed_html:
                    self.embed_html = request.get(url=self.embed_url)
                self.js_url = extract.js_url(self.embed_html)
                self.js = request.get(self.js_url)

            apply_signature(self.player_config_args, fmt, self.js)

            # build instances of :class:`Stream <Stream>`
            self.initialize_stream_objects(fmt)

        # load the player_response object (contains subtitle information)
        self.player_response = json.loads(self.player_config_args["player_response"])
        del self.player_config_args["player_response"]
        self.player_config_args["title"] = unescape(self.player_response['videoDetails']['title'])
        self.stream_monostate.title = self.title
        self.stream_monostate.duration = self.length

        logger.info("init finished successfully")

self.player_config_args["title"] = unescape(self.player_response['videoDetails']['title'])

video = YouTube(url)
title = video.player_response['videoDetails']['title']
worked for me.

Great one, thanks! It works perfectly for me as well.

try this if that doesn't work out.
put this on __main__.py line 114 - 117
    # Fix for KeyError: 'title' issue #434
    if "title" not in self.player_config_args:  # type: ignore
        title = json.loads(self.player_config_args['player_response'])['videoDetails']['title']
        self.player_config_args["title"] = unescape(title)

This fixed it for me

Can confirm this works better (for me anyway) than the solution in #632


Add allocation monitoring to long runs

This PR adds the allocation monitoring to the long runs, so that we have persistent monitoring

bors r+


add multiple support

multiple handlers
I need multiple handlers for different repos and I hope those handlers have different secret for each repo. And those handlers only take one port.
So I make options.secret to support both string and object. If options.secret is an object, the key of the object will be appId, and the value of the object will be appSecret. At last, the EmitData will return the appId for use.

Here's the example for multiple handlers:
// handler settings
var handler = createHandler({
  path: '/app',
  secret: {
    app1: 'secret1',
    app2: 'secret2'
  }
})
// server
http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(7777)
// events
handler.on('push', function (event) {
  var appId = event.appId
  switch (appId) {
    case 'app1':
      // do sth about app1
      break
    case 'app2':
      // do sth about app2
      break
    default:
      break
  }
})

And in github Webhooks Payload URL:
app1
http://example.com/app?id=app1

app2
http://example.com/app?id=app2

If options.secret is a string, everything remains the same.

Thanks, @excaliburhan! This PR covers a fairly specific scenario as written, but I wonder if we could expand it to accommodate the scenarios in #16 ("add additional fields to emitData") and #21 ("enable multiple handlers").
If we allowed consumers to provide their own validation/parsing logic--or even separated webhook processing from the HTTP server itself--we could preserve the existing (simple) default but open the door for more customization downstream.
Thoughts?

OK, I realize this PR is actually 'One handler deals with multiple webhooks'.
Solution A: expand
Support multiple path && secret to enable real multiple handlers, like this:
var createHandler = require('github-webhook-handler')
var handler = createHandler([
{ path: '/app1', secret: 'secret1' },
{ path: '/app2', secret: 'secret2' }
])

this solution means we have to rewrite the handler function in github-webhook-handler.js

Solution B: process over the HTTP server
var handlerA = createHandler({ path: '/app1', secret: 'secret1' })
var handlerB = createHandler({ path: '/app2', secret: 'secret2' })

http.createServer(function (req, res) {
  // process logic
  switch (req.url) {
    case '/app1':
      handlerA(req, res, function (err) {
        res.statusCode = 404
        res.end('no such location')
      })
      break
    case '/app2':
      handlerB(req, res, function (err) {
        res.statusCode = 404
        res.end('no such location')
      })
      break
    default:
      break
  }
}).listen(7777)

// events
handlerA.on('issues', function(event) {
    // do sth
})
handlerB.on('issues', function(event) {
    // do sth
})

this solution contains consumers' own process logic.

I prefer the Solution A, it may make the github-webhook-handler.js a little complicated, but for consumers, it's more convenient.
For Solution B, what makes me unhappy is I have to write many nearly same code to keep different handlers work.
I'd like to help with Solution A.
@rjz what you think about this?

It seems like we could write A in terms of B, something like:
function multiHook(handlerOpts) { // it's a silly name :^)
  var handlers = handlerOpts.reduce(function (hs, opts) {
    hs[opts.path] = createHandler(opts);
    return hs;
  }, {});

  return http.createServer(function (req, res) {
    var handler = handlers[req.url];
    handler(req, res, function (err) {
      res.statusCode = 404
      res.end('no such location')
    });
  });
}

If that's reasonable, maybe it's appropriate to leave this handler focused on a single hook but either:

add an example for the multi-app case here
create a new package (ala github-webhook) tailored to the multi-app case

Cool.
I think we could close this PR now:)

One more thing, in github webhooks settings, the content-type must be application/json rather than application/x-www-form-urlencoded.
I think this tip should be written in the READEME.md.
Just a suggestion.

Done, and big thanks for your suggestions on this, @excaliburhan!

README.md: great point, will add (or be happy to merge a PR)
Also, if you're up to add an example to this repo or to link up an external package, it would be awesome to have a reference for other folks with this issue

ok, here's the multi handlers complete example(have tested on my server), and an external package node-github-webhook.
example for github-webhook-handler
function generaterHandler(handlerOpts) {
  var handlers = handlerOpts.reduce(function(hs, opts) {
    hs[opts.path] = createHandler(opts)
    return hs
  }, {})

  return http.createServer(function(req, res) {
    var handler = handlers[req.url]
    handler(req, res, function(err) {
      res.statusCode = 404
      res.end('no such location')
    })
  }).listen(7777)
}

var http = require('http')
var createHandler = require('github-webhook-handler')
var handlerOpts = [{
  path: '/app1',
  secret: 'secret1'
}, {
  path: '/app2',
  secret: 'secret2'
}]
var handler = generaterHandler(handlerOpts)

handler.on('error', function(err) {
  console.error('Error:', err.message)
})
handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref)
})

example for node-github-webhook
var http = require('http')
var createHandler = require('node-github-webhook')
var handler = createHandler([{
    path: '/app1',
    secret: 'secret1'
  },
  {
    path: '/app2',
    secret: 'secret2'
  }
])

http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(7777)

// handler
handler.on('error', function (err) {
  console.error('Error:', err.message)
})
handler.on('push', function (event) {
  var path = event.path
  switch (path) {
    case '/app1':
      // do sth for app1
      break
    case '/app2':
      // do sth for app2
      break
    default:
      break
  }
})


NVMe device not found error in secure erase after unvme-setup reset command

I have an SSD of type MTFDHAL800MCE from Micron technology. My system is based on Mint18 installed on an HDD not the SSD. I connect to this system remotely using putty. Micron has provided a Storage Executive CLI as a tool to run specific commands on the SSDs. The links for the msecli user guide and the datasheet for my SSD is available here: msecli-userguide and SSD-datasheet.
I used the command  unvme-setup reset to change access to the SSD to the kernel space. It successfully changed from UNVMe-enabled to /dev/nvme0. I, also, checked it with msecli -L which displayed all devices in my system.
However, after an hour it failed with the error message the device not found and the NVMe SSD was no more detected by fdisk, sfdisk, or gparted. I rebooted the system by sudo shutdown -r now, but nothing changed. Why the SSD is no more recognized and how can I fix this?

UNVMe is a userspace driver.  Msecli is an application talking to the kernel space driver.  The two are unrelated.  You're posting to the wrong place.


QR scan area shows as black square

Xiaomi Mi A2 running Android 10 and the Camera app v. 63.
The active scanning area shows up as an opaque black box:

Scanning itself works fine. Haven't experienced this in any other apps with similar designs (e.g. Firefox for Android's QR scanner appears as intended).

Hello,
I came across this issue labeled as  in your repository, and I'm very interested in contributing to it as part of a school project.
I believe working on this issue will not only help me gain practical experience in, but also contribute positively to your project. I've reviewed the contribution guidelines for your repository and am ready to adhere to them.
Could you please let me know if it's possible for me to work on this issue? If there are any specific requirements or starting points you'd like me to know, I'd be glad to hear them.
Thank you for considering my request. I'm looking forward to the opportunity to contribute to your project.
Best regards,
Neethu Duggi

It looks like a bug with the device and it's not clear what can be done about that.

Hi @nonremittal,
Are you currently active to help us out with resolving this issue?

Hi @nonremittal,
Are you currently active and willing to help us out with testing a solution for this issue?
Thanks a lot for reporting this issue and trying out our app!


Allow partner_account to be specified for aggregates

Allow aggregations by partner_account to support reporting on the receiving account of transfers
For cases where you transfer from the same account using the same transfer code into different partner accounts, but want to report on the specific account/partner_account transfers.
Also introduced some keyword arguments to the aggregate API - these shouldn't affect existing calls as they just replace the options hash but do prevent the use of the double_entry gem with ruby < 2.0 (see https://github.com/envato/double_entry/pull/107 for removing ruby 1.9.3 support).  Note the build should go green once we've merged in #107, as the only tests failing are in the ruby 1.9.3 run.
Paired with @salamagd

Nice work! :+1:

+1 nice

:stevo_boom:


fix: set NOT_FALSY to ..._not_falsy.

Before they were set to _is_falsy. Now they're correctly set to _not_falsy.

Careful about #15, it's what derailed me trying to break my fork into committable PRs back to main, (though I'm hoping to have some time soon)


Fix localstack integeration in CI

Our tests currently work fine locally but fail on the CI because local stack throws the following warning
WARN --- [  MainThread] l.utils.docker_utils       : Unexpected error when attempting to determine container port status: ('Docker process returned with errorcode 125', b'', b'docker: Error response from daemon: driver failed programming external connectivity on endpoint zealous_ride (d8e1c3a80de72fee30875b420eb9259da868275eb418c6c4b39d9b7c1b164712): Error starting userland proxy: listen tcp4 <IP_ADDRESS>:53: bind: address already in use.\ntime="2023-10-04T10:45:53Z" level=error msg="error waiting for container: "\n')

Because of this, the test cases fail to interact with Localstack and through this error
Result of inserting to s3 Err(FailedToUploadToS3(DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: ProviderError(ProviderError { source: FailedToLoadToken(FailedToLoadToken { source: ServiceError(ServiceError { source: TokenError { kind: InvalidToken }, raw: Response { inner: Response { status: 411, version: HTTP/1.1, headers: {"content-type": "text/html; charset=us-ascii", "server": "Microsoft-HTTPAPI/2.0", "date": "Wed, 04 Oct 2023 10:49:48 GMT", "connection": "close", "content-length": "344"}, body: SdkBody { inner: Once(Some(b"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"[http://www.w3.org/TR/html4/strict.dtd\](http://www.w3.org/TR/html4/strict.dtd/)">\r\n<TITLE>Length Required</TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=us-ascii\">\r\n
Length Required
\r\n

HTTP Error 411. The request must be chunked or have a content length.
\r\n\r\n")), retryable: true } }, properties: SharedPropertyBag(Mutex { data: PropertyBag { contents: ["aws_smithy_http::connection::CaptureSmithyConnection", "aws_smithy_http::operation::Metadata", "aws_http::user_agent::AwsUserAgent"] }, poisoned: false, .. }) } }) }) }), connection: Unknown } })))

Current investigations

The error is mostly because of linking between the test cases and localstack as we tried running the tests without setting up localstack and got the same error
Interacting with localstack using awslocal works fine on the CI as we are able to create queues and buckets
There seems to be some issue in setting up localstack on Ubuntu in general - https://github.com/localstack/localstack/issues/6501. We tried doing it on macOs but it kept failing because Docker was not found (even though we were installing it in the steps).
We tried the solution of setting DNS_ADDRESS=0 but got the error Invalid ip address in Localstack.

Here are some links
https://github.com/docker/for-win/issues/10601
https://github.com/sameersbn/docker-bind/issues/65
It's possible some of the solutions above would have worked but we couldn't try all the permutations because of lack of time.

Using a self hosted runner so this is fixed


add issue_template.md

I can take this up. if its still avaialble.
Do you have any template defined?

Hey @arshadkazmi42 , thanks for offering , feel free to work on it.

Sorry its already done in https://github.com/web-ext-labs/ui-tool/commit/31d42804792f9025a0a923c6ab02803731be0a48. Closing it.


Two hello-world images have the same image ID and same tag, but different digests

When I docker pull hello-world, I got the image with a digest of f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Image is up to date for hello-world:latest
docker.io/library/hello-world:latest

I was using a Mac, but when I docker inspect hello-world:latest, I saw the os/arch is linux/amd64
    ...
    "Architecture": "amd64",
    "Os": "linux",
    ...

So I went to https://hub.docker.com/_/hello-world/?tab=tags and found strangely enough, the latest hello-world for linux/amd64 has a digest of 92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
So I pulled down this image as well
$ docker pull hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a: Pulling from library/hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
docker.io/library/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a

Surprisingly, I ended up with two images with the same tag, same image ID, but different digests.
$ docker image ls --digests
REPOSITORY                    TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
hello-world                   latest              sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a   fce289e99eb9        15 months ago       1.84kB
hello-world                   latest              sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e   fce289e99eb9        15 months ago       1.84kB

Are these two images the same one? How can I uniquely address an image if I want consistency across my team?

Looking at our repo-info repository (maintains an archive of image digests), there is a unique digest for each tag, but the underlying image is the same
https://github.com/docker-library/repo-info/blob/master/repos/hello-world/remote/latest.md
hello-world:latest is f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
hello-world:latest - linux; amd64 is 92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
latest is different from amd64's latest because it's a shared tag that will auto-redirect to the correct architecture on pull https://github.com/docker-library/faq#whats-the-difference-between-shared-and-simple-tags
https://github.com/docker-library/faq/issues/10

IMO this is more clear when you look at the objects through the registry API directly -- when I query the hello-world:latest tag, I get an object with digest of sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e and the following JSON payload (where you can see sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a as the digest for the amd64 image, as @wglambert mentioned/linked):
{
  "manifests": [
    {
      "digest": "sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      },
      "size": 524
    },
    {
      "digest": "sha256:e5785cb0c62cebbed4965129bae371f0589cadd6d84798fb58c2c5f9e237efd9",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v5"
      },
      "size": 525
    },
    {
      "digest": "sha256:50b8560ad574c779908da71f7ce370c0a2471c098d44d1c8f6b513c5a55eeeb1",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v7"
      },
      "size": 525
    },
    {
      "digest": "sha256:963612c5503f3f1674f315c67089dee577d8cc6afc18565e0b4183ae355fb343",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "arm64",
        "os": "linux",
        "variant": "v8"
      },
      "size": 525
    },
    {
      "digest": "sha256:85dc5fbe16214366748ebe9d7cc73bc42d61d19d61fe05f01e317d278c2287ed",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "386",
        "os": "linux"
      },
      "size": 527
    },
    {
      "digest": "sha256:8aaea2a718a29334caeaf225716284ce29dc17418edba98dbe6dafea5afcda16",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "ppc64le",
        "os": "linux"
      },
      "size": 525
    },
    {
      "digest": "sha256:577ad4331d4fac91807308da99ecc107dcc6b2254bc4c7166325fd01113bea2a",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "s390x",
        "os": "linux"
      },
      "size": 525
    },
    {
      "digest": "sha256:468a2702c410d84e275ed28dd0f46353d57d5a17f177aa7c27c2921e9ef9cd0e",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "amd64",
        "os": "windows",
        "os.version": "10.0.17763.1098"
      },
      "size": 1124
    }
  ],
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "schemaVersion": 2
}

Thanks for the clarification.


Enable Alternating Chat Messages Instead of Single Compressed User Message

Description:
Currently, the implementation for conversational RAG compresses all past chat messages into a single user message when using the OpenAIChatGenerator or similar components. I think this approach differs from common chat generator functionalities, where models generally benefit from receiving alternating messages from the user and assistant as separate entries. Providing this structure might help maintain conversational context more effectively.
Feature Request:
Allow the entire list of past chat messages to be provided to the LLM, rather than compressing them into a single user message. This ensures that each user query and assistant response is treated as separate ChatMessage objects, improving the context preservation and enabling the model to follow the conversational flow more naturally.
Correct me if I'm wrong with some of these assumptions or if this is already possible.

@vblagoje feel free to correct me if I'm wrong or if this is already possible out of the box.


pip install failed, can it work in py3?

pip install failed, can it work in  #py3.5?

Collecting PyBaiduyuyin
Using cached PyBaiduYuyin-0.1.1.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\Cheer.L\AppData\Local\Temp\pip-build-ik3qss4a\PyBaiduyuyin\setup.py", line 11, in
import PyBaiduYuyin
File "c:\users\cheer.l\appdata\local\temp\pip-build-ik3qss4a\pybaiduyuyin\PyBaiduYuyin_init_.py", line 492
print 'You said ' + text
^
SyntaxError: Missing parentheses in call to 'print'

https://github.com/DelightRun/PyBaiduYuyin/blob/master/PyBaiduYuyin/init.py#L492
i've found that, in PyBaiduYuyin.init.py line492

while True:
print("Say something!")
with m as source:
audio = r.listen(source)
print("Got it! Now to recognize it...")
try:
text = r.recognize(audio)
print 'You said ' + text
except LookupError:
print("Oops! Didn't catch that")

this print is differnt from others, which is py2 style.

thanks,CheerL .I changed the print to print();and then it works.


Implement ListView template

There is currently no way to specify item templates inside ListViews

My idea for the solution is to have a  component, with a slot. Have yet to explore the details on how to tackle this, but seems like the most reasonable way to go about it!
Other concern is multiple item templates, which I don't know how will work yet.
If you have any ideas or suggestions, please write them down here! Even if it's just brainstorming, really helps with coming up with solutions.

The angular renderer implements it with a detached container element for item templates:
https://github.com/NativeScript/nativescript-angular/blob/master/nativescript-angular/directives/list-view-comp.ts

If I wanted to set the itemTemplate on the ListView, what gets passed? According to the docs, it can either be a string or a Template. Is a detached container considered a template (Detached Container is a ProxyViewContainer?
(Mostly leaving these links here so it's easier to find!)

Yes, Detached Container is a ProxyViewContainer
https://github.com/NativeScript/nativescript-angular/blob/fa089aa67f82c66dd2c37f25b5aca6deed5244e3/nativescript-angular/element-registry.ts#L111

When you pass a String or a Template to itemTemplate, it gets passed to the builder.parse function for it to return a View.
https://github.com/NativeScript/NativeScript/blob/master/tns-core-modules/ui/builder/builder.ts#L27

So it expects xml in that case? I think we should pass it a template instead of generating xml that will get parsed again.

On the vue side, after a quick read through docs, I think we need to use (scoped slots)[https://vuejs.org/v2/guide/components.html#Scoped-Slots]


Object specification

Need to update the specification of the JSON objects.
What should be inside?

Each subobject might need different data, as it solves different tasks. There should be an outline stored locally assigning clear names and task specifications to each object. For example "A". Should there be error messages or not? Ist the info just for the person rewriting the version number or is it part of the code and used by the programm?
We can expand it, but we shouldn't delete necessary parts as otherwise the scripts might get corrupted...


Adds Documentation and Help menu items.

Fixes #199

Good job so far. Everything's neat and your naming is great. Very readable. Haven't tried it yet on my machine, but it seems to work fine in the usual case. :+1:
A few things to work on:

[ ] Address the concerns in my comments.
[ ] Update this branch with the latest CIRDLES:master (another reason to keep separate feature branches).
[ ] Move the logic you've introduced into a new class. In the future, this might be moved to Commons as ET_Redux has similar code.
[ ] Make the commit title human readable and put "Fixes #199" in the commit message body. Look at some of my past bug fixes to get a better idea of this.

I'm going to accept this pull request without tests, but we'll sit down together sometime this week or next so that I can teach you how all that would go.


ARROW-386: [Java] Respect case of struct / map field names

Changes include:

Remove all toLowerCase() calls on field names in MapWriters.java template file, so that the writers can respect case of the field names.
Use lower-case keys for internalMap in UnionVector instead of camel-case (e.g. bigInt -> bigint). p.s. I don't know what is the original purpose of using camel case here. It did not conflict because all field names are converted to lower cases in the past.
Add a simple test case of MapWriter with mixed-case field names.

I expect this will also show up if added to the integration tests. @julienledem @jacques-n I'm not sure the timeline for using the Arrow jars in Drill, but I presume case-sensitivity is something you'd be able to handle without too much trouble on the application side?

I think we need to support both behaviors. We have a bunch of code that supports case insensitivity that is built on this code. -1 until we come up with a better solution. Maybe @julienledem will have some ideas but he is out this week

@jacques-n this is blocking use of Arrow on some internal use cases where we have case sensitive field names. We are also working on Arrow Java<->C++ in Spark -- I'm not sure if Spark SQL metadata is case sensitive or not.

I'm not worried about the internal name change (bigInt > bigint).
The key is the change to mapwriters. Can you add an option in MapWriters when you construct one to whether they are case sensitive or not? Keep the default behavior as it was but allow a fully case preserving/sensitive alternative?

@jacques-n , without the name change of bigInt -> bigint, the test case of promotableWriter inside TestComplexWriter.java would fail. The problematic code block is the following:
public NullableBigIntVector getBigIntVector() {
    if (bigIntVector == null) {
      int vectorCount = internalMap.size();
      bigIntVector = internalMap.addOrGet("bigInt", MinorType.BIGINT, NullableBigIntVector.class);
      if (internalMap.size() > vectorCount) {
        bigIntVector.allocateNew();
        if (callBack != null) {
          callBack.doWork();
        }
      }
    }
    return bigIntVector;
  }

After BigIntWriter got promoted into UnionWriter, the internalMap of UnionVector already has an entry of "bigint". Somehow, an additional entry named "bigInt" is created. The subsequent operations are then messed up.

For the default behavior, is that the best solution? Probably it is only me, but I never expect a data writer would silently lowering-case of field names provided by users. Of course, if there are there are already products based on the case insensitivity, it make sense to keep it as default.

@wesm title changed, is this good?

@alphalfalfa: I was saying that the bigint change seems correct.
For defaults: we've built a bunch of code on top of this already so changing the default would be quite challenging.

@jacques-n I've added the option and set default to be case-insensitive

thanks for the update @alphalfalfa.
this looks good to me.
@jacques-n ?

LGTM also

The modifications don't address my concerns. Specifically, we want to avoid evaluating the boolean in map() every single time it is called. A common pattern when parsing json strings is calling this repeatedly. Let's just have two version of the implementation. In most cases, only one would get loaded so specialization could occur.

thanks for clarifying @jacques-n.
@alphalfalfa could make the following changes to resolve this?

make handleCase(final String input) protected and just return input.toLowerCase() in MapWriters
create a subclass of NullableMapWriter called CaseInsensitiveNullableMapWriter that overrides handleCase
modify ComplexWriterImpl to implement the correct NullableMapWriter in rotAsMap()/INIT (@jacques-n: please confirm but if should be fine to add an if in rootAsMap())
Then we should be good to go

@alphalfalfa Do you need support for nested maps? It does not look like you current PR passes down the caseSensitive attribute to nested maps.

If condition in rootAsMap seems fine.
Agreed that the whole tree should probably be case sensitive or not (not just a part of it).

sure, I can make the change.
@julienledem I probably don't need support for nested maps. Do you think I should pass down the attribute? If so, can you point me to the right portion of code?

@alphalfalfa I think for correctness it is better to pass down the caseSensitivity attribute to nested maps. That means passing down that attribute to ComplexWriters returned by your writer:

in ComplexWriterImpl, pass the attribute to the writer returned by rootAsList()
in MapWriters, pass the attribute to the writers returned by list() and map()
Possibly you can create a NullableMapWriterFactory to pass down to the writers which will be called to create new NullableMapWriter instances.

PR updated. Hope I cover all the possible cases.

@jacques-n @wesm more comments?

LGTM +1

Thank you all and thanks @alphalfalfa for the careful revisions

thanks @alphalfalfa ! We appreciate your contribution.


Fixes #5725

Impact

[x] Bug fix (non-breaking change which fixes expected existing functionality)
[ ] Enhancement/New feature (adds functionality without impacting existing logic)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Description
Fixed the dead links in the README file.
Fixes #5725

Things to be aware of

Things to worry about

Additional Context

Hi @bartipan,
Thank you for taking the time to create this PR, sadly we missed it and already addressed the changes you reported in the related created issue. So, I'll close this PR.
Thanks again,
Daniel.


Autoheight calculates highest visible item

Autoheight now works with more than a single visible item.

Fixed in #578


Add event addSilentRenewSuccess when signinSilent is called and successful.

Hi!
The UserManager events include the event addSilentRenewError. Can an event addSilentRenewSuccess also be added, to get a callback if signinSilent function is executed successfully from SilentRenewService?
Maybe here: SilentRenewService.ts#L51

There already exists such an event. See addUserLoaded (Raised when a user session has been established (or re-established).)

Thx!


missing --copy-audio all

Hi Don. Great work on this new tool. I'm missing the --copy-audio all functionality (and also --add-subtitle all). Are these features planned or are you thinning out the parameters to keep the tool as close to your optimal workflow? The reason these parameters are important to me is that I already rip the movies from Blu-ray only containing the audio tracks & subtitles I want to keep (in original format). Otherwise I have to switch my ripping strategy. :-)

@whppr Thank you and thanks for using my tools!
I'm a bit unsure exactly you mean by this feature request. And because you didn't ask for --add-audio all, I'm assuming that you want to always copy tracks in their original format. If that's the case, then I have no such plans and don't wish to add a feature like that. That's not transcoding, that's remuxing.
Copying original, large lossless audio tracks really misses the whole point of compression, i.e. making things smaller.
Not only that, lossless audio formats are generally not very portable. Even new, advanced TV streaming devices from Apple, Amazon, Google and Roku have difficulties with DTS-HD and TrueHD audio, sometimes not even allowing pass through to more capable audio receivers. It's a mess.
My goal has always been transcoding "into a smaller, more portable format." I believe it was a mistake to add a --copy-audio feature to my transcode-video tool years ago and I don't want to repeat that mistake with other-transcode.
But if you really meant --add-audio all, then I don't want to add that feature either. Here's what I wrote earlier in issue https://github.com/donmelton/other_video_transcoding/issues/3:

Currently there is no way to add either all audio tracks or all subtitle tracks from an input source with a single option and argument. My older transcode-video tool has this feature but I intentionally left it out of other-transcode in the hope that users would add tracks by by language or title instead because this would 1) make those users more thoughtful and 2) yield smaller output.

Again, adding everything from an original Blu-ray Disc or DVD rip misses the whole point of compression. And I want to discourage people from thinking other-transcode is a backup tool.
Seriously, if you need all those tracks or need them all in their original format, then you shouldn't be transcoding. You should be figuring out a way to play your original rips. And if that's the case, then I recommend using Plex to serve up your media.
I've leave this open for now so that others can also comment.

@donmelton Thanks for your extensive answer. Let me explain my use case: I've ripped all my (350+) Blu-rays with original video and only kept the core AC3 or DTS track (so no lossless tracks), which are stored on external offline storeage. Mostly it's only one track, but for some movies (especially animation) I have both English and Dutch tracks. I use your tools to make them NAS/streaming friendly.
I prefer to keep these core tracks as they are mostly 640kbit or 1500kbit, which is still small enough for more portable versions and already encoded properly with better quality encoders than the (good enough) ffmpeg included open source ac3/eac3 encoder.
I hope I clarified my use case a bit more, but can fully understand that you want to keep this tool more in line with your original intend. I'm continuing to be a happy user anyway. Thanks!

@whppr As Don mentioned above, copying all audio out may ultimately lead to playback problems even via Plex and should be avoided when transcoding.
In order for audio to get to the speakers via a receiver, all parts of the end-to-chain have to support that audio or enable pass through. For example, a Mac or PC directly connected to a modern receiver will probably play something like lossless Dolby TrueHD or DTS-HD MA audio but not much else other than the Shield will support it. If you go via an Apple TV 4K, FireTV 4K, Roku Stick+/Ultras and most TV-supplied apps, then that hardware too has to support these formats before any apps like Plex can use them. Otherwise you may get silence. AppleTV doesn't support pass through at all but converts its inbound audio to lossless LPCM but only for FLAC, Dolby Digital, EAC3/DD+ and Atmos tracks. Send it a raw TrueHD and it won't know what to do with it.
All of this is a long way of saying @donmelton has taken great care to provide options which CAN be used with the vast majority of players and so removing the old copy all is the right thing to do for a transcoded file.
I suspect many people using the tools just want the resultant transcode to play with good audio and video (and subtitles) on their TVs/portable devices. We did an unbelievable amount of beta testing prior to release and many of us have large libraries. Doing a copy-all just introduces more hassle than it's worth and you should try and look at the optional EAC3 flag as a replacement - at 640kb/sec, it sounda superb. It's now my default as I genuinely cannot hear the difference between it and lossless played via physical BRs. And I've tried with a lot of testing. And the benefits is that file size is small relative to the original lossless files. Which is what transcoding is all about in the end.

Thanks for explaining the reasoning behind the options of the new tool. Perfectly make sense. I should have followed Don's guide / rules to ripping Blu-ray discs (concerting lossless audio to FLAC) instead of focussing on preserving the core AC3/DTS tracks.
I've just been too spoiled with video_transcoding. It left a lot of room to play with all the settings and I also experimented a lot with the ratecontrol system and some extra x264 parameters the beginning of 2019. I even ported them back to a Handbrake profile so I could easily do test encodes for specific parts of a movie.

@whppr Sorry I took so long to respond. I was playing World of Warcraft Classic. :)
Also, many thanks to @rhapsodians for that explanation!
OK, I understand your situation much better now. Thanks for the explanation! And, you might think this is amusing, about 20% of my Blu-ray rips are in the same predicament because I haven't got around to re-ripping them yet with lossless audio in FLAC format.
Since I already pass through audio in AC-3 format, what you really need is something like a --copy-dts option, which would pass lossy DTS (not DTS-HD) through without transcoding it to AC-3 or DD+, right?

Hi @whppr ... thanks for the additional info. I think we were all typing at the same time so things may have been a little confusing. Having read you're approach, I now understand what you're doing and why you asked the question.
But may I suggest a change of approach? If you move all future rips/transcodes to a FLAC rip for the main audio, that will allow you to retain lossless and 5.1/6.1/7.1 audio for archiving purposes. Then taking this as the default audio stream (or streams for the bi-lingual rips), then use the new --eac3 option so long as your playback decides support it. That way you're transcoding from lossless -> lossy but with a really excellent output. Just a thought.
And like Don, you could go back and either re-rip the Blu-rays to get FLAC or the slightly more complex approach, just rip the FLAC and then mux them back into your current rips via mkvmerge. Might be faster than reripping all 350 BRs.

@whppr One final tip:  if you run other-transcode --help full, you'll see position and duration arguments (--position TIME and --duration TIME. These should make it a lot easier to do test transcodes of specific sections of movies especially now as other-transcode uses FFmpeg instead of HandBrakeCLI. It's one of the tricks we use to test tough scenes (for the encoders) to ensure that they look the best they can.

@donmelton You're responding pretty fast for a WoW player! 😄 A --copy-dts option would be exactly what I need for my current rips (for indeed the lossy DTS core track). I already noticed that FFmpeg was using pass through for AC3.
@rhapsodians Yeah, I should start re-ripping (at least my favourite movies) my BRs to lossless FLAC. The --eac3 option (supported by my players) sounds like the way forward. Also thanks for pointing out the position and duration arguments. That will help a lot testing what settings are optimal for my subjective eyes (limited to Intel QSV with h264 or h265 or else the good old x264 encoder).
Thanks so much for your time guys! It's really appreciated.

I have the use cased described by "--add-audio all", which basically means that I have movies in all kinds of languages, and when I rip them, then I preserve the languages (and hopefully the lossless audio if available) I want to keep. But when transcoding I do it in batches and this requires me to do something like the following:
other-transcode --eac3 --add-audio dan --add-audio eng --add-audio fra --add-audio ara Movie.mkv
etc.. for all of the languages I can possibly think of - because then I can reuse the same commandline for all movies, regardless of what language they are in.

@whppr I've checked in an implementation of your feature request here: https://github.com/donmelton/other_video_transcoding/commit/ae43ff9deabefbde665879ec276b4e336eb8b8b3
However, it does not use a new option. Instead it adds original as a width attribute to the --main-audio and --add-audio options.
I'll let you know when it's released.

@donmelton Thanks for adding support for the original tracks. I like the way you implemented it!

@whppr OK, I released this yesterday. Just gem update to get the new version. Closing this now. Thanks again for filing this issue!

@whppr Just so you know, I just released version 0.3.0 with a pass-dts option that might be easier for you to use.


FDS-134 - Table action stack ()

Hi team,
This adds ActionsMenu to Table.
Closed

Open

https://projects.invisionapp.com/d/main#/projects/prototypes/21025246

[x] Includes unit tests for ALL required FDS use cases
[x] Does not mute any top level API props in React
[x] Includes an explanation for any changes to Jest snapshots (should be a PR tag automatically added if this happens)
[x] Component uses React.forwardRef() when a single DOM node is returned, AND it makes React-sense to access that DOM node

Snapshot is failing because Reakit generates new WIA/ARIA content on every test
<button
      aria-controls="id-4i1qlg"
      aria-controls="id-e15rrn"
      aria-expanded="false"
      aria-haspopup="menu"
      class="icon basic ui button"
      type="button"
>```


Missing events in EventHub after successful send

Expected Behavior
We expect that all events are delivered to the EventHub.
Actual Behavior
However, if EventHub returns any error during receiving of messages from the sender (e.g. in case the throughput limits are exceeded), the sender is not notified of that situation immediately. Several events are lost before the connection becomes healthy again.
We believe the issue might be caused by the fact that EventHub does not support acknowledging the event upon obtaining it. Therefore, the sender keeps sending the messages until it receives the error notification from EventHub (which takes some time) and when it reconnects, it continues sending messages from the last one that was sent (and not the first one that caused the error).
We are not sure about a possible solution as this involves several components. In an ideal scenario, EventHub could respond to the new event by acknowledging it (or also to each batch by acknowledging it).
The current situation is for us quite problematic, as we cannot go to production with the risk of our events getting lost and we are not getting notified about it.
Do you have any ideas what could be done to mitigate the situation?
Environment

OS: AKS, Ubuntu 16.04
Go version: v1.12
Version of library: v2.0.0

Replication of the problem
package main

import (
	"context"
	"fmt"
	"time"

	"github.com/Azure/azure-event-hubs-go/v2"
)

func main() {
	partitionID := "0"
	eventNum := int64(15000)
	connStr := "Endpoint=sb://namespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=superSecret1234=;EntityPath=hubName"
	hub, err := eventhub.NewHubFromConnectionString(connStr, eventhub.HubWithPartitionedSender(partitionID))

	if err != nil {
		fmt.Println(err)
		return
	}

	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
	defer cancel()

	partitionInfo0, err := hub.GetPartitionInformation(ctx, partitionID)
	if err != nil {
		fmt.Println(err)
		return
	}

	event := eventhub.NewEventFromString("hello, world!")
	for i := int64(0); i < eventNum; i++ {
		err = hub.Send(ctx, event)
		if err != nil {
			fmt.Println(err)
			return
		}
	}

	partitionInfo1, err := hub.GetPartitionInformation(ctx, partitionID)
	if err != nil {
		fmt.Println(err)
		return
	}

	if partitionInfo1.LastSequenceNumber - partitionInfo0.LastSequenceNumber != eventNum {
		// Always if eventhub is throttled
		fmt.Printf("Test failed, number of received events: %d (expected=%d)",
			partitionInfo1.LastSequenceNumber - partitionInfo0.LastSequenceNumber, eventNum)
	} else {
		// Only if eventhub is not throttled
		fmt.Println("Test success")
	}

	err = hub.Close(context.Background())
	if err != nil {
		fmt.Println(err)
	}
}

The sender sends the message unsettled (https://github.com/Azure/azure-event-hubs-go/blob/master/sender.go#L251 and http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#type-sender-settle-mode). Sender should only return upon ACK from Event Hubs that the message was persisted.
What happens if you add a sleep after sending the events and before requesting the partition information? Does the number of message match after a short period of time?
Also, if you could build this with -tags debug and run with env var DEBUG_LEVEL=3 you should get the AMQP logs out to stdout. If you could attach those logs, or confirm the sender settlement mode, it would help greatly in determining the root issue.

This is a bug and I now see why... My above comment was only half right. The sender is sending unsettled, but we must ask the receiver for an ACK by setting the amqp.LinkReceiverSettle(amqp.ModeSecond) when establishing the sender.
Without amqp.LinkReceiverSettle(amqp.ModeSecond)
davidjustice at extremis in ~/code/azure/event-hubs-go on master [!]
$ DEBUG_LEVEL=3 go test -v -run '^TestEH/TestPartitioned/TestSend$' -tags debug
=== RUN   TestEH
=== RUN   TestEH/TestPartitioned
=== RUN   TestEH/TestPartitioned/TestSend
...
08:59:59.437901 TX: Begin{RemoteChannel: 0, NextOutgoingID: 0, IncomingWindow: 100, OutgoingWindow: 100, HandleMax:<PHONE_NUMBER>, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:59:59.533531 RX: Begin{RemoteChannel: 1, NextOutgoingID: 1, IncomingWindow: 5000, OutgoingWindow: 100, HandleMax: 255, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:59:59.533797 TX: Attach{Name: _FrnGS2oGrx3CYv0XAqa8hjbANlFJKmHmrDf_Op_GIQXy-aOndFuIg, Handle: 0, Role: Sender, SenderSettleMode: unsettled, ReceiverSettleMode: <nil>, Source: <nil>, Target: source{Address: goehtestg8da68-tagv8fpe/Partitions/0, Durable: 0, ExpiryPolicy: , Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 0, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:59:59.730407 RX(Session): Attach{Name: _FrnGS2oGrx3CYv0XAqa8hjbANlFJKmHmrDf_Op_GIQXy-aOndFuIg, Handle: 0, Role: Receiver, SenderSettleMode: unsettled, ReceiverSettleMode: first, Source: <nil>, Target: source{Address: goehtestg8da68-tagv8fpe/Partitions/0, Durable: 0, ExpiryPolicy: session-end, Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 1046528, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:59:59.730491 RX(Session): Flow{NextIncomingID: 0, IncomingWindow: 5000, NextOutgoingID: 1, OutgoingWindow: 100, Handle: 0, DeliveryCount: 0, LinkCredit: 1000, Available: 0, Drain: false, Echo: false, Properties: map[]}
08:59:59.730566 RX: Attach{Name: _FrnGS2oGrx3CYv0XAqa8hjbANlFJKmHmrDf_Op_GIQXy-aOndFuIg, Handle: 0, Role: Receiver, SenderSettleMode: unsettled, ReceiverSettleMode: first, Source: <nil>, Target: source{Address: goehtestg8da68-tagv8fpe/Partitions/0, Durable: 0, ExpiryPolicy: session-end, Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 1046528, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:59:59.730768 RX: Flow{NextIncomingID: 0, IncomingWindow: 5000, NextOutgoingID: 1, OutgoingWindow: 100, Handle: 0, DeliveryCount: 0, LinkCredit: 1000, Available: 0, Drain: false, Echo: false, Properties: map[]}
08:59:59.730843 TX(link): Transfer{Handle: 0, DeliveryID: 1, DeliveryTag: "\x00\x00\x00\x00\x00\x00\x00\x00", MessageFormat: 0, Settled: false, More: false, ReceiverSettleMode: <nil>, State: <nil>, Resume: false, Aborted: false, Batchable: false, Payload [size]: 72}
08:59:59.730894 TX(Session): Transfer{Handle: 0, DeliveryID: 1, DeliveryTag: "\x00\x00\x00\x00\x00\x00\x00\x00", MessageFormat: 0, Settled: false, More: false, ReceiverSettleMode: <nil>, State: <nil>, Resume: false, Aborted: false, Batchable: false, Payload [size]: 72}
08:59:59.731270 TX(Session): Detach{Handle: 0, Closed: true, Error: *Error(nil)}
08:59:59.825365 RX(Session): Detach{Handle: 0, Closed: true, Error: *Error(nil)}
--- PASS: TestEH (12.66s)
    --- PASS: TestEH/TestPartitioned (9.73s)
        --- PASS: TestEH/TestPartitioned/TestSend (9.72s)
    suite.go:224: "foo" does not contain "tagv8fpe", so it won't be deleted.
    suite.go:224: "goehtestpkoial-tag3eob3" does not contain "tagv8fpe", so it won't be deleted.
PASS
ok  	github.com/Azure/azure-event-hubs-go/v2	12.686s

With amqp.LinkReceiverSettle(amqp.ModeSecond)
$ DEBUG_LEVEL=3 go test -v -run '^TestEH/TestPartitioned/TestSend$' -tags debug
=== RUN   TestEH
=== RUN   TestEH/TestPartitioned
=== RUN   TestEH/TestPartitioned/TestSend
...
08:55:31.882061 RX: Begin{RemoteChannel: 1, NextOutgoingID: 1, IncomingWindow: 5000, OutgoingWindow: 100, HandleMax: 255, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:55:31.882433 TX: Attach{Name: 09LQ5hb-omUAzPiGIOWj2HQcqJ9Bpm99FrhdciulfBRdbg6WzdE7Zw, Handle: 0, Role: Sender, SenderSettleMode: unsettled, ReceiverSettleMode: second, Source: <nil>, Target: source{Address: goehtest571d13-tagmmbkw/Partitions/0, Durable: 0, ExpiryPolicy: , Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 0, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:55:32.070227 RX(Session): Attach{Name: 09LQ5hb-omUAzPiGIOWj2HQcqJ9Bpm99FrhdciulfBRdbg6WzdE7Zw, Handle: 0, Role: Receiver, SenderSettleMode: unsettled, ReceiverSettleMode: second, Source: <nil>, Target: source{Address: goehtest571d13-tagmmbkw/Partitions/0, Durable: 0, ExpiryPolicy: session-end, Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 1046528, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:55:32.070294 RX(Session): Flow{NextIncomingID: 0, IncomingWindow: 5000, NextOutgoingID: 1, OutgoingWindow: 100, Handle: 0, DeliveryCount: 0, LinkCredit: 1000, Available: 0, Drain: false, Echo: false, Properties: map[]}
08:55:32.070362 RX: Attach{Name: 09LQ5hb-omUAzPiGIOWj2HQcqJ9Bpm99FrhdciulfBRdbg6WzdE7Zw, Handle: 0, Role: Receiver, SenderSettleMode: unsettled, ReceiverSettleMode: second, Source: <nil>, Target: source{Address: goehtest571d13-tagmmbkw/Partitions/0, Durable: 0, ExpiryPolicy: session-end, Timeout: 0, Dynamic: false, DynamicNodeProperties: map[], Capabilities: []}, Unsettled: map[], IncompleteUnsettled: false, InitialDeliveryCount: 0, MaxMessageSize: 1046528, OfferedCapabilities: [], DesiredCapabilities: [], Properties: map[]}
08:55:32.070699 RX: Flow{NextIncomingID: 0, IncomingWindow: 5000, NextOutgoingID: 1, OutgoingWindow: 100, Handle: 0, DeliveryCount: 0, LinkCredit: 1000, Available: 0, Drain: false, Echo: false, Properties: map[]}
08:55:32.070764 TX(link): Transfer{Handle: 0, DeliveryID: 1, DeliveryTag: "\x00\x00\x00\x00\x00\x00\x00\x00", MessageFormat: 0, Settled: false, More: false, ReceiverSettleMode: <nil>, State: <nil>, Resume: false, Aborted: false, Batchable: false, Payload [size]: 72}
08:55:32.070844 TX(Session): Transfer{Handle: 0, DeliveryID: 1, DeliveryTag: "\x00\x00\x00\x00\x00\x00\x00\x00", MessageFormat: 0, Settled: false, More: false, ReceiverSettleMode: <nil>, State: <nil>, Resume: false, Aborted: false, Batchable: false, Payload [size]: 72}
08:55:32.262284 RX(Session): Disposition{Role: Receiver, First: 1, Last: <nil>, Settled: true, State: Accepted, Batchable: false}
08:55:32.262356 RX: Disposition{Role: Receiver, First: 1, Last: <nil>, Settled: true, State: Accepted, Batchable: false}
08:55:32.262600 TX(Session): Detach{Handle: 0, Closed: true, Error: *Error(nil)}
08:55:32.354054 RX(Session): Detach{Handle: 0, Closed: true, Error: *Error(nil)}
--- PASS: TestEH (18.08s)
    --- PASS: TestEH/TestPartitioned (9.29s)
        --- PASS: TestEH/TestPartitioned/TestSend (9.29s)
    suite.go:224: "foo" does not contain "tagmmbkw", so it won't be deleted.
    suite.go:224: "goehtestpkoial-tag3eob3" does not contain "tagmmbkw", so it won't be deleted.
PASS
ok  	github.com/Azure/azure-event-hubs-go/v2	18.108s

I'll open a PR and get this fixed up. Thank you!

Yes, we have tried it locally and it works correctly. Thanks a lot.
Just a question - when do you expect to release a new version with a fix?


[FEATURE] Make it mandatory to use Cocoapods for better distribution of the build

Is your feature request related to a problem? Please describe.
Related to #11 and https://github.com/godotengine/godot-proposals/issues/4758
Describe the solution you'd like
Ask to the user to config the exported project as Cocoapods

Should be done on #45

It seems to be technically unfeasible, when trying to use Cocoapods in the project exported by Godot, errors occur saying that the class cannot be found, the only way is to manually add the .xcframewoek

But we can still use Cocoapods to make it easier to manage the development, because we can define the version and then generate the .zip with the necessary .xcframework, so the end user will not need to use Cocoapods


Passing threshold as variable doesn't detects check failure

Hello team!
When the Soda check runs with a threshold defined as a variable, Soda doesn't detect the failure.
Soda check configuration:
checks for ${table_name}:
    - freshness(${column_name}) < ${column_age}

When I run this check with parameters, Soda correctly detects that the freshness is 1 day and 10 hours, but no failures raised.
The output of the check run:

When I replace variable ${column_age} with the exact value, Soda works correctly:
checks for ${table_name}:
    - freshness(${column_name}) < 1d

The output of the check run

Can you have a look at this issue, as it has a big impact on check idempotency?
Thank you in advance, Elena

SODA-1450


Change issue links in the About this release page

Description:

Fixed issue links
Known issue links

Fixed with #1824


Typo "Azure Blob storage"→"Azure Blob Storage"

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-scoped-credential-transact-sql?view=azure-sqldw-latest

@hyoshioka0128 : Thanks for your contribution! The author(s) have been notified to review your proposed change.

@hyoshioka0128 : Thanks for your contribution! The author(s) have been notified to review your proposed change.


question about the evaluation result of dso and orbslam

hello
I've read your paper "A Photometrically Calibrated Benchmark For Monocular Visual Odometry".
In section 3.2, figure 8 you compared the result of dso and orbslam by 500 runs.
The figure is upload below:

However i have a question here: from the figure we can see that as the number of runs increases, the error increases correspondingly, but when the number of run increases from  approximately 480 to 500, the error increases so fast. I think it's not so feasible or may i just can't explain this phenomenon.
In the paper there are a lot of figures like this having the same result. Could you please explain this phenomenon? Thank you so much!
best
chenchr

It just means that overall there are not so many sequences with high error, but there are a few that have very large error.
Imagine the extreme, where all except one runs have error 0, and that one run has a very large error 100. The curve you would see would be vertical line at x=0 and then an almost horizontal around y=499 from x=0 to x=100.
Does that answer your question?

Yes, I got your point. Sorry for not replying until now. Thanks!

@NikolausDemmel Yes, I got your point. Sorry for not replying until now. Thank!