Kopium uses Array instead of Vec for array fields

I was generating the rust code for this CRD and noticed that the code generated is using Array instead of Vec for some fields.

Here's the CRD
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.6.2
installer.open-cluster-management.io/last-applied-configuration: ce84b11fb18eb5436f84845f6c462e1f6773cc46
creationTimestamp: "2022-02-14T14:03:43Z"
generation: 1
labels:
installer.name: multiclusterhub
installer.namespace: open-cluster-management
name: agents.agent-install.openshift.io
resourceVersion: "270891"
uid: 741e93d1-2f89-4945-8975-09a90983ba8f
spec:
conversion:
strategy: None
group: agent-install.openshift.io
names:
kind: Agent
listKind: AgentList
plural: agents
singular: agent
scope: Namespaced
versions:

additionalPrinterColumns:

description: The name of the cluster the Agent registered to.
jsonPath: .spec.clusterDeploymentName.name
name: Cluster
type: string
description: The Approve state of the Agent.
jsonPath: .spec.approved
name: Approved
type: boolean
description: The role (master/worker) of the Agent.
jsonPath: .status.role
name: Role
type: string
description: The HostStage of the Agent.
jsonPath: .status.progress.currentStage
name: Stage
type: string
description: The hostname of the Agent.
jsonPath: .status.inventory.hostname
name: Hostname
priority: 1
type: string
description: The requested hostname for the Agent.
jsonPath: .spec.hostname
name: Requested Hostname
priority: 1
type: string
name: v1beta1
schema:
openAPIV3Schema:
description: Agent is the Schema for the hosts API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: AgentSpec defines the desired state of Agent
properties:
approved:
type: boolean
clusterDeploymentName:
description: ClusterReference represents a Cluster Reference. It has
enough information to retrieve cluster in any namespace
properties:
name:
description: Name is unique within a namespace to reference a
cluster resource.
type: string
namespace:
description: Namespace defines the space within which the cluster
name must be unique.
type: string
type: object
hostname:
type: string
ignitionConfigOverrides:
description: Json formatted string containing the user overrides for
the host's ignition config
type: string
installation_disk_id:
description: InstallationDiskID defines the installation destination
disk (must be equal to the inventory disk id).
type: string
installerArgs:
description: Json formatted string containing the user overrides for
the host's coreos installer args
type: string
machineConfigPool:
type: string
role:
description: "HostRole host role \n swagger:model host-role"
type: string
required:
- approved
- role
type: object
status:
description: AgentStatus defines the observed state of Agent
properties:
bootstrap:
type: boolean
conditions:
items:
description: Condition represents the state of the operator's reconciliation
functionality.
properties:
lastHeartbeatTime:
format: date-time
type: string
lastTransitionTime:
format: date-time
type: string
message:
type: string
reason:
type: string
status:
type: string
type:
description: ConditionType is the state of the operator's reconciliation
functionality.
type: string
required:
- status
- type
type: object
type: array
debugInfo:
description: DebugInfo includes information for debugging the installation
process.
properties:
eventsURL:
description: EventsURL specifies an HTTP/S URL that contains events
which occured during the cluster installation process
type: string
state:
description: Current state of the Agent
type: string
stateInfo:
description: Additional information pertaining to the status of
the Agent
type: string
type: object
hostname:
type: string
inventory:
properties:
bmcAddress:
type: string
bmcV6Address:
type: string
boot:
properties:
currentBootMode:
type: string
pxeInterface:
type: string
type: object
cpu:
properties:
architecture:
type: string
clockMegahertz:
description: 'Name in REST API: frequency'
format: int64
type: integer
count:
format: int64
type: integer
flags:
items:
type: string
type: array
modelName:
type: string
type: object
disks:
items:
properties:
bootable:
type: boolean
byID:
type: string
byPath:
type: string
driveType:
type: string
hctl:
type: string
id:
type: string
installationEligibility:
properties:
eligible:
type: boolean
notEligibleReasons:
items:
type: string
type: array
required:
- notEligibleReasons
type: object
ioPerf:
properties:
syncDurationMilliseconds:
description: 99th percentile of fsync duration in milliseconds
format: int64
type: integer
type: object
model:
type: string
name:
type: string
path:
type: string
serial:
type: string
sizeBytes:
format: int64
type: integer
smart:
type: string
vendor:
type: string
wwn:
type: string
required:
- id
type: object
type: array
hostname:
type: string
interfaces:
items:
properties:
biosDevName:
type: string
clientID:
type: string
flags:
items:
type: string
type: array
hasCarrier:
type: boolean
ipV4Addresses:
items:
type: string
type: array
ipV6Addresses:
items:
type: string
type: array
macAddress:
type: string
mtu:
format: int64
type: integer
name:
type: string
product:
type: string
speedMbps:
format: int64
type: integer
vendor:
type: string
required:
- flags
- ipV4Addresses
- ipV6Addresses
type: object
type: array
memory:
properties:
physicalBytes:
format: int64
type: integer
usableBytes:
format: int64
type: integer
type: object
reportTime:
description: 'Name in REST API: timestamp'
format: date-time
type: string
systemVendor:
properties:
manufacturer:
type: string
productName:
type: string
serialNumber:
type: string
virtual:
type: boolean
type: object
type: object
ntpSources:
items:
properties:
sourceName:
type: string
sourceState:
description: "SourceState source state \n swagger:model source_state"
type: string
type: object
type: array
progress:
properties:
currentStage:
description: "HostStage host stage \n swagger:model host-stage"
type: string
progressInfo:
type: string
stageStartTime:
description: 'Name in REST API: stage_started_at'
format: date-time
type: string
stageUpdateTime:
description: 'Name in REST API: stage_updated_at'
format: date-time
type: string
type: object
role:
description: "HostRole host role \n swagger:model host-role"
type: string
validationsInfo:
additionalProperties:
items:
properties:
id:
type: string
message:
type: string
status:
type: string
required:
- id
- message
- status
type: object
type: array
description: ValidationsInfo is a JSON-formatted string containing
the validation results for each validation id grouped by category
(network, hosts-data, etc.)
type: object
type: object
type: object
served: true
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: Agent
listKind: AgentList
plural: agents
singular: agent
conditions:

lastTransitionTime: "2022-02-14T14:03:43Z"
message: no conflicts found
reason: NoConflicts
status: "True"
type: NamesAccepted
lastTransitionTime: "2022-02-14T14:03:43Z"
message: the initial names have been accepted
reason: InitialNamesAccepted
status: "True"
type: Established
storedVersions:
v1beta1

use kube::CustomResource;
use serde::{Serialize, Deserialize};
use std::collections::BTreeMap;

