Kea configuration of first entry gets overwritten by new entries

Important notices
Before you add a new report, we ask you kindly to acknowledge the following:

[x] I have read the contributing guide lines at https://github.com/opnsense/core/blob/master/CONTRIBUTING.md
[x] I am convinced that my issue is new after having checked both open and closed issues at https://github.com/opnsense/core/issues?q=is%3Aissue

Describe the bug
We have multiple subnets in Kea.
When we add a new one without "Auto collect option data" the Gateway and DNS servers of the first entry are overwritten by the values used in the new subnet.
There are also inconsistencies between the Kea API and the opnsense user interface (see Screenshots).
To Reproduce
Steps to reproduce the behavior:

Create multiple subnets with manual gateway and dns server in Kea.
Add a new subnet with manual gateway and dns server.
Check the gateway and dns server for the first subnet in the list

Expected behavior
The first entry should not be overwritten
Screenshots
This is the interface configuration in the user interface (<IP_ADDRESS>/24 net look correct, <IP_ADDRESS>/24 has a wrong gateway and dns from a subnet we added later):

This is what the API returns (<IP_ADDRESS>/24 net look correct, <IP_ADDRESS>/24 has a wrong gateway and dns):
[
  {
    "arguments": {
      "Dhcp4": {
        "allocator": "iterative",
        "authoritative": false,
        "boot-file-name": "",
        "calculate-tee-times": false,
        "control-socket": {
          "socket-name": "/var/run/kea4-ctrl-socket",
          "socket-type": "unix"
        },
        "ddns-generated-prefix": "myhost",
        "ddns-override-client-update": false,
        "ddns-override-no-update": false,
        "ddns-qualifying-suffix": "",
        "ddns-replace-client-name": "never",
        "ddns-send-updates": true,
        "ddns-update-on-renew": false,
        "ddns-use-conflict-resolution": true,
        "decline-probation-period": 86400,
        "dhcp-ddns": {
          "enable-updates": false,
          "max-queue-size": 1024,
          "ncr-format": "JSON",
          "ncr-protocol": "UDP",
          "sender-ip": "<IP_ADDRESS>",
          "sender-port": 0,
          "server-ip": "<IP_ADDRESS>",
          "server-port": 53001
        },
        "dhcp-queue-control": {
          "capacity": 64,
          "enable-queue": false,
          "queue-type": "kea-ring4"
        },
        "dhcp4o6-port": 0,
        "early-global-reservations-lookup": false,
        "echo-client-id": true,
        "expired-leases-processing": {
          "flush-reclaimed-timer-wait-time": 25,
          "hold-reclaimed-time": 3600,
          "max-reclaim-leases": 100,
          "max-reclaim-time": 250,
          "reclaim-timer-wait-time": 10,
          "unwarned-reclaim-cycles": 5
        },
        "hooks-libraries": [
          {
            "library": "/usr/local/lib/kea/hooks/libdhcp_lease_cmds.so",
            "parameters": {}
          }
        ],
        "host-reservation-identifiers": [
          "hw-address",
          "duid",
          "circuit-id",
          "client-id"
        ],
        "hostname-char-replacement": "",
        "hostname-char-set": "[^A-Za-z0-9.-]",
        "interfaces-config": {
          "interfaces": [
            "vlan0.100",
            "vlan0.120",
            "vlan0.50",
            "vlan0.70",
            "vlan0.90"
          ],
          "re-detect": true
        },
        "ip-reservations-unique": true,
        "lease-database": { "persist": true, "type": "memfile" },
        "loggers": [
          {
            "debuglevel": 0,
            "name": "kea-dhcp4",
            "output_options": [
              { "flush": true, "output": "syslog", "pattern": "" }
            ],
            "severity": "INFO"
          }
        ],
        "match-client-id": true,
        "multi-threading": {
          "enable-multi-threading": true,
          "packet-queue-size": 64,
          "thread-pool-size": 0
        },
        "next-server": "<IP_ADDRESS>",
        "option-data": [],
        "option-def": [],
        "parked-packet-limit": 256,
        "reservations-global": false,
        "reservations-in-subnet": true,
        "reservations-lookup-first": false,
        "reservations-out-of-pool": false,
        "sanity-checks": {
          "extended-info-checks": "fix",
          "lease-checks": "warn"
        },
        "server-hostname": "",
        "server-tag": "",
        "shared-networks": [],
        "statistic-default-sample-age": 0,
        "statistic-default-sample-count": 20,
        "store-extended-info": false,
        "subnet4": [
          {
            "4o6-interface": "",
            "4o6-interface-id": "",
            "4o6-subnet": "",
            "allocator": "iterative",
            "calculate-tee-times": false,
            "id": 1,
            "max-valid-lifetime": 4000,
            "min-valid-lifetime": 4000,
            "option-data": [
              {
                "always-send": false,
                "code": 6,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "domain-name-servers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 3,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "routers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 15,
                "csv-format": true,
                "data": "localdomain",
                "name": "domain-name",
                "never-send": false,
                "space": "dhcp4"
              }
            ],
            "pools": [
              { "option-data": [], "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
            ],
            "relay": { "ip-addresses": [] },
            "reservations": [
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xxxxxxxxxxxxxx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              }
            ],
            "store-extended-info": false,
            "subnet": "<IP_ADDRESS>/24",
            "t1-percent": 0.5,
            "t2-percent": 0.875,
            "valid-lifetime": 4000
          },
          {
            "4o6-interface": "",
            "4o6-interface-id": "",
            "4o6-subnet": "",
            "allocator": "iterative",
            "calculate-tee-times": false,
            "id": 2,
            "max-valid-lifetime": 4000,
            "min-valid-lifetime": 4000,
            "option-data": [
              {
                "always-send": false,
                "code": 6,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "domain-name-servers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 3,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "routers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 15,
                "csv-format": true,
                "data": "localdomain",
                "name": "domain-name",
                "never-send": false,
                "space": "dhcp4"
              }
            ],
            "pools": [
              { "option-data": [], "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
            ],
            "relay": { "ip-addresses": [] },
            "reservations": [],
            "store-extended-info": false,
            "subnet": "<IP_ADDRESS>/24",
            "t1-percent": 0.5,
            "t2-percent": 0.875,
            "valid-lifetime": 4000
          },
          {
            "4o6-interface": "",
            "4o6-interface-id": "",
            "4o6-subnet": "",
            "allocator": "iterative",
            "calculate-tee-times": false,
            "id": 3,
            "max-valid-lifetime": 4000,
            "min-valid-lifetime": 4000,
            "option-data": [
              {
                "always-send": false,
                "code": 6,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "domain-name-servers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 3,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "routers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 15,
                "csv-format": true,
                "data": "localdomain",
                "name": "domain-name",
                "never-send": false,
                "space": "dhcp4"
              }
            ],
            "pools": [
              { "option-data": [], "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
            ],
            "relay": { "ip-addresses": [] },
            "reservations": [
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              }
            ],
            "store-extended-info": false,
            "subnet": "<IP_ADDRESS>/24",
            "t1-percent": 0.5,
            "t2-percent": 0.875,
            "valid-lifetime": 4000
          },
          {
            "4o6-interface": "",
            "4o6-interface-id": "",
            "4o6-subnet": "",
            "allocator": "iterative",
            "calculate-tee-times": false,
            "id": 4,
            "max-valid-lifetime": 4000,
            "min-valid-lifetime": 4000,
            "option-data": [
              {
                "always-send": false,
                "code": 6,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "domain-name-servers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 3,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "routers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 15,
                "csv-format": true,
                "data": "localdomain",
                "name": "domain-name",
                "never-send": false,
                "space": "dhcp4"
              }
            ],
            "pools": [
              { "option-data": [], "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
            ],
            "relay": { "ip-addresses": [] },
            "reservations": [
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              },
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              },
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              },
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              },
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              },
              {
                "boot-file-name": "",
                "client-classes": [],
                "hostname": "",
                "hw-address": "xx:xx:xx:xx:xx:xx",
                "ip-address": "<IP_ADDRESS>",
                "next-server": "<IP_ADDRESS>",
                "option-data": [],
                "server-hostname": ""
              }
            ],
            "store-extended-info": false,
            "subnet": "<IP_ADDRESS>/24",
            "t1-percent": 0.5,
            "t2-percent": 0.875,
            "valid-lifetime": 4000
          },
          {
            "4o6-interface": "",
            "4o6-interface-id": "",
            "4o6-subnet": "",
            "allocator": "iterative",
            "calculate-tee-times": false,
            "id": 5,
            "max-valid-lifetime": 4000,
            "min-valid-lifetime": 4000,
            "option-data": [
              {
                "always-send": false,
                "code": 6,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "domain-name-servers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 3,
                "csv-format": true,
                "data": "<IP_ADDRESS>",
                "name": "routers",
                "never-send": false,
                "space": "dhcp4"
              },
              {
                "always-send": false,
                "code": 15,
                "csv-format": true,
                "data": "localdomain",
                "name": "domain-name",
                "never-send": false,
                "space": "dhcp4"
              }
            ],
            "pools": [
              { "option-data": [], "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
            ],
            "relay": { "ip-addresses": [] },
            "reservations": [],
            "store-extended-info": false,
            "subnet": "<IP_ADDRESS>/22",
            "t1-percent": 0.5,
            "t2-percent": 0.875,
            "valid-lifetime": 4000
          }
        ],
        "t1-percent": 0.5,
        "t2-percent": 0.875,
        "valid-lifetime": 4000
      },
      "hash": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "result": 0
  }
]

