java.sourceSets.main.output.classesDirs no longer depends on the classes task in Gradle 7.6

Breaking change starting with Gradle 7.6-20221014231703+0000.
See this AGP bug for context.
java.sourceSets.main.output.classesDirs no longer depends on the classes task.
In the attached bug_repro.zip, running ./gradlew bar --dry-run has the following output with Gradle 7.4:
:compileJava SKIPPED
:foo SKIPPED
:processResources SKIPPED
:classes SKIPPED
:bar SKIPPED

But with Gradle 7.6-20221014231703+0000 it has the following output:
:compileJava SKIPPED
:bar SKIPPED

The issue is that the bar task adds java.sourceSets.main.output.classesDirs to its input, which has a dependency on the classes task in Gradle 7.4, but has a dependency on only the javaCompile task starting with Gradle 7.6-20221014231703+0000.

Note the regression happened via one of these commits https://github.com/gradle/gradle/compare/bc01957e03b6ee2f2c7163390eda0295db8430df...96a78dfc1ee9fc8146b73197ff37a787e3e0450a

Fixed by https://github.com/gradle/gradle/pull/22498


Wait for https://github.com/webpack/extract-text-webpack-plugin/issues/56

https://github.com/webpack/extract-text-webpack-plugin/issues/56


Completion improvements for 111

Fixes #111
This resolves the issue with trailing '/' missing for directories, and adds completion support for the 'local-bin' case (That is, when a user is typing a path as the first item, only directories and executable files are listed).
I did encounter that double '/' issue you mentioned. It does appear to originate from glob itself, but only happens with '/' and './'. I have no idea why. I've chosen to special case them in expand. Alternately, we could drop the GLOB_MARK and append the directory '/' ourselves.

Hmm, this failure is annoying, need to think about how things should work. This may even be a bug in expansion.

@ALSchwalm I am wondering if we can just add the "/" ourselves for now, hmm.

@ALSchwalm an FYI, these two issues will be very useful for janet shell completions in the future:
https://github.com/janet-lang/janet/issues/121
https://github.com/janet-lang/janet/issues/120

Ah yeah, those will definitely be handy.  Regarding your other note, I can implement the '/' to avoid that special casing (something like below):
(->> (glob (string ;(peg/match expand-parser s)))
       (map (fn [f]
              (if-let [stat (os/stat f)]
                (if (and (= (stat :mode) :directory)
                         (not= (last f) ("/" 0)))
                  (string f "/")
                  f)
                f))))