#[derive(CustomResource, Serialize, Deserialize, Clone, Debug)]
#[kube(group = "agent-install.openshift.io", version = "v1beta1", kind = "Agent", plural = "agents")]
#[kube(namespaced)]
#[kube(schema = "disabled")]
pub struct AgentSpec {
    pub approved: bool,
    pub clusterDeploymentName: Option<AgentClusterDeploymentName>,
    pub hostname: Option<String>,
    pub ignitionConfigOverrides: Option<String>,
    pub installation_disk_id: Option<String>,
    pub installerArgs: Option<String>,
    pub machineConfigPool: Option<String>,
    pub role: String,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentClusterDeploymentName {
    pub name: Option<String>,
    pub namespace: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatus {
    pub bootstrap: Option<bool>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub conditions: Vec<AgentStatusConditions>,
    pub debugInfo: Option<AgentStatusDebugInfo>,
    pub hostname: Option<String>,
    pub inventory: Option<AgentStatusInventory>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub ntpSources: Vec<AgentStatusNtpSources>,
    pub progress: Option<AgentStatusProgress>,
    pub role: Option<String>,
    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
    pub validationsInfo: BTreeMap<String, Array>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusConditions {
    pub lastHeartbeatTime: Option<String>,
    pub lastTransitionTime: Option<String>,
    pub message: Option<String>,
    pub reason: Option<String>,
    pub status: String,
    pub r#type: String,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusDebugInfo {
    pub eventsURL: Option<String>,
    pub state: Option<String>,
    pub stateInfo: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventory {
    pub bmcAddress: Option<String>,
    pub bmcV6Address: Option<String>,
    pub boot: Option<AgentStatusInventoryBoot>,
    pub cpu: Option<AgentStatusInventoryCpu>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub disks: Vec<AgentStatusInventoryDisks>,
    pub hostname: Option<String>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub interfaces: Vec<AgentStatusInventoryInterfaces>,
    pub memory: Option<AgentStatusInventoryMemory>,
    pub reportTime: Option<String>,
    pub systemVendor: Option<AgentStatusInventorySystemVendor>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryBoot {
    pub currentBootMode: Option<String>,
    pub pxeInterface: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryCpu {
    pub architecture: Option<String>,
    pub clockMegahertz: Option<i64>,
    pub count: Option<i64>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub flags: Vec<String>,
    pub modelName: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryDisks {
    pub bootable: Option<bool>,
    pub byID: Option<String>,
    pub byPath: Option<String>,
    pub driveType: Option<String>,
    pub hctl: Option<String>,
    pub id: String,
    pub installationEligibility: Option<AgentStatusInventoryDisksInstallationEligibility>,
    pub ioPerf: Option<AgentStatusInventoryDisksIoPerf>,
    pub model: Option<String>,
    pub name: Option<String>,
    pub path: Option<String>,
    pub serial: Option<String>,
    pub sizeBytes: Option<i64>,
    pub smart: Option<String>,
    pub vendor: Option<String>,
    pub wwn: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryDisksInstallationEligibility {
    pub eligible: Option<bool>,
    pub notEligibleReasons: Vec<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryDisksIoPerf {
    pub syncDurationMilliseconds: Option<i64>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryInterfaces {
    pub biosDevName: Option<String>,
    pub clientID: Option<String>,
    pub flags: Vec<String>,
    pub hasCarrier: Option<bool>,
    pub ipV4Addresses: Vec<String>,
    pub ipV6Addresses: Vec<String>,
    pub macAddress: Option<String>,
    pub mtu: Option<i64>,
    pub name: Option<String>,
    pub product: Option<String>,
    pub speedMbps: Option<i64>,
    pub vendor: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventoryMemory {
    pub physicalBytes: Option<i64>,
    pub usableBytes: Option<i64>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusInventorySystemVendor {
    pub manufacturer: Option<String>,
    pub productName: Option<String>,
    pub serialNumber: Option<String>,
    pub virtual: Option<bool>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusNtpSources {
    pub sourceName: Option<String>,
    pub sourceState: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AgentStatusProgress {
    pub currentStage: Option<String>,
    pub progressInfo: Option<String>,
    pub stageStartTime: Option<String>,
    pub stageUpdateTime: Option<String>,
}

Not fully related to this issue but we may also want to catch usage of restricted keywords (note virtual in the generated codeand escape them withr#`

The curious part of the crd is this:
              validationsInfo:
                additionalProperties:
                  items:
                    properties:
                      id:
                        type: string
                      message:
                        type: string
                      status:
                        type: string
                    required:
                    - id
                    - message
                    - status
                    type: object
                  type: array
                description: ValidationsInfo is a JSON-formatted string containing
                  the validation results for each validation id grouped by category
                  (network, hosts-data, etc.)
                type: object

which i take to mean that validationsInfo member should be a vector of ValidationInfo structs (with members id, type and status). it's a different way of specifying this than i'm used to, but it can probably be worked in.

actually no, it looks like it should be a BTreeMap<String, ValidationsInfo> from looking at:

https://github.com/openshift/assisted-service/blob/36774ad9829f4bcc62effbf73981dc07e9261ae8/api/common/common_types.go#L5-L15
https://github.com/openshift/assisted-service/blob/36774ad9829f4bcc62effbf73981dc07e9261ae8/api/common/common_types.go#L5-L15

I think I possibly have a fix for it in #33 . It depends if I have interpreted the validationsInfo struct correctly. @flaper87 are you able to test out this branch or give me an instance of an agent.agent-install.openshift.io that has the struct?
the latter would help write a better test for this weird case

are you able to test out this branch or give me an instance of an agent.agent-install.openshift.io that has the struct?

I tested the branch and it looks like it works as expected.
Here's an example of a CR
apiVersion: agent-install.openshift.io/v1beta1
kind: Agent
metadata:
  creationTimestamp: "2022-02-14T17:55:14Z"
  finalizers:
  - agent.agent-install.openshift.io/ai-deprovision
  generation: 2
  labels:
    agent-install.openshift.io/bmh: cluster-spoke-0-master-2
    infraenvs.agent-install.openshift.io: spoke0-cluster
  name: 356201c1-b6e7-4fd1-b04e-666e317ee12b
  namespace: spoke0-cluster
  resourceVersion: "886129"
  uid: ed29cd23-6ccc-452f-a643-066abaae1c54
spec:
  approved: true
  clusterDeploymentName:
    name: spoke0-cluster
    namespace: spoke0-cluster
  hostname: cluster-spoke-0-master-2
  role: ""
status:
  bootstrap: true
  conditions:
  - lastTransitionTime: "2022-02-14T17:55:14Z"
    message: The Spec has been successfully applied
    reason: SyncOK
    status: "True"
    type: SpecSynced
  - lastTransitionTime: "2022-02-14T17:55:14Z"
    message: The agent's connection to the installation service is unimpaired
    reason: AgentIsConnected
    status: "True"
    type: Connected
  - lastTransitionTime: "2022-02-14T17:56:37Z"
    message: The agent installation stopped
    reason: AgentInstallationStopped
    status: "True"
    type: RequirementsMet
  - lastTransitionTime: "2022-02-14T17:56:37Z"
    message: The agent's validations are passing
    reason: ValidationsPassing
    status: "True"
    type: Validated
  - lastTransitionTime: "2022-02-14T18:15:20Z"
    message: 'The installation has completed: Done'
    reason: InstallationCompleted
    status: "True"
    type: Installed
  - lastTransitionTime: "2022-02-14T17:55:14Z"
    message: The agent is bound to a cluster deployment
    reason: Bound
    status: "True"
    type: Bound
  debugInfo:
    eventsURL: EVENTS_URL
    state: installed
    stateInfo: Done
  inventory:
    bmcAddress: <IP_ADDRESS>
    bmcV6Address: ::/0
    boot:
      currentBootMode: uefi
    cpu:
      architecture: x86_64
      clockMegahertz: 2394
      count: 24
      flags:
      - fpu
      - vme
      - de
      - pse
      - tsc
      - msr
      - pae
      - mce
      - cx8
      - apic
      - sep
      - mtrr
      - pge
      - mca
      - cmov
      - pat
      - pse36
      - clflush
      - mmx
      - fxsr
      - sse
      - sse2
      - ss
      - syscall
      - nx
      - pdpe1gb
      - rdtscp
      - lm
      - constant_tsc
      - rep_good
      - nopl
      - xtopology
      - cpuid
      - tsc_known_freq
      - pni
      - pclmulqdq
      - vmx
      - ssse3
      - fma
      - cx16
      - pdcm
      - pcid
      - sse4_1
      - sse4_2
      - x2apic
      - movbe
      - popcnt
      - tsc_deadline_timer
      - aes
      - xsave
      - avx
      - f16c
      - rdrand
      - hypervisor
      - lahf_lm
      - abm
      - 3dnowprefetch
      - cpuid_fault
      - invpcid_single
      - ssbd
      - ibrs
      - ibpb
      - stibp
      - ibrs_enhanced
      - tpr_shadow
      - vnmi
      - flexpriority
      - ept
      - vpid
      - ept_ad
      - fsgsbase
      - tsc_adjust
      - bmi1
      - avx2
      - smep
      - bmi2
      - erms
      - invpcid
      - avx512f
      - avx512dq
      - rdseed
      - adx
      - smap
      - clflushopt
      - clwb
      - avx512cd
      - avx512bw
      - avx512vl
      - xsaveopt
      - xsavec
      - xgetbv1
      - xsaves
      - arat
      - umip
      - pku
      - ospke
      - avx512_vnni
      - md_clear
      - arch_capabilities
      modelName: Intel Xeon Processor (Cascadelake)
    disks:
    - byPath: /dev/disk/by-path/pci-0000:00:1f.2-ata-1
      driveType: ODD
      hctl: "0:0:0:0"
      id: /dev/disk/by-path/pci-0000:00:1f.2-ata-1
      installationEligibility:
        notEligibleReasons:
        - Disk is removable
        - Disk is too small (disk only has 109 MB, but 120 GB are required)
        - Drive type is ODD, it must be one of HDD, SSD.
      ioPerf: {}
      model: QEMU_DVD-ROM
      name: sr0
      path: /dev/sr0
      serial: QM00001
      sizeBytes: 108984320
      smart: '{"json_format_version":[1,0],"smartctl":{"version":[7,1],"svn_revision":"5049","platform_info":"x86_64-linux-4.18.0-305.19.1.el8_4.x86_64","build_info":"(local
        build)","argv":["smartctl","--xall","--json=c","/dev/sr0"],"exit_status":4},"device":{"name":"/dev/sr0","info_name":"/dev/sr0","type":"scsi","protocol":"SCSI"},"vendor":"QEMU","product":"QEMU
        DVD-ROM","model_name":"QEMU QEMU DVD-ROM","revision":"2.5+","scsi_version":"SPC-3","device_type":{"scsi_value":5,"name":"CD/DVD"},"local_time":{"time_t":1644862275,"asctime":"Mon
        Feb 14 18:11:15 2022 UTC"},"temperature":{"current":0,"drive_trip":0}}'
      vendor: QEMU
    - bootable: true
      byPath: /dev/disk/by-path/pci-0000:05:00.0
      driveType: HDD
      id: /dev/disk/by-path/pci-0000:05:00.0
      installationEligibility:
        eligible: true
        notEligibleReasons: []
      ioPerf: {}
      name: vda
      path: /dev/vda
      sizeBytes:<PHONE_NUMBER>00
      smart: '{"json_format_version":[1,0],"smartctl":{"version":[7,1],"svn_revision":"5049","platform_info":"x86_64-linux-4.18.0-305.19.1.el8_4.x86_64","build_info":"(local
        build)","argv":["smartctl","--xall","--json=c","/dev/vda"],"messages":[{"string":"/dev/vda:
        Unable to detect device type","severity":"error"}],"exit_status":1}}'
      vendor: "0x1af4"
    - byPath: /dev/disk/by-path/pci-0000:06:00.0
      driveType: HDD
      id: /dev/disk/by-path/pci-0000:06:00.0
      installationEligibility:
        eligible: true
        notEligibleReasons: []
      ioPerf: {}
      name: vdb
      path: /dev/vdb
      sizeBytes:<PHONE_NUMBER>00
      smart: '{"json_format_version":[1,0],"smartctl":{"version":[7,1],"svn_revision":"5049","platform_info":"x86_64-linux-4.18.0-305.19.1.el8_4.x86_64","build_info":"(local
        build)","argv":["smartctl","--xall","--json=c","/dev/vdb"],"messages":[{"string":"/dev/vdb:
        Unable to detect device type","severity":"error"}],"exit_status":1}}'
      vendor: "0x1af4"
    - byPath: /dev/disk/by-path/pci-0000:07:00.0
      driveType: HDD
      id: /dev/disk/by-path/pci-0000:07:00.0
      installationEligibility:
        eligible: true
        notEligibleReasons: []
      ioPerf: {}
      name: vdc
      path: /dev/vdc
      sizeBytes:<PHONE_NUMBER>00
      smart: '{"json_format_version":[1,0],"smartctl":{"version":[7,1],"svn_revision":"5049","platform_info":"x86_64-linux-4.18.0-305.19.1.el8_4.x86_64","build_info":"(local
        build)","argv":["smartctl","--xall","--json=c","/dev/vdc"],"messages":[{"string":"/dev/vdc:
        Unable to detect device type","severity":"error"}],"exit_status":1}}'
      vendor: "0x1af4"
    - byPath: /dev/disk/by-path/pci-0000:08:00.0
      driveType: HDD
      id: /dev/disk/by-path/pci-0000:08:00.0
      installationEligibility:
        eligible: true
        notEligibleReasons: []
      ioPerf: {}
      name: vdd
      path: /dev/vdd
      sizeBytes:<PHONE_NUMBER>00
      smart: '{"json_format_version":[1,0],"smartctl":{"version":[7,1],"svn_revision":"5049","platform_info":"x86_64-linux-4.18.0-305.19.1.el8_4.x86_64","build_info":"(local
        build)","argv":["smartctl","--xall","--json=c","/dev/vdd"],"messages":[{"string":"/dev/vdd:
        Unable to detect device type","severity":"error"}],"exit_status":1}}'
      vendor: "0x1af4"
    hostname: cluster-spoke-0-master-2.bare-net
    interfaces:
    - flags:
      - up
      - broadcast
      - multicast
      hasCarrier: true
      ipV4Addresses:
      - <IP_ADDRESS>/24
      ipV6Addresses: []
      macAddress: ee:ee:ee:ee:20:2e
      mtu: 1500
      name: enp1s0
      product: "0x0001"
      speedMbps: -1
      vendor: "0x1af4"
    - flags:
      - up
      - broadcast
      - multicast
      hasCarrier: true
      ipV4Addresses:
      - <IP_ADDRESS>/24
      ipV6Addresses: []
      macAddress: aa:aa:aa:aa:20:2a
      mtu: 1500
      name: enp2s0
      product: "0x0001"
      speedMbps: -1
      vendor: "0x1af4"
    memory:
      physicalBytes:<PHONE_NUMBER>0
      usableBytes:<PHONE_NUMBER>0
    systemVendor:
      manufacturer: Red Hat
      productName: KVM
      virtual: true
  ntpSources:
  - sourceName: mail.sebi.org
    sourceState: not_combined
  - sourceName: <IP_ADDRESS>
    sourceState: synced
  - sourceName: x.ns.gin.ntt.net
    sourceState: not_combined
  - sourceName: h2924008.stratoserver.net
    sourceState: not_combined
  progress:
    currentStage: Done
    stageStartTime: "2022-02-14T18:15:20Z"
    stageUpdateTime: "2022-02-14T18:15:20Z"
  role: master

@clux  thanks a bunch for addressing this issue so fast :pray:


🔥 Strip taco api down to minimum necessary

I've realised I can take this further. I'll do that at some point soon.

all done and ready for review!

A question... I'm calling _taco.initialize() in the taco module. Is that ok or should I just export that function like anything else and let the user choose when to call it?

I think I'm minded to export it and leave it to the user

All yours @theref . There's not much more that could be stripped down now!


MudSelect: Fix MultiSelection in MudSelect

Description
Currently, MudSelect supports various data types beyond strings. However, when using a type with a value of 0, it behaves like a single-select component during rendering.
this is not best way to fix this , but most simple
Close #9808
Close #7941
Close #4753
Close #9210
Close #3164
How Has This Been Tested?
Add a test viewer page
Type of Changes

[x] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[ ] Documentation (fix or improvement to the website or code docs)

before

after

Checklist

[x] The PR is submitted to the correct branch (dev).
[x] My code follows the code style of this project.
[x] I've added relevant tests.

@danielchalmers note our PR naming policy for verbs Fix instead of Fixed or Fixing. I changed this one, so it will be consistent in the change log.

@danielchalmers note our PR naming policy for verbs Fix instead of Fixed or Fixing. I changed this one, so it will be consistent in the change log.

Sure, I'll be more aggressive in renaming


Diversity Report - Amendments

Hi Andrew and Matt,
I just wanted to reach out about a change to the Platform’s Diversity Report section that we would like to make if possible, which addresses an issue that has come up several times in the last fortnight. Apologies if you prefer Slack for this type of issue Andrew, but I thought with the various attachments an email might be easier.
The issue is that we have noticed that the platform diversity report is not currently consistent with other places where we report diversity statistics, most notably the annual Combined Statistics Report. This has therefore caused some confusion when reading from exercise Diversity Checkpoints (which are produced from the Platform reports page). See the attached emails for a couple of examples.
Most significantly, candidates listing their ethnicity as Other are not being included in the BAME category on the diversity reports. However, our agreed policy with JDF partners is that Other comes under the BAME label, including for EMP consideration. The other main inconsistency is that candidates who choose not to disclose their characteristics (“Prefer not to say”) are being included in percentage calculations, so that, for example, the sum of percentages for disabled and non-disabled candidates is not 100%. A final minor difference is the inclusion of a Gender Neutral category in the Gender section. This has an extremely small number of responses so the Stats report just includes this in the Unknown count, so that the comparison between male and female representation can be easily made.
See below tables as presented in the statistics report (2022 tables can be found here). Note i) no “Other” category for ethnicity, ii) unknowns not included in percentage calculations and iii) no “Gender Neutral” category in gender. To compare, see the diversity reports here for 066 as an example.
We are keen to make a change to the diversity reports as quickly as possible to prevent further confusion. Would you be able to advise on how best we might be able to do this? Happy to chat through further with Jessica and the developers present to fully illustrate the issue and agree our proposed changes.

Hi Sean,
Thank you for sending over the details. Reading through the detail with develops we think one of the requirements is:
•	In apply when a candidate selects “other”  the diversity section on admin should count this as BAME in the diversity report section.
The others we are not sure what you want and how you want it presented, so think a chat is best? The first link didn’t work but I presume you mean this one - Diversity of the judiciary: 2022 statistics - GOV.UK (www.gov.uk) and the attached document from this website?

Hi Sean,
We have spoken some more and think point 2 is this:
It looks like the second point is that the actual values (e.g. male, female) should add up to 100% with the Prefer Not To Says being reflected outside of this, probably they’ve used Declaration Rate to indicate this. So, for example, out of 10 cats:
•	6 said they prefer Whiskers
•	2 said they prefer Applause
•	2 preferred not to say
The percent would be:
•	75% said they prefer Whiskers (6 out of 8)
•	25% said they prefer Applause (2 out of 8)
•	Declaration rate was 80% (8 out of 10)

Our emails have crossed, but yes, the cat analogy is correct. We’d like to apply this to the whole diversity report section (so Applied, Shortlisted, …, Handover) for each characteristic (Gender, Ethnicity, …, Social Mobility). For Social Mobility, it is not clear if the current numbers for Attending State School and First Gen Uni are including or excluding unknowns from the percentage calculation. It would be good to verify that they are excluding them.

Just picking up from our conversation on Slack, the questions to be included on the application form from 1st April are the three below. These would replace the existing three social mobility questions (around schooling, Oxbridge and university attendance). I know that the last two are very similar to ones we already ask but we have agreed to standardise the exact wording of the questions and responses across all JDF members (JO, Bar Council, Law Society etc).
Happy to chat about this. Aware we have the application working group later today which may touch on similar things.
Best wishes,
Sean
What was the occupation of your main household earner when you were about aged 14?
•	Modern professional & traditional professional occupations such as: teacher, nurse, physiotherapist, social worker, musician, police officer (sergeant or above), software designer, accountant, solicitor, medical practitioner, scientist, civil / mechanical engineer.

•	Clerical and intermediate occupations such as: secretary, personal assistant, call centre agent, clerical worker, nursery nurse.
•	Technical and craft occupations such as: motor mechanic, plumber, printer, electrician, gardener, train driver.
•	Routine, semi-routine manual and service occupations such as: postal worker, machine operative, security guard, caretaker, farm worker, catering assistant, sales assistant, HGV driver, cleaner, porter, packer, labourer, waiter/waitress, bar staff.
•	Long-term unemployed (claimed Jobseeker’s Allowance or earlier unemployment benefit for more than a year).
•	Small business owners who employed less than 25 people such as: corner shop owners, small plumbing companies, retail shop owner, single restaurant or cafe owner, taxi owner, garage owner.
•	Other such as: retired, this question does not apply to me, I don’t know.
•	I prefer not to say.
Which type of school did you attend for the most time between the ages of 11 and 16?
•	A state-run or state-funded school – non-selective
•	A state-run or state-funded school – selective
•	Independent or fee-paying school
•	Independent or fee-paying school, where I received a bursary covering 90% or more of my tuition
•	Attended school outside the UK
•	I don’t know
•	Prefer not to say
Did either of your parents attend university and gain a degree (e.g. BA/BSc or equivalent) by the time you were 18?
•	No, neither of my parents attended university
•	Yes, one or both of my parents attended university
•	Do not know / not sure
•	I prefer not to say

This has failed user testing please see slack: https://drie.slack.com/archives/C01R6GAAETG/p1689169719020309

Needs approval from Sean Cuddihy. per discussion retro 3/8/23

@drieJAC @warrensearle please take a look at  Sean's feedback below, a few tweaks required before we send back to him for final UT:
Some notes on these changes. I think there is still some work to do here but moving in the right direction.
Diversity reports:
•	The new way of reporting percentages, with the declaration rate below, is very clear and exactly what we wanted.
•	I can see that those who have declared gender as “Other” are being treated as if they did not declare, which is what we wanted (even though this is not completely ideal, but it is how it is done in the Combined Stats report and numbers are very small).
•	I’m not able to tell whether “Other” ethnicity is being counted within the Ethnic Minority category as I don’t think any of the example exercises I’ve looked at have any candidates who that would apply to.
•	The social mobility bit is a little bit different as it is showing outputs from two different questions (one about school, one about parents’ education) on top of each other. These should probably have a declaration rate like the others. I.e, it is currently telling me that 56.67% (17) were first generation to attend university, but it is not immediately clear if that is 56.67% of the total applicants, or 56.67% of those who declared.
Dashboard:
•	The percentage reporting here is not working as well. If I go on exercise 00582 and look at the dashboard filtered to Gender, it says 27 candidates applied, but that is wrong I think, there were 30 but only 27 declared their gender. This should ideally be reporting it exactly how the Diversity Report does it.
•	Then underneath Male and Female it still has all the extra categories such as “Gender Neutral”, “Other” and “No answer” which we wanted to get rid of – as on the Diversity report, just display the main categories, and then the declaration rate underneath. Pro
•	The same seems to be the case on the other diversity categories: Ethnicity – we only want White and Ethnic Minority (where Other is included in EM). Disability: we only want Yes and No. Prof background: we only want Barrister, CILEx, Solicitor and Other. Social mobility is a bit different if using the current format of displaying two different questions on the same panel. (it says Undefined candidates applied next to Social Mobility so it is definitely not working quite right.

Feedback from Sean Cuddihy:
'Stats for 'Other' should be displayed for Professional Background on the Dashboard and the Report


uDiscovery Redesign

The following is the redesign of uDiscovery service based on the various lessons learned from deploying uDiscovery in production and valuable feedback from developers.  uDiscovery is no longer a dumping ground for all kinds of information but instead only stores service discovery information (service location, version, and service topic metadata).
#137

@stevenhartley can you rebase this PR?


docs(guide/Services): describe your change...

module was not loaded in the unit test program

module has to be loaded to the unit testing program for testing the servive

I have signed the CLA.
Thanks,
Bhalaji N
Project Engineer | Soliton Technologies http://www.solitontech.com/
On Tue, Feb 17, 2015 at 10:32 AM, googlebot<EMAIL_ADDRESS>wrote:

Thanks for your pull request.
It looks like this may be your first contribution to a Google open source
project, in which case you'll need to sign a Contributor License Agreement
(CLA) at https://cla.developers.google.com/.
If you've already signed a CLA, it's possible we don't have your GitHub
username or you're using a different email address. Check the information
on your CLA https://cla.developers.google.com/clas or see this help
article on setting the email on your git commits
https://help.github.com/articles/setting-your-email-in-git/.
Once you've done that, please reply here to let us know. If you signed the
CLA as a corporation, please let us know the company's name.
—
Reply to this email directly or view it on GitHub
https://github.com/angular/angular.js/pull/11081#issuecomment-74617391.


Configure different Log Types for different Response Statuses in Okhttp-Logging-Interceptor

Currently  4 log levels exist in OkhttpLogginginterceptor.Level.
In an application with lots of request this could lead to very noisy log output. e.g. it would totally make sense to have just a Level.BASIC logging for all successful Requests and Responses and to log the whole Body for unsuccessful ones. Also it could be considered to have the possibility to log erroneous Requests on a Debug or Error LogLevel

This comes up frequently, we generally advise people to copy and modify the OkhttpLogginginterceptor or the event listener and implement the functionality you need.  We are not intending an all purpose logging facility, and we don't want changes to surprise existing users.

Okay thank you for the insight


Clarification on DiagnosticTag

Would it be possible to get further clarification on how clients are supposed to handle DiagnosticTag?
export namespace DiagnosticTag {
	/**
	 * Unused or unnecessary code.
	 *
	 * Clients are allowed to render diagnostics with this tag faded out
	 * instead of having an error squiggle.
	 */
	export const Unnecessary: 1 = 1;
	/**
	 * Deprecated or obsolete code.
	 *
	 * Clients are allowed to rendered diagnostics with this tag strike through.
	 */
	export const Deprecated: 2 = 2;
}

According to the pyright maintainers (https://github.com/microsoft/pyright/issues/1118#issuecomment-1478108228), diagnostics with the Unnecessary tag should not be treated as "real" diagnostics and should just be rendered faded and excluding from statuslines, sign column, inline text, etc.  And, it should be considered a bug if any editor treats diagnostics with these tags as normal diagnostics. However, the spec does not say this explicitly.
Can further clarification be provided on how clients should exactly implement diagnostics with these tags?

Actually LSP always state away from defining UI for the client (and it will). Clients may offer filter mechanism or other means to make them not show in the UI.
Even VS Code doesn't hide them (at least in TypeScript)

I will close the issue since I really don't want to enforce UI rendering in the LSP specification.

Many thanks!

So Pylance doesn't report these as problems:

How can vscode be inconsistent here (note I don't use this editor)? Surely in both cases, the diagnostic is just a diagnostic with hint?

severity is optional so it might be that in case of Pylance it's not set and that's how VSCode handles it.

Unforuntetly not in this case. This is the diagnostic:
{
  "message": "\"_validator\" is not accessed",
  "range": {
    "end": {
      "character": 30,
      "line": 118
    },
    "start": {
      "character": 20,
      "line": 118
    }
  },
  "severity": 4,
  "source": "Pyright",
  "tags": [ 1 ]
}

That is correct: hints are not shown in the problems list in VS Code.


make offset always fiest in ctor, crosstested stucts vs type, added s…

…truct layout methods, type layout works as before (all test are in place), moved out all SUTs for view and reuse, moved sln to build root dir, added nullable test; #15

I fixed many issues. Much more pretty now. Code still complex (so do not see patter to simplify it now, probably during nullables support)

@dzmitry-lahoda Sorry, was a bit busy at work... Why you decided to close the PR?

I rewrote all code and will do even more. I guess better to create new pull. As code very very different.

@dzmitry-lahoda Ok, sounds good. Looking forward to the new PR.

Except complex padding, i have found need to support nullables and fixed(new C# feature) with non primitive structs (which was hard in previous code). I will fix all this and create pull again.


fix: commit missing monero settings

Description
Missed updating these monero settings in the last PR.
Motivation and Context
Set to the mainnet community wallet.
How Has This Been Tested?
manually

Ignore the license failure, it does that sometimes.

Thought it would be populated.

It's most likely because you had an existing settings file. You'd have to wipe that file and start fresh.


add globsemver: pattern

GlobSemver filter is a combination of Glob and Semver filters.
This filter is useful when you want to do glob matching and semantic versioning simultaneously.
For example, one of our development teams pushes several deployments a day, each deployment has to go through multiple CI stages before it finally gets to k8s cluster.
This sometimes triggers race condition -- for example, developer pushes v1.2.5-rc tag to CI, then he realizes he had made a logical mistake, fixes it and pushes v1.2.6-rc tag.
He expects that soon he will see v1.2.6-rc at k8s-staging cluster.
But because the CI node which was testing v1.2.6-rc was slower then the one which was testing  v1.2.5-rc -- Flux deploys v1.2.6-rc first, and then replaces it with v1.2.5-rc if we are using glob:*-rc filter
globSemver filter  globsemver:v{1.x.x}-rc could prevent such an issue

It's my first commit in Golang, so comments are welcome :)

Hi @white-hat thanks for the contribution, the Go code looks great.
As for your use case, semver has the concept of 'pre-release versions'. The Go library we are using goes a bit into more detail what exactly is matched by constraints: https://github.com/Masterminds/semver#working-with-pre-release-versions

SemVer comparisons without a pre-release comparator will skip pre-release versions.

So if you include a pre-release in the semver constraint, it will match your examples:
semver:1.x.x-0 (which is the same as >=1.0.0-0) is the same as your suggested globsemver:v{1.x.x}-rc. (Also note that the v prefix is accepted/ignored by semver)

@rndstr thank you for the explanation. So the only benefit of globsemver is that you can have >2 environments to deploy to.
For example, a developer wants to deploy v1.0.0 first to dev environment, then to stg and then to prd.
Using v1.0.0-0 and semver allows him to have such a "flag" to distinguish between two environments (stg/prd), but he cannot deploy to(dev).
But I don't think it's worth complication of app anyway, closing the PR

I think there are valid use cases, for example where semver is only kind of followed.
As an example, what if I want the latest version of redis, but only the alpine images?

globsemver:{~5}-alpine: 5.0.4-alpine
semver:~5-alpine: 5.0.4 > 5.0.4-stretch > 5.0.4-alpine > 5.0.4-32bit if we're unlucky
glob:5.*-alpine: whichever 5.*-alpine image was pushed last

If you want to spin this further, globsemver:{~5}-alpine{~3}...


Handle NULL returned by channel.basicGet

If there is nothing in the queue, channel.basicGet returns null rather than a GetResponse. This does not conform to the assumption that this would be a blocking call. This means we'll need to convert this into a blocking call ourselves.

Take a look at how RabbitMQ does it's QueueingConsumer? This might be insightful.


[BUG] Workflows Scanner using SP Modernization Scanner Tool doesn't scan all sites from CSV

SharePoint Modernization Scanner tool doesn't scan all sites but doesn't throw any error either.
Issue :
We provided a CSV with approx. 1,15,000 SharePoint sites and csv doesn't have any header. We started running the scanner , it completed without any issues and folder also got created ; but it didn't scan all the sites ; It just scanned 10,000 out if it and even if we check error file ; it shows another 2,000 records.  This has been tried twice and we see the same behavior all the times

Please make your batches smaller + check the performance best practices: https://docs.microsoft.com/en-us/sharepoint/dev/transform/modernize-scanner-faq#whats-the-impact-of-running-a-scan-and-how-do-i-get-the-best-performance. Also consider turning on the "Don't use search" option on the last page of the scan wizard to further increase performance.

What data will I miss on to if we turn on "turning on the "Don't use search" option" ?

You'll miss Site views and site unique visitor data. Threads: 5 x processors you have on the machine...max 30

@VimmiRawat : were you able to scan your tenant using the given guidance? If so then please close this issue

@VimmiRawat : did you manage to get the scan working with above tips?

Hello,
I am working on it . Scanner actually takes a lot of time even for 25k sites . It’s approx. 1 day . Is it expected ?
Regards,
Vimmi
From: Bert Jansen<EMAIL_ADDRESS>Sent: Friday, December 11, 2020 9:07 AM
To: pnp/sp-dev-modernization<EMAIL_ADDRESS>Cc: Rawat, Vimmi<EMAIL_ADDRESS>Mention<EMAIL_ADDRESS>Subject: [External] Re: [pnp/sp-dev-modernization] [BUG] Workflows Scanner using SP Modernization Scanner Tool doesn't scan all sites from CSV (#558)
This message is from an EXTERNAL SENDER - be CAUTIOUS, particularly with links and attachments.

@VimmiRawathttps://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_VimmiRawat&d=DwMCaQ&c=eIGjsITfXP_y-DLLX0uEHXJvU8nOHrUK8IrwNKOtkVU&r=RxdAoBPFsyo_ysmJ6Zhb1B-Y7gjfjYc0tMXS6bZlNCM&m=LinKthmSD2nqZ2GaQVtdEr-YJcOENoZWbh2qUAGJSEc&s=LFtzWMTKFZk2h3SJl_51iDQF7ct4cb0hBg1psFnyomU&e= : did you manage to get the scan working with above tips?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_pnp_sp-2Ddev-2Dmodernization_issues_558-23issuecomment-2D742945531&d=DwMCaQ&c=eIGjsITfXP_y-DLLX0uEHXJvU8nOHrUK8IrwNKOtkVU&r=RxdAoBPFsyo_ysmJ6Zhb1B-Y7gjfjYc0tMXS6bZlNCM&m=LinKthmSD2nqZ2GaQVtdEr-YJcOENoZWbh2qUAGJSEc&s=Lm7p_LVV8HzeCU6LcL6Q9uTmQdLk6JPjfl3cv06oXnQ&e=, or unsubscribehttps://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_notifications_unsubscribe-2Dauth_AO54P62M3IFFRLKJ4SO6TJTSUGHVZANCNFSM4UJGY4JA&d=DwMCaQ&c=eIGjsITfXP_y-DLLX0uEHXJvU8nOHrUK8IrwNKOtkVU&r=RxdAoBPFsyo_ysmJ6Zhb1B-Y7gjfjYc0tMXS6bZlNCM&m=LinKthmSD2nqZ2GaQVtdEr-YJcOENoZWbh2qUAGJSEc&s=ELu8vQ_ofGIdbNKVZ4Omt6QfkBxflfPVUF0lRt2Wpag&e=.

This message is for the designated recipient only and may contain privileged, proprietary, or otherwise confidential information. If you have received it in error, please notify the sender immediately and delete the original. Any other use of the e-mail by you is prohibited. Where allowed by local law, electronic communications with Accenture and its affiliates, including e-mail and instant messaging (including content), may be scanned by our systems for the purposes of information security and assessment of internal compliance with Accenture policy. Your privacy is important to us. Accenture uses your personal data only in compliance with data protection laws. For further information on how Accenture processes your personal data, please see our privacy statement at https://www.accenture.com/us-en/privacy-policy.

www.accenture.com

Yes, that's abnormal. It's however better to not run too large batches...25K sites is quite large.

But , with company of our size ( approx, 4,80,000 SPO sites ) ; it's difficult to run the scanner with just 10 k sites as a batch as it will take more than a month to complete. Should we run the batch of 10k on 5 servers simultaneously and change the thread count ? If yes, what should we keep the thread count if we are running it on 5 servers at the same time ? If not , then ; what is the best and fastest way to run the scanner for some 5,00,000 sites ? Note : We can't wait for a month's time for this.

First step is assuring you follow the earlier mentioned performance guidance:
Please make your batches smaller + check the performance best practices: https://docs.microsoft.com/en-us/sharepoint/dev/transform/modernize-scanner-faq#whats-the-impact-of-running-a-scan-and-how-do-i-get-the-best-performance. Also consider turning on the "Don't use search" option on the last page of the scan wizard to further increase performance.
Import is to only check the workflow scan option, definitely do not do a full scan. Also I assume you're not scanning the each user's OneDrive for Business site, makes no sense to do that with regard to workflow.
The scanner uses multi threading in a way that it splits the given set of sites over the available threads, if you've sites with a ton of sub sites these will take a very long time as they're processed by a single thread. How many sites to scan in one go really depends on your environment, but if you follow above rules you should be able to run the scan for fairly large batches of sites. You can consider running a number of scans in parallel from multiple machines, but let's first get one scan run to successfully complete.

Closing per no feedback anymore

Closing per no feedback anymore


Core.cpp configuration

How GNames and GObjects mask/pattern should be?
\x00\x7D\x8D
xxx?xxx??
^^like that?

compiled


Database URI Getting Uploaded to Github through a json file.

Problem:
There is a config.json file which is tracked by git and it is revoking the security by adding the MongoDB URI to GitHub.
Solution:
Though the code base is using .env files, the config.json is not necessary in my opinion. If it gets removed then the security issues might get fixed.

ok. work on it @OINDIL


server hangs when changing imports

Description
When changing the imports of a file, Lean has to re-import the files. However, sometimes the Lean server (in VSCode) will just hang forever showing yellow bars, not making any progress for many mintutes. Reloading the window or restarting the file in VSCode will cause the Lean server to import the files correctly and be ready for use after a matter of seconds.
I have noticed this multiple times myself on Windows, and I have noticed this with various students and other people, I believe always on Windows. I think this is a Windows-only issue. EDIT: at least one Mac user also experiences this (see Zulip thread below).
I don't have a way to reliably reproduce this.
Possibly related: leanprover/lean4#3787
Zulip thread
Versions
vscode-lean v0.0.135 (and many other versions)
Lean 4.7.0-rc2 (and many other versions)
Windows 11 Home
Impact
Add :+1: to issues you consider important. If others are impacted by this issue, please ask them to add :+1: to it.

For what it is worth, I've never observed this on macos.

@fpvandoorn Do you still encounter this issue on 4.8.0?

Yes


Image / ImageField not expanded correctly

Templated-docs version: 0.3.1
Python version: 2.7.x
Operating System: Mac OSX 10.11

Description
While trying to expand an ImageField inside a template, we don't get the image in the resulting OpenOffice file.
What I Did
we create a Django ImageField object, and insert into the context, then we expand the template (an ODS) to another ODS. Everything is expanded (variables and objects) but not the image (sort of)
What we get
we unzip the resulting ODS, we see the image tag with the link to the subdir "Pictures/<ourfile.jpg>" but there is no "Pictures/" subdir in the resulting zip file, so this to us explains why it doesn't work as expected.
We have looked at the source code of the image tag, and indeed there doesn't seem to be an instruction to write anything to the Pictures subdir.
There is something in the init.py file, that seems to write in the Pictures/ subdir but it doesn't work for us.
We are pretty ignorant of the ODT/S format, but to us it seems it could not work if there is no embedded file in the zip. Is this assumption correct? If so, could we propose a patch?
Thanks
Z

Ok, we have found maybe a little typo:
On line 134 of init.py
   for _, image in context.dicts[0].get(IMAGES_CONTEXT_KEY, {}).items():
where
IMAGES_CONTEXT_KEY = '_templated_docs_imgs'
but for us, debugging the code, the relevant key in the context.dicts[0] is:
IMAGES_CONTEXT_KEY = 'ootemplate_imgs'
By doing this substitution we have managed to have the image written in the Pictures/ subdir. It still does not show up in the ODS file, but it seems more feasable now.

Hi, @zontarian , thanks for the report. You're right, that's just a silly typo. I'll fix it and roll out a new version.

Hi @alexmorozov, thanks!
But we have another thing to ask: as we said, the problem goes away only partly: the picture is saved inside the 'Pictures/' subfolder, but in our example, it is not showing up.
By unzipping and looking at the content, we see the tag is written without any obvious mistakes, but the image does not show up. Could you please do a little test on your part also?
We are using a spreadsheet at the moment.
Thanks!

Sure, I'll look into this as well.

Any news on the Images bug? :)

I'm facing the same issue, seeing in Zipped file I can see the image is properly placed, but when it creates the first odt file, it is not properly deployed. Is ther any alternative to solve the problem?

I'm facing the same issue, seeing in Zipped file I can see the image is properly placed, but when it creates the first odt file, it is not properly deployed. Is ther any alternative to solve the problem?

I offered a way to fix that (pull request)[https://github.com/alexmorozov/templated-docs/pull/20] and explained issue in comment there.
Generally, author uses straight px to cm conversion forgetting about dpi of the images.

Hi @alexmorozov , I have the same problem with images files. Please help us.
Thank


Update takes ages to complete

Hi,
I just don't know whether the update of this plugin is by download from the website file-by-file or whole zipped package to the install. It took almost an hour to complete.
Was Atom download alot of files from repo to update the plugin?
Kind regards
TN

It took almost an hour to complete.

An hour is crazy. Maybe a couple minutes, tops. Is your Internet very slow?
Regardless, we are working on improving the installation time. Thanks for your feedback.

This happens to me too on every update.  OSX 10.11.5, happened on Yosemite too.  If I just use the update functionality, it will sit there "updating" forever, with apm process taking 200% or more.  If I just kill Atom after a few minutes and relaunch, the update appears to have applied correctly.

If I just use the update functionality, it will sit there "updating" forever, with apm process taking 200% or more. If I just kill Atom after a few minutes and relaunch, the update appears to have applied correctly.

This is not an Atom-Beautify issue. This is a bug with settings-view.
See Issue https://github.com/atom/settings-view/issues/532 and Pull Request https://github.com/atom/settings-view/pull/771

This bug with settings-view has since been updated so a future Atom release should resolve this issue.


how to get auto complete control to not be constrained to the column?

ideally i'd like the popup typeahead to be able to float over the table and be any size - is there a trick to making that happen?

Sorry, I did not quite understand what you want to do.


Investigate publishing the Docker image on the new GitHub Package Registry

GitHub recently just released their Package Registry, so this issue is to investigate how (or if) to publish the Pode Docker images to their registry.
Docs: https://help.github.com/en/articles/configuring-docker-for-use-with-github-package-registry

On-hold, just awaiting beta confirmation.


DTS out of order with RTMP

Shaka streamer with rtmp url :-
Stream #0:1: Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 3999 kb/s, 30 fps, 30 tbr, 1k tbn, 60 tbc

ffmpeg -stream_loop -1 -re -loglevel warning -i rtmp://<IP_ADDRESS>/live/commet -f mpegts -vcodec copy -acodec copy -y /tmp/shaka-live-l9xznts7/c981326e-352a-4fff-9699-1ca7683c2eba

ffmpeg -stream_loop -1 -re -loglevel warning -i rtmp://<IP_ADDRESS>/live/commet -f mpegts -vcodec copy -acodec copy -y /tmp/shaka-live-l9xznts7/b5a06f54-b5e4-4299-96c0-46f4ec9c39d6

ffmpeg -y -thread_queue_size 100 -i /tmp/shaka-live-l9xznts7/c981326e-352a-4fff-9699-1ca7683c2eba -thread_queue_size 100 -i /tmp/shaka-live-l9xznts7/b5a06f54-b5e4-4299-96c0-46f4ec9c39d6 -map 0:0 -an -cmp chroma -f mpegts -preset ultrafast -c:v h264 -b:v 2M -bf 0 -pix_fmt yuv420p -flags +cgop -profile:v main -level:v 3.1 -keyint_min 60 -g 60 -vf scale=-2:480 /tmp/shaka-live-l9xznts7/28b66dc7-8a57-45ec-8498-3d0c5ab7bb06 -map 1:1 -vn -ac 2 -f mpegts -c:a aac -b:a 64k /tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8

packager 'init_segment=/RAM_Disk/out//audio_und_2c_64k_init.mp4,stream=audio,in=/tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8,segment_template=/RAM_Disk/out//audio_und_2c_64k_$Number$.m4s,' 'init_segment=/RAM_Disk/out//video_480p_2M_init.mp4,stream=video,in=/tmp/shaka-live-l9xznts7/28b66dc7-8a57-45ec-8498-3d0c5ab7bb06,segment_template=/RAM_Disk/out//video_480p_2M_$Number$.m4s,' --segment_duration 2 --time_shift_buffer_depth 50 --preserved_segments_outside_live_window 1 --suggested_presentation_delay 1 --minimum_update_period 4 --mpd_output /RAM_Disk/out/dash.mpd --io_block_size 65536

ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.5.0 (Ubuntu 5.5.0-12ubuntu1~16.04) 20171010
  configuration: --enable-gpl --enable-nonfree --enable-libx264 --enable-libmp3lame --enable-libfdk-aac --enable-libxml2 --enable-ffplay
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
[1105/181423:INFO:demuxer.cc(88)] Demuxer::Run() on file '/tmp/shaka-live-l9xznts7/28b66dc7-8a57-45ec-8498-3d0c5ab7bb06'.
[1105/181423:INFO:demuxer.cc(160)] Initialize Demuxer for file '/tmp/shaka-live-l9xznts7/28b66dc7-8a57-45ec-8498-3d0c5ab7bb06'.
[1105/181423:INFO:demuxer.cc(88)] Demuxer::Run() on file '/tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8'.
[1105/181423:INFO:demuxer.cc(160)] Initialize Demuxer for file '/tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8'.
Input #0, mpegts, from '/tmp/shaka-live-l9xznts7/c981326e-352a-4fff-9699-1ca7683c2eba':
  Duration: N/A, start: 1.400000, bitrate: N/A
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 117 kb/s
Input google/shaka-player#1, mpegts, from '/tmp/shaka-live-l9xznts7/b5a06f54-b5e4-4299-96c0-46f4ec9c39d6':
  Duration: N/A, start: 1.400000, bitrate: N/A
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream google/shaka-player#1:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream google/shaka-player#1:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 117 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream google/shaka-player#1:1 -> google/shaka-player#1:0 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[mpegts @ 0x21a5900] Thread message queue blocking; consider raising the thread_queue_size option (current value: 100)
[libx264 @ 0x21a7140] using SAR=1280/1281
[libx264 @ 0x21a7140] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x21a7140] profile Constrained Baseline, level 3.1
Output #0, mpegts, to '/tmp/shaka-live-l9xznts7/28b66dc7-8a57-45ec-8498-3d0c5ab7bb06':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: h264 (libx264), yuv420p, 854x480 [SAR 1280:1281 DAR 16:9], q=-1--1, 2000 kb/s, 30 fps, 90k tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.35.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: -1
[mpegts @ 0x225e1c0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 100)
[mpegts @ 0x21dd500] frame size not set
Output google/shaka-player#1, mpegts, to '/tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8':
  Metadata:
    encoder         : Lavf58.20.100
    Stream google/shaka-player#1:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 64 kb/s
    Metadata:
      encoder         : Lavc58.35. libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: -1
[mpegts @ 0x225e1c0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 100)
[mpegts @ 0x21dd500] frame size not set
Output google/shaka-player#1, mpegts, to '/tmp/shaka-live-l9xznts7/bee4f5c6-c812-4d02-aa19-053c8b9dbcc8':
  Metadata:
    encoder         : Lavf58.20.100
    Stream google/shaka-player#1:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 64 kb/s
    Metadata:
      encoder         : Lavc58.35.100 aac
[1105/181435:WARNING:es_parser_h26x.cc(334)] [MPEG-2 TS] PID 256 Possible GAP at dts 126000 with next sample at dts 129000 (difference 3000)
[1105/181437:WARNING:representation.cc(372)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Segments should not be overlapping. The new segment starts at 180312 but the previous segment ends at 180333.
[1105/181445:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 7 > kRoundingErrorGrace (5). The new segment starts at 1081008 but the previous segment ends at 1081001.
[1105/181512:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 6 > kRoundingErrorGrace (5). The new segment starts at 3601302 but the previous segment ends at 3601296.
[1105/181540:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 6 > kRoundingErrorGrace (5). The new segment starts at 5941873 but the previous segment ends at 5941867.
[1105/181609:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 7 > kRoundingErrorGrace (5). The new segment starts at 8280355 but the previous segment ends at 8280348.
[1105/181630:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 6 > kRoundingErrorGrace (5). The new segment starts at 10441203 but the previous segment ends at 10441197.
[1105/181644:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 6 > kRoundingErrorGrace (5). The new segment starts at 11521628 but the previous segment ends at 11521622.
[1105/181651:WARNING:representation.cc(362)] Representation (id=1,codec='mp4a.40.2',frequency=44100,language='') Found a gap of size 6 > kRoundingErrorGrace (5). The new segment starts at 12060795 but the previous segment ends at 12060789.

While playing the playback url:-
[dash @ 0x7ffaf0000940] DTS 4626000 < 4983000 out of order]
repeating the same segment util the segment disappears on the folder, later for every 2 seconds the video stops for 5 seconds up to last segment.
If i increase the seconds in time_Shift_Buffer_Depth then it will play the segments for that
particular time,later same issue repeat.
Can any one guide me how to resolve the issue,what are the changes i need to do in the shaka-streamer

We don't yet support RTMP in Shaka Streamer (see google/shaka-streamer#16), and I'm not sure we could reproduce this issue without access to your private stream.  (I noticed a private IP range on the URL.)
It's possible that the "DTS out of order" error is a problem in the input.  Where does this particular RTMP stream come from?  What generates it?
Also, I'm going to transfer this issue to the streamer repo.

we are generating rtmp through node rtmp

Can you please give us some way to reproduce your results?  Some details on how you are generating the RTMP stream?

Thanks for the response.
By using node-media-server (node.js) and ffmpeg converting the mp4 video file with (h264 video and audio aac codecs) to rtmp url.
node app.js
ffmpeg -re -i  sample.mp4  -c copy -f flv rtmp://localhost/live/commet
Using the rtmp url in shaka streamer

Can you provide us with a more complete set of instructions to reproduce the issue?  Please assume we know nothing about node-media-server, and please provide any source material you're starting with.

1)Creating a new folder nms , then i perform the steps  as it is which was present in below link.
->This is the link where i follow the steps to generate the rtmp url  with node.js:-
click:- https://www.npmjs.com/package/node-media-server
2)Git version:-
mkdir nms
cd nms
git clone https://github.com/illuspas/Node-Media-Server
npm i
node app.js
npm version (recommended):-
mkdir nms
cd nms
npm install node-media-server
->create a new file app.js  and open the file ,copy the below content to the app.js file:-
vi app.js
#---------------------------------------copy the below content------------------
const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1935,
chunk_size: 60000,
gop_cache: true,
ping: 30,
ping_timeout: 60
},
http: {
port: 8000,
allow_origin: '*'
}
};
var nms = new NodeMediaServer(config)
nms.run();
#-----------------------------------------------copied up to here------------------------------
Then run the node app.js in one terminal and ffmpeg in another terminal
a)node app.js
b)ffmpeg -re -i sample.mp4 -c copy -f flv rtmp://localhost/live/commet
Like this way i am generating the rtmp url. Then inserting this rtmp url to "input_looped_file_config.yaml" for both audio and video.
Make changes in the pipeline_live_config.yaml according to us
->vi pipeline_live_config.yaml
streaming_mode: live
transcoder:
A list of resolutions to encode.
resolutions:
- 720p
- 480p
#- 360p
#- 240p
#- 144p

The number of audio channels to output.
channels: 2
The codecs to encode with.
audio_codecs:
- aac
video_codecs:
- h264
packager:
Manifest format (dash, hls, or both)
manifest_format:
- dash
- hls
Length of each segment in seconds.
segment_size: 2
Availability window, or the number of seconds a segment remains available.
availability_window: 200
Presentation delay, or how far back from the edge the player should be.
presentation_delay: 50
Update period, or how often the player should fetch a new manifest.
update_period: 4
After that the below command line executed in that terminal
python3 shaka-streamer -i config_files/input_looped_file_config.yaml  -p config_files/pipeline_live_config.yaml  -o /var/www/html/dash/
All these operation is done in the ("UBUNTU LTS 16.04 OS")

Thank you for the instructions.  You still have not provided your sample.mp4 file, which could be key to reproducing your issue.
In particular, your command ffmpeg -re -i sample.mp4 -c copy -f flv rtmp://localhost/live/commet copies the input to FLV, which requires certain audio sample rates (44100, 22050, or 11025) and certain codecs (aac, for example).  So not just any MP4 will do.
You also left out the contents of your input config file.
I've tried to reproduce your issue by recreating the missing pieces.
I created my own sample.mp4 from known-good content with:
ffmpeg \
    -t 60 -i Sintel.2010.720p.mkv \
    -ac 2 -ar 44100 \
    -c:v h264 -b:v 4M \
    -c:a aac -b:a 128k \
    sample.mp4

This is 60 seconds of Sintel, in stereo, 44.1kHz AAC, 720p h264, 4Mbps.
Your pipeline config is in an older format, so I'm guessing you're using v0.1 of the application.  Please update to a newer build, either from source or with pip3 install --upgrade shaka-streamer.
In spite of the fact that we don't officially support RTMP yet (see #16), I've gotten this working without changing any of the Streamer code.  I think I see the issue, and it's with your ffmpeg commands.
You're taking your sample.mp4 and sending it to RTMP, then asking Streamer to create a loop for you.  For a networked input like this, you need to have the RTMP input be unending instead.  So you need to loop that mp4 in your ffmpeg command.
ffmpeg -stream_loop -1 -re -i sample.mp4 -c copy -f flv rtmp://localhost/live/commet

Then, your pipeline config (updated to the current format) would be:
streaming_mode: live
resolutions:
  - 480p
audio_codecs:
  - aac
video_codecs:
  - h264
manifest_format:
  - dash
segment_size: 2
availability_window: 200
presentation_delay: 50
update_period: 4

And your input config would be (note the lack of input_type: looped_file):
inputs:
  - name: rtmp://localhost/live/commet
    media_type: video

  - name: rtmp://localhost/live/commet
    media_type: audio

This works for me, and plays fine in the latest version of Shaka Player.
Does this help?

Details of sample.mp4:
$ mediainfo BangladeshInnings2nd.mp4
General
Complete name                            : BangladeshInnings2nd.mp4
Format                                   : MPEG-4
Format profile                           : Adobe Flash
Codec ID                                 : f4v  (isom/mp42/m4v )
File size                                : 690 MiB
Duration                                 : 23mn 20s
Overall bit rate mode                    : Variable
Overall bit rate                         : 4 134 Kbps
Encoded date                             : UTC 2019-05-17 17:55:14
Tagged date                              : UTC 2019-05-17 17:55:14
Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile<EMAIL_ADDRESS>Format settings, CABAC                   : Yes
Format settings, ReFrames                : 1 frame
Format settings, GOP                     : M=1, N=60
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 23mn 20s
Bit rate mode                            : Constant
Bit rate                                 : 4 000 Kbps
Width                                    : 1 280 pixels
Height                                   : 720 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Variable
Frame rate                               : 30.000 fps
Minimum frame rate                       : 1.751 fps
Maximum frame rate                       : 30.303 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.145
Stream size                              : 668 MiB (97%)
Title                                    : WowzaStreamingEngine
Language                                 : English
Encoded date                             : UTC 2019-05-17 17:55:14
Tagged date                              : UTC 2019-05-17 17:55:14
Audio
ID                                       : 2
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Format profile                           : LC
Codec ID                                 : 40
Duration                                 : 23mn 20s
Bit rate mode                            : Variable
Bit rate                                 : 129 Kbps
Channel(s)                               : 2 channels
Channel positions                        : Front: L R
Sampling rate                            : 44.1 KHz
Frame rate                               : 43.066 fps (1024 spf)
Compression mode                         : Lossy
Stream size                              : 21.5 MiB (3%)
Title                                    : WowzaStreamingEngine
Language                                 : English
Encoded date                             : UTC 2019-05-17 17:55:14
Tagged date

Thanks for your reply, but can i get some more detail information regarding of the issue and its solution

May i know what are the contents i left in the input_config files.
If you don't mind can you please explain me in step by step method how you are approaching and what are the changes you made for resolving the issue and what are the changes i need to do to resolve the issue on my side.

Here i am using the upgrade version of shaka-streamer but it is not taking the version of shaka-packager

can you help me how to resolve the issue

We require Shaka Packager v2.1 or above.  If you have a pre-release version built from source, you'll need to:

Verify that it is newer than the v2.1 tag
Get the latest Shaka Streamer source code from github
Run it with the option --skip_deps_check to bypass the version number check on Shaka Packager

The --skip_deps_check option will appear in Streamer v0.4, which has yet to be released on PyPI.
After that, you should use the commands and config files I showed you in my earlier comment.  (ffmpeg -stream_loop -1 when streaming to the RTMP encoder, and use the input config I showed you without looped_file.)
If that doesn't work for you, you'll need to send us the actual MP4 source file you're using, not just the output of mediainfo on it.  I can't reproduce a specific failure with mediainfo output alone.
Does this help?

Thanks for your help.
In shaka player its working fine and the same issue showing in the ffplay .
In vod content the normal file is working fine, when it was rtmp is showing below errors  though iam using  --skip_deps_check option in shaka-streamer.

error is:-
new_shaka/new-shaka-streamer/shaka-streamer$ python3 shaka-streamer -i config_files/input_vod_config.yaml -p config_files/pipeline_vod_config.yaml  --skip_deps_check -o /var/www/html/vod/
Traceback (most recent call last):
File "shaka-streamer", line 126, in
sys.exit(main())
File "shaka-streamer", line 91, in main
input_config_dict = yaml.safe_load(f)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/init.py", line 162, in safe_load
return load(stream, SafeLoader)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/init.py", line 114, in load
return loader.get_single_data()
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/constructor.py", line 41, in get_single_data
node = self.get_single_node()
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 36, in get_single_node
document = self.compose_document()
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 55, in compose_document
node = self.compose_node(None, None)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 84, in compose_node
node = self.compose_mapping_node(anchor)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 133, in compose_mapping_node
item_value = self.compose_node(node, item_key)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 82, in compose_node
node = self.compose_sequence_node(anchor)
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/composer.py", line 110, in compose_sequence_node
while not self.check_event(SequenceEndEvent):
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/parser.py", line 98, in check_event
self.current_event = self.state()
File "/home/indudhar/.local/lib/python3.5/site-packages/yaml/parser.py", line 393, in parse_block_sequence_entry
"expected , but found %r" % token.id, token.start_mark)
yaml.parser.ParserError: while parsing a block collection
in "config_files/input_vod_config.yaml", line 22, column 4
expected , but found ''
in "config_files/input_vod_config.yaml", line 24, column 5
indudhar@gaian-lap253:~/new_shaka/new-shaka-streamer/shaka-streamer

Thank you for your help and its playing fine in shaka-player for both (live+vod),(encrypted+non encrypted ) playback url.
But in ffplay the above issue is not resolved .

While playing encrypted live+vod content in shakaplayer its not playing and throwing the issue :-
Shaka Error MANIFEST.RESTRICTIONS_CANNOT_BE_MET ([object Object])

the mpd file

AAAALXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAA0iBWZsdXRlSOPclZsG

AAAALXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAA0iBWZsdXRlSOPclZsG

--------------------------------------------------------------------------------------------------------------------------------------

The mpd file is :

AAAALXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAA0iBWZsdXRlSOPclZsG

AAAALXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAA0iBWZsdXRlSOPclZsG

I'm unable to reproduce your results.  Please wait for the 0.4 release with documented RTMP support.

yes you can close the isssue

Thanks!  Let us know if we can do anything else for you.


X.A.Submap, X.U.Ungrab: Sync after ungrab (fixes issues with runProcessWithInput)

Description
When runProcessWithInput is invoked immediately after ungrabPointer/ungrabKeyboard, we don't actually ungrab at all because runProcessWithInput blocks and the ungrab requests wait in Xlib's queue for a request that needs a queue flush.
Common uses of unGrab (before spawn) aren't followed by a blocking action, so the ungrab requests are flushed by xmonad's main loop, and this is merely a timing issue—fork/exec takes a while and xmonad probably manages to get back to its main loop in time. Uses of runProcessWithInput in ordinary non-submap key bindings happen to work because key bindings are passive grabs—the grab is released by the user's fingers releasing the key itself, even if xmonad's ungrab requests are stuck in a blocked queue. Submap key bindings, however, take an active grab and therefore need to ungrab explicitly.
Easy fix—explicit sync.
Fixes: https://github.com/xmonad/xmonad/issues/313
Checklist

[X] I've read CONTRIBUTING.md

[X] I've considered how to best test these changes (property, unit,
manually, ...) and concluded:
Appears to have fixed the issue and I'll ask the reporter of https://github.com/xmonad/xmonad/issues/313 to verify.

[X] I updated the CHANGES.md file

n/a I updated the XMonad.Doc.Extending file (if appropriate)

It just occurred to me that we might also (or perhaps only) want sync in runProcessWithInput to always flush pending requests, even if runProcessWithInput is used elsewhere. Probably won't harm anything, will it?

I don't think it'll hurt anything, but I'm also not sure it's runProcessWithInput's job.

It's not its job, but it's probably the only thing in xmonad(-contrib) that blocks, so it's understandable that everything else assumes explicit sync is unnecessary. It'd be a hack, but then the entire Xlib kind of is. :-))

On the other hand it might be completely unnecessary. We won't know until someone files another bug, and that may never happen (even if there is one!).

Let's just merge this as it is; should it ever break again, I'll add that other sync.


duplicate method StreamID version 0.15.2

Updating to the latest libp2p quic release is causing CI to fail for the following error:
../../../../pkg/mod/github.com/lucas-clemente/quic-go@v0.15.2/interface.go:54:2: duplicate method StreamID
../../../../pkg/mod/github.com/lucas-clemente/quic-go@v0.15.2/stream.go:44:2: duplicate method StreamID

You need Go 1.14.

Yea that would be it. What exactly does go 1.14 do to alleviate this? I don't recall anything in the release notes about ignoring duplicate methods

That was one of the new features of this release.


Improve AWS IAM Identity Center integration provisioning role

Background
Some background: the modules/aws-idc-integration/iam-roles folder in this repository contains a Terraform module for deploying AWS IAM roles with a trust relationship to the Common Fate deployment. There are two roles:

A read role, allowing Common Fate to sync IAM Identity Center resources
A provision role, allowing Common Fate to (de)provision access to IAM Identity Center account assignments

The module has variables allowing the permissions to be customised according to customer use cases. One such use case is the ability to provision access to the AWS organization root account. This use case requires additional privileges, because the AWS IAM Identity Center Service Linked Role is not used when provisioning access to the org root account. The Service Linked Role uses the AWSSSOServiceRolePolicy managed policy.
Prior to this PR, the provision role had an IAM policy allowing the iam:UpdateSAMLProvider action to be performed. We performed some internal testing today after receiving a customer inquiry about this. Our testing revealed that this action is required when provisioning access to the org root account, but otherwise is not required in the policy.
When provisioning access to the org root account, you'll get an error like this if the action is not allowed:
Access denied by IAM. Please check your policy, or wait for role propagation to complete. IAM Error: User: arn:aws:sts::123456789012:assumed-role/role-name/session-name is not authorized to perform: iam:UpdateSAMLProvider on resource: arn:aws:iam::123456789012:saml-provider/AWSSSO_1234567890abcdef_DO_NOT_DELETE because no identity-based policy allows the iam:UpdateSAMLProvider action

Looking through our internal documentation, the iam:UpdateSAMLProvider action was added to our integration policies around 12 months ago (as part of our Glide open source project which has now been sunset in favour of our commercial platform). The testing that was performed then was on the organization root account, but the action was mistakenly added to the default integration policy. This error was carried over into our Terraform module.
Changes
This PR shifts the iam:UpdateSAMLProvider to be added to the policy only when the permit_management_account_assignments variable is true.
Additionally, this PR adds a few statements from the AWSSSOServiceRolePolicy managed policy to the provisioner policy when permit_management_account_assignments is true, specifically:
{
        # this statement is taken from the AWSSSOServiceRolePolicy managed policy
        "Sid" : "IAMSAMLProviderUpdateAction",
        "Effect" : "Allow",
        "Action" : [
          "iam:UpdateSAMLProvider"
        ],
        "Resource" : [
          "arn:aws:iam::*:saml-provider/AWSSSO_*"
        ]
      },
      {
        # this statement is taken from the AWSSSOServiceRolePolicy managed policy
        "Sid" : "IAMSAMLProviderCleanupActions",
        "Effect" : "Allow",
        "Action" : [
          # "iam:DeleteSAMLProvider", - removed here out of an abundance of caution, shouldn't be required for provisioning JIT access to the management account.
          "iam:GetSAMLProvider"
        ],
        "Resource" : [
          "arn:aws:iam::*:saml-provider/AWSSSO_*"
        ]
      },
      {
        # this statement is taken from the AWSSSOServiceRolePolicy managed policy
        "Sid" : "IAMRoleCleanupActions",
        "Effect" : "Allow",
        "Action" : [
          "iam:DeleteRole",
          "iam:DeleteRolePolicy",
          "iam:DetachRolePolicy",
          "iam:ListRolePolicies",
          "iam:ListAttachedRolePolicies"
        ],
        "Resource" : [
          "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*"
        ]
      },
      {
        "Sid" : "AssignManagementAccountIDC",
        "Effect" : "Allow",
        "Action" : [
          "iam:AttachRolePolicy",
          "iam:CreateRole",
          "iam:PutRolePolicy",
          "iam:UpdateRole",
          "iam:UpdateRoleDescription",
          "iam:UpdateAssumeRolePolicy",
          "iam:PutRolePermissionsBoundary",
          "iam:DeleteRolePermissionsBoundary"
        ],
        "Resource" : "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*",
        "Condition" : {
          "StringEquals" : { // note that an $$ escape is used here so that terraform doesn't try to interpolate this string
            "aws:PrincipalOrgMasterAccountId" : "$${aws:PrincipalAccount}"
          }
        }
      }

I believe that these actions will prevent edge cases causing provisioning errors in the org root account (such as updating the description of an SSO permission set, and then trying to request it in the org root account). Also, changing the statement IDs (the Sid field) to align with the AWSSSOServiceRolePolicy makes it easier to explain the permissions and show the similarity to the Service-Linked Role.

This has been tested and working in an internal deployment


Global cleanup without zones

Have you thought about implementing a global cleanup without zones? You say in the description that "you are going to want a zone to represent all the zones, so you can send it off to clean each room in one go", but what about this?: If the 'zones' value is not in the accessory configuration, the vacuum's behavior is the same that in the original homebridge-xiaomi-roborock-vacuum plugin.
What do you think?

Should be solved by last commit. If you don't provide zone config it should do a normal cleanup. I know people wanted this and out of the country for a few months so someone is gonna have to test it and report back. In theory it works.
https://github.com/Smileydude/homebridge-xiaomi-roborock-vacuum/commit/7060fd4f02cab7f925a16cd625f207c113ecdf35


Multiple asserts on same selector

If in a "then" assertion you test different conditions on the same selector, e.g.:
"#myDiv span": should.haveText "This text"
"#myDiv span": should.match 1
only the second assertion is picked up by witness.

Try using an array:
"#myDiv span": [
  should.haveText "This text"
  should.match 1
]

Yep, that works - thanks.


Reconnect not paying attention to Disable/Enable in Connections.

With Reconnect enabled, using the disable button in connections (especially in debugging and programming against), it seems the reconnection loop is not properly closed out and after 5 seconds it reconnects.
Re-enabling creates another connection to my Websocket and I can quickly have multiple connections from the same Companion instance.

Thanks for feedback, PR is awaiting - it fixes registering timer twice (on error and on close) and now timer will be correctly destroyed on destroy.