Relevant log files
If applicable, information from log files supporting your claim.
Additional context
Add any other context about the problem here.
Environment
Software version used and hardware type if relevant, e.g.:
OPNsense 24.1.2_1-amd64
FreeBSD 13.2-RELEASE-p10
OpenSSL 3.0.13
Intel(R) Xeon(R) Gold 6326 CPU @ 2.90GHz (8 cores, 8 threads)

best check the contents of /usr/local/etc/kea/kea-dhcp4.conf as that is what we generate.

@AdSchellevis
Hmm, kea-dhcp4.conf matches the values in the web interface. Not sure why the API yields different values.

Hi have same issue, and when I edit any non-first entry and save, first entry get corrupted even in kea-dhcp4.conf

A kea-dhcp4.conf file combined with the kea configuration section (in config.xml) might help track possible issues....

@AdSchellevis
config.xml after first subnet:
  <Kea>
      <ctrl_agent version="0.0.1">
        <general>
          <enabled>1</enabled>
          <http_host><IP_ADDRESS></http_host>
          <http_port>8000</http_port>
        </general>
      </ctrl_agent>
      <dhcp4 version="1.0.0">
        <general>
          <enabled>1</enabled>
          <interfaces>opt20</interfaces>
          <valid_lifetime>4000</valid_lifetime>
          <fwrules>0</fwrules>
        </general>
        <ha>
          <enabled>0</enabled>
          <this_server_name/>
        </ha>
        <subnets>
          <subnet4 uuid="b3b776e5-0cfc-4510-b80a-9210ec814f4c">
            <subnet><IP_ADDRESS>/24</subnet>
            <option_data_autocollect>0</option_data_autocollect>
            <option_data>
              <domain_name_servers><IP_ADDRESS></domain_name_servers>
              <routers><IP_ADDRESS></routers>
              <domain_name/>
              <ntp_servers/>
              <tftp_server_name/>
              <boot_file_name/>
            </option_data>
            <pools><IP_ADDRESS>-<IP_ADDRESS></pools>
          </subnet4>
        </subnets>
        <reservations/>
        <ha_peers/>
      </dhcp4>
    </Kea>