However, I also wanted to note that as of bash 5.0.7, I do get the trailing slash:
[adam@laptop /]$ ls /*
bin/   dev/   home/  lib64/ mnt/   proc/  run/   srv/   tmp/   var/
boot/  etc/   lib/   media/ opt/   root/  sbin/  sys/   usr/

So I'm wondering if I'm misunderstanding your concern.

Oh ok, for me this does not:
[ac@black:~]$ echo /*
/bin /boot /dev /etc /home /mnt /nix /opt /proc /root /run /secrets /sys /tmp /usr /var

My concern is adding GLOB_MARK changes this does with the current implementation:
echo $PWD

To clarify a bit more, I think for now adding a trailing slash inside the completion function is best. I don't mind implementing that change, I know I may be being picky, but i think a small difference like this could be annoying in the future.

If you are out of time, I'm also happy to make the final tweaks and then merge.

I have some time to implement this. I was misreading the test failures, I see what you're saying now. I think I've also found another edge case that I want to fix (ls /*)

I think that should do it. I decided to ignore the ls /* case for the time being.
Some refactoring could probably reduce the number of stat calls though.

Cool, I will test it now, I agree about stat syscalls, I can make a refactor ticket.


spring boot 2.0.0

Does not support spring boot 2.0.0？

Not yet, I'm working on it, on some days we will have new release working with the spring boot 2.0.0.

@melodicdeath if you want to see the evolution, you can see the feature branch

Done, you can found it in the version 0.8.0

Thanks very much.


Layout without table?!

If my layout does not contain the table, how can I 'insert' it?! For example, the following code does not work (there are no errors, but the table is not shown):
app.layout = html.Div([
    dcc.Location(id='url', refresh=False),
    html.Div(id='body'),
])

@app.callback(Output('body', 'children'),
              [Input('url', 'pathname')])
def display_page(pathname):
  return dt.DataTable()

I am having the same issue !

Has anyone solved the problem?

The way dash handle the components lib dependencies is by inspecting the initial layout. If your initial layout doesn't contain a DashTable, it won't load the dash_table_experiments js bundle and you can't use the component in a callback.
You can solve this by having a dummy component in the initial layout.

Thanks for your answer 👍

Because of this limitation, I use html.Table() in my code instead of dash-table-experiments.


new(ComponentService) Configure component template source

Provides a mechanism to customise the paths looked in to load
component templates from

Added new configurable property ComponentService::componentTemplatePaths
Made the "scope" parameter optional - it's near on impossible to mock reasonably
Added test for the above

To configure the template paths, in your project's .yml file
---
Name: component_overrides
---
SilverStripe\Core\Injector\Injector:
  SilbinaryWolf\Components\ComponentService:
    properties:
      componentTemplatePaths:
        - components
        - components/atoms
        - components/molecules
        - components/organisms

As discussed in other comms. You confirmed this is all good to go! Will merge and tag :)


Connection problem Liontron BMS

I have a problem connection my liontron bms. BMS Firmware-Version is 2.5.
When i turn off the bluetooth in the website of the esphome interface and reacitvate it, is get values for one time. In the same session the bms is shown to ha as bms errors and going to offline.
I have esphome 2024.06.04 compiled with idf.
In the interface i get [D]	[esp32_ble_client:110]	[0] [70:3E:97:xx:xx:xx] ESP_GATTC_WRITE_CHAR_EVT
The connection is still blocked than, because i can not find the bms with the mobile phone app. When i disable bluetooth in esphome, the bms can immediately be found with the phone app
When connection is not working …. Hopefully you can help here.

Do you have a Android device and are you able to prepare a btsnoop capture of the BLE traffic? I would like to compare the traffic of the Android App with the implementation here. There is probably a difference (in the command set) which confuses the BMS.

Not at the moment. I only have iphone available.
i just installed 2024.6.6 and activated some debug and verbose logging…
i get this at the moment, without response from the bms it seems….
Send command: DD.A5.03.00.FF.FD.77 (7)
22:57:12	[V]	[esp32_ble_client:121]
[0] [70:3E:97:D1:C1:8C] gattc_event_handler: event=4 gattc_if=3
22:57:12	[D]	[esp32_ble_client:110]
[0] [70:3E:97:D1:C1:8C] ESP_GATTC_WRITE_CHAR_EVT

Could you provide a download link to the Android app of your BMS?

The log messages aren't helpful without any context.

This one: https://play.google.com/store/apps/details?id=com.liontron.liontronmulti&hl=de&pli=1

Die App schickt die folgenden Befehle/Frames periodisch an die App:
DD A5 03 00 FF FD 77
DD A5 04 00 FF FC 77

Expected response: The start of frame is DD and the end of frame 77.
The app supports these response frames:
static const uint8_t JBD_CMD_HWINFO = 0x03;
static const uint8_t JBD_CMD_CELLINFO = 0x04;

I've pushed a small change at a feature branch. Please update your YAML from
substitutions:
  external_components_source: github://syssi/esphome-jbd-bms@main

to
substitutions:
  external_components_source: github://syssi/esphome-jbd-bms@liontron-support

to apply this change to your ESP. This is the difference: https://github.com/syssi/esphome-jbd-bms/pull/83/files
We are trying to avoid sending an probably unsupported command.

Hi Sebastian, problem stays the same. It connects, reads values one time an than goes in BMS offline while the BLE Connection stays connected.

Okay. As next step a btsnoop capture is required to get an idea whats different.

will try to get an android mobile working....

i'm sorry, i do not have an android mobile here available to do a btsnoop.... do you know a possibility with a raspberry pi? Or a Website, which discribes, what to do?

No. I don't know another way to sniff the communication between the official app and the BMS.

Could you provide a complete ESPHome log? I best case it will provide some more important details.

I changed back to the "normal" Branch...
logs_testboard2_logs.txt

Could you provide another log using the feature branch? I would like to check the difference.

I've extracted the important parts of the main branch log:
[17:32:28][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] Found device
[17:32:28][D][esp32_ble_tracker:669]: Found device 70:3E:97:D1:BE:20 RSSI=-92
[17:32:28][D][esp32_ble_tracker:690]:   Address Type: PUBLIC
[17:32:28][D][esp32_ble_tracker:692]:   Name: '0223400011'
[17:32:28][D][esp32_ble_tracker:695]:   TX Power: 2
[17:32:28][D][esp32_ble_tracker:219]: Pausing scan to make connection...
[17:32:28][D][esp32_ble_tracker:219]: Pausing scan to make connection...
[...]
[17:32:29][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] ESP_GATTC_SEARCH_CMPL_EVT
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x1800
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x1  end_handle: 0x7
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x1801
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x8  end_handle: 0xb
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x180A
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0xc  end_handle: 0xe
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0xFF00
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0xf  end_handle: 0x16
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 00010203-0405-0607-0809-0A0B0C0D1912
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x17  end_handle: 0x1b
[17:32:29][I][esp32_ble_client:227]: [0] [70:3E:97:D1:BE:20] Connected
[17:32:29][V][esp32_ble_client:069]: [0] [70:3E:97:D1:BE:20]  characteristic 0xFF01, handle 0x11, properties 0x12
[17:32:29][V][esp32_ble_client:069]: [0] [70:3E:97:D1:BE:20]  characteristic 0xFF02, handle 0x15, properties 0x6
[17:32:29][V][esp32_ble_client:121]: [0] [70:3E:97:D1:BE:20] gattc_event_handler: event=18 gattc_if=3
[17:32:29][D][esp32_ble_client:188]: [0] [70:3E:97:D1:BE:20] cfg_mtu status 0, mtu 128
[17:32:29][V][esp32_ble_client:121]: [0] [70:3E:97:D1:BE:20] gattc_event_handler: event=38 gattc_if=3
[17:32:29][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] ESP_GATTC_REG_FOR_NOTIFY_EVT
[17:32:29][D][esp32_ble_client:296]: Wrote notify descriptor 1, properties=18
[17:32:29][I][jbd_bms_ble:093]: Request device info
[17:32:29][VV][jbd_bms_ble:555]: Send command: DD.A5.05.00.FF.FB.77 (7)
(0x05 request ignored)

[17:32:31][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:32:31][VV][jbd_bms_ble:103]: Notification received: DD.<IP_ADDRESS>.<IP_ADDRESS>.D<IP_ADDRESS>.01.2D.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.0B.95.FD.28.77 (12)
[...]
[17:32:31][I][jbd_bms_ble:260]: Hardware info frame (25 bytes) received
[17:32:31][VV][jbd_bms_ble:261]:   <IP_ADDRESS>.10.D<IP_ADDRESS>.01.2D.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.0B.95 (25)
[17:32:31][D][jbd_bms_ble:263]:   Device model:
[17:32:31][D][sensor:094]: 'bms total voltage': Sending state 13.30000 V with 2 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms current': Sending state 0.00000 A with 1 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms power': Sending state 0.00000 W with 1 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms charging power': Sending state 0.00000 W with 2 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms discharging power': Sending state 0.00000 W with 2 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms capacity remaining': Sending state 43.11000 Ah with 2 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms nominal capacity': Sending state 44.00000 Ah with 2 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms charging cycles': Sending state 1.00000  with 0 decimals of accuracy
[17:32:31][D][jbd_bms_ble:290]:   Date of manufacture: 2022.8.3
[17:32:31][D][sensor:094]: 'bms balancer status bitmask': Sending state 0.00000  with 0 decimals of accuracy
[17:32:31][D][binary_sensor:036]: 'bms balancing': Sending state OFF
[17:32:31][D][sensor:094]: 'bms errors bitmask': Sending state 0.00000  with 0 decimals of accuracy
[17:32:31][V][text_sensor:013]: 'bms errors': Received new state
[17:32:31][D][text_sensor:064]: 'bms errors': Sending state ''
[17:32:31][D][sensor:094]: 'bms software version': Sending state 2.50000  with 1 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms state of charge': Sending state 98.00000 % with 0 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms operation status bitmask': Sending state 3.00000  with 0 decimals of accuracy
[17:32:31][D][binary_sensor:036]: 'bms charging': Sending state ON
[17:32:31][D][switch:055]: 'bms charging': Sending state ON
[17:32:31][D][binary_sensor:036]: 'bms discharging': Sending state ON
[17:32:31][D][switch:055]: 'bms discharging': Sending state ON
[17:32:31][D][sensor:094]: 'bms battery strings': Sending state 4.00000  with 0 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms temperature 1': Sending state 23.40000 °C with 1 decimals of accuracy

[17:32:31][VV][jbd_bms_ble:555]: Send command: DD.A5.04.00.FF.FC.77 (7)
[17:32:31][VV][jbd_bms_ble:103]: Notification received: DD.<IP_ADDRESS>C.FB.0C.FD.0C.FD.0C.FE.FB.D5.77 (15)
[17:32:31][I][jbd_bms_ble:209]: Cell info frame (8 bytes) received
[17:32:31][VV][jbd_bms_ble:210]:   0C.FB.0C.FD.0C.FD.0C.FE (8)
[17:32:31][D][sensor:094]: 'bms cell voltage 1': Sending state 3.32300 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms cell voltage 2': Sending state 3.32500 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms cell voltage 3': Sending state 3.32500 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms cell voltage 4': Sending state 3.32600 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms min cell voltage': Sending state 3.32300 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms max cell voltage': Sending state 3.32600 V with 3 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms max voltage cell': Sending state 4.00000  with 0 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms min voltage cell': Sending state 1.00000  with 0 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms delta cell voltage': Sending state 0.00300 V with 4 decimals of accuracy
[17:32:31][D][sensor:094]: 'bms average cell voltage': Sending state 3.32475 V with 4 decimals of accuracy

[17:32:46][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:33:01][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:33:16][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:33:31][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:33:46][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:34:01][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:34:16][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:34:31][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)
[17:34:46][VV][jbd_bms_ble:555]: Send command: DD.A5.03.00.FF.FD.77 (7)

I've pushed some more changes to the feature branch (liontron-support). Please give it another try and provide the log. :-)

it seems that its not copnnecting with the lion branch....
logs_testboard2_logs (1).txt

It looks like you aren't using the most recent version of the liontron-support branch.
See https://github.com/syssi/esphome-jbd-bms/pull/83/files
The Send command (handle 0x%02X): message should include the used handle.

tried to clear the cache, but i dont think that the download was successfull.. . can you see in the logs which version i [downloaded?](logs_testboard2_logs (2).txt)

I've pushed another feature branch to trigger a clean build on your side:
substitutions:
  external_components_source: github://syssi/esphome-jbd-bms@liontron

Could you update your YAML and give it another try? Thanks in advance!

looks very good....

I've pushed some more changes. :-) Please recompile again and provide another log.

seems to stay stable.... some invalid frame length... will take a look tomorrow and check, what homeassist is logging.....
logs_testboard2_run.txt
Thank you very much for your support so far. I think it will help others, who have liontron as batterys... there was not much to find, before i found yout project....

It's not perfect yet. Your BMS firmware has timing issues. I will try to make some more changes next days.

About the timing: The Android app transmits the following request every 500ms:
# JBD_CMD_HWINFO
DD A5 03 00 FF FD 77

The second request is transmitted after 1105ms the first time and every 3100ms later on:
# JBD_CMD_CELLINFO
DD A5 04 00 FF FC 77

We will have to imitate this behavior/timing because the BMS firmware is unable to schedule responses properly.

I've pushed another improvement. Does it still work?

think no... is connected, but does not seem to get Values....
logs_testboard2_logs.txt

Could you change the update_interval of the jbd_bms_ble to 1s. Does the change something?

You are using the main branch again. Please stick to liontron as long we are testing here.

You are using the main branch again. Please stick to liontron as long we are testing here.

dont think so.. since yesterday i did not change the source... it's still liontron....
external_components_source: github://syssi/esphome-jbd-bms@liontron

Could you change the update_interval of the jbd_bms_ble to 1s. Does the change something?

Update Interfall updates every second... Cell Voltage updates every update intervall... and stays connected.... it seems

Sorry, my fault! I was looking on an outdated download/ESPHome log. So the connection keeps only up and running on a fast update interval? Could you play around with the value?

Could you provide another ESPHome log using the 1s update interval? I would like to the both frames (type 0x03 and 0x04) are received properly.

Here the logs...
Just to let you know and dont confuse you... i have two Batteries, which i try....
mac_address: 70:3e:97:D1:C1:8C - 55 Ah and two temp Sensor
mac_address: 70:3E:97:D1:BE:20 - 40 Ah and one temp Sensor
Switching Input Charge and Output charge does not work as well... but thats next....
logs_testboard2_logs (1).txt
By the way: Don't you sleep at all? every time I write you reply within minutes... very fascinating...

Hi Sebastian,
the last Version  you provided works for me with Update Interval of 8s. Since the Compile there was no Prooblem.

That's a bit confusing because to difference to the main branch is pretty tiny. If you restart the ESP multiple times is the ESP always able to setup a proper BLE connection + data flow or does it stop every now and then?

after a rebbot i have sometimes to reboot again.... but since i set to 8s there is no disconnect anymore.... i tried 10s, that did not work properly

Yes. Let's try to main branch. This doesn't work out of the box, correct?

strange.... it seems the only problem was se poll intervall ... with the main branchs it's starting and working as expected ..... dont understand that...

You didn't tried the default in the past?

I've merged some minor improvements of the Liontron branch nevertheless now into main. Let's declare this issue as resolved! :-)

i initialy tried the main branch... everything starts working after changing the update intervall to lower than 15s... i just tried 9s which works as well.... last time i tried 10s it did not work...
so lets say its resolved.... hopefully the updateintervall chang3 helps some other guys.... Thans for your support, figuring this out.

Last question: Could you provide some more details about your Liontron BMS? Do you know the exact model name? Could you tell me the name/model of your battery pack? I would like to add your battery / BMS to the list of supported devices.

Notes for myself:
[17:32:28][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] Found device
[17:32:28][D][esp32_ble_tracker:669]: Found device 70:3E:97:D1:BE:20 RSSI=-92
[17:32:28][D][esp32_ble_tracker:690]:   Address Type: PUBLIC
[17:32:28][D][esp32_ble_tracker:692]:   Name: '0223400011'
[17:32:28][D][esp32_ble_tracker:695]:   TX Power: 2
[17:32:28][D][esp32_ble_tracker:219]: Pausing scan to make connection...
[17:32:28][D][esp32_ble_tracker:219]: Pausing scan to make connection...
[...]
[17:32:29][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] ESP_GATTC_SEARCH_CMPL_EVT
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x1800
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x1  end_handle: 0x7
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x1801
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x8  end_handle: 0xb
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0x180A
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0xc  end_handle: 0xe
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 0xFF00
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0xf  end_handle: 0x16
[17:32:29][V][esp32_ble_client:223]: [0] [70:3E:97:D1:BE:20] Service UUID: 00010203-0405-0607-0809-0A0B0C0D1912
[17:32:29][V][esp32_ble_client:225]: [0] [70:3E:97:D1:BE:20]  start_handle: 0x17  end_handle: 0x1b
[17:32:29][I][esp32_ble_client:227]: [0] [70:3E:97:D1:BE:20] Connected
[17:32:29][V][esp32_ble_client:069]: [0] [70:3E:97:D1:BE:20]  characteristic 0xFF01, handle 0x11, properties 0x12
[17:32:29][V][esp32_ble_client:069]: [0] [70:3E:97:D1:BE:20]  characteristic 0xFF02, handle 0x15, properties 0x6
[17:32:29][V][esp32_ble_client:121]: [0] [70:3E:97:D1:BE:20] gattc_event_handler: event=18 gattc_if=3
[17:32:29][D][esp32_ble_client:188]: [0] [70:3E:97:D1:BE:20] cfg_mtu status 0, mtu 128
[17:32:29][V][esp32_ble_client:121]: [0] [70:3E:97:D1:BE:20] gattc_event_handler: event=38 gattc_if=3
[17:32:29][D][esp32_ble_client:110]: [0] [70:3E:97:D1:BE:20] ESP_GATTC_REG_FOR_NOTIFY_EVT
[17:32:29][D][esp32_ble_client:296]: Wrote notify descriptor 1, properties=18

these are the Batterys.
They have the passibility to set a PIN i Think.... but i dont know how....
https://liontron.com/download/german/LISMART1255LX.pdf
https://liontron.com/download/german/LISMART1240LX.pdf

I've implemented a retrieve hardware version button entity yesterday:
button:
  - platform: jbd_bms_ble
    jbd_bms_ble_id: bms0
    retrieve_hardware_version:
      name: "${name} retrieve hardware version"

Could you add the section to your YAML and press the button a few times (once per second). Does your BMS repond or is the 0x05 request always ignored?

here ist the Log: Seems to fetch the Name / Model
logs_testboard2_logs.txt

[21:55:29][D][jbd_bms_ble:245]:   Device model:<PHONE_NUMBER>
[21:55:29][D][jbd_bms_ble:272]:   Date of manufacture: 2024.2.3

Hi Sebastian, just to clarify. this is the Name of the Unit not the model Name. This name can be changed, I think.
A Model Name can not be read from the BMS…. the LIONTRON App does not read the Model as well. The he name you read is the name  the device is showing in BLE Scan…..

Thanks for the clarification. Did you try to get the Mosfet switches working?

The Switch worked as expected

Perfect! Feel free to create new issues if you miss something or if you see room for improvements.


Use useSelector instead of connect in more places.

Following #4876, toward issue #4837, here are some more that I did today.

... Ah, that was on reading the first 10 commits; looking at the rest now :slightly_smiling_face:

Ah, looks like your review crossed with my force-push! Thanks for the review; there's more, now, though. 😛

Thanks for the reviews! Merged, with those small tweaks.


Alpine initrd should mount the livecd under /run/initramfs/live

Currently alpine initrd mounts the livecd under /media/root-ro
Our automated scan for configs, expects the livecd to be mounted under /run/initramfs/live
This means that an Alpine iso with a bundled config will never be able to autoinstall.
This change should be pretty easy as we control the init during initramfs so we can modify the init to mount it in a different dir with zero issues.
Issue source: https://github.com/kairos-io/kairos/issues/2876
Reported by @Ludea

MErged, should be ready for kairos 3.3.0 or in master soon-ish :d


Create a graphical playbook viewer

Consider a web based UI for previewing playbooks based on React-Flow

Consider retiring playbook viewer in favor of web-based solution


Rule(...).set_match(...) or alike

In order to determine if rule was matched or not some flag can be set
This can be probably stored in context
open to negotiation

bro hello for what?? please provide an example for usage..... so that I iunderstand ur point✨🙏


Live messages if i am offline

Hello,
I wanted to know if messages sent live are only retrieved if my account is online when they are sent, or if they are retrieved even if I'm offline?
If they aren't retrieved because I'm offline, will they be retrieved as soon as I log in?
If they aren't retrieved, what can I do to get them?
Thank you

messages can be cloned while BOT is running
if bot is not running - no messages
if not retrieved (also if bot is running) - you can't get it again (only clone again)


Add support for other ArcGIS standard keyword types

We want to support at least the keyword types that are available in FGDC:
<!ELEMENT theme    (themekt, themekey+)>
<!ELEMENT place    (placekt, placekey+)>
<!ELEMENT stratum  (stratkt, stratkey+)>
<!ELEMENT temporal (tempkt, tempkey+)>

The full list of known ArcGIS types are:
<!ELEMENT discKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT otherKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT placeKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT productKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT searchKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT stratKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT subTopicCatKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT tempKeys (keyword+, thesaName?, thesaLang?)>
<!ELEMENT themeKeys (keyword+, thesaName?, thesaLang?)>

In addition to the four FGDC keyword types, consider supporting searchKeys. This can be done in the ISO standard by utilizing MD_KeywordTypeCode (exactly as it is currently used for theme and place keys), and for cross-compatibility with FGDC by appending them to themekey on import.
Note: because there is no standard place to write search keys in FGDC, they will not convert losslessly back to ISO or ArcGIS after being converted to FGDC, and I don't feel good about making up a new FGDC tag just for this:
<!ELEMENT search (searchkt, searchkey+)>

This has been delivered, and with it a rare bug fix. Now the following key word types are supported for all standards:

Theme Keys
Place Keys
Stratum Keys
Temporal Keys

In addition to that, these ArcGIS standard keyword types are supported, but not between standards:

Discipline Keys
Other Keys
Product Keys
Search Keys
Topical Category Keys

The bug that was fixed was that, when extending a parser to support new fields, if one referenced an attribute (@value below) in the XML path for a custom property, the parser would only read the first occurrence of the attribute. Now the output will be as expected as demonstrated below:
from gis_metadata.arcgis_metadata_parser import ArcGISParser

class CustomAgisParser(ArcGISParser):
    def _init_data_map(self):
        super(CustomAgisParser, self)._init_data_map()

        self._data_map['topic_categories'] = 'dataIdInfo/tpCat/TopicCatCd/@value'
        self._data_map['_topic_categories_root'] = 'dataIdInfo/tpCat'

agis_metadata = """
<metadata xml:lang="en">
  <dataIdInfo>
    <tpCat>
      <TopicCatCd value="001"/>
    </tpCat>
    <tpCat>
      <TopicCatCd value="002"/>
    </tpCat>
  </dataIdInfo>
</metadata>
"""
agis_parser = CustomAgisParser(agis_metadata)
agis_parser.topic_categories  # ['001', '002']


tuple_size<>::value and 'private' keyword

#include <iostream>
#include "boost/pfr.hpp"

class Test { // no ostream operator defined!
private:
    std::string s;
    int i;
    char c;
public:
    double d;
    float f;
};

int main() {
    std::cout << "Test has " << boost::pfr::tuple_size<Test>::value
        << " fields" << "\n";
}

This prints "Test has 1 fields". gcc 7.1.0, std=c++17. Is this intended behaviour? If I change private: to public:, I get "Test has 5 fields"

Answer my own question:

C++17 limitations: T must be aggregate initializable

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal-initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

Actually this seems to be an error.
I have to improve library internals to provide a compile time assert with a string like "Provided type is not an aggregate: private members are not allowed."

Tried to do my best with private/protected. If you'll find a better way to deal with the problem, or some more missing static_asserts - please give me a hint!
Great thanks for the error report and for the code snippet.


Added sysctl to change sockbuffer

Codecov Report

Merging #268 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

@@            Coverage Diff             @@
##           master     #268      +/-   ##
==========================================
- Coverage   52.76%   52.72%   -0.05%
==========================================
  Files          39       39
  Lines        4325     4334       +9
==========================================
+ Hits         2282     2285       +3
- Misses       1846     1849       +3
- Partials      197      200       +3

Impacted Files
Coverage Δ

enforcer/datapath.go
68.12% <33.33%> (-2.08%)
:arrow_down:

Continue to review full report at Codecov.

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


jacoco-report-aggregation does not handle dependencies without version

Expected Behavior
jacoco-report-aggregation works when one of project declares a dependency without a version, thanks to importing a platform (BOM).
Current Behavior
The new plugin stops working when you add a dependency without a version. Code compiles, tests run, standard jacocoTestReport works, but testCodeCoverageReport task crashes.
Context
I use Spring Boot BOM to omit versions for some dependencies.
Steps to Reproduce
See the GitHub action result in
https://github.com/pkubowicz/gradle-jacoco-aggregation-platform-bug
Your Environment
Gradle 7.4-rc-1
Build scan URL: https://scans.gradle.com/s/3vp6wbtg7ps2a

@pkubowicz thank you for reporting - we are testing a fix now.


Update Ancestral Knowledge talent to increase Mana instead of Intellect

The Ancestral Knowledge talent in Enhancement tree should increase Mana by 5%, not Intellect.
Stats without talent:

Before fix:

After fix:

Need to fix the % as well down from 2% per point to 1%

Oh dang looks like you just need to update the tests

the % is still wrong as well, it needs to be 1% per talent point not 2% per talent point

Ah yep my bad. I was doing this well past my regular work hours  😅

Hey @vintage143 looks like tests are failing again :( would you mind re-running the updater?

@kayla-glick just got around to this. Was too busy playing sod for the last few days :)


[BUG]: Type error in doc example - One-to-one can be null

What version of drizzle-orm are you using?
0.28.6
What version of drizzle-kit are you using?
0.19.13
Describe the Bug
In the docs, there is the example of a one-to-one relationship using a user and a profile table. With the foreign key on the profile table, a user could possibly have no corresponding profile.
But when using relation queries, user.profile is not object | null, only object. This is not a correct type inference and breaks type safety in development.
Here is a TS Playground to show the problem.
const users = sqliteTable('users', {
  id: integer('id').primaryKey(),
  name: text('name'),
});

const usersRelations = relations(users, ({ one }) => ({
  profileInfo: one(profileInfo, {
    fields: [users.id],
    references: [profileInfo.userId],
  }),
}));

const profileInfo = sqliteTable('profile_info', {
  id: integer('id').primaryKey(),
  userId: integer("user_id").references(() => users.id),
  metadata: blob("metadata"),
});

const sqlite = new Database("db.sqlite");
const db = drizzle(sqlite, {
  schema: { users, usersRelations, profileInfo },
});

const user = db.query.users.findFirst({
  columns: {},
  with: { profileInfo: true }
}).sync()
if (!user) throw new Error("User not found")
type ProfileInfo = typeof user.profileInfo
  // ^?  { id: number; userId: number | null; metadata: unknown; }
  // ❌👆 ProfileInfo could be null, because the foreign key is
  // on the profileInfo table, not the userTable

Expected behavior
A relation with a table that has the foreign key should be nullable.
Environment & setup
No response

That's because you defined the relations incorrectly. You need to define it on the profileInfo side, and for users it should be just profileInfo: one(profileInfo), without the fields. In other words, the side that "owns" the relation (profileInfo in this case) should define fields and references, and the other side shouldn't.

That's because you defined the relations incorrectly. You need to define it on the profileInfo side, and for users it should be just profileInfo: one(profileInfo), without the fields. In other words, the side that "owns" the relation (profileInfo in this case) should define fields and references, and the other side shouldn't.

Ah thank you very much for the answer! I'll do that, but I'm not sure that the doc is clear about this in my opinion.
Also, I copied the example from the doc (just switched it to sqlite), I guess it should be updated? I could do a PR if you want 👍


Issue with CAS operations

Hi,
I'm trying to use CAS features offered by gocqlx.
But I'm having an issue:

If I use Exec *Queryx.ExecCASRelease(), I always receive the value APPLIED=FALSE, even if the query has been applied.
If I use Exec *Queryx.GetCASRelease(dest), I always receive the value APPLIED=FALSE and moreover nothing is returned in Dest.

Here my example:
appl, err := cassandra.NamedExecCASStmtStruct(ctx, ADDCASSANDRAENTRYCAS, cData, &cData2)
ADDCASSANDRAENTRYCAS = fmt.Sprintf(INSERT INTO %s (id,  name)	VALUES (:id, :name)   IF NOT EXISTS;, CassandraTableName)
`
func (c *Cassandra) NamedExecCASStmtStruct(ctx context.Context, query string, args interface{}, dest interface{}) (bool, error) {
logger.Infof("Executing query: %s - args: %s", query, args)
q, n, err := gocqlx.CompileNamedQueryString(query)
if err != nil {
	logger.Errorf("Error during creation of query %s. Args %s. Err: %s", query, args, err)
	return false, err
}
    appl, err := c.session.ContextQuery(ctx, q, n).BindStruct(args).GetCASRelease(dest)
if err != nil {
	logger.Errorf("Error executing cassandra statement: %s. Args %s. Err: %s", query, args, err)
	return false, err
}
return appl, nil

`
The query application is ok, in fact it inserts the data only if it does not exist, but it seems that query results are not correctly retrieved.
I also tried as explained in example_test.go but it seems to not work.
Can you please help me? Am I missing something?
Using gocql.MapScanCas it all works, but I would prefer to use query binding with gocqlx.

What DB are you using.

This does not work with Cassandra because it includes the [applied] column in metadata and the query skips metadata by default. To work around this you can call NoSkipMetadata() on your query before execution and it should work as desired.
You can read more here and in the two referenced issues.

Thanks @kevinbarbour, just tried and it perfectly works!
If you agree we can close the issue.

Great, glad that worked for you!

@kevinbarbour let's document that.


Minor bugs corrections

Mixed Integer EGO Tests correction,
EGO and MFK documentation corrections,
MFK examples corrections
Apply black

Work in progress

Work in progress


Return BadRequest response when antiforgery token validation fails

Issue - https://github.com/aspnet/Antiforgery/issues/28
@pranavkm @rynowak

Tests? I'd really expect this to impact existing functional tests. If we don't have unit test coverage, then add it. :watch:

:up: :date:

:shipit:


How can I access keyboard key positions in terms of offsetLeft and offsetTop?

Hello,
I would like to be able to access the HTMLElement.offsetLeft and HTMLElement.offsetTop properties of each key in the keyboard. In other words, I would like be able to identify the pixel coordinates that correspond to the top-left corner of each key.
Is there a supported or conventional approach to extracting this info from the keyboard keys?
Thank you so much,
Anthony

Hello @vardaro,
You can probably use the method recurseButtons for this task. It's a ForEach to iterate through all the buttons.
Use it like so (with keyboard.current in case you're using React Hooks):
keyboard.current.recurseButtons(buttonElement => {
  // Use buttonElement as needed
});

https://hodgef.com/simple-keyboard/documentation/methods/recursebuttons/
Regards,
Francisco Hodge


Add uffizzi open command for dev cluster ingress

Summary
Add a convenience function that automatically opens any ingresses configured for the current context cluster.
This command should:

Extract all ingress from the current context (This is the equivalent of kubectl get ingress -o json | jq -r '.items[] .spec.rules[].host')
Prepend https:// to each ingress to create a URL
Open a browser tab for each URL. Be sure this works for Linux, Mac, and Windows systems.

Example Usage
uffizzi open

Or uffizzi open [CLUSTER_NAME]

@moklidia @zipofar Let's use the command uffizzi ingress open

@gadkins Is this going to work only with dev environments? How about uffizzi dev ingress open then?

@zipofar Please change to uffizzi dev ingress open


Adding header to outgoing request

Hi there
Is there any way to add new headers to outgoing requests from interceptors?

Hello there,
you can use the requestFulfilled() method to modify the axios config object. That contains the request headers, and you can add new headers to it too.

Hi, how to add async data to headers?


Add longevity test plan and results

Proposed changes
Problem:

We don't know if NGF can successfully process both control plane and data plane transactions over a period of time much greater than in our tests.
We didn't yet try to catch bugs that could only appear over a period of time (like resource leaks).

Solution:

Create a longevity test plan
Run the test
Document the results

CLOSES https://github.com/nginxinc/nginx-gateway-fabric/issues/956
Checklist
Before creating a PR, run through this checklist and mark each as complete.

[x] I have read the CONTRIBUTING doc
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] I have checked that all unit tests pass after adding my changes
[x] I have updated necessary documentation
[x] I have rebased my branch onto main
[x] I will ensure my PR is targeting the main branch and pulling from my branch from my own fork

@kate-osborn

Can you add details on how you created the metrics graphs in GKE? It would be great to be able to reproduce the graphs you included in this PR.

I did save the dashboard in our private infra under the name "NGF Longevity Test", but it is also possible to export it as JSON. I can also mention the name in the docs. Let me know

@kate-osborn

Can you add details on how you created the metrics graphs in GKE? It would be great to be able to reproduce the graphs you included in this PR.

I did save the dashboard in our private infra under the name "NGF Longevity Test", but it is also possible to export it as JSON. I can also mention the name in the docs. Let me know

That should be fine. We can always add the JSON dashboard in the future if it becomes an issue. Let's not mention the name in our docs since it's a private account.


Travis: use latest versions of Go and rename tip to master

But, after checking which Go versions Travis really used (1.7.5 & 1.8.1), it seems this feature is not yet production ready. Nice idea (to not have to update .travis.yml after every new Go release), yet we'll have to wait until it really starts using the latest version of Go as documented.

Codecov Report

Merging #1012 into master will decrease coverage by 3.58%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master    #1012      +/-   ##
==========================================
- Coverage   53.48%   49.89%   -3.59%
==========================================
  Files         117      117
  Lines       11101    11101
==========================================
- Hits         5937     5539     -398
- Misses       4486     4912     +426
+ Partials      678      650      -28

Impacted Files
Coverage Δ

restic/backend/b2/b2.go
0% <0%> (-79.93%)
:arrow_down:

restic/backend/swift/swift.go
0% <0%> (-71.91%)
:arrow_down:

restic/backend/swift/config.go
34.37% <0%> (-56.25%)
:arrow_down:

restic/node.go
33.12% <0%> (-1.07%)
:arrow_down:

restic/archiver/archiver.go
65% <0%> (+0.16%)
:arrow_up:

Continue to review full report at Codecov.

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

Nice idea, I wasn't aware of the x!


Add continuous Hessian spectrum throughout training

Add GROUSE implementation for efficient low-rank subspace tracking with Grassmannian SGD based on the following paper (or other more recent subspace tracking papers): https://people.eecs.berkeley.edu/~brecht/papers/10.Bal.Now.Rec.GROUSE.pdf

As a first step, just gonna try incrementally updating the eigenvector estimates using the previous computations as the initialization

Regarding GROUSE, there seems to be a Matlab implementation by the author, not sure if that's going to be helpful. I'd be curious if this can be used in a similar way to the SVCCA paper by google, but I probably won't get to that.

It's been a while since I thought about this feature, but that link is certainly helpful. Looking back on it, the GROUSE implementation could be modified to solve the least squares objective through the conjugate gradient method. I think this should end up having the same computational complexity as power iteration.


refactor(csg.js): move Path2.innerToCAG to CAGFactories. Renamed as f…

This a pull request regarding innerToCAG => fromPath2

@jeromew Big thanks for these changes.
Its great to have another set of eyes around this code. Exciting!

@z3dev ok I will add the comments. I must admit I lazily followed the code style in Path2.js ;-)

I added the documentation and squashed the commits. The doc makes it clear that getPoints returns the internal, potentially mutable points of the Path. I hesitated initially to return a copy of the points (cloning the path and returning the cloned points).
That would be slower since we add operations but I don't yet have a fine grained vision of what the state of things is in the library and it seems both of you prefer immutability.
tell me what you prefer and I will change the PR accordingly.

The library follows the rule of returning a NEW object, but I guess there are probably some exceptions. Is there some simple rules for return values in JavaScript? I haven't seen anything, so I assume that returns are generally "references", unless there's a specific NEW.
In this case, returning the list of points is probably best.

I saw many places indeed where returned objects are deep-cloned, creating a sort of immutability.
In javascript, basic types like string, booleans and integers are returned as they are. They are values and immutable in the sense that a value cannot be modified.
objects and arrays are returned as references. So modifying the elements modifies the original object. You need to deep-clone the object/array if you want something that can live its own life.

Thanks for the contribution,

I know this one is merged , but thanks for the contribution :)
I am very much in favour of immutability as far as possible, but there are performance tradeoffs .
In general csg.js does seem to be on the side of returning new objects (I have been scolded by a contributor a few years back when I broke this rule :)
This is again a subject worth more discussion, but there are ways to do rather fast object cloning with Object.assign & co these days , or the various functional programing libraries (I love Ramda), but  that works best with simpler data structures perhaps.


unpin poetry

We had pinned poetry to 1.1.15 when we were testing the Windows CI issues.  This removes that.

LGTM, and all green,.


[K12] Fix Missing TSO Updates for Application, Test, and Test Scores

Critical Changes
Changes
New List Views and Quick Actions
In version 1.8, we made the following changes. If you installed an earlier version or installed on top of an existing org, consider making them to your org.
We introduced a K-12 All Applications list view on Application. If you choose to create a K-12 All Applications list view we recommend this configuration.

Sharing Settings: All users can see this list view
Filter by Owner: All attributes
Display order: Application Name, Applicant, Applying To, Term, Application Type, Application Status, Application Date, Application Decision Date, Applicant Decision Date, Preparer
See Create or Clone a List View.

We introduced a K-12 All Tests list view on Test. If you choose to create a K-12 All Tests list view, we recommend this configuration:

Sharing Settings: All users can see this list view-
Filter by Owner: All tests
Display order: Test Name, Contact, Test Type, Test Date
See Create or Clone a List View.
Create a K12 Test Compact Layout with fields in this order: Test Name, Contact, Test Type, Test Date

We introduced a K-12 All Test Scores list view on Test Scores. If you choose to create a K-12 All Tests Scores list view, we recommend this configuration:

Sharing Settings: All users can see this list view
Filter by Owner: All test scores
Display order: Test Score Name, Test Type, Test, Subject Area, Score, Percentile
See Create or Clone a List View.
Add K-12 All Test Scores as a related list on Test.
For more information, see Display a New Custom Object After a Product Release.
Create a K12 Test Compact Layout with fields in this order: Test Name, Contact, Test Type, Test Date

Updates to the Test and Test Score Page Layouts
We've added the Edit, New Note, New Case, Printable View, Change Owner, Clone, and Delete standard quick actions to the Test and Test Score page layouts. These quick actions are available from Salesforce Mobile and Lightning Experience Actions bar.
To use the new Case quick action:

Ensure that your profile has proper permissions to edit quick actions.
Edit the non-managed New Contact global action to specify a Record Type of Incident.
On the Test and Test Score page layouts, replace the default New Case quick action with the
New Case quick action we've provided with this release. If you see two New Case quick actions, use the standard, non-managed quick action (NOT k12kit__NewContact quick action).

For more information, see Quick Action Considerations.
Issues Closed
New Metadata
Page Layouts:

K12 Kit Application Layout
K12 Kit Test Layout
K12 Kit Test Score Layout

List View:

K12 All Application
K12 All Tests
K12 All Test Score

Deleted Metadata
Testing Notes
We cannot test trial org at this moment until this PR is merge to master - then test the trial org.

Merging PR to allow changes to be tested.


Create a CustomLink React component which abstracts over Next.js and Fluent UI Link

We prefer to use Next.js Link component for functionality as it supports pre-fetching and maintains scrolls after navigation. However, to be consistent with Fluent UI principles, we need to use its Link component to display it on the UI.
Currently it has used as shown here: https://github.com/ai-economy-simulator/ecosim-client/blob/a0fdcca428ee1873a5014a46d3cc82712388b52e/src/app/components/footer.tsx#L18-L20
Create a custom component CustomLink which abstracts over this nesting. It should take a child JSX component as prop and nest it inside the NextLink component.
https://github.com/ai-economy-simulator/ecosim-client/blob/a0fdcca428ee1873a5014a46d3cc82712388b52e/src/app/components/link.tsx#L4

I would like to work on this issue. Please assign this issue to me.

I've assigned it to you @GauravGupta993.


Using connect MP process with disconnect code (E23) still results in a connected metering point

Current Behavior

Sending in a request to connect an MP (Process type D15), but using the disconnection code (E23) still results in the metering point being connected, and a Metering point connected integration event to be sent out.
Expected behavior

Any other code than "Connect" (E22) using the process type D15 (connect metering point) should be rejected.
How to reproduce

Send in a request to connect a metering point in state "New", but use the disconnect code instead (E23)
Environment

U

Look into if we will provide this service for market.

We do not need to perform checks that are not part of the process. Talk to CCO

Has been fixed


Better Documentations ?

I can't find any documentation, README is not enough for a web framework. readthedoc can help you in some sense.

There is somehow narrative documentation by example in: https://github.com/squeaky-pl/japronto/tree/master/examples

yeah, i'd like to have some documentations like http://aiohttp.readthedocs.io/en/stable/web.html, for example, request/response/server/client etc. that would be very helpful. With only the README, i don't know even how to use request object.

https://github.com/squeaky-pl/japronto/blob/master/tutorial/4_request.md

how can i get the query parameters from request obj ?
like, "http://<IP_ADDRESS>:8080/profile/?query_id=012345678"

This is exactly documented in the file I linked:
```# Given a HTTP 1.1 GET request to /basic?a=1 this would yield
method set to GET, path set to /basic, version set to 1.1
query_string set to a=1 and query set to {'a': '1'}.```

doc in comment is not very noticeable. why not use some auto-doc system ? that'll be very helpful.
Thanks for your reply.

This project is intended for speed enthusiasts, people who like plumbing, exprimenting and early adopters. Whatever you see is a proof of concept. There is no point in writing nice documentation at this point since I know I am gonna break all the APIs anyway. That's why I don't want to encourage people to use it. If you are looking for somehow stable documented framework then aiohttp indeed or Sanic is for you.

Hi, I've been playing with japronto and so far I'm having a great time experimenting. But I'm not yet clear on how to approach unit testing, I get it that it's still a proof of concept in many ways, but perhaps there's a recommended way of doing unit tests?


Some static pages are not jumping into the correct page as markdown

The markdown is jumping into the right page, but the static page that is generated by Gatsby is not working using dynamic URL, example, in the normal-dungeon/1/2-1A.md, if selected option Forget it should jump into normal-dungeon/2/1.md, but on the static page is trying to jump into normal-dungeon/1/2/1

hello! Can I work on this?

Yes @AudreyKj, you could do it.

Hi @AudreyKj, sorry about this😶 , the issue is working now, but I don't know why.


Move system tables into SqlFileBase

Draft, because I don't understand, why this doesn't work.
If I execute the test with predefined folder only, the test passes. If I execute all fixture folders, it fails.
But I don't know why. I thought we create a new environment for each test execution. Or is there any kind of cache?

Okay, there is a cache. We do keep the environment using object and lazy. That's why I needed to unregister the old parser and register the new parser with the new system tables.

@AlecStrong What do you think?


New Engineering Effectiveness & Efficiency page

As requested on the issue #1404 of the Backlog, I added a page for the Engineering Effectiveness & Efficiency solution.
Please notice that it is still missing the images.

already at staging:
https://landing-staging.srcd.run/solutions/engineering-effectiveness-efficiency/
there are some missing images that should be added before merging

I added the three images of this page.
Maybe we can rethink about the layout, as with the images it has a lot of white space. I was thinking of putting below the intro text and the image the examples in two columns and then the buttons. What do you think @vcoisne?

yes @znegrin good idea. Can you try 2 columns?

I fixed the merge and reorganised the layout. Now this page should be completely ready.

sorry @znegrin; we need your super powers solving conflicts 👯♂

Fixed 👍


Presentation: Hierarchy level size limiting

Part of https://github.com/iTwin/itwinjs-backlog/issues/104
Related to https://github.com/iTwin/imodel-native/pull/187 and https://github.com/iTwin/presentation/pull/89
imodel-native: https://github.com/iTwin/imodel-native/tree/presentation/hierarchy-level-size-limiting

I skipped a failing test that needs to be updated to match the latest addon behavior. @MichaelBelousov is aware.


Converting pie charts into stacked bar charts

As we plan to convert pie charts into bar charts, I have a few suggestions:
Existing pie chart example:

1. Bar Chart:
A standard bar chart will compare numeric values between levels of a categorical variable which in our case is "Confirmed trip". One bar will be plotted for each level of the categorical variable, each bar’s length indicating numeric value. As we are looking at numeric values across one categorical variable("Confirmed mode"), I feel using a bar chart is a better option than using a stacked bar chart. We can have something like -

I will also add proportions on top of each bar or change the y-axis to percentages.
2. Stacked Bar Chart:
In stacked bar chart, we will have only one bar ( representing confirmed mode) divided into a number of sub-bars stacked end to end, each one corresponding to a level of the second categorical variable(different confirmed modes are (Bus, walk, e-bike).
It will also not be straightforward to compare other division's values across the one bar we have (confirmed trip) except the one division plotted against the base line.
It will look something like this -

or

@shankari any thoughts?

which in our case is "Confirmed trip".

It is actually "Confirmed mode" or "Confirmed purpose" as the case may be.

As we are looking at numeric values across one categorical variable("Confirmed mode")

As I said in
https://github.com/e-mission/em-public-dashboard/pull/82#issuecomment-1516852401

The general rule of thumb for replacing pie charts is stacked bar graphs, not bar graphs directly
what is important for the pie charts and their replacements is the proportions, not the actual numbers
using bar graphs directly focuses more on the numbers, not on the proportions

I know what stacked bar charts look like. There is an implementation of a visualization using stacked bar charts in https://github.com/e-mission/em-public-dashboard/pull/78 and the related paper.
I look forward to your recommended design, along with backing references, on how best to proceed.

e.g. search for "how should I replace pie charts?", read through all the results and make a recommendation that matches our specific use case and is well regarded in the literature, along with the justification.
If you find strong evidence that regular bar charts are the best way to show proportions of a whole, I am willing to see it, but I don't think that is the case.

While planning out the replacement, you should also consider that we want to eventually include error bars for these values - e.g instead of having 20% e-bike trips and 30% car trips, we will have 15-25% e-bike trips and 25-35% car trips.
That is the "count every trip" project that Michael is working on.
That is one of the reasons that we are switching away from pie charts - I am not sure how to put error bars on pie charts.
Or if there is a way to have error bars (error wedges) in pie charts, we can stick with them
Maybe https://www.physicsforums.com/threads/pie-chart-error-bars.909288/

visualization is about telling a story. you might want to read some of the material we have published on this to see the story that we want to tell, and then figure out how to represent that story in the graphs. Note again that the story is typically not "participants took 2000 e-bike trips" but more that the program achieved a 30% e-bike mode share.
e.g. https://www.osti.gov/biblio/1778194
https://www.osti.gov/biblio/1841348
I am also sending you to the in-progress version via email.

Pie charts vs Bar Charts
One of the major problems with pie charts is that it is almost impossible to directly compare the sizes of two slices unless the differences are very large whereas with bar charts our eyes compare the end points. Because they are aligned at a common baseline, it’s very easy to assess relative size. This makes it easy to see not only which segment is the largest but also how incrementally larger it is than the other segments.
Many articles do suggest using a bar chart as a replacement to pie charts but because our use case show proportions as a whole, stacked bar charts are a better choice. For example - We want to see 'The number of trips for each replaced transport mode for e-bike only'. In this case, we want to know about the transport mode most replaced by e-bike which the biggest stack in a stacked bar chart will tell us at a glance.
After going through the materials provided above I have come up with a few alternatives -
Percentage, or stacked bar charts:
It will be a single bar with each category having a coloured section within the bar accounting for a proportion of the total. The labels can sit inside the chart itself, providing an overall cleaner visual. There is also room for more categories than 3 or 4 as recommended for pie charts. Something like this -

If our eventual goal is to add errors to the stacked bar chart then we can do something like this in stacked bar chart -

Implementation link : https://towardsdatascience.com/the-quick-and-easy-way-to-plot-error-bars-in-python-using-pandas-a4d5cca2695d
Implementation :
I have also experimented with the implementation using python libraries numpy, pandas and matplotlib as mentioned in the article :

https://medium.datadriveninvestor.com/9-creative-alternatives-to-the-traditional-pie-chart-for-data-visualisation-4d0a624aafe5
<EMAIL_ADDRESS>

@swastis10
All that sounds good wrt stacked bar charts.
But:

I still don't see a list of possible recommendations and the pros and cons as requested in https://github.com/e-mission/em-public-dashboard/issues/83#issuecomment-1517022115 I just see justification for stacked bar charts. You have a link (https://medium.datadriveninvestor.com/9-creative-alternatives-to-the-traditional-pie-chart-for-data-visualisation-4d0a624aafe5) which lists 9 creative alternatives to pie charts. Stacked bar charts are only one of them. What are the pros and cons of stacked bar charts versus the other alternatives for our use case? Why would we use stacked bar charts versus (say) a treemap?
We already have an implementation of stacked bar charts using numpy, pandas and matplotlib in https://github.com/e-mission/em-public-dashboard/pull/78. Is there a reason to re-experiment with implementation? Why can we not just clean up that implementation and use it? Is cleanup even needed?
you had an initial concern https://github.com/e-mission/em-public-dashboard/issues/83#issue-1677491721 that a stacked bar chart will have only one bar. Is that still a concern? How does your design address that?
"If our eventual goal is to add errors to the stacked bar chart then we can do something like this in stacked bar chart -" - the graph in the example is not a stacked bar chart, only a regular bar chart.

I would like to take an example and explain the alternatives to pie charts and their pros and cons:

Here is a pie chart displaying the distribution of world population in the year 2021. Now we have 3 drawbacks while displaying this information in a pie chart -

We cannot compare size of 2 areas in a pie chart, say, we cannot tell China's population is greater than India by what magnitude.
As you can see in this example that pie charts are not very well suited for displaying large number of characteristics. Not a lot of legends are being displayed in the chart. ('223 others') We either have to increase the size of the legend or hover over it with mouse.
It gives a static overview of distribution. For eg - We can see world population distribution over 2021 but if we want to see trends over time then we will have to create 2 pie charts for 2 different years say, year 2020 and 2021. Now, if we want to compare the population of India in the year 2020 and 2021 we cannot readily do it by looking at 2 different pie charts.

For the human eye it is easier to compare two squared surfaces. Therefore, bar chart and stacked bar charts are 2 options.
Horizontal bar charts:

These charts essentially solve issues 1 and 2. Each feature can be displayed in a horizontal bar. The reader can readily understand the population of one country and compare it to another country. If a large number of countries is to be displayed, the number of horizontal bars will simply be more without affecting the reader's ability to read the data.
Tree Maps:
They are good for representing hierarchical data. Our use case does not have dependent data e.g work, home, shopping etc. Also they are not user friendly.
Donut Chart:
It has very similar drawbacks as Pie chart
Stacked bar chart

These chart solve issues 1 and 3. Because of squared shapes it is easier to compare surfaces between two countries or between two time frames. In our usecase we do not have a lot of characteristics to display therefore 2 is not really as issue in our case. But there are scenarios where we want to compare 2 pie charts like this. (stacked bar charts are a better choice)

As our use case show proportions as a whole, stacked bar charts are a better choice. We can easily get an understanding of how each category contributes to the overall picture. For example - We want to see 'The number of trips for each replaced transport mode for e-bike only'. In this case, we want to know about the transport mode most replaced by e-bike which the biggest stack in a stacked bar chart will tell us at a glance.
The stacked bar chart with just be a single bar showcasing each purpose of the trip stacked onto one another.

Another example of a stacked bar chart with error bars would be -

I will use the implementation in https://github.com/e-mission/em-public-dashboard/pull/78

@swastis10 this still does not address all my questions and raises new ones
New questions:

wrt treemaps "Also they are not user friendly." why? Where is this a quote from?
from the three points that you listed, do we have a lot of (3, comparisons over time)? In which graphs?

existing questions:

I still see only four alternatives discussed (bar, stacked bar, tree and donut), where donut is essentially the same as pie. Are those the main alternatives? please cite your source.
you had an initial concern https://github.com/e-mission/em-public-dashboard/issues/83#issue-1677491721 that a stacked bar chart will have only one bar. Is that still a concern? How does your design address that?

new questions

wrt treemaps "Also they are not user friendly." why? Where is this a quote from?

As stated in https://www.nngroup.com/articles/treemaps/, bar charts should be preferred over Treemaps if possible.

A treemap is a complex, area-based data visualization for hierarchical data that can be hard to interpret precisely. In many cases, simpler visualizations such as bar charts are preferable.

from the three points that you listed, do we have a lot of (3, comparisons over time)? In which graphs?
We have done some comparisons over time. For example -

Trends in mode share shifted over time. E-bike mode share dropped as the weather grew colder. But even in the height of winter in Colorado, the e-bike mode share was a respectable 25%

Or number of trips for each mode over a time period for different programs.

existing questions

I still see only four alternatives discussed (bar, stacked bar, tree and donut), where donut is essentially the same as pie. Are those the main alternatives? please cite your source.

There were other alternatives which did not seem valid in our case. For example :
Packed bubble chart:  it is difficult to get exact values or a ranking from the unordered bubble sizes.
Waffle chart: They aren't very common, therefore need to educate users about them
Source: https://slidebazaar.com/blog/alternatives-to-pie-charts/
https://owllytics.com/3-pie-chart-alternatives-guarantee-to-capture-attention-better/
https://www.storytellingwithdata.com/blog/2014/06/alternatives-to-pies

you had an initial concern https://github.com/e-mission/em-public-dashboard/issues/83#issue-1677491721 that a stacked bar chart will have only one bar. Is that still a concern? How does your design address that?
The stacked bar chart will have a single bar. Something like this -

Here, we can see the number of trips for each purpose and also compare it to the specific mode (say e-bike) and the purposes for it being used.

@swastis10 for this:

Trends in mode share shifted over time. E-bike mode share dropped as the weather grew colder. But even in the height of winter in Colorado, the e-bike mode share was a respectable 25%

we have timeseries visualizations in the public dashboard.
Are you suggesting that we have stacked bar graphs in addition to the timeseries or instead of the timeseries?
Note that the public dashboard is updated daily.
What concretely do you have in mind? (maybe a quick sketch using powerpoint or figma would be helpful).

Here, we can see the number of trips for each purpose and also compare it to the specific mode (say e-bike) and the purposes for it being used.

This is roughly what I had in mind when I said "Concretely, I think you can come up with a design that addresses both new question #2 and existing question number #2 if you think hard enough. "
But not exactly. What would you do for studies, for example?

Are you suggesting that we have stacked bar graphs in addition to the timeseries or instead of the timeseries?

@shankari , because we are working with time series of correlated data points; it is a good practice to plot the data as a line plot. Had the data been uncorrelated, then bar charts were a better option over line plots. So timeseries is good.

Do we have multiple programs in the dashboard now? How would we handle this with the current metrics?

We do not have multiple programs in the dashboard. (Default only) Are we testing studies only?

What concretely do you have in mind? (maybe a quick sketch using powerpoint or figma would be helpful).

I have a design roughly like this on my mind-

@swastis10

Do we have multiple programs in the dashboard now? How would we handle this with the current metrics?

This was a rhetorical question that was designed to guide you towards a better design, as are almost all my questions from the comment. I know that we don't have multiple programs now - I wrote the dashboard code (both in the CanBikeCO. The goal was to make you think about the second part of that question: "How would we handle this with the current metrics?" We don't have program specific metrics.
Rhetorical question: What metrics do we have? How would you want to handle them?
More concretely:
You had said "Or number of trips for each mode over a time period for different programs." as a reason for using stacked bar instead of regular bar graphs.
But we don't have multiple programs in the dashboard now.  So we will not want to show the number of trips for each mode over a time period for different programs.
Rhetorical question: What are some metrics that we might be able to compare?

Are we testing studies only?

Read the code. Rhetorical question: Does the code only work with studies?

I have a design roughly like this on my mind-

But this has only one bar. In prior comments, you have said that the advantage of stacked bars over regular bar graphs is that it supports comparisons. But if you don't do any comparisons, then what is the advantage?
I am going to wait for one more response and then just give you a design to implement because I feel like we are just discussing in circles and this is taking too much time.

@swastis10
much better, but still not a very well-researched or well-understood plan. At this point, I will take over and provide a detailed, step-by-step design and you can focus on the implementation.
At a high level, we need to support both studies and programs. All the e-bike comparisons that you have outlined are only relevant for programs. "What does an e-bike replace" is not relevant unless you are providing e-bikes to the people who are collecting the data.
So the answer to:

Are we testing studies only?

is that OpenPATH is used for both studies and programs. Programs have a mode of interest and studies do not. So you cannot just copy-paste analysis results from a program-oriented paper for your design.

A comparison between total number of trips vs Mode choice for trips under 10 miles

This is much closer to what we are looking for, since it is relevant for both programs and studies.
So a concrete design would be something like:
The current list of metrics for studies is defined in https://github.com/e-mission/em-public-dashboard/blob/main/frontend/metrics_study.html
The current list of metrics for programs is defined in https://github.com/e-mission/em-public-dashboard/blob/main/frontend/metrics_program.html
Common pie charts between studies and programs, grouped into similar bins for comparison:
Group #1 (number of trips):

number of trips for each mode
number of commute trips for each mode
number of trips under 10 miles for each mode

Group #2 (trip mileage):

number of miles for each mode
number of commute miles for each mode (new metric)
number of miles for each mode in trips under 10 miles (new metric)

Group #3 (trip purpose):

number of trips for each purpose
number of miles for each purpose (new metric)

Additional pie charts only for programs:

number of trips for each purpose for the mode of interest
number of miles for each purpose for the mode of interest (new metric)

So a basic new design would be:

for all deployments, create group 1, group 2 and group 3
for programs, also create group 4

A better new design would be:

for all deployments, create group 1, group 2 and group 3
for programs, create group 4 and also group 5a and 5b that mix and match the purposes

Group 5a:

number of trips by purpose for all trips
number of trips by purpose for e-bike trips

Group 5b:

number of miles by purpose for all trips
number of miles by purpose for e-bike trips

You will also need to change the frontend to display the new metrics and make sure that the proportions of the boxes match the proportions of the new figures.

Now tracked in #86


abstract out kedge "populators"

Take a look at the diagram below:

Diagram explanation
The left block in app with the name containers[] is the containers[] that we over-ride with our custom fields like health, envFrom. The right block is the one that is part of podSpec that we have over-ridden in the left.
Problem explanation
We have added certain new fields on top of what is defined in containers spec. And so the data is parsed into these defined fields that are outside like the containers[] in app gets all the data while the containers[] in podSpec has no data.
The containerSpec has to be copied into the containerSpec in podSpec. So we have to copy all the data from app level containers[] to podSpec containers[]. Also health has to be transformed into livenessProbe and readinessProbe; envFrom gets populated into envs in container.
Right now this population happens in functions like populateVolumes, populateContainerHealth and one in envFrom which currently in PR review is populateContainerHealth.
Why put all this data in the podSpec you might ask, because once this canonical podSpec is created we can simply give it to any controller that needs podSpec and since all the data is already validated, defaulted and populated in one place we don't need to do anything after that. You can see this happening in code right now where deployment is created:
deploymentSpec.Template.Spec = app.PodSpec

goto code here.
Proposal
So I propose these changes should happen via a layer like we have right now of defaulters https://github.com/kedgeproject/kedge/issues/50 and validators https://github.com/kedgeproject/kedge/issues/49 . So creating a layer called a populators which does above which is already happening right now alongside conversion code.

The diagram was created using https://www.draw.io/

Closing since we use populators now


problem with bootstrap 4

after insert digits don't show the list of item.

Can you provide an example?  Its been a while since anyone has worked on this, I'm not surprised there's an issue with Bootstrap 4.

@truckingsim
Maybe he has the same problem as me. If Bootstrap 4 is used, then the request is sent and probably received (Ajax), but it is not changed on the client side, so the client can not choose the right option.
I am talking about a situation in which we will only replace libraries with newer ones.

The problem is that our repo doesn't directly use any bootstrap.  We using jQuery's ajax to make the request, we change the actual underlying select element, and then call refresh on the bootstrap-select instance.  Bootstrap-select is not part of bootstrap.  I get there's a problem, but without having an example its hard to tell if this is on us or something else.

@truckingsim Yep, but Bootstrap-select is compatibile with Bootstrap 4. But maybe I have something in the code (I mean i just download Ajax Bootstrap Select code and change versions to newest)
http://<IP_ADDRESS>/ajax/example/php/index2.php

So .dropdown-menu is display: none for some reason.  That's why none of the options are showing.  We are rendering them, but the menu is hidden.  Did you upgrade the bootstrap-select version as well?  It may be doing something to the dropdown menu to make it visible in 4?

I will try to play, because even the menu on the left should display the results (as it does not use Ajax). However, in another project I use Bootstrap Select (the latest from Bootstrap 4) and no problems.

That's exactly why i asked :).  Let me know if you find anything interesting.

Same issue here. Still not able to identify why .dropdown-menu is display: none. Also noticed that even when changing to display: block it works in the first time but when clicking again the search box is misplaced and nothing appears, seems to be breaking some CSS.

i have no problems with bs4.
use the dev branch of bootstrap-select.
this is a bs-select issue and not a bs-ajaxselect issue!
im on 1.13.3-dev bs-select, but there is now a 1.14-dev and official bs-4 support is announced.
https://github.com/snapappointments/bootstrap-select/tree/v1.14-dev


Remove deprecated exclusion zones features.

Removed the old "exclusion zones" feature, which has been deprecated since v1.11.0. Cesium for Unreal has CesiumCartographicPolygon and CesiumTileExcluder now, which are better.

Thanks for the pull request @kring!

:heavy_check_mark: Signed CLA found.

Reviewers, don't forget to make sure that:

[ ] Cesium for Unreal Samples works.


Refresh token automatically on HTTP 401 or 403 response?

I'm using the API (v1.0.10) in the following way:
    var oauth2Client = new OAuth2(getGoogleCredentials().clientId, getGoogleCredentials().secret);
    oauth2Client.setCredentials({
      access_token: user.services.google.accessToken,
      refresh_token: user.services.google.refreshToken
    });
    calendar.events.list({
        calendarId: 'primary',
        auth: oauth2Client
      }, ...);

When my token is expired I get an HTTP 401 back from the server. However, I'd expect the library to automatically refresh my token and make the request again. It doesn't.
I figured out that a workaround is to add the expiry_date when calling setCredentials, e.g.
oauth2Client.setCredentials({
      access_token: user.services.google.accessToken,
      refresh_token: user.services.google.refreshToken,
      expiry_date: user.services.google.expiresAt
    });

But this isn't mentioned in the docs. I'd expect expiry_date to be optional and the API to auto refresh the token.

So is there any event I can listen and refresh token automatically?

I ran into a similar issue. What works for me is to set expiry_date to true when setting the credentials and I don't have a date availble. This will force a token refresh, you can then store the client's expiry_date after using it.
    oauth2Client.setCredentials({
      access_token: user.google.accessToken,
      refresh_token: user.google.refreshToken,
      expiry_date: true
    });

As this issue is not closed yet, I thought I'd ask for an update on the matter. As discussed before, the token is not automatically refreshed, when sending both the refresh_token and the access_token and as @zoellner suggested, adding expiry_date: true solves this problem. However, in the documentation (README.md) it says:

You can start using OAuth2 to authorize and authenticate your requests to Google APIs with the retrieved tokens. If you provide a refresh_token and the access_token has expired, the access_token will be automatically refreshed and the request is replayed.

So you might want to update that.

Spent the last hour debugging my code because of the misleading Readme.md :( You should fix this.

Please update the readme.md.  As was pointed out by the last two posters, the readme is wrong.  The access_token is NOT automatically refreshed.  Thanks above for the tip on expiry_date: true.

Actually, setting expiry_date: true is forcing a refresh of the access token on every request, which probably is not what you want.
A better work around is to store the expiry_date the API is returning and including it in the following requests. That will make the auto-refresh work, while only refreshing the access token when needed (instead of on every request).
Eg, something like:
const oauth2Client = new OAuth2(clientId, secret, redirectUrl);
let tokens = db.getTokens();
let {access_token, refresh_token, expiry_date} = tokens;
oauth2Client.setCredentials({access_token, refresh_token, expiry_date});

let response = await gmail.users.messages.list({ userId: 'me', auth: oauth2Client });

// If a refresh occured, store the new access_token and expiry_date
if (oauth2Client.credentials.id_token) {
  console.log('Received new tokens');
  db.storeTokens(oauth2Client.credentials);
}

@lirbank refresh token work on sockets? such as socket.io

Can i call the calendar event(insert,update,delete) by authentication token without authorization process?

I clarified in the README.
See https://github.com/google/google-api-nodejs-client/issues/261#issuecomment-233215639 for an example.

@jmdobry where does the initial expiry_date value come from?

After logging into my web app  PassportJs Google Oauth2
oAuth2.setCredentials({
access_tokens: user[0].access_token,
refresh_tokens: user[0].refresh_token,
expiry_date: true
});
    plus.people.get({
      userId: 'me',
      auth: oAuth2
    }, function (err, response) {

      console.log(err);
      res.send(response);

    });

I am always receiving an error [Error: No access or refresh token is set.]
Can anyone please help me why the tokens are not set

@aduddella Here's an example of plus.people.get: https://github.com/google/google-api-nodejs-client/pull/690/files#diff-a88bd7f246f78d9b231774787108751f

@lirbank https://github.com/google/google-api-nodejs-client/issues/261#issuecomment-233215639
In contrast, the readme details the following approach:
oauth2client.on('tokens', (tokens) => {
  if (tokens.refresh_token) {
    // store the refresh_token in my database!
    console.log(tokens.refresh_token);
  }
  console.log(tokens.access_token);
});

Are both approaches fine, or is one recommended? Does tokens here include expiry_date?

Greetings!  The event based approach is new, and was added after this post was originally answered :) . Both ways are fine honestly.  The nice thing about using the event is that you get notified not only when the refresh_token changes, but also when the access_token is refreshed.  The tokens returned here should return the expiry_date.

Cheers for the snappy response! 🍻

@JustinBeckwith is there a better example with using the event based approach? I mean in a fuller context. i.e do i listen to the event before making a request to youtube api for example or something?


As an applicant, ability to submit collaborative applications with multiple people/entities

[ ] Create an "Add collaborators" section in Basic info for Concept notes and Proposals
[ ] For each click, add new Name and Email fields
[ ] Create an "This is a collaborative submission" check at the end of Basic Info for Concept Notes (link to what that means).
[ ] Create a function that deletes draft concept notes w/o validated users after 30 days, or draft concept notes w/o any activity in the last 30 days
[ ] Allow revisions and save as draft, for all validated (non-staged) users, and allow other collaborators to be added after
[ ] Require all applicants to "sign off" on the application before it can be submitted for OTF team review
[ ] Send determination msgs or any other notifications to all applicants, including invite for proposal msgs
[ ] Copy editors from the concept note to a proposal when invited
[ ] Require all applicants to "sign off" on the proposal before it can be submitted for OTF review
[ ] Somehow add a filter (maybe a state?) that allows OTF team to see collaborative applications still in draft

Related to #324

Yes! thanks @saoun. I tried searching, but wasn't finding the right things.

related to https://github.com/OpenTechFund/hypha/issues/1878


📎  Implement function-no-unknown

Hello! I'm interested in tackling this issue.

Sure, go ahead!

I've implemented the basic rules, but I'm still working out the details and have some questions:

In stylelint, double-dashed custom functions (e.g., --custom-function()) are ignored. Should Biome do the same?
stylelint retrieves its list of known CSS functions from the css-functions-list package. Should Biome use this list as well?

I've implemented the basic rules, but I'm still working out the details and have some questions:

In stylelint, double-dashed custom functions (e.g., --custom-function()) are ignored. Should Biome do the same?

We should too for now, because we don't have a semantic model yet. We wouldn't be able to understand if the function is defined somewhere else.

stylelint retrieves its list of known CSS functions from the css-functions-list package. Should Biome use this list as well?

We should copy this list, and maybe add a comment with a link to it.

Understood. Thank you for the guidance. I have created the PR (#2570).

I've implemented the basic rules, but I'm still working out the details and have some questions:

In stylelint, double-dashed custom functions (e.g., --custom-function()) are ignored. Should Biome do the same?

We should too for now, because we don't have a semantic model yet. We wouldn't be able to understand if the function is defined somewhere else.

stylelint retrieves its list of known CSS functions from the css-functions-list package. Should Biome use this list as well?

We should copy this list, and maybe add a comment with a link to it.

I am thinking of vendoring the list for Stylelint for 2 reasons:

some of the vendor prefixed functions listed don't exist
it's easier to maintain (would hurt the community though)

It's time consuming to check them one by one but Ill eventually have to do it.
i.e. the prefixed ones were automatically generated

Yeah it would be great to have a single source of truth.
From our end, we can just automatically update that list some internal scripts


Investigate exports for R26 from import form

Description of the issue
From all of the datasets with import forms filled out for R26, investigate how many of them have not got to a finished status (Exported, submitted)
List of R26 datasets according to import form

https://contribute.data.humancellatlas.org/projects/detail?uuid=f3825dfe-990a-431f-b971-9c26d39840db
https://contribute.data.humancellatlas.org/projects/detail?uuid=c5b475f2-76b3-4a8e-8465-f3b69828fec3
https://contribute.data.humancellatlas.org/projects/detail?uuid=2d4d89f2-ebeb-467c-ae60-a3efc5e8d4ba
https://contribute.data.humancellatlas.org/projects/detail?uuid=3ce9ae94-c469-419a-9637-5d138a4e642f
https://contribute.data.humancellatlas.org/projects/detail?uuid=cd9d6360-ce38-4321-97df-f13c79e3cb84
https://contribute.data.humancellatlas.org/projects/detail?uuid=7c599029-7a3c-4b5c-8e79-e72c9a9a65fe
https://contribute.data.humancellatlas.org/projects/detail?uuid=c281ab63-7b7d-4bdf-b761-9b1baaa18f82

Acceptance criteria

[x] All projects have been assessed and the assessment properly indicated in the ticket
[ ] The import team has been informed about these issues

Complete/Exported

https://contribute.data.humancellatlas.org/projects/detail?uuid=f3825dfe-990a-431f-b971-9c26d39840db
https://contribute.data.humancellatlas.org/projects/detail?uuid=2d4d89f2-ebeb-467c-ae60-a3efc5e8d4ba&tab=upload
https://contribute.data.humancellatlas.org/projects/detail?uuid=cd9d6360-ce38-4321-97df-f13c79e3cb84&tab=upload
https://contribute.data.humancellatlas.org/projects/detail?uuid=c281ab63-7b7d-4bdf-b761-9b1baaa18f82&tab=upload
Exporting
https://contribute.data.humancellatlas.org/projects/detail?uuid=c5b475f2-76b3-4a8e-8465-f3b69828fec3
https://contribute.data.humancellatlas.org/projects/detail?uuid=3ce9ae94-c469-419a-9637-5d138a4e642f&tab=upload
https://contribute.data.humancellatlas.org/projects/detail?uuid=7c599029-7a3c-4b5c-8e79-e72c9a9a65fe&tab=upload (Put to graph valid by accident when trying to move another dataset, but was stuck in exporting)

Actions:
@ESapenaVentura to contact nathan to inform about those 3 datasets, for them to not be imported
@ESapenaVentura to contact the main wranglers for those 3 datasets, so that they can send another import form for the next release

Main wranglers to export these 3 datasets and fill in import forms for the release - this will work as a test for the ingest system.


max_cellname_length being ignored

max_cellname_length being ignored
import gdsfactory as gf

gf.CONF.max_cellname_length = 3 # making the cell name ridiculously short
c = gf.Component('Example_long_name')
print(c.name)

in principle this is also fixed by #2909 (and related fixes in kfactory for show, etc.)
I don't know if it's really practical that anyone actually sets the limit to such a low number, but it's maybe worth noting that

when max_cellname_length == 9, the @cell decorator will reduce the name to _<HASH>
when max_cellname_length < 9, the @cell decorator will basically ignore you
when max_cellname_length < 8, klayout will not shorten cell names to less than 8 characters on save

which is to say, maybe there should be some sort of warning when max_cellname_length is set to anything less than 10?
@sebastian-goeldi
import gdsfactory as gf

gf.CONF.max_cellname_length = 9 # don't make this number smaller than 9...

@gf.cell
def really_loooooooooong_name():
    return gf.Component()

c = gf.Component('Example_long_name')
# don't expect this to work... shortening happens on save or @cell creation
# print(c.name)

# cell name will be shortened
c.write_gds("test.gds")

c2 = really_loooooooooong_name()
# this will also work
print(c2.name)

I would suggest that we simply restrict it to a minimum of 9 with
https://docs.pydantic.dev/2.3/api/types/#pydantic.types.PositiveInt

sounds great to me


About  v1_0_train_nus.json

Hi author, what is the purpose of this file v1_0_train_nus.json? Also tags like <c1,CAM_BACK,1088.3,497.5> appear directly in the Q&A and do not reflect the category and coordinate information. Can you explain this? thanks!!!

Hi! These files are from the DriveLM dataset, I'd recommend to check their repo here: https://github.com/OpenDriveLab/DriveLM


Host path volumes are now needed

Summary
What happened/what you expected to happen?
Since upgrading from 2.12.9 to 3.x I am unable to submit any workflows. This is because we have pod security policies in place that forbid the use of host path volumes, these policies were in place when using 2.12.9 as well so it would seem in 3.x something has been introduced that requires the use of host path volumes, but I was unable to find anything on https://argoproj.github.io/argo-workflows/upgrading/.
So if this was intentional, why? and which paths in particular? If it wasn't then I guess it is correct to raise this as a bug.
I can confirm that removing the pod security policy stops the error from occurring.
Diagnostics
👀 Yes! We need all of your diagnostics, please make sure you add it all, otherwise we'll go around in circles asking you for it:
What Kubernetes provider are you using?
GKE
What version of Argo Workflows are you running?
I have tried 3.0.3, 3.0.8 and 3.1.2
What executor are you running? Docker/K8SAPI/Kubelet/PNS/Emissary
K8SAPI
Did this work in a previous version? I.e. is it a regression?
Yes, this worked fine in 2.12.9
Workflow YAML:
metadata:
  name: delightful-python
  labels:
    example: 'true'
spec:
  arguments:
    parameters:
      - name: message
        value: hello argo
  entrypoint: argosay
  templates:
    - name: argosay
      inputs:
        parameters:
          - name: message
            value: '{{workflow.parameters.message}}'
      container:
        name: main
        image: 'argoproj/argosay:v2'
        command:
          - /argosay
        args:
          - echo
          - '{{inputs.parameters.message}}'
  ttlStrategy:
    secondsAfterCompletion: 300
  podGC:
    strategy: OnPodCompletion

# Logs from the workflow controller:

time="2021-07-26T11:48:11.047Z" level=info msg="Processing workflow" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.054Z" level=info msg="Updated phase  -> Running" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.055Z" level=info msg="Pod node delightful-python initialized Pending" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=warning msg="Non-transient error: pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]"
time="2021-07-26T11:48:11.062Z" level=info msg="Failed to create pod delightful-python (delightful-python): pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=warning msg="Non-transient error: pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]"
time="2021-07-26T11:48:11.062Z" level=error msg="Mark error node" error="pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]" namespace=bibcd-argo nodeName=delightful-python workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="node delightful-python phase Pending -> Error" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="node delightful-python message: pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="node delightful-python finished: 2021-07-26 11:48:11.062743502 +0000 UTC" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=error msg="error in entry template execution" error="pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=warning msg="Non-transient error: pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]"
time="2021-07-26T11:48:11.062Z" level=info msg="Updated phase Running -> Error" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="Updated message  -> error in entry template execution: pods \"delightful-python\" is forbidden: unable to validate against any pod security policy: [spec.volumes[1]: Invalid value: \"hostPath\": hostPath volumes are not allowed to be used]" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="Marking workflow completed" namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.062Z" level=info msg="Checking daemoned children of " namespace=bibcd-argo workflow=delightful-python
time="2021-07-26T11:48:11.075Z" level=info msg="Workflow update successful" namespace=bibcd-argo phase=Error resourceVersion=160042919 workflow=delightful-python
time="2021-07-26T11:48:11.075Z" level=info msg="Queueing Error workflow bibcd-argo/delightful-python for delete in 5m0s"
time="2021-07-26T11:48:11.075Z" level=info msg="Queueing Error workflow bibcd-argo/delightful-python for delete in 5m0s"

Message from the maintainers:
Impacted by this bug? Give it a 👍. We prioritise the issues with the most 👍.

I was able to describe a pod from a workflow submitted after removing those policies and I can see this:
  docker-sock:
    Type:          HostPath (bare host directory volume)
    Path:          /var/run/docker.sock
    HostPathType:  Socket

I'm not using the docker executor though, is this expected?

hmm, ARGO_CONTAINER_RUNTIME_EXECUTOR:   is blank, even though I have it configured to use K8SAPI in the config map. This would make it default to the docker executor I assume?

maybe the config map structure has changed?

The config map I am using:
apiVersion: v1
kind: ConfigMap
metadata:
  name: workflow-controller-configmap
data:
  containerRuntimeExecutor: k8sapi

  executor: |
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 0.1
        memory: 64Mi
      limits:
        cpu: 0.5
        memory: 512Mi

Looks like the above config map was not being applied by our CD system, I applied it manually and this seems to be resolved now.
However, it does seem like the config map structure has changed. The old one I was using (and was working with 2.12.9) was:
apiVersion: v1
kind: ConfigMap
metadata:
  name: workflow-controller-configmap
data:
  config: |
    containerRuntimeExecutor: k8sapi
    executor:
      imagePullPolicy: IfNotPresent
      resources:
        requests:
          cpu: 500m
          memory: 500Mi
        limits:
          cpu: 500m
          memory: 500Mi

This structure now appears to have changed to the one in my previous comment.


Can't import node_module SVG

Reproduction
Found an issue that was closed: #8606
No further help was commented on however and the help section on the Remix Docs didn't help either.
Comment from other Issue:
@pcattori I seem to have the same problem and the troubleshooting section didn't help.
I've a similar setup:
I have a package, which expects  "@package/icons" to exist in the repository and in that packages lib build, it imports it:
import icons from<EMAIL_ADDRESS>
In my Library, everything works fine.
In Remix, when I start my dev or build, I get the error:
"[vite] Internal server error: Unknown file extension ".svg"
In my vite.config.ts I have an alias:
'@package/icons': resolve(__dirname, './node_modules/@package/icons'),

I've tried using the cjsInterop Package (however, I'm trying to reference a node_module svg here, not a JS File).
When I try to incorporate @brophdawg11 's suggestion with ssr.noExternal, I also get the error:
[vite] Internal server error: module is not defined
So I'm currently at an impasse and can confirm that I, too, have the same problem importing non-JS-Files from external packages.
System Info
System:
    OS: macOS 14.4.1
    CPU: (11) arm64 Apple M3 Pro
    Memory: 253.22 MB / 36.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.11.1 - ~/.nvm/versions/node/v20.11.1/bin/node
    npm: 10.2.4 - ~/.nvm/versions/node/v20.11.1/bin/npm
  Browsers:
    Chrome: 124.0.6367.62
    Edge: 123.0.2420.97
    Safari: 17.4.1
  npmPackages:
    @remix-run/dev: ^2.8.1 => 2.8.1
    @remix-run/node: ^2.8.1 => 2.8.1
    @remix-run/react: ^2.8.1 => 2.8.1
    @remix-run/serve: ^2.8.1 => 2.8.1
    vite: ^5.2.8 => 5.2.9

Used Package Manager
npm
Expected Behavior
Third-party SVGs should be able to be impored
Actual Behavior
Third-party (node_module package) SVGs can't be imported

Could you provide a minimal reproduction?

@brophdawg11 in the original issue #8606 there is a stackblitz link:
https://stackblitz.com/edit/vitejs-vite-u1xsya
I've also noticed that if I link the package, everything works fine. Only when I install the package it fails. If that helps.


revisit caching / health strategies for external systems

Add new checks to Boot's /health endpoint

Duplicates #545 and #553