kea-dhcp4.conf after first subnet:
{
    "Dhcp4": {
        "valid-lifetime": 4000,
        "interfaces-config": {
            "interfaces": ["vlan0.803"]
        },
        "lease-database": {
            "type": "memfile",
            "persist": true
        },
        "control-socket": {
            "socket-type": "unix",
            "socket-name": "/var/run/kea4-ctrl-socket"
        },
        "loggers": [
            {
                "name": "kea-dhcp4",
                "output_options": [
                    {
                        "output": "syslog"
                    }
                ],
                "severity": "INFO"
            }
        ],
        "subnet4": [
            {
                "id": 1,
                "subnet": "<IP_ADDRESS>/24",
                "option-data": [
                    {
                        "name": "domain-name-servers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "routers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "domain-name",
                        "data": "localdomain"
                    }
                ],
                "pools": [
                    { "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
                ],
                "reservations": [
                ]
            }
        ]
        ,"hooks-libraries": [
            {
                "library": "/usr/local/lib/kea/hooks/libdhcp_lease_cmds.so",
                "parameters": { }
            },
        ]
    }
}

config.xml after second subnet added:
  <Kea>
      <ctrl_agent version="0.0.1">
        <general>
          <enabled>1</enabled>
          <http_host><IP_ADDRESS></http_host>
          <http_port>8000</http_port>
        </general>
      </ctrl_agent>
      <dhcp4 version="1.0.0">
        <general>
          <enabled>1</enabled>
          <interfaces>opt20</interfaces>
          <valid_lifetime>4000</valid_lifetime>
          <fwrules>0</fwrules>
        </general>
        <ha>
          <enabled>0</enabled>
          <this_server_name/>
        </ha>
        <subnets>
          <subnet4 uuid="b3b776e5-0cfc-4510-b80a-9210ec814f4c">
            <subnet><IP_ADDRESS>/24</subnet>
            <option_data_autocollect>0</option_data_autocollect>
            <option_data>
              <domain_name_servers><IP_ADDRESS></domain_name_servers>
              <routers><IP_ADDRESS></routers>
              <domain_name/>
              <ntp_servers/>
              <tftp_server_name/>
              <boot_file_name/>
            </option_data>
            <pools><IP_ADDRESS>-<IP_ADDRESS></pools>
          </subnet4>
          <subnet4 uuid="07b8fa5b-7754-4c59-8694-a75df52f468c">
            <subnet><IP_ADDRESS>/24</subnet>
            <option_data_autocollect>0</option_data_autocollect>
            <option_data>
              <domain_name_servers><IP_ADDRESS></domain_name_servers>
              <routers><IP_ADDRESS></routers>
              <domain_name/>
              <ntp_servers/>
              <tftp_server_name/>
              <boot_file_name/>
            </option_data>
            <pools><IP_ADDRESS>-<IP_ADDRESS></pools>
          </subnet4>
        </subnets>
        <reservations/>
        <ha_peers/>
      </dhcp4>
    </Kea>

kea-dhcp4.conf after second subnet:
{
    "Dhcp4": {
        "valid-lifetime": 4000,
        "interfaces-config": {
            "interfaces": ["vlan0.803"]
        },
        "lease-database": {
            "type": "memfile",
            "persist": true
        },
        "control-socket": {
            "socket-type": "unix",
            "socket-name": "/var/run/kea4-ctrl-socket"
        },
        "loggers": [
            {
                "name": "kea-dhcp4",
                "output_options": [
                    {
                        "output": "syslog"
                    }
                ],
                "severity": "INFO"
            }
        ],
        "subnet4": [
            {
                "id": 1,
                "subnet": "<IP_ADDRESS>/24",
                "option-data": [
                    {
                        "name": "domain-name-servers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "routers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "domain-name",
                        "data": "localdomain"
                    }
                ],
                "pools": [
                    { "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
                ],
                "reservations": [
                ]
            },
            {
                "id": 2,
                "subnet": "<IP_ADDRESS>/24",
                "option-data": [
                    {
                        "name": "domain-name-servers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "routers",
                        "data": "<IP_ADDRESS>"
                    },
                    {
                        "name": "domain-name",
                        "data": "localdomain"
                    }
                ],
                "pools": [
                    { "pool": "<IP_ADDRESS>-<IP_ADDRESS>" }
                ],
                "reservations": [
                ]
            }
        ]
        ,"hooks-libraries": [
            {
                "library": "/usr/local/lib/kea/hooks/libdhcp_lease_cmds.so",
                "parameters": { }
            },
        ]
    }
}

@moogle19 from my perspective this looks good, same as specified in https://kea.readthedocs.io/en/latest/arm/dhcp4-srv.html or am I missing something?

@AdSchellevis
The files are valid, the problem is that domain-name-servers and routers in the option-data values of the first entry are overwritten by the second entry.
I configured <IP_ADDRESS> as router/dns for the first subnet but after adding the second subnet with <IP_ADDRESS> the first one gets the router/dns specified in the <IP_ADDRESS> subnet.

@moogle19 after save it changes to the first?

I can't reproduce that on my end, auto collect is the only thing that mangles with these settings when set, the rest operates the same as any other form.
https://github.com/opnsense/core/blob/efc9b09c769b1d073a197517a25d9ea20667e234/src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv4.php#L48-L65

Yes, after save of second, first is corrupted.
It happens when auto collect is off (could that be an issue)?

and what does the configuration history show? (System: Configuration: History)

starting from scratch I seem to be able to reproduce this, not sure why this happens yet though.

@moogle19 @mmaction does this issue on your end only happen when adding a new item or also when editing an existing one (and 2 are already there)?

Should be fixed with https://github.com/opnsense/core/commit/8973f6efb14bec010e7f929ae748d8e06795e8c9 , which can be installed using:
opnsense-patch 8973f6e

Kea is the only component that currently uses these nested structures inside the model, which is the reason this issue only shows itself here.


[Refactoring] Add Observer abstraction

Observer abstraction
At the moment lists are handled by the Observer class using a workaround. But this Workaround changed the logic of the "normal" property observing logic. Also the structure is not expandable.
Therefore a structure should be created that there is a super-type for Observers and multiple observer implementations can exist
Example structure
AbstractObserver (interface)
├─ ActionObserver (abstract)
│  ├─ MapObserver
│  ├─ ListObserver
├─ ObjectObserver

As this is a fundamental change many systems such as ReactiveController will be affected.

Changes implemented
The changes are implemented.
Additions
The Proxy system had to be reworked too as the systems were tightly bound.
New Proxy Structure:
ProxyEngine (abstract)
|- ReactiveProxyEngine
|- ListProxyEngine

New/Changed therms and classes

Therm
Description
Usage for Users
Final form

ProxyEngine
The class to base ProxyEngines off.Catches proxy calls and distributes them

✔

ReactiveProxyEngine
A ProxyEngine for ReactiveProxies

✔

Proxy
A class that forwards calls to an ProxyEngine

NOT A CLASS

ProxyCreator
A ProxyFactory
✔
❌

ReactiveProxy
A Proxy that makes an object reactive
✔
✔

ReactiveWrapper
Warps a plain object to provide a Reactable implementation.Warning: Does not calls react automatically! Thats what ReactiveProxies and ReactiveSubject are used for
〰
✔


Generations and parents by index array

This one's quite a bit of work to follow. It removes many of the list.index() operations for speed. Potentially some of these functions could now be wrapped with numba to speed them up later, too.


It all force closes when clicking "select folder" in advanced settings for changing where it installs.

Can't change install location, don't want it in with my normal Minecraft at all, but that is not possible in the Java version, nor here due to the whole thing force closing itself whenever the button is selected. The text field underneath the "select folder" is unmodifiable as well, and idk if you are meant to be able to or not, either way changing the install location is not possible.

Image is just for context, and is the executable when first opened to click advanced settings, the selections of items in the two checkbox fields change nothing with this process when it force closes.

The error that it outputs as it closes.

Getting the same error myself also when trying to change location

I also get this

Fixed in 1.3.13 (building rn)


feat: update mermaid

Adds new features such as gitGraph!  The grammar has changed slightly from the alpha version, and no longer supports reset operations and some internal fast-forwarding has been removed for simplicity. Some few GitGraphs based on the alpha version might break with the update. This is the reason for the major version number update.

— https://github.com/mermaid-js/mermaid/releases/tag/9.0.0

Thanks!


No setting to Skolemize blank nodes

Describe the bug
Unable to find setting to Skolemize blank nodes as RDF4J parser allows.
To Reproduce
Steps to reproduce the behavior:
This is my input json-ld
 {
   "@context": {
     "@version": 1.1,
     "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
     "xsd": "http://www.w3.org/2001/XMLSchema#",
     "et": "urn:acme:com#",
     "@vocab": "urn:acme:com#",
     "aId": {
       "@id": "@id",
       "@type": "@id"
     },
     "aVId": {
       "@id": "et:aVId",
       "@type": "@id"
     },
     "parts": {
       "@id": "et:parts",
       "@container": "@list",
       "@context": {
         "id": {
           "@id": "@id"
         }
       }
     },
     "id": {
       "@id": "et:id",
       "@type": "xsd:string"
     },
     "title": {
       "@id": "et:title",
       "@language": "en"
     },
     "type": {
       "@id": "et:type",
       "@type": "@vocab"
     },
     "version": {
       "@id": "et:version",
       "@type": "@id"
     }
   },

   "type": "Book",
   "title": "Title1",
   "parts": [
     {
       "version": "urn:acme:com:1111",
       "id": "urn:acme:com:2222",
       "type": "chapter",
       "title": "Chapter1"
     }
   ],
   "aId": "urn:acme:com:3333",
   "aVId": "urn:acme:com:4444"
 }

This is the set of triples that gets generated
 <urn:acme:com:2222> <urn:acme:com#title> "Chapter1"@en .
 <urn:acme:com:2222> <urn:acme:com#type> <urn:acme:com#chapter> .
 <urn:acme:com:2222> <urn:acme:com#version> <urn:acme:com:1111> .
 <urn:acme:com:3333> <urn:acme:com#aVId> <urn:acme:com:4444> .
 <urn:acme:com:3333> <urn:acme:com#parts> _:genid5f5f3ab0 .
 _:genid5f5f3ab0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:acme:com:2222> .
 _:genid5f5f3ab0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
 <urn:acme:com:3333> <urn:acme:com#title> "Title1"@en .
 <urn:acme:com:3333> <urn:acme:com#type> <urn:acme:com#Book> .

I cannot find a setting to Skolemize the blank nodes. I want to be able to create RDF4J statements to add these to remote repository using RDF4J Model api and without it I am not able to do so
Expected behavior
There should be an option similar to RDF4J Skolemize
https://rdf4j.org/javadoc/latest/org/eclipse/rdf4j/rio/helpers/BasicParserSettings.html#SKOLEMIZE_ORIGIN
Additional context
Add any other context about the problem here.

Resources

W3C Wiki
RDF4J Skolemization

Hi!
The blank node id in your example (_:genid5f5f3ab0) is not generated by Titanium. Titanium produces blank node ids in a form _:b[NUMBER] e.g. _:b0, _:b1 and so on.
What is your use-case? Titanium.toRdf() -> RDF4J?
Anyway, enabling a user to set a custom blank node id generator looks like a useful enhancement.

Hi!
The blank node id in your example (_:genid5f5f3ab0) is not generated by Titanium. Titanium produces blank node ids in a form _:b[NUMBER] e.g. _:b0, _:b1 and so on.
What is your use-case? Titanium.toRdf() -> RDF4J?
Anyway, enabling a user to set a custom blank node id generator looks like a useful enhancement.

The triples generated by Titanium parser are to be persisted using Rio.write and then loaded into a repository.

The triples generated by Titanium parser are to be persisted using Rio.write and then loaded into a repository.

closed due inactivity, feel free to re-open with new information.


Fix for date parsing in AssumeRoleProvider _is_expired check

The current AssumeRoleProvider._is_expired check will pull the expiration date time from cache when checking the expiration. The expiration is stored as a datetime however the method attempts to parse it as a string. The resolution is to use the credentials._parse_if_needed method instead of the dateutil.parser parse method.

The cached object is a response from client.assume_role(), and as per the documentation, that type looks like:
{
    'Credentials': {
        'AccessKeyId': 'string',
        'SecretAccessKey': 'string',
        'SessionToken': 'string',
        'Expiration': datetime(2015, 1, 1)
    },
    'AssumedRoleUser': {
        'AssumedRoleId': 'string',
        'Arn': 'string'
    },
    'PackedPolicySize': 123
}

This appears to be a valid bug.

Are you able to tell me what error you got or steps to reproduce this? I'm looking at this and trying to figure out how this ever worked and that would be useful.


rearrange PCG_HAS_128BIT_OPS guards to compile without SIZEOF_INT128

Fix #11

It looks like you're moving some 64-bit things behind the guard?

@imneme yes, my bad, fixed at 8b718adecdc5ecb64aeeab7ab7e03d37b6269ce0

Thanks!


Error while building docker image

I am getting the following error while trying to build the image for the first time:
Step 7/19 : RUN mix local.hex --force
---> Running in 6991c9307bfe
* creating /root/.mix/archives/hex-0.17.7
Removing intermediate container 6991c9307bfe
---> beb08a793394
Step 8/19 : RUN mix deps.get
---> Running in 89e9c0af8572
** (Mix) Could not find a Mix.Project, please ensure you are running Mix in a directory with a mix.exs file
The command '/bin/sh -c mix deps.get' returned a non-zero code: 1

Hi @ABCurado!
Make sure you run the docker build command in the root of the project, it should work.
docker build -f docker/prod/Dockerfile .

Thanks, that solved it.
I am often used to see the Dockerfile at the root of the project and didn't realize that was the error.


AdaptiveETA gives negative ETA

Thanks for a great package!
I've noticed that when using the AdaptiveETA widget and my download speed is not uniform you will get a negative ETA. It would be better if it just said 00:00.
Script for reproducing:
from progressbar import ProgressBar, AdaptiveETA
import time

pb = ProgressBar(widgets=[AdaptiveETA()], max_value=20)

for i in range(20):
    pb.update(i)
    time.sleep(0.1)
    if i < 10:
        time.sleep(0.5)
print("")

Output is:
ETA:  -1 day, 23:59:56

That's indeed a bit odd, guess there should be a max(0, delta) somewhere in there :)
I'll take a look at it soon

This seems to have been fixed in e48fc913f89028560033a5ed6bfaa010a5e80d2e :+1:  Thanks!

That's great to hear. Sorry for not responding sooner I've just been really busy


[go_router_builder] [go_router]

Is there an existing issue for this?

[X] I have searched the existing issues
[X] I have read the guide to filing a bug

Steps to reproduce
Create a route configuration (/) with child Routes (a, b) and a redirection to any of the child Routes from the main Route.
Expected results
Route /a should load when navigating to /.
Actual results
An error is thrown: One of build or buildPage must be implemented.
I have to override the build method of HomeRoute for this to work.
Code sample
Code sample
@TypedGoRoute<HomeRoute>(
  path: '/',
  routes: [
    TypedGoRoute<ARoute>(
      path: 'a',
    ),
    TypedGoRoute<BRoute>(
      path: 'b',
    )
  ],
)
@immutable
class HomeRoute extends GoRouteData {
  @override
  FutureOr<String?> redirect(BuildContext context, GoRouterState state) {
    return '/a';
  }
}

Screenshots or Video

Screenshots / Video demonstration
[Upload media here]

Logs
Logs
[Paste your logs here]

Flutter Doctor output
Doctor output
[✓] Flutter (Channel stable, 3.10.5, on macOS 13.1 22C65 darwin-arm64, locale en-GB)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.2)
[✓] IntelliJ IDEA Community Edition (version 2022.2.5)
[✓] VS Code (version 1.79.2)
[✓] Connected device (2 available)
[✓] Network resources

Hi @lukaszciastko
It seems this is WAI. Please check https://github.com/flutter/flutter/issues/103368#issuecomment-1589690425 to have ideas for your case.
In case you have a different scenario, please provide a completed and minimal reproducible code sample  so that we may verify this. Thank you!


Upload from a URL - OneDrive API - Available for OneDrive for b

Hi,
This is a really good feature.
Any timeline as to when this will be available on OneDrive for Business?
Thanks

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

ID: 42443681-dd86-ce0c-587f-2336f965ebaf
Version Independent ID: abcbaeba-560b-661d-0127-5c44d9089915
Content: Upload from a URL - OneDrive API - OneDrive dev center
Content Source: docs/rest-api/api/driveitem_upload_url.md
Product: onedrive
GitHub Login: @rgregg
Microsoft Alias: rgregg

We don't currently have a timeline for adding this to OneDrive for Business.  You may want to go add a vote on our UserVoice for this feature:  https://sharepoint.uservoice.com/forums/329220-sharepoint-dev-platform?category_id=194593

We don't currently have a timeline for adding this to OneDrive for Business.  You may want to go add a vote on our UserVoice for this feature:  https://sharepoint.uservoice.com/forums/329220-sharepoint-dev-platform?category_id=194593


Support for GCS Snapshots

Allows for passing a repo type to the cronjob to support GCS repositories.
Depends on https://github.com/upmc-enterprises/elasticsearch-cron/pull/6

I merged the PR in the cron container and built this: upmcenterprises/elasticsearch-cron:0.1.0
Would you mind updating this PR to reference that image as the default?


Refactor reminder tests & update documentation (UG/PPP)

[x] Refactor reminder tests
[x] Update UG for clarity
[x] PPP draft

Codecov Report

Merging #200 (4f1daea) into master (0730f00) will increase coverage by 0.23%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##             master     #200      +/-   ##
============================================
+ Coverage     73.75%   73.99%   +0.23%
- Complexity      727      732       +5
============================================
  Files           107      107
  Lines          2084     2084
  Branches        249      249
============================================
+ Hits           1537     1542       +5
+ Misses          470      467       -3
+ Partials         77       75       -2

Impacted Files
Coverage Δ

.../model/application/UpcomingInterviewPredicate.java
100.00% <0.00%> (+25.00%)
:arrow_up:

...eedu/application/logic/commands/RemindCommand.java
75.00% <0.00%> (+75.00%)
:arrow_up:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


Add bind argument to delayed, to allow dependencies not implied by wrapped-function's args

[x] Closes #7901
[x] Tests added / passed
[ ] Passes black dask / flake8 dask / isort dask

Currently to apply deps not implied by function args in dask.delayed you can do this (thanks @abergou for the tip):
from dask.graph_manipulation import bind

t1 = delayed(task1)()
t2 = bind(delayed(task2), t1)()

While this works as expected, the invocation is a bit dense/hard to read, requires an extra import, and is not immediately obvious to users. What I'm proposing is that we provide a bind parameter to delayed that will then internally apply the bind to the delayed object. So the invocation would look like so:
t1 = delayed(task1)()
t2 = delayed(task2, bind=t1)()

This also has the added benefit of documenting this ability on the delayed interface, rather than being hidden where most users wouldn't know where to find it.

Thanks for writing this up @aa1371 and sorry it has taken some time for a review. To me, this seems like a rather large change for a slight simplification of a niche usecase. So I am not persuaded that it is necessary. I do recommend that you add an example to the documentation though!

Yea I was actually thinking after I opened this that just a quick mention in the delayed docs is probably good enough for this too. Will close this PR and open a new one with just a doc change soon. Thanks.


Random Seeding & RNG

Clarify random seeding and RNGs.

If we implement (B) then there might be inconsistency in the convergence for the same workload ran in the same environment but at different times. What cases would not suffice with default seeding behavior?
Also, there are some issues around few workloads where the seeds are not passed to all submodules and those submodule resort to their default seeding behavior which can bring up inconsistency in the results.

Why not just restrict to the list of seeds used in the reference runs? That gets around issues of convergence speed up due to lucky initialization from using system clock. Is there a good reason to allow for setting seeds to anything but the reference seeds?

SWG:
You can use the following to seed RNGs:

Clock
Another RNG (initialized with an allowed seed)
System source of randomness (e.g. /dev/random or /dev/urandom)

note 1: We also recognize that there are reasons to duplicate seeds in distributed environments
note 2: We recognize seeds are useful for reproducibility and stability, we feel this should be addressed intelligently in future submissions, possibly v1.0.0. For now random is rather random.

I suggest we allow only two sets of experiments:

Random seeds from the default behavior of an RNG (from an approved list of RNGs) - prevents choosing seeds that give better results
Fixed set of seeds - allows reproducibility

If playing around with seeds is allowed, it can be abused to get favorable runs (assuming some seeds do indeed lead to faster convergence).
I don't see the point of using the clock value or system source of randomness to seed RNGs.


python_execute should show the original stacktrace or none at all

When python_execute and friends run some plugin code, the stacktrace is misleading (and confusing):
http://paste.ubuntu.com/17093682/
Error while parsing, could not continue.
Erreur détectée en traitant function <SNR>100_RunPygd[3]..provider#python#Call :
ligne   18 :
UnboundLocalError("local variable 'tree' referenced before assignment",)
Traceback (most recent call last):
  File "/home/teto/.local/lib/python2.7/site-packages/neovim/msgpack_rpc/session.py", line 185, in handler
    rv = self._request_cb(name, args)
  File "/home/teto/.local/lib/python2.7/site-packages/neovim/api/nvim.py", line 151, in filter_request_cb
    result = request_cb(self._from_nvim(name), args)
  File "/home/teto/.local/lib/python2.7/site-packages/neovim/plugin/host.py", line 74, in _on_request
    rv = handler(*args)
  File "/home/teto/.local/lib/python2.7/site-packages/neovim/plugin/script_host.py", line 75, in python_execute
    exec(script, self.module.__dict__)
  File "<string>", line 1, in <module>
UnboundLocalError: local variable 'tree' referenced before assignment

We should catch the exception and show the "inner" stacktrace, or at least hide the irrelevant python-client stacktrace.

We should be able to change the error message to our liking using ErrorResponse. I will look into it.

As a datapoint, vim doesn't show the python commandline either:
:py3 def somefun(): faail
:py3 somefun()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<string>", line 1, in somefun
NameError: name 'faail' is not defined

Not to say that we shouldn't try to do better than vim... I have a very faint memory of messing with python's code cache (used for showing lines in tracebacks) when hacking on numba a few years ago so it should be doable.

The relevent logic seems to be here https://github.com/ipython/ipython/blob/master/IPython/core/compilerop.py
cpython apparently does not care about this usecase so IPython needs to monkeypatch the linecache. We should do the same.

What about when Vim is running a python plugin, as opposed to command line one-off?
I didn't want to suggest anything risky like monkey patching. If it's not possible to get the inner trace, we can just hide the current, irrelevant one.

Well there is no missing "inner" traceback, there is a single exception going all the way to the msgpack event loop and you can already see all the strackframes. What is missing is the actual line contents. IPython is used by huge userbase over many years, as it is the to-go solution for heavy interactive python work, so we can be sure their code has been thoroughly tested.

What about when Vim is running a python plugin, as opposed to command line one-off?

If you mean code imported from a file then both vim and neovim is fine, as python can find the actual code in the source file. We still might want to shave off the python-client frames, though.

closed by https://github.com/neovim/python-client/pull/211


pact-jvm-consumer-junit: Decimal points are sometimes removed when writing to a pact consumer file

Given I have a bundle with a post request body :
.body("{\"responsetest\": true, \"name\": \"harry\",\"data\": 1234.0 }")
When I run a consumer test with this body
Then I receive a response
And I verify the response body
 assertEquals(,"harry",responseJSON.get("name"));
 assertEquals("Miss matched data",1234.0f,responseJSON.get("data"),0.1f);

And the pact file is written
And within the file there is a response
And EXPECTED within this response, there is a key value pair:   "data": 1234.0,
And ACTUAL within this response, there is a key value pair:   "data": 1234,
edit: formatting

I'll need to investigate, but my guess would be that the JSON parser is dropping the zero.

I've raised https://issues.apache.org/jira/browse/GROOVY-7794 to resolve this

Turns out this has been fixed in Groovy 2.4.6, so I've upgraded it and it fixes your problem.

Thanks for the very prompt response.


RedditForBlind.RedditForBlind version 0.99.8

[ ] Have you signed the Contributor License Agreement?
[ ] Have you checked that there aren't other open pull requests for the same manifest update/change?
[ ] This PR only modifies one (1) manifest
[ ] Have you validated your manifest locally with winget validate --manifest <path>?
[ ] Have you tested your manifest locally with winget install --manifest <path>?
[ ] Does your manifest conform to the 1.4 schema?

Note: <path> is the name of the directory containing the manifest you're submitting.

Microsoft Reviewers: codeflow:open?pullrequest=https://github.com/microsoft/winget-pkgs/pull/110053&drop=dogfoodAlpha

Unfortunately, the package errors instead of launching on a Windows 11 VM:

Application: RedditForBlind.exe CoreCLR Version: 4.700.22.41602 .NET Core Version: 3.1.29 Description: The process was terminated due to an unhandled exception. Exception Info: System.NullReferenceException: Object reference not set to an instance of an object

I can retrieve the stack trace if desired.

.NET Core Version: 3.1.29
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException: Object reference not set to an instance of an object.
   at RedditForBlindWPF.MainWindow..ctor(ITelemetry telemetry)
   at RedditForBlindWPF.App.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1_0(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at RedditForBlindWPF.App.Main()


Error when connecting to aternos server

Can you please attach console logs?

Closing due to lack of response from user.


Setuping Kanban Board

Kanban Board Setup.
Hello Reviewer, 👋🏾
We are a group of 3 developers.
1.  @Agetuni  - member 1
2. @Ukaypromise  - member 2
3. @Efiamotu-1  - member 3
project Link  : https://github.com/Agetuni/catalog_of_my_things/projects/1

Hi @Agetuni @Ukaypromise @Efiamotu-1 👋,
Good job so far!
There are some issues that you still need to work on to go to the next project but you are almost there!
Highlights

All cards created properly 👍
Link to project works 👍

Required Changes ♻

Kindly add descriptions to your tasks as stated in the project requirement

Check the comments under the review.
Optional suggestions
Every comment with the [OPTIONAL] prefix is not crucial enough to stop the approval of this PR. However, I strongly recommend you take them into account as they can make your code better.
Cheers and Happy coding!👏👏👏
Feel free to leave any questions or comments in the PR thread if something is not 100% clear.
Please, remember to tag me @davidsoky007 in your question so I can receive the notification.
Please, do not open a new Pull Request for re-reviews. You should use the same Pull Request submitted for the first review, either valid or invalid unless it is requested otherwise.

As described in the Code reviews limits policy you have a limited number of reviews per project (check the exact number in your Dashboard). If you think that the code review was not fair, you can request a second opinion using this form.

@Davidosky007 Thanks for your review and impressive feedback. We have made the corrections.

Hi Team,
@Agetuni , @Ukaypromise and @Efiamotu-1
Great job implementing the recommended changes 👍🏽
Your project is complete!  There is nothing else to say other than... it's time to merge it :shipit:
STATUS: APPROVED 🟢
Congratulations! 🎉
Cheers and Happy coding!👏👏👏
Feel free to leave any questions or comments in the PR thread if something is not 100% clear.
Please, remember to tag me @whoistolu in your question so I can receive the notification.

As described in the Code reviews limits policy  you have a limited number of reviews per project (check the exact number in your Dashboard). If you think that the code review was not fair, you can request a second opinion using this form.


add event http receiver

[ ] If this pull request closes/resolves/fixes an existing issue, replace the issue number. Closes #.
[x] Update the CHANGES log.

https://skywalking.apache.org/docs/main/latest/en/protocols/readme/#events-report-protocol Event doc doesn't update.

You should do local testing before submitting a pull request, this feature is not tested through e2e or UT.


:sparkles: add dashboard images in doc

Summary
Related issue(s)
Fixes #

/cc @clyang82 @yanmxa @hchenxa @yahliu

@braddmin

Do you need to have a document to embed those images?

Yes, After this pr merged, doc team will link to ACM/Globalhub doc.
https://github.com/stolostron/rhacm-docs/pull/6450


#VajramClassNameIsVajramId Validate that vajram class simple name is same as vajramId

With Krystal 5, vajramId is inferred from Vajram class, so this scenario is not possible


fix(versions): update Activiti/activiti-dependencies versions into develop

UpdateBot pushed maven dependency: org.activiti:activiti-core-dependencies to: 7.1.116

UpdateBot commands:
updatebot push-version --kind maven org.activiti:activiti-core-dependencies 7.1.116 --merge false


Question about the code

I reproduced your code in the win10 conda environment, but the following problems occurred

Dear friends, an error occurs “ModuleNotFoundError: No module named 'tacto.loaders'”， I tried the tacto package with version 0.0.2 and 0.0.3. neither have the tacto.loaders.  I also checked the tacto repository in https://github.com/facebookresearch/tacto/tree/main/tacto and found no script named loaders. Could help me to install the tacto with tacto.loaders.

I reproduced your code in the win10 conda environment, but the following problems occurred

请问您解决问题了吗？我也遇到了同样的问题


Improve performance

54% speedup on Lua (5.2.4)
28% speedup on LuaJIT (2.1.0-beta2)
29% speedup on Node (v7.9.0)

This PR is a minimal alternative to #135.

Additionally, local variables generated by let are correctly added to environment. #135 did not do this.
This PR behaves identically to the current version of Lumen, except:

every let form adds an environment frame even if there are no bindings.
the let macro always returns a fully-expanded result.


update Chinese code

Signed-off-by: samzong.lu<EMAIL_ADDRESS>What type of PR is this?

/kind design
What this PR does / why we need it:
Optimize the system prompts of Chinese pages.
Which issue(s) this PR fixes:
Fixes #
Special notes for your reviewer:

/lgtm
/approve


Which repo should I use for PHP completion?

I see there's 2 repo for PHP completion, I successfully installed both LanguageServer-php-neovim and ncm-phpactor.
But, which should I use? What's the different? Or, should I just use both for best completion?

They're based on different engine. I don't know much about the differences.
phpactor currently doesn't have variable completion.
You could pick one randomly, then try another one when you find that the first one doesn't feed you need.


Change ClosedJobsApplication component prop names

Description
This change was necessary to match real data property names. On xp-registration we have name
containing job title, and description is for job description and not closed and applied job application dates so I changed it to info.
Checklist

[x] set yourself as an assignee
[x] set appropriate labels for a PR (In Review or In Progress depending on its status)
[x] make sure your code lints (npm run lint)
[x] Flow typechecks passed (npm run flow)
[x] Snapshots tests passed (npm run jest)
[x] if any snapshots have been changed, verify that component still works and looks as expected and update the changed snapshot
[x] once finished with all the changes, you run npm run build command and committed changed files to the branch
[x] manually tested the app by running it in several different browsers (Firefox, Chrome, Opera, Safari, MS IE/Edge, etc.) and checked nothing is broken and operates as expected!

Related PRs

branch
PR

xp_branch_name
XP

xp_registration_branch_name
XP Registration

xp_api_branch_name
XP API

Steps to Test or Reproduce
Check ClosedJobsApplication component on storybook or in the upcoming My Applications page.
Impacted Areas in Application
the upcoming My Applications page

@WagnerMoreira Let's please get merge conflicts resolved.

@nicksp conflicts merged and moved to in-review again

This PR was auto-resolved and obsolete now.