really drop python<=3.7 support

Description
Filter all code over pyupgracde --py38-plus.
Related Issues
N/A
Checklist

[ ] This PR has sufficient documentation.
[x] This PR has sufficient test coverage.
[ ] This PR title satisfies semantic convention.

Additional Comments

No additional comments.

None of the refactor this PR does actually removes any py3.7 specific constructs? What's the motivation for this PR?
That being said, it does seem to catch some redundant stylistic things so happy to get this merged as clean up.

Superseded by https://github.com/syrupy-project/syrupy/pull/921


Code speedup

There's a lot of low-hanging fruit in the optimization of the code. Most of the simulation time is spent on dict-related operations, such as __hash__ and __eq__ in particular. Re-writing some of the often-called and dictionary-heavy functions will greatly improve the runtime.
See https://github.com/KULeuven-MICAS/zigzag/pull/60 for WIP.

Currently, Zigzag has the concept of MemoryOperands (eg I1, I2) and LayerOperands (I, W). The idea behind this distinction is that users can create layers with different names for the layer operands. To map the layer operands to the memory operands, each layer has a MemoryOperandLinks instance to map layer to memory operands.
In practice, only the same two layer and memory operands occur, and the MemoryOperandLinks is always the exact same, namely the default. I don't know any use case of having a different layer-to-memory-operand mapping.
Dealing with this variable mapping from layer to memory operand costs a lot of execution time and complexity. There are many, many occurrences of this translation. The code could be significantly sped up by removing MemoryOperandLinks, merging the concept of memory and layer operands into one, and hardcoding the operands (e.g. layer.operand_1 or layer.weight_op ).
Are there any drawbacks in this approach? Am I missing use cases where a non-default ``MemoryOperandLinks` is needed?


2.0.3 - Ignoring bypass request

My bypass seems to have stopped working recently. I believe it might have happened after I updated to 2.0.3
[11/22/2022, 4:32:16 PM] [Envisalink-Ademco] setByPass:  Bypass set -  true
[11/22/2022, 4:32:16 PM] [Envisalink-Ademco] Alarm is READY no action required. Ignoring bypass request.
[11/22/2022, 4:32:16 PM] [homebridge-envisalink-ademco] Characteristic 'On': SET handler returned write response value, though the characteristic doesn't support write response. See https://homebridge.io/w/JtMGR for more info.
[11/22/2022, 4:32:16 PM] [homebridge-envisalink-ademco] Error:
at On.Characteristic.characteristicWarning (/homebridge/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:2138:105)
at /homebridge/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:1756:22
at /homebridge/node_modules/homebridge/node_modules/hap-nodejs/src/lib/util/once.ts:10:18
at EnvisalinkCustomAccessory.setByPass (/homebridge/node_modules/homebridge-envisalink-ademco/accessories/customAccessory.js:211:17)
at On. (/homebridge/node_modules/homebridge-envisalink-ademco/accessories/customAccessory.js:60:62)
at On.emit (node:events:513:28)
at /homebridge/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:1725:16
at new Promise ()
at On. (/homebridge/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:1723:14)
at step (/homebridge/node_modules/homebridge/node_modules/tslib/tslib.js:144:27)
[11/22/2022, 4:32:17 PM] [Envisalink-Ademco] Command | %00,01,1C28,08,00,PRIME SLIDER    CHIME,Rdy to Arm$,00,01,1C28,08,00,PRIME SLIDER    CHIME,Rdy to Arm | Acknowledged
[11/22/2022, 4:32:17 PM] [Envisalink-Ademco] Envisakit Operation: updatekeypad
[11/22/2022, 4:32:17 PM] [Envisalink-Ademco] systemUpdate: Status changed -  {
partition: '01',
code: {
icon: [ 3, 5, 10, 11, 12 ],
zone: '08',
beep: 'off',
txt: 'PRIME SLIDER    CHIME'
},
status: 'Virtual Keypad Update',
keypadledstatus: {
alarm: false,
alarm_in_memory: false,
armed_away: false,
ac_present: true,
bypass: false,
chime: true,
not_used1: false,
armed_zero_entry_delay: false,
alarm_fire_zone: false,
system_trouble: false,
not_used2: true,
not_used3: true,
ready: true,
fire: false,
low_battery: false,
armed_stay: false
},
mode: 'READY'
}

Hi,
Nothing changed from previous version (e.g. 2.0.1) in regards to the alarm bypass code and I have been personally using it without issue. However, I did notice a best coding practice that I wasn't following from (https://github.com/homebridge/homebridge/wiki/Characteristic-Warnings). I have updated /homebridge/node_modules/homebridge-envisalink-ademco/accessories/customAccessory.js and upload it to the code repo. Please replace your current customAccessory.js with the repo version and let me know if the error disappears.
In addition please make sure your running the last homebridge v1.5.1


Cannot preview article before saving draft or publishing

Until saving/publishing the Preview button returns an error. Better to only show the preview button once the article is saved/published.

@ehmadzubair

Artciles can be previewed before publishing and a bug was preventing it. This will be fixed in #415


add a new label-warning using default orange color

labels have too few colors by default, only 3 available states and intermediate one would be an improvement.

 You should sign our Contributor License Agreement in order to get your pull request merged.

@bvanalderweireldt can you open this pull request against the develop branch? Thanks


add 1.6 edge and beta bundle files

Create edge and beta bundle files with upgraded components versions

NOTE: unchecked items are the ones whose version is still under discussion/missing, and thus it hasn't been updated in the bundles definition. Check the item ONLY after modifying the bundle files.

[x] mlmd (1.9.0 latest release) (current version 1.0.0, next version ?) -> not included in the bundle
[x] minio -> no version, latest/edge, stays the same
[x] oidc-gatekeeper - this component's upgrade is a nice to have, see kubeflow/manifests#2150 for more info -> ckf-1.4/edge as no upgrades were merged in upstream
[x] envoy-operator (1.20.6 latest release) (current version 1.12.2, next version ?) -> not included in the bundle
[x] katib-db points to charmed-osm-mariadb-k8s - stays the same
[x] kfp-db points to charmed-osm-mariadb-k8s - stays the same
[x] argo-operators 3.3 (3.3.8)
[x] dex-auth-operator 2.31 - as in kubeflow/manifests#2243
[x] istio-operators 1.11 - Upstream will support 1.13
[x] metacontroller-operator v2.0.4 (4.2.1 latest release)
[x] seldon-core-operator 1.14 (1.14.0 latest release)

The following versions were extracted from kubeflow/manifests README.md and kubeflow/manifests#2242:

[x] training-operator 1.5 (1.5.0-rc0 release)
[x] katib 0.14 (0.14.0 release)
[x] notebook-operators 1.6
[x] kubeflow-dashboard-operator 1.6
[x] kubeflow-profiles-operator 1.6
[x] kubeflow-tensorboard-operators 1.6
[x] kubeflow-volumes-operator 1.6
[x] kubeflow-roles-operator 1.6
[x] kfp-operators 2.0 (see kubeflow/manifests#2200 for more info)
[x] admission-webhook-operator 1.6

Useful links

kubeflow/manifests#2207
kubeflow/manifests#2194
Kubernetes deprecation guide

Upstream notebooks says they will be using istio 1.14 instead of 1.13 (see this comment)

Upstream kfp uses argo 3.2.3 (specifically, image gcr.io/ml-pipeline/argoexec:v3.2.3-license-compliance which I think they recompile for some reason that helps with license compliance?). I rendered the manifests to make sure it isn't overwritten somewhere else, but the final product uses version 3.2.3
edit: I made this change to the list above

Ignore everything I said here.  They pushed a new manifest after I said it, and the argo version is now 3.3.8

Should this bundle include knative?

Didn't have time right now to make sure I did it correctly, but we want to remove envoy and mlmd from the bundle

yup, removed


indentscope wrongly marks non bracketed indents

Contributing guidelines

[X] I have read CONTRIBUTING.md
[X] I have read CODE_OF_CONDUCT.md
[X] I have updated 'mini.nvim' to latest version

Module(s)
mini.indentscope
Description
I'm having issues with indentscope in C indents where curly braces are not there. Here's a video:
https://user-images.githubusercontent.com/31820255/229249581-79cc0914-0f6c-42a8-9e8e-cd12ab2ea283.mp4
Here's the snippet, just in case:
int smbios_add_string(u8 *start, const char *str)
{
	int i = 1;
	char *p = (char *)start;

	/*
	 * Return 0 as required for empty strings.
	 * See Section 6.1.3 "Text Strings" of the SMBIOS specification.
	 */
	if (*str == '\0')
		return 0;

	while (*p) {
		if (!strcmp(p, str))
			return i;

		p += strlen(p) + 1;
		i++;
	}

	strcpy(p, str);
	p += strlen(str);
	*(p + 1) = '\0'; // Indicate the end of set with an additional null byte
	return i;
}

Neovim version
0.8.3
Steps to reproduce
This is the default behaviour.
Expected behavior
Indent guides should not be shown on empty lines, for non-bracketed blocks in C.
Actual behavior
Indent guides are also shown for empty lines, even if the block is not bracketed.

It works as expected. 'mini.indentscope' takes into account only text indent. In your example you seem to use options.try_as_border = true which leads to showing indent scope of a construct's "inner body" instead of outer one. Presence or absence of brackets has nothing to do with.

I do understand that, but is it expected behaviour for it to show indent on empty lines? Here is what it looks like, with  try_as_border = false.
https://user-images.githubusercontent.com/31820255/229270847-d55b5ba4-ee3b-47d9-b5cc-3c7ac0b2ec2e.mp4
The video shows that the if block ends on line 157, but the indent guides are still shown for it on line 158. It feels a bit off while using it.
Here is my lazy.nvim config:
  {
    "echasnovski/mini.indentscope",
    opts = function(_, opts)
      return vim.tbl_deep_extend("force", opts, {
        draw = {
          animation = require("mini.indentscope").gen_animation.none(),
        },
        options = {
          try_as_border = false,
        },
        symbol = "a",
      })
    end,
  },

I do understand that, but is it expected behaviour for it to show indent on empty lines?

By default, yes. Behavior of empty lines near the edge is controlled by options.border. To not recognize bottom blank lines try options = { border = 'top' }.

Thanks, now it behaves as expected.


optimisation implemented and unit tests added

Codecov Report

Merging #491 (69f58b4) into master (c0b3d2e) will decrease coverage by 0.00%.
The diff coverage is 47.02%.

:exclamation: Current head 69f58b4 differs from pull request most recent head 7e788e9. Consider uploading reports for the commit 7e788e9 to get more accurate results

@@            Coverage Diff             @@
##           master     #491      +/-   ##
==========================================
- Coverage   79.02%   79.01%   -0.01%
==========================================
  Files         173      173
  Lines       28572    28775     +203
==========================================
+ Hits        22578    22737     +159
- Misses       5994     6038      +44

Impacted Files
Coverage Δ

resqpy/olio/intersection.py
75.90% <14.28%> (-8.93%)
:arrow_down:

resqpy/olio/vector_utilities.py
70.46% <20.58%> (-5.07%)
:arrow_down:

resqpy/grid_surface.py
72.98% <57.82%> (-0.30%)
:arrow_down:

resqpy/rq_import/_import_nexus.py
42.71% <0.00%> (-0.15%)
:arrow_down:

resqpy/fault/_grid_connection_set.py
84.96% <0.00%> (+0.59%)
:arrow_up:

resqpy/surface/_surface.py
67.74% <0.00%> (+0.92%)
:arrow_up:

resqpy/olio/triangulation.py
89.07% <0.00%> (+7.21%)
: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 c0b3d2e...7e788e9. Read the comment docs.

@connortann Could you please take a look, especially at the poetry & toml changes.


I18N

Setup I18N in the application
Setup

[x] Basic Setup (#36)
[ ] CSS
[ ] Constant Iteration

Translations

[ ] German: @dottorer
[ ] French: @stephanerangaya

Tips:

https://robots.thoughtbot.com/foolproof-i18n-setup-in-rails
http://www.lauradhamilton.com/internationalization-for-ruby-on-rails-apps

I think this is mainly done now. Longer term a better support for translations would be welcome but we can manually update strings for now...closing.


[SPARK-33591][3.0][SQL][FOLLOWUP] Add legacy config for recognizing null partition spec values

What changes were proposed in this pull request?

This PR is to backport https://github.com/apache/spark/pull/31421 and https://github.com/apache/spark/pull/31421 to branch 3.0
This is a follow up for https://github.com/apache/spark/pull/30538.
It adds a legacy conf spark.sql.legacy.parseNullPartitionSpecAsStringLiteral in case users wants the legacy behavior.
It also adds document for the behavior change.
Why are the changes needed?

In case users want the legacy behavior, they can set spark.sql.legacy.parseNullPartitionSpecAsStringLiteral as true.
Does this PR introduce any user-facing change?

Yes, adding a legacy configuration to restore the old behavior.
How was this patch tested?

Unit test.

Test build #134791 has started for PR 31441 at commit 505b7bc.

Kubernetes integration test starting
URL: https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/39378/

Kubernetes integration test status success
URL: https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/39378/

Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder-K8s/39378/

Test build #134791 has finished for PR 31441 at commit 505b7bc.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.

Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/134791/

Merged to branch-3.0.

@gengliangwang mind creating another PR for branch-3.1?


FATAL Enable vuex store by creating store/index.js.

Hi, when deploying to Firebase functions the developer console says FATAL Enable vuex store by creating store/index.js. I've tried creating the file index.js in the store folder, but it doesn't work. Have you faced that problem or could you help me to solve it?

I haven't touched this repo for a long time and there are many new versions of Vue I guess now, what version of Vue are you using?

Hi. I forget to tell you that the problem is when using @nuxtjs/auth, these are the versions I'm using:
 "@nuxtjs/auth": "^4.9.1",
 "nuxt": "^2.15.4",
  "vue": "^2.6.12",

I hope you could help me.


Permissions CRUD using entityframework

Hello! Can you tell me a way, how can I use ABP provided tools to add/edit/remove/check permissions for different user roles? I am having a hard time dealing with this and I can't find any good examples on it. Thank you!

Hello!
Did you already have a look to the document regarding
permissions/authorization?
http://aspnetboilerplate.com/Pages/Documents/Authorization
You might also find useful the Role management guide:
http://aspnetboilerplate.com/Pages/Documents/Zero/Role-Management
Also here are is a demo application that might help you:
https://github.com/aspnetboilerplate/sample-blog-module
Regards,
William Obando
El mié, 12 de agosto de 2015 04:02 PM, chujzaurus<EMAIL_ADDRESS>escribió:

Hello! Can you tell me a way, how can I use ABP provided tools to
add/edit/remove/check permissions for different user roles? I am having a
hard time dealing with this and I can't find any good examples on it. Thank
you!
—
Reply to this email directly or view it on GitHub
https://github.com/aspnetboilerplate/module-zero/issues/96.

Hello!
Yes, I've read these. I am not really sure how Tenant - Role - User - Permissions relationship work.
For example: I have 2 tenants, each tenant have different roles. I want users to be assigned to roles, to get their permissions.
The main problems I face are:
How to get currently granted permissions for a role.
How to grant a permission to a role.
I am expecting it to be working on the database level: Storing permissions for each role in a table.
Can I get an example of practical approach to these problems?
Maybe I am missing something and trying to use ABP provided tools in a wrong way?
Thank you!


[BACKLOG-8213] Added MDI Support to Oracle Bulk Loader

@mdamour1976

Hello, This is an automated comment from our build system. Since this pull request originated from a user  not in the Pentaho organization, we will not proceed  with automatic validation of the pull request.  However, rest assured that it will be reviewed manually as soon  as we get the chance. Thanks for your contribution!


[W6.1f][T09-B4]Nabeel Zaheer

Accepting this PR without a review because another of your PRs for this tutorial was reviewed in detail.


Multiple issues to do with occurrence display, map, and species

Inspired by user feedback https://github.com/gbif/portal-feedback/issues/382 ("find number of mammals in china") I tried to answer this question, and made a video of my experience.

In summary

It's not obvious how I get an answer to this question
After realising that the list of species in the species tab will help me find the answer, I can't copy that data (download only applies to the occurrence data)
When I play with the map I have to work really hard to click on the dots and not the squares.

I realise this is munging a bunch of issues together, but it bugs me when we gloss over the really basic stuff. I think it's entirely reasonable for someone to ask for a list of mammals in China, and GBIF doesn't do a great job of answering that question.

Thank you so much for a detailed issue!
We added the species tab/ad hoc checklist as an experiment. Making it downloadable is postponed for now, but it should of course be an option if we keep the tab and it seems there is an interest in it. I have created an issue for it here
species tab
Adding some info text to the 'species tab' in the top seems like a start to spare confusion at least. I'll do that and ask @dnoesgaard to write something informative as I'm not too good at that.
Do you have a better suggestion for the tab name? Or how we could make it more intuitive where to find that info?
map clicking
For the map clicking I agree very much. We just talked about it 2 hours ago.
Ideally the map SOLR API exposed a coordinates to geometry. Currently we simply do coordinates +- some pixes and do a search. But there is no relation to neither dot nor square. So clicking could easily include info from two squares or miss occurrences in the other end of the square. And since the SOLR maps only have tiles for a few zoom levels, it becomes even more weird here than on the precalculated ones on dataset and species pages.
On some zoomlevels the target is too big, on others it is way too small.
Perhaps an option could be to draw the clicked query - then at least the user would know.

The map clicking part of this issue has been adressed here: #507
We have moved away from the click and now the user can draw a rectangle instead. The rectangle remains visible when the occurrences are show. Hopefully, this makes it more explicit which area has been searched.


ERROR TypeError: this.elementRef.nativeElement.querySelector is not a function

Hi,
I installed the module (4.0.4) and it works on Angular 4.1.1
But it load slowly and the log is filled with this message repeated hundreds times:
ERROR TypeError: this.elementRef.nativeElement.querySelector is not a function
    at SwiperComponent.setup (/srv/httpd/dist/server/webpack:/~/angular2-useful-swiper/lib/swiper.component.js:27:1)
    at SwiperComponent.ngAfterViewChecked (/srv/httpd/dist/server/webpack:/~/angular2-useful-swiper/lib/swiper.component.js:36:1)
    at callProviderLifecycles (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:11076:1)
    at callElementProvidersLifecycles (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:11048:1)
    at callLifecycleHooksChildrenFirst (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:11032:1)
    at checkAndUpdateView (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:12061:1)
    at callViewAction (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:12367:1)
    at execComponentViewsAction (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:12313:1)
    at checkAndUpdateView (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:12059:1)
    at callViewAction (/srv/httpd/dist/server/webpack:/~/@angular/core/@angular/core.es5.js:12367:1)

I tried Swiper 3.3.1 as mentioned in the README and the latest 3.4.2
There are no more errors after the page is loaded and client finish the render. Not even if I go to different page and return.
Any idea?
Thanks

Seems its only happens when  the server side render the component url (universal?)
No errors are logged when I load any other url and then browse to the components with the Swiper

It looks like that call will cause problems with Universal. I'm testing a couple of options for making it Universal friendly at the moment. I'll keep this issue open and let you know how I get on.

This is fixed by pull request 24.


Added support for general LDAP uid attribute.

I added support for general LDAP uid attribute since this is necessary in some cases. I tried to follow Gitlab LDAP configuration.
Note: This is my first code in ruby so feel free to criticize.
Signed-off-by: Tomas Dohnalek<EMAIL_ADDRESS>

Really good, thanks! Just fix my small issue.

I have incorporated your notes.

Could you squash these two commits into a single one ?

Done.

Thanks!


deploy.yaml: Fix operator repo name

- Description of the problem which is fixed/What is the use case
the repo name of the operator is wrong
- What I did
use the correct name
- How to verify it
Deploy the operator via oc apply -f deploy/deploy.yaml and check the image field in the pod spec of the controller
- Description for the changelog
Fix deploy.yaml to use correct operator repository name

/approve
/lgtm

thank you @fidencio


Pluralsight JSON download problem

Checklist

[ x] I'm reporting a broken site support issue
[x ] I've verified that I'm running youtube-dl version 2020.03.24
[x ] I've checked that all provided URLs are alive and playable in a browser
[ x] I've checked that all URLs and arguments with special characters are properly quoted or escaped
[ x] I've searched the bugtracker for similar bug reports including closed ones
[ x] I've read bugs section in FAQ

Verbose log
youtube-dl --verbose https://app.pluralsight.com/library/courses/csharp-collections-advanced/table-of-contents
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['--verbose', 'https://app.pluralsight.com/library/courses/csharp-collections-advanced/table-of-contents']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2020.03.24
[debug] Python version 3.7.1 (CPython) - Darwin-18.7.0-x86_64-i386-64bit
[debug] exe versions: none
[debug] Proxy map: {}
[pluralsight:course] csharp-collections-advanced: Downloading JSON metadata
[pluralsight:course] csharp-collections-advanced: Downloading JSON metadata
ERROR: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 627, in _request_webpage
return self._downloader.urlopen(url_or_request)
File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 2238, in urlopen
return self._opener.open(req, timeout=self._socket_timeout)
File "/anaconda3/lib/python3.7/urllib/request.py", line 531, in open
response = meth(req, response)
File "/anaconda3/lib/python3.7/urllib/request.py", line 641, in http_response
'http', request, response, code, msg, hdrs)
File "/anaconda3/lib/python3.7/urllib/request.py", line 569, in error
return self._call_chain(*args)
File "/anaconda3/lib/python3.7/urllib/request.py", line 503, in _call_chain
result = func(*args)
File "/anaconda3/lib/python3.7/urllib/request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
Description

WRITE DESCRIPTION HERE

Its working if you add working username
youtube-dl --username "user@email" --password "pass " --verbose https://app.pluralsight.com/library/courses/csharp-collections-advanced/table-of-contents

Correct this issue by downloading the cookies from Pluralsight
1 - Download this plugin for google chrome cookiestxt
2 - Access Pluralsight like a normal user and navigate to the course you want to download
3 - After navigate, click on the cookiestxt button and "click here" blue link to download the cookies.txt file
4 - Add your username, password, user-agent, sleep-interval, cookie and subtitles (optional) to your download
youtube-dl --username<EMAIL_ADDRESS>--password "xxxxxx" --verbose --min-sleep-interval 120 --max-sleep-interval 240 "https://app.pluralsight.com/library/courses/course-of-your-choice/table-of-contents" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0" --cookies cookies.txt --sub-lang en --sub-format srt --write-sub
5 - Users of distros like ubuntu related problems downloading this way, I have made it all in windows 10
6 - Watch out to not be banned by Pluralsight
7 - Try Harder!


[Suggestion] show some screenShort

show some pic, bro
follow you

It's not working as intended yet, so I can't really show a picture of it working. I will include one as soon as it's working.
Thanks for the suggestion

oh，I see.
you'r a young boy Student, great, go for it
as for material design ,much more theory and guide line
but there is no all-purpose solution for all platform, but material try to solve it, at least I think so.
the material lib, which contains material design module, can use it quickly for develop


Add partitioning column configuration setting

Description
Adds a configuration setting that allows the user to specify which column is used for partitioning. The column must be a unix millisecond timestamp.
This implementation seems to work for my use case, what do you think? @gliter
Resolves #18
PR Checklist

[x] Tests added
[x] Changelog updated

Look good. Could you add some test case?

Please also update changelog and readme.

Added a simple test to ensure IcebergChangeEvent works as intended. Not sure how to properly test that the actual configuration setting is used, though. Also updated readme & changelog

I will double check that everything works the way i want it tomorrow, don't merge until I mark it as ready :)

Yep. That would be definitely an improvement.

Not really. Maybe you could try to put some logging/breakpoint here:
https://github.com/getindata/kafka-connect-iceberg-sink/blob/develop/src/main/java/com/getindata/kafka/connect/iceberg/sink/IcebergUtil.java#L37
to see when tables are created

Unfortunately I dont really have a local environment where I can easily debug :/ Weird thing is, there is already logging around the table creation, so I know it's not actually happening concurrently.

Oh, i thought it happens during some automated tests.
There is a system test with test containers, you can fiddle with it to check if you can replicate it.
https://github.com/getindata/kafka-connect-iceberg-sink/blob/develop/src/test/java/com/getindata/kafka/connect/iceberg/sink/IcebergSinkSystemTest.java

The problems were unrelated to the connector.
The latest commit introduces two settings:

iceberg.partition.timestamp decides which field is used as the timestamp source. Defaults to __source_ms_ts
iceberg.partition.column is the name of the output timestamptz column

If iceberg.partition.timestamp is empty, iceberg.partition.column is expected to already exist and be of the correct type. Not sure if this could actually happen with the current setup?
If they are set to the same field, that field is expected to be an integer timestamp, and its values will be converted to timestamptz and stored in a column with the same name, overwriting the integers.
Sounds good?


Unable to install on MacOS

Nikitas-MacBook-Pro:scraper mojojojo$ cabal install curlhs
Resolving dependencies...
Configuring curlhs-0.1.3...
Building curlhs-0.1.3...
Failed to install curlhs-0.1.3
Build log ( /Users/mojojojo/.cabal/logs/curlhs-0.1.3.log ):
Configuring curlhs-0.1.3...
Building curlhs-0.1.3...
Preprocessing library curlhs-0.1.3...
In file included from LibCC.hsc:110:
Network/CURL000/LibC0.c:91:30: error: argument to 'section' attribute is not valid for this target: mach-o section specifier requires a segment and section separated by a comma
void* __attribute__((section(".data"))) curlADRTAB[TABLEN] = {};
                             ^
1 error generated.
compiling dist/build/Network/CURL000/LibCC_hsc_make.c failed (exit code 1)
command was: /usr/bin/gcc -c dist/build/Network/CURL000/LibCC_hsc_make.c -o dist/build/Network/CURL000/LibCC_hsc_make.o -m64 -fno-stack-protector -D__GLASGOW_HASKELL__=708 -Ddarwin_BUILD_OS=1 -Dx86_64_BUILD_ARCH=1 -Ddarwin_HOST_OS=1 -Dx86_64_HOST_ARCH=1 -INetwork/CURL000 -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/time-1.4.2/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/Users/mojojojo/.cabal/lib/x86_64-osx-ghc-7.8.4/rtld-0.0.2/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/bytestring-<IP_ADDRESS>/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/base-<IP_ADDRESS>/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/integer-gmp-<IP_ADDRESS>/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.8.4/lib/ghc-7.8.4/include/
cabal: Error: some packages failed to install:
curlhs-0.1.3 failed during the building phase. The exception was:
ExitFailure 1

It seems that the OSX compiler (clang?) has a different syntax for 'section' attribute than gcc.
Network/CURL000/LibC0.c:91:30: error: argument to 'section' attribute is not valid for this target: mach-o section specifier requires a segment and section separated by a comma
void* __attribute__((section(".data"))) curlADRTAB[TABLEN] = {};

According to the documentation on https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html, this should work:
Network/CURL000/LibC0.c:91:
void* __attribute__((section("__DATA,__data"))) curlADRTAB[TABLEN] = {};

But maybe a better solution would be to just remove the 'section' attribute at all:
Network/CURL000/LibC0.c:91:
void* curlADRTAB[TABLEN] = {};

Forcing the '.data' section is not needed on Windows, so maybe the same works on OSX.
Unfortunately I don't have access to the OSX machine and actually I don't even know if curlhs works at all on that platform. It should, but I can't test it, so sorry for all inconveniences. I would be grateful if you could do some tests for me.

Travis can be used to test against different OSs. Here's a page on OS X: http://docs.travis-ci.com/user/osx-ci-environment/.
AIU, you're already acquainted with Travis, so I think it'll be best if you just update your config accordingly and experiment with changes without me in the middle.

I'm informing you that both
- void* __attribute__((section(".data"))) curlADRTAB[TABLEN] = {};
+ void* __attribute__((section("__DATA,__data"))) curlADRTAB[TABLEN] = {};

- void* __attribute__((section(".data"))) curlADRTAB[TABLEN] = {};
+ void* curlADRTAB[TABLEN] = {};

resolved the problems on my OS.

Thanks for your time.

Thanks for the fix and the library!
Could you please make a release containing the fix?

Done. Just wanted to make it compatible with GHC 7.10 before release.

Thanks


unquote fails with when used in a proofstate with no goal

Hello,
It appears that unquote fails when used in a proofstate with no goal.
The following module definition shows the current behavior: unquote's behavior depends on the current proofstate.
module Unquote
open FStar.Tactics

let _: string = _ by (
  print (unquote (`"test"));
  exact (`"")
)

[@expect_failure]
let _ = run_tactic (fun _ -> print (unquote (`"test")))

If anyone run into this, here is a workaround. Below, unquote_no_goal sets up a dummy goal, runs unquote, solves the dummy goal, and returns the unquoted value:
open FStar.Tactics

// [with_goal] bootstraps a non-empty proofstate with [goal] as its one goal, and runs [f] with this goal
let with_goal (goal: term) #a (f: binder -> Tac a): Tac a
  = let proof = uvar_env (top_env ()) None in
    unshelve proof;
    let binder = tcut goal in
    flip ();
    let r = focus (fun _ -> let r = f binder in
                         qed ();  r
    ) in exact (`()); r

let unquote_no_goal #a (t: term): Tac a
  = with_goal (`(1 == 1)) (fun _ ->
       let r = unquote t in
       trefl (); r
    )

// Unquotes as expected: the following prints "test"
let _ = run_tactic (fun _ -> print (unquote_no_goal (`"test")))


sauerbraten not saving settings

Describe the bug
When you fire up sauerbraten, it's supposed to save any options upon exit of the program.   It does not
To Reproduce
Steps to reproduce the behavior:

install sauerbraten
start the program with $ sauerbraten_client
select options from the menu
change any setting (e.g. game or music volume, or character name)
quit the program
restart it
check to see if your option is preseved

Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
Additional context
Add any other context about the problem here.
Notify maintainers

Metadata
Please run nix-shell -p nix-info --run "nix-info -m" and paste the result.
Maintainer information:
# a list of nixpkgs attributes affected by the problem
attribute:
# a list of nixos modules affected by the problem
module:

Hm, I can save settings with both unstable and 21.05... are you still on 20.09?

system: "x86_64-linux"
host os: Linux 5.4.118, NixOS, 20.09.4132.52090c613ad (Nightingale)
multi-user?: yes
sandbox: yes
version: nix-env (Nix) 2.3.11
channels(kevin): "nixpkgs-21.11pre301537.14df81c809e"
nixpkgs: /home/kevin/.nix-defexpr/channels/nixpkgs

I upgraded, some errors flashed by during the upgrade that I can't find the log for.   When I rebooted really quickly a UEFI error flashed by which was too quick to read, now when I try to execute sauerbraten_client I get:
init: sdl libGL error: MESA-LOADER: failed to open radeonsi: /nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/libc.so.6: version GLIBC_2.32' not found (required by /run/opengl-driver/lib/dri/radeonsi_dri.so) (search paths /run/opengl-driver/lib/dri)
libGL error: failed to load driver: radeonsi
libGL error: MESA-LOADER: failed to open radeonsi: /nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/libc.so.6: version GLIBC_2.32' not found (required by /run/opengl-driver/lib/dri/radeonsi_dri.so) (search paths /run/opengl-driver/lib/dri) libGL error: failed to load driver: radeonsi libGL error: MESA-LOADER: failed to open swrast: /nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/libc.so.6: version GLIBC_2.32' not found (required by /run/opengl-driver/lib/dri/swrast_dri.so) (search paths /run/opengl-driver/lib/dri)
libGL error: failed to load driver: swrast
X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  152 (GLX)
Minor opcode of failed request:  3 (X_GLXCreateContext)
Value in failed request:  0x0
Serial number of failed request:  107
Current serial number in output stream:  108
`
Also, coincidentally, when I try and bring up emacs 28 I get this:
/nix/store/ysaiynbnr9vp1l83pq9fdlzydzybdcar-glib-networking-2.68.1/lib/gio/modules/libgiognutls.so: undefined symbol: g_tls_channel_binding_error_quark Failed to load module: /nix/store/ysaiynbnr9vp1l83pq9fdlzydzybdcar-glib-networking-2.68.1/lib/gio/modules/libgiognutls.so
Which may be related to this?
https://githubmemory.com/repo/vlaci/openconnect-sso/issues/55

here's my current metadata:
- system:"x86_64-linux"`

host os: Linux 5.10.48, NixOS, 21.05.1555.6b940846e99 (Okapi)
multi-user?: yes
sandbox: yes
version: nix-env (Nix) 2.3.12
channels(kevin): "nixpkgs-21.11pre301537.14df81c809e"
channels(root): "nixos-21.05.1555.6b940846e99"
nixpkgs: /home/kevin/.nix-defexpr/channels/nixpkgs

`

I just tried and it saved my settings. Feel free to reopen with proper reproduction steps if you still see an issue


duckdb.dll not found in AzureAutomation when opening a connection

When opening the connection for DataSource = :memory:, the duckdb.dll i not located when running this module in Azure Automation.
Tested both for Powershell 5.1 and PowerShell 7.2
Throwing exception points to DuckDBConnectionStringBuilder:

but the stack trace shows that the duckdb.dll cannot be found:

I am unsure where the duckdb.dll originates from. I couldn't find it in the DuckDB.NET-repo either,
Could you share some information here and i could try to help debugging this.

Thanks @larsthelord for trying PSDuckDB and reporting thi.
Hmm, not sure. Could you share the script? You can also try psduckdb in the console.
duckdb.dll is here https://github.com/dfinke/PSDuckDB/tree/main/lib and should be local when you do the install-module

The script is as simple as it gets.
$ErrorActionPreference = "Stop" Import-Module PsDuckDb try{     $db = New-DuckDBConnection     $db.Open() } catch {     $err = $_     Get-Error }
I don't know if you're familiar with Azure Automation, but it's basically a kind of sandbox in Azure that lets you PowerShell scripts.
The modules are installed via a Module-handler in Azure

I did find the duckdb.dll in the repo. But what is it compiled from?

Yes familiar with Az automation. I have not tried PSDuckDB there.
Here are details on it. I installed it from the nuget package.
https://duckdb.net/docs/getting-started.html

The $PsVersiontalbe in Automation Account says that it is running on Windows, but it is som kind of stripped down container thing. It doesn't allow you to do all of the usual stuff.
$PsVersionTable:

from here (https://learn.microsoft.com/en-us/azure/automation/automation-runbook-execution)
I built the DuckDb.dlls for linux and Windows.
Got it working in PowerShell in wsl when including the .so-file, but when running it in Automation Account it now throws a different error:

So I don't think it is running on Linux.

I've done some more reading. I see that the duckdb.dll is an unmanaged dll compiled from C.
This might be the reason is won't work in Azure Automation, and that there is some restriction on unmanaged code.
And when it comes to if the Automation Account is Linux or Windows?
It has a weird naming convention for its folders that is a mix of Windows and Linux standard.
Here is cwd, and the ModulePath for PsDuckDb

When I get some time, I will try creating a simple unmanaged dll, then referencing it in another dll to see if the same problem appears.
I will also have a look at putting the unmanaged dll into a combined dll to see if that makes a difference

@larsthelord thanks for digging in!

@larsthelord DuckDB update to a new version. I updated PSDuckDB.
It now works on my local PS 5.1. Give it a try.

Thanks for the update. Folks who did have an issue witn 5.1 are now able to work.
I don't use Az Automation. I don't know how to debug the issue.
Hopefully something will pop up on my radar about.

I will try the compiling-trick. Compiling all .dlls as one, and see if that helps. (I've just been very busy lately)
The module works fine on azure function, but that runs in it's own container, while Automation Account has some kind of shared container with other jobs. I guess this is the reason for system calls being limited, and the reason for the unmanaged duckdb.dll is causing problems.

I will try the compiling-trick. Compiling all .dlls as one, and see if that helps. (I've just been very busy lately)
The module works fine on azure function, but that runs in it's own container, while Automation Account has some kind of shared container with other jobs. I guess this is the reason for system calls being limited, and the reason for the unmanaged duckdb.dll is causing problems.

Interesting. No rush - looking forward to hearing what you find out

Had a chat with Microsoft Azure Support, and it seems that Automation account has restrictions when it comes to unmanaged code.
This is as i thought the reason it won't accept the references.
It is also not possible to repackage unmanaged code as a part of managed .dll
As of now, it seems that there is no way to utilize duckdb in Automation Account. The only alternative is using Azure functions, a VM or an actual machine.

@larsthelord thanks for tracking all of that.
Yes, the core DuckDB is C++, unmanaged. I use DuckDB.NET, managed, which surfaces that as a ADO type interface.
That is too bad.


New version: TechSmith.Camtasia version <IP_ADDRESS>848

[X] Have you signed the Contributor License Agreement?
[X] Have you checked that there aren't other open pull requests for the same manifest update/change?

[ ] Have you tested your manifest locally with winget install --manifest <path>?
[X] Does your manifest conform to the 1.0 schema?

Resolves #28303

Microsoft Reviewers: Open in CodeFlow

.

/azp run

/azp run


deps: bump libc from 0.2.153 to 0.2.155

Add dependencies that support the loongarch64 architecture rust-lang/libc#2765

Thanks :)


Feature: Commodity Sale Check where Cargo Commodity count > n

While trading/mining, I often carry more than 1 commodity type.  When landing at stations, EDDI reports the ships's cargo profits one at a time, when profits are available.  In situations where I am mining/rare trading, etc, I can easily have in excess of 15 different commodities.  Listening to the looped profit report can be tiresome.
It would be nice to have a variable threshold based on the ship's cargo commodity count.  If the cargo commodity count exceeds the threshold, a summarized sum total of profits for the count of  commodities message is responded:  "You can sell n commodities here for a total profit of X credits" or similar.
I have not yet worked with Cottle, but it appears to support loops and variables.  I tried fiddling with this myself, but with my unfamiliarity with the events and scripts and EDDI packages, I find myself at a disadvantage.
This applies to the Commodity Sale Check script.

I came up with this quickly, CMDR McDonald may be able to give you a better/more efficient solution.  I have tested it, and it works fine.  It's set at a default of five items to list, any more (six or above) will give a total number of commodities and total profit.  You can change this to however many you want to be listed.  Just copy this and replace the whole Commodity Sale Check script.
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}

{for cargo in ship.cargo:
   {if cargo.commodity.name != 'Limpet' && !cargo.missionid && !cargo.stolen:
        {set marketcommodity to market(cargo.commodity)}
        {if marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargonumber to cargonumber + 1}
        }
    }
}

{if cargonumber > maxcommoditycount:
   You can sell {cargonumber} commodities here for a total profit of {totalprofit} credits.
|else:
   {for cargo in ship.cargo:
      {if cargo.stolen:
         {set carryingstolencargo to true}
      |elif cargo.commodity.name != 'Limpet' && !cargo.missionid:
         {set marketcommodity to market(cargo.commodity)}
         {if marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            You can sell your {cargo.commodity.name} here for a profit of {marketcommodity.sellprice - cargo.price} credits per tonne.
         }
      }
   }
}

{if carryingstolencargo:
    Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
}

After a bit more testing, I've found a small problem in my script.  It would say something even if there were no profitable commodities in your cargo,  Oops!  I've fixed this, and updated the script so that if ALL your cargo is profitable, it will tell you that, and the total profit.
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}
{set cargonumber to 0}

{for cargo in ship.cargo:
   {if cargo.commodity.name != 'Limpet' && !cargo.missionid && !cargo.stolen:
        {set marketcommodity to market(cargo.commodity)}
         {cargo.commodity.name},
        {if marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargonumber to cargonumber + 1}
        }
    }
}

{if cargonumber = len(ship.cargo):
   You can sell all of your legal cargo here for a total profit of {totalprofit} credits.
|elif cargonumber > maxcommoditycount:
   You can sell {cargonumber} commodities here for a total profit of {totalprofit} credits.
|else:
   {for cargo in ship.cargo:
      {if cargo.stolen:
         {set carryingstolencargo to true}
      |elif cargo.commodity.name != 'Limpet' && !cargo.missionid:
         {set marketcommodity to market(cargo.commodity)}
         {if marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            You can sell your {cargo.commodity.name} here for a profit of {marketcommodity.sellprice - cargo.price} credits per tonne.
         }
      }
   }
}

{if carryingstolencargo:
    Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
}

Damn, I just realised I left some testing code in there.  Please remove the following line:
{cargo.commodity.name},
it come just after this line:
{set marketcommodity to market(cargo.commodity)}

I had posted some replies to address this request, however, since taking some time away from the computer and stepping back from the problem to think about it, I've come up with an improved and more efficient version of my suggestion.  CMDR McDonald may have something better to offer, but in the mean time here's my version.
It is set to a limit of listing five commodities before giving just a total (at six or more), but this can be altered to suit your choice.  Just copy the whole thing and replace the whole Commodity Sale Check script.
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}
{set carryingstolencargo to 0}
{set profitablecargo to 0}
{set cargostring to ""}

{for cargo in ship.cargo:
   {if cargo.stolen:
      {set carryingstolencargo to carryingstolencargo + 1}
   |elif cargo.commodity.name != 'Limpet' && !cargo.missionid:
        {set marketcommodity to market(cargo.commodity)}
        {if marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargostring to cat(cargostring," your ",cargo.commodity.name," for ",profit," credits profit,")}
            {set profitablecargo to profitablecargo + 1}
        }
    }
}

{if profitablecargo > 0 && profitablecargo = len(ship.cargo) - carryingstolencargo:
   You can sell all of your
   {if carryingstolencargo > 0: {OneOf("legal","legitimate")} }
   cargo {Occasionally(2,"commodities")} here for a total profit of {totalprofit} credits.
|elif profitablecargo > maxcommoditycount:
   You can sell {profitablecargo} commodities here for a total profit of {totalprofit} credits.
|elif profitablecargo > 0:
   You can sell {cargostring}.
}

{if carryingstolencargo > 0:
    Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
}

I believe this will do exactly what you need.  I've tested it out and it works very well.  Although, I may not have caught every bug in my code.

That's fantastic thanks!  I will test it out.  I was arriving at a similar set of logic for the cargo maths, but hadn't considered the stolen cargo or limpets.  Nice touch.

 :)  And if CMDR McDonald likes it enough too, he's more than welcome to use it in future updates to EDDI.

Working like a charm on a mining run with 6 commodities at a profit of over 170,000 credits.  I was also carrying limpets and a stolen trade canister, for good measure.  The number of commodities and total profit were spot on!

The credit goes to CMDR McDonald, it is primarily his code after all.  I just made some alterations to provide a solution to your problem.  I will certainly be using it myself from now on though, so thank you for requesting it otherwise I may not have thought about doing it.
I'm also considering updating it to provide a simple 'You can sell your illegal cargo for X credits at the local black market', if there is one at the current station.  Or something along those lines anyway.  I'm not home right now, but will look into it later.

I've updated the script and fixed a couple of potential problems in rare cases.  This should be a bit more robust now.
Can you test the stolen goods part?  I can't seem to get it to work.  The cargo.stolen Boolean value seems to always resolve as False, no matter how many stolen commodities I am carrying.  However, the Boolean for 'station.hasblackmarket' seems to work fine, so I'm not sure what's happening.
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}
{set carryingstolencargo to 0}
{set missioncargo to 0}
{set profitablecargo to 0}
{set cargostring to ""}

{for cargo in ship.cargo:
    {if cargo.commodity.name != 'Limpet':
        {set marketcommodity to market(cargo.commodity)}
        {if cargo.stolen:
            {set carryingstolencargo to carryingstolencargo + 1}
        |elif cargo.missionid:
            {set missioncargo to missioncargo + 1}
        |elif marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargostring to cat(", ",cargostring," your ",cargo.commodity.name," for ",profit," credits profit")}
            {set profitablecargo to profitablecargo + 1}
        }
    }
}

{if profitablecargo > 0 && profitablecargo = len(ship.cargo) - carryingstolencargo - missioncargo:
   You can sell all of your
   {if carryingstolencargo > 0: {OneOf("legal","legitimate")} }
   {if missioncargo > 0: non-mission}
   cargo {Occasionally(2,"commodities")} here for a total profit of {totalprofit} credits.
|elif profitablecargo > maxcommoditycount:
   You can sell {profitablecargo} commodit{if profitablecargo > 1:ies |else:y} here for a total profit of {totalprofit} credits.
|elif profitablecargo > 0:
   You can sell {cargostring} per tonne.
}

{if carryingstolencargo > 0 || missioncargo > 0:
   {if station.hasblackmarket:
       {OneOf("This station has a Black Market,","There is a Black Market at this station,")},
       {if carryingstolencargo > 0:
           you may be able to {OneOf("sell","off-load")} your
           {carryingstolencargo} {OneOf("stolen","illegal")}
           {OneOf("cargo","commodit{if carryingstolencargo > 1:ies |else:y}")} here.
       }
       {if missioncargo > 0:
           You {if carryingstolencargo > 0: may also |else: can}
           sell your {missioncargo} mission {Occasionally(2," specific")}
           {OneOf("cargo","commodit{if missioncargo > 1:ies |else:y}")} here if you wish.
       }
   |elif carryingstolencargo > 0:
       Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
   }
}

I ran in to the same issue, where the stolen cargo was not registering.  I think we need to qualify the "if cargo.stolen:" as true or false.  Modifying the block to:
{for cargo in ship.cargo:
    {if cargo.commodity.name != 'Limpet':
        {set marketcommodity to market(cargo.commodity)}
        {if cargo.stolen = true:
            {set carryingstolencargo to carryingstolencargo + 1}
        |elif cargo.missionid = true:
            {set missioncargo to missioncargo + 1}
        |elif marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargostring to cat(", ",cargostring," your ",cargo.commodity.name," for ",profit," credits profit")}
            {set profitablecargo to profitablecargo + 1}
        }
    }
}

Seems to correctly detect that I have the correct count of  stolen commodities on board when landing at a station with a black market.
I was debugging with a simplified version, examples below:
Doesn't work:
{set carryingstolencargo to 0}

{for cargo in ship.cargo:
        {if cargo.stolen:
            {set carryingstolencargo to carryingstolencargo + 1}
    }
}

Count of stolen cargo is {carryingstolencargo}

This works:
{set carryingstolencargo to 0}

{for cargo in ship.cargo:
        {if cargo.stolen = true:
            {set carryingstolencargo to carryingstolencargo + 1}
    }
}

Count of stolen cargo is {carryingstolencargo}

Putting it all together.... I'm going to test with this version:
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}
{set carryingstolencargo to 0}
{set missioncargo to 0}
{set profitablecargo to 0}
{set cargostring to ""}

{for cargo in ship.cargo:
    {if cargo.commodity.name != 'Limpet':
        {set marketcommodity to market(cargo.commodity)}
        {if cargo.stolen = true:
            {set carryingstolencargo to carryingstolencargo + 1}
        |elif cargo.missionid = true:
            {set missioncargo to missioncargo + 1}
        |elif marketcommodity && marketcommodity.demand > 0 && marketcommodity.sellprice && marketcommodity.sellprice > cargo.price:
            {set profit to marketcommodity.sellprice - cargo.price}
            {set totalprofit to totalprofit + profit}
            {set cargostring to cat(", ",cargostring," your ",cargo.commodity.name," for ",profit," credits profit")}
            {set profitablecargo to profitablecargo + 1}
        }
    }
}

{if profitablecargo > 0 && profitablecargo = len(ship.cargo) - carryingstolencargo - missioncargo:
   You can sell all of your
   {if carryingstolencargo > 0: {OneOf("legal","legitimate")} }
   {if missioncargo > 0: non-mission}
   cargo {Occasionally(2,"commodities")} here for a total profit of {totalprofit} credits.
|elif profitablecargo > maxcommoditycount:
   You can sell {profitablecargo} commodit{if profitablecargo > 1:ies |else:y} here for a total profit of {totalprofit} credits.
|elif profitablecargo > 0:
   You can sell {cargostring} per tonne.
}

{if carryingstolencargo > 0 || missioncargo > 0:
   {if station.hasblackmarket:
       {OneOf("This station has a Black Market,","There is a Black Market at this station,")},
       {if carryingstolencargo > 0:
           you may be able to {OneOf("sell","off-load")} your
           {carryingstolencargo} {OneOf("stolen","illegal")}
           {OneOf("cargo","commodit{if carryingstolencargo > 1:ies |else:y}")} here.
       }
       {if missioncargo > 0:
           You {if carryingstolencargo > 0: may also |else: can}
           sell your {missioncargo} mission {Occasionally(2," specific")}
           {OneOf("cargo","commodit{if missioncargo > 1:ies |else:y}")} here if you wish.
       }
   |elif carryingstolencargo > 0:
       Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
   }
}

Hmm, I thought I'd tried that, but I'll give it another go, just as you have it here.
I've also found that the script only looks at what a station wants to buy or sell.  If you have something that the station doesn't normally want or provide, even if you can sell it here for a profit, it won't tell you.  For example, I picked up a legal occupied cryopod and some algae, went to a station, and while I could sell them for pure profit, the script didn't tell me as the station didn't normally deal in those.  I've also found this to be the case when hauling rare goods and engineer specific commodities.
I'm not sure what to do about these as the script gets it's market information in the very first bit of code, and takes it direct from the stations buy/sell list.  I've wondered if there is a way to only check what you are hauling against what the station will buy it for, but I'm not that good at this yet.
On another note, I've made a couple of slight adjustments to my script to make a couple of lines sound much better:-
            {set cargostring to cat(cargostring," your ",cargo.commodity.name," for ",profit," credits profit. ")}
and
|elif profitablecargo > 0:
   You can sell {cargostring}
}

After listening to these in the previous form, I thought they sounded too rushed and making these slight adjustments makes things clearer.

I've just tried the {if cargo.stolen = true: and it still doesn't work for me.  The cargo.stolen is always resolving as false.
I have three commodities on board: 2 Uraninite (stolen), 15 Xihe Biomorphic Companions (rare good), and 9 Non-Lethal Weapons (bought for a mission).  When I first landed at an outpost with a black market, the script told me I could sell the Non-Lethal weapons and that was it, nothing else.  I then ran a test of the script and now it tells me I can sell both the Non-Lethal Weapons AND the stolen Uraninite as LEGAL commodities.
I have cleared the %APPDATA% directory, reinstalled EDDI, set it up again and copied the script into a new personality, and it still says the same thing, two legal commodities and no stolen ones.  Same goes for the default script.
I have added the following code to test, right after the line {set marketcommodity to market(cargo.commodity)}.
Name {cargo.commodity.name}.
Defined: {defined(cargo.stolen)}.
Cast: {cast(cargo.stolen,"n")}.

This tells me that cargo.stolen is defined for each of the three commodities, however it is always defined as 0, 'false',
However, I've also tried this code:
{set test to true}
Cast test: {cast(test,"n")}.

This also tells me that test is 'zero', or "false". So this isn't setting the Boolean value correctly.
And to make sure this 'Cast' is working I tried this:
Cast test: {cast(station.hasblackmarket,"n")}.
And this tells me that it's 'one', or "true". So this is working perfectly, and I'm really confused.  I have no idea why it's not working for me, but works for you.  And with the test results I have, I'm wondering if the 'station.hasblackmarket' is being defined in a different way to the 'cargo.stolen' variable.
If CMDR McDonald could weigh in on this and provide some insight, it would be very much appreciated.

I sold my normal cargo and only have two stolen on board now.  I've just tried these:
 {if cargo.stolen = false:
Nothing happens.
 {if cargo.stolen != false:
Tells me I can sell my stolen cargo, which would normally be correct as this is 'not false'. However....
 {if cargo.stolen != true:
Also tells me I can sell my stolen cargo, which is wrong as this is 'false'.
This is making me crazy as to why it's not working....

This is due to cottle not providing native boolean types.  I've put in functions for 'true' and 'false' for the next release of EDDI so that these will work as expected; if you want this to work before that then you can just use 0 and 1 instead of true and false.

I've just tried both of these  {if cargo.stolen = 1:  and  {if cargo.stolen = 0:  and neither of them worked. My stolen cargo is still considered as legal when taken to a black market.  This is in both my script and the EDDI default (copied as a new personality).

Thank you for all of your changes for this event.  2.1.1-b4 has an altered script that provides only a single sentence regardless of the number of commodities that can be sold for profit.  Feel free to test this if and let me know how it is going if you have the beta, otherwise it will be released in 2.1.1

Thanks.  I'm in the middle of a mining run right now, so I'll see how it goes when I return to sell my cargo.
I took a quick look over and noticed what seems to be a small typo.  You have ('offload, dump', 'fence').  Should it not be ('offload', 'dump', 'fence')?

First I want to say thank you for the new script, and also to apologise for the following wall of text.
I've tested the new script and it works very well.  While it does shorten the overall spoken sentence, it doesn't do what we were looking for.  We wanted a variable cut-off point where an amount of commodities over the threshold would simply say 'X commodities for Y profit'.  This is most useful when mining (or piracy) when you will have many different commodites and don't want to hear them all listed.  This shouldn't affect traders, as people normally trade in one or two commodities at a time anyway.
I don't mean to 'step on your toes' with my script, and I certainly don't consider mine 'superior' to yours, as we are looking for different things in what this script provides.  It looks like you wish the simplicity of just saying what you can sell for profit, while the others and myself want more (or less) information depending on the situation.
I've merged my script and your new one to provide what we need.  It also makes what I consider to be a few improvements and changes, and here is my reasoning behind those.
Misson commodities.
These are counted, so they can be discounted when looking at selling everything. Of course this only applies as my script allows for a single 'you can sell everything for Y profit' sentence over the set threshold, as mission commodities can't be sold.
Also, if I've failed a mission, I'd like to know if I can get rid of the mission cargo for a few credits rather than dump it in deep space.
Null commodities.
Not all commodites are in the stations market list obtained at the beginning of the script, even though they can still be sold there.  Minerals like Osmium and Praseodymium, or some engineering commodities, are 'null' and so are not counted towards the profitable cargo.  This could simply be because they are neither in demand OR supply, I'm not sure.  My script counts these and informs the Commander that they have such cargo on board.  The default script ignores these commodities entirely, even if they can be sold for a profit.
If this is a bug that can be fixed, then the 'null' sections can be removed.
My 'while' loops.
Mine make it unecessary to have multiple IF statements for one or two or multiple items of profitable commodities.  These will all work within the one while loop.  Although, I think your version may require less processing power/time?
Market commodity demand.
Right, this one is a bit more complex.  I came across a bug in the demand/supply where sometimes (not sure if every time) a commodity that is in supply (and has no demand) in the market, is still assigned a demand of 1 and with null supply.  If this is an EDDI bug or a problem with the companion app, I don't know.
This means that even if a commodity is in supply at a station, the default script, and my one, counts it towards profitable cargo, particularly if you got it for free, like when mining.  This is actually ok if you are looking for all cargo that will give a profit, rather than what cargo will give best profit.  Obviously, a commodity in supply will not be as profitable as if it were in demand.
For example, I've just finished a mining run, and Gold, Silver & Gallite were all considered as a demand of 1 with no supply by the script.  In reality, the market had Gold at a supply of 823, Silver at 1411, and Gallite at 12197, with no demand for any of them.  This meant that all three were considered as profitable commodities.  In fact, I didn't have anything on board that was in supply and not have demand of 1 and supply of null.
Just as a thought, could this be a bug in EDDI, not assigning supply correctly?  Or the companion app not supplying the correct information?  I've not tested every occasion I've been selling items, but it's possible that all commodities in supply are like this.
I've made the check '|elif marketcommodity && marketcommodity.sellprice > cargo.price:' so that anything that's profitable will be included, it doesn't matter if it's in demand or not.  This also means that you don't need the {if profit > 0: line, as it's taken care of in this initial check.  Checking if marketcommodity.demand > 0 (so far) seems to always be true, even if the commodity is not in demand at all.
As a band-aid 'fix' for this, you could make the check marketcommodity.demand > 1. This will correct the check to only consider commodities in real demand and ignore ones in supply, as originally intended, because most items in real demand are much more than only 1.  The obvious downside to this is when a commodity genuinely is in demand by only 1, but this is rare.
Personally, I prefer the script to list everything that is profitable, even if it's not in demand.
Timing of the script.
This is less to do with the actual script itself, and more to do with where it is called from.  I've found that if I put the call to the script in the 'Market information updated' event, instead of in the 'Docked' event, then the information it provides is accurate.  Last night I accidentally had the call in both, and when it was called it gave different information in both cases.  However, the one in the 'Market' event was correct and the 'Docked' one was wrong.  The only downside to this is that the 'Market' event is usually several seconds before it's triggered after docking, but this can be countered with something like "Checking market data, please wait" at the end of the 'Docked' event script, and "Data update complete" at the start of the 'Market' event script. I have something similar to that in my scripts.
Further to this, I've also moved the Purchase, Swapout and Limpet checks to the 'Market' script to keep everything tidy, and hopefully, more accurate.  Basically, I moved the last half of the Docked script to the Market script.
Stolen Commodity reminder.
I've left the reminder about stolen cargo in, as I've often forgotten, or not realised, I have picked up stolen commodities.  I find this useful.

Well, anyway, I think that's everything I wanted to say.  Here's my version of the script.  I've not got around to testing the stolen commodities in a black market yet, or trying it with mission cargo, but I don't think there will be any problems as it worked in the previous versions.  It is a little bigger than the default script, but that's because it does more.  I'm also keeping the call to this script in my 'Market information updated' event as it's much more accurate there.
{_ Function to find a given commodity in market}
{set market(commodity) to:
    {for marketcommodity in station.commodities:
        {if marketcommodity.EDDBID = commodity.EDDBID:
            {return marketcommodity}
        }
    }
}

{_ set this as your max to list before total is used instead}
{set maxcommoditycount to 5}
{set totalprofit to 0}
{set profitablecommodities to []}
{set stolencommodities to []}
{set missioncommodities to []}
{set nullcommodities to []}

{for cargo in ship.cargo:
    {if cargo.commodity.name != 'Limpet':
        {set marketcommodity to market(cargo.commodity)}
        {if cargo.stolen = true:
            {set stolencommodities to cat(stolencommodities, [cargo.commodity])}
        |elif cargo.missionid:
            {set missioncommodities to cat(missioncommodities, [cargo.commodity])}
        |elif marketcommodity = null:
            {set nullcommodities to cat(nullcommodities, [cargo.commodity])}
        |elif marketcommodity && marketcommodity.sellprice > cargo.price:
            {set profit to (marketcommodity.sellprice - cargo.price) * cargo.amount}
            {set profitablecommodities to cat(profitablecommodities, [cargo.commodity])}
            {set totalprofit to totalprofit + profit}
        }
    }
}

{if len(profitablecommodities) > 0 && len(profitablecommodities) = len(ship.cargo) - len(stolencommodities) - len(missioncommodities):
   You can sell all of your
   {if len(stolencommodities) > 0: {OneOf("legal","legitimate")} }
   {if len(missioncommodities) > 0: non-mission}
   cargo {Occasionally(2,"commodities")} here for a total profit of {totalprofit} credits.
|elif len(profitablecommodities) > maxcommoditycount:
   You can sell {len(profitablecommodities)} commodit{if len(profitablecommodities) > 1:ies |else:y} here for a total profit of {totalprofit} credits.
|elif len(profitablecommodities) > 0:
   {set cur to 0}
   You can sell your
   {while cur < len(profitablecommodities):
      {profitablecommodities[cur].name}
      {set cur to cur + 1}
      {if cur < len(profitablecommodities)-1:
          ,
      |elif cur = len(profitablecommodities)-1:
          and
      }
   }
   for a profit of {totalprofit} credits.
}

{if len(nullcommodities) > 0:
   {Pause(200)}
   {set cur to 0}
   Your cargo of
   {while cur < len(nullcommodities):
      {nullcommodities[cur].name}
      {set cur to cur + 1}
      {if cur < len(nullcommodities)-1:
          ,
      |elif cur = len(nullcommodities)-1:
          and
      }
   }
   are not
   {OneOf("listed at {OneOf('this station','the local market')}",
       "on the {OneOf('local markets','stations')} normal {OneOf('list of commodities','commodity list')}")},
   {if state.nullcommoditiestoday != 1:
      You may be able to sell these here, but
      {SetState("nullcommoditiestoday",1)}
   }
   {OneOf("profit is not guaranteed","profits are uncertain","these may be unprofitable")}.
}

{if len(stolencommodities) > 0 || len(missioncommodities) > 0:
  {Pause(200)}
   {if station.hasblackmarket:
       {OneOf("This station has a Black Market,","There is a Black Market at this station,")},
       {if len(stolencommodities) > 0:
           you may be able to {OneOf("sell","off-load","dump","fence")} your
           {len(stolencommodities)} {OneOf("stolen","illegal")}
           {OneOf("cargo","commodit{if len(stolencommodities) > 1:ies |else:y}")} here.
       }
       {if len(missioncommodities) > 0:
           {Pause(200)}
           You {if len(stolencommodities) > 0: may also |else: can}
           sell your {len(missioncommodities)} mission {Occasionally(2," specific")}
           {OneOf("cargo","commodit{if len(missioncommodities) > 1:ies |else:y}")}
           here if you wish, but this will fail the mission.
       }
   |elif len(stolencommodities) > 0:
       Reminder: you {OneOf("have stolen cargo on-board", "have stolen goods on-board", "are carrying stolen goods", "are carrying stolen cargo")}.
   }
}

Wow.... just wow... :P

Darkcyde13,
First of all, thank you for your work on this. I'm really enjoying the customizability of the Elite Dangerous experience through VA and EDDI. Is there a reference for the programming language that is being used in EDDI somewhere that I can read up on? To use your routine, I guess we would only need to change the maxcommoditycount to whatever we want?

mikelimtw,
There is a link in the help for EDDI that goes to a web page detailing all the Cottle commands, this is where I get much of my information.
http://r3c.github.io/cottle/#toc-2
And, yes, change maxcommoditycount to whatever you like.  If the total number of profitable commodities is over this number, then it will say "X commodities for Y profit". if the total is less than, or equal to, this number, then they will be listed individually.

Nicely done, Darkcyde13. I'm definitely incorporating this one into my own scripts (stealing this). :-)


Can't see the video and Google's link.

Can't see the video of "Detection walkthrough" and "Full waypoint walkthrough", can't open Google's link.

What is the google link you mention?
Both of the videos appear to be working as intended currently, please let me know if you still cannot see them.

No further comments; closing.


er#1789

Description

Configuration

Regression?

Other information

.NET can be used to build IoT applications for IoT devices and scenarios. IoT applications typically interact with sensors, displays, and input devices that require the use of general-purpose I/O (GPIO) pins, serial ports, or similar hardware. For example, you can find libraries that work with popular boards like Raspberry Pi and HummingBoard.


[BUG]  Direct access to the login page prompts an error

Is there an existing issue for this?

[X] I have searched the existing issues

Current Behavior
输入 http://<IP_ADDRESS>:888  后
跳转到  http://<IP_ADDRESS>:888/passport/login
直接输入  http://<IP_ADDRESS>:888/passport/login
则显示页面错误

Expected Behavior
直接输入  http://<IP_ADDRESS>:888/passport/login
应该能正常使用
Steps To Reproduce
No response
Environment
HertzBeat version(s):1.1.3

Debug logs
No response
Anything else?
No response

你好 按着你的步骤在最新版本访问 http://localhost:1157/passport/login 我们没有复现此问题，看你的演示端口888 是你们自己改了啥导致这个问题的吗

Bot detected the issue body's language is not English, translate it automatically. 👯👭🏻🧑🤝🧑👫🧑🏿🤝🧑🏻👩🏾🤝👨🏿👬🏿

Hello, follow your steps to visit http://localhost:1157/passport/login in the latest version. We have not reproduced this problem. Look at your demo port 888, did you change what caused this problem?


Suggestion: Ability to transfer pet ownership

A few players on my server have been wishing to gift each other pets

I have gotten this request before. I am unsure of how the system should work. I thought of the following concepts:

You "abandon" your pet and he gets free for anyone to tame
You can set the owner of your pet to another playername
You can pick up your pet as an item and whoever spawns it back is the new owner

I tend to the first system because i think it seems to be the most realistic having to gain trust of your new pet.

I think the first system would be great, actually. Then players could also "release" the pet from ownership.
...wonder when someone will start a pokemon mod based on this one haha

Do you want to have a look at it pre release?
petai_v1.3.5.zip

Some quick server testing and its looking good!


How to close inactive code hinting

This might not related to the plugin, but it confused me for a long time. I add the feature flag for some function, and it keep complaining that this part of code is inactive. It make me hard to write some new code in it. I wonder if there is a way to close this warning during the development.

Oh I figure it out, just need to add this settings into the options.


Remove internal secret rotation variables

Variables for cert password and cert share aren't used by internal secret rotation. These are only required when doing external secret rotation.

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

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

@nzRegularIT - thanks a ton for finding this and contributing!
#sign-off

@nzRegularIT - thanks a ton for finding this and contributing!
#sign-off


Add test_all_subset_models mode

For #2246

Test runs (are still pending):

for false: https://github.com/intel/intel-xpu-backend-for-triton/actions/runs/11215825534
for true: https://github.com/intel/intel-xpu-backend-for-triton/actions/runs/11215830797

Accuracy run: https://github.com/intel/intel-xpu-backend-for-triton/actions/runs/11445587582
Performance run: https://github.com/intel/intel-xpu-backend-for-triton/actions/runs/11445592099


Updates table parsing to use more precise xpaths including summary

LGTM! Tested locally and I can no longer reproduce the issue with DOT 3279824.


Sync File System Support

Google integration is highly desired.  This would naturally allow the user to use their Google account to have real-time access to project files from multiple devices.
Some kind of Google-supplied, or seemingly-Google-supplied, cloud support is what is meant here; not necessarily Google Drive.  It's important that the cloud support be easy and natural so the user doesn't even have to think about it.  A cloud form of local browser storage is what's desired, attached to their Google account so that it's accessible (syncable) from multiple devices (running Chrome IDE) automatically.
This was discussed briefly in the File Management > Importing/Exporting between drive/download/USB/local storage section of the Chrome IDE Phase 2 Discussion Notes document.
NOTE: Google Drive is also desired for backing up, exporting, importing, and sharing projects/source.  This, however, is a separate feature from this issue.  See Issue 83 for more info.

@PropGit We have discovered that Chrome SyncFileSystem fails when the user is not logged into a google account.  On a positive note, we have confirmed there is offline support but the user needs to be logged in. For this sprint, Google syncFileSystem storage functionality will be added with the restriction that it will only work for users who are logged in.
This issue appears to be related to an existing issue.  You can find it here
Is this a valid project constraint given the target platform of ChromeBooks that require login?  If not, we can discuss this further in another issue that is scheduled for a future enhancement.

@urbantumbleweed To answer your question, this is fine for now, but we'll need to address it again later.
I have some questions.

By "log in" do you mean to Chrome?  Or do we / can we provide a separate log in prompt ourselves at some point?
Does it fail in a graceful way that we can trap and silently handle or choose to prompt the user or not?
We are continuing to maintain things via indexdb just like we have been regardless of syncFileSystem, right?  So this doesn't really cause a big issue from a user perspective yet.
That's great that it has offline support.  Is it possible for the user to "log in" if the there's no Internet connection?  I think it is; my Chromebook seems to do so before it has Wi-Fi established.

So, that log on causes syncFileSystem to work automatically in it's offline mode?

#6<EMAIL_ADDRESS>I suspect this probably needs to be closed as WontFix, unfortunately.  (Assigning to tzik@ in case he has a plan)
Status: WontFix
Owner<EMAIL_ADDRESS>
Ouch... but after that amount of time, it's what I expected to.
We've got to be able to handle this outside of a deeper fix; I can't imagine at this point that it's impossible to deal with gracefully... just will have to be in another sprint.

That is quite disappointing, as the issue linked was supposed to be fixing the problem (according to the description).  It isn't impossible, but the amount of effort needed to solve this is significant.  I think trying to get Google to fix this is a good idea (probably by opening another issue that is exclusive to non-logged in support instead of multiple things).  SyncFileSystem should totally support this feature.

I agree, this is a real issue, but just how could it actually be solved by SyncFileSystem?
I mean, on a multi-user system, irregardless of how/where it stores the files during logged-out state, how would it associate the files to any person/account so that it knows how to resolve it once someone logs in?

Answers in response to yesterday

By "log in" do you mean to Chrome? Or do we / can we provide a separate log in prompt ourselves at some point?
That is correct, we mean Chrome.

Does it fail in a graceful way that we can trap and silently handle or choose to prompt the user or not?
Currently we are not handling the syncFIleSystem fail.  We need to consider options and spec our requirements in additional issues

We are continuing to maintain things via indexdb just like we have been regardless of syncFileSystem, right? So this doesn't really cause a big issue from a user perspective yet?
Not exactly, with your decision to use syncFileSystem api we have replaced indexdb in all cases except for temporary files.

That's great that it has offline support. Is it possible for the user to "log in" if the there's no Internet connection? I think it is; my Chromebook seems to do so before it has Wi-Fi established.
Initial log in requires internet. The user must log in with an internet connection but once logged into Chrome the session persists even if internet connection is lost.  The session persists until the user logs out or the machine sleeps.  On a positive note, if the user has logged into Chrome on the machine before, subsequent log in is possible when offline

So, that log on causes syncFileSystem to work automatically in it's offline mode?
That is correct.

When the user launches the app, how does it choose which log-in to use? If frequently have my Chrome browser logged into my personal address but I have a number of tabs open that are logged in to Google services with another account.
There can only be one user logged into a Chrome instance at a time.  Therefore, the app uses the current user profile at the time it is launched. The logged in user is separate from the email addresses used to log into google services.

You can see the user is "Guest" as indicated in the top right corner.

This is the view when switching users

We still need to follow-up with answers to your questions from your last comment.

@PropGit every chrome instance has some sort of "user" even if it is an anonymous user on first launch.  I don't think syncFileSystem would transfer any files saved on an anonymous user to a logged-in user's account, but it should at least gracefully degrade to the offline-only FileSystem API


Deduplicate plugin documentation

Currently we store detailed plugin documentation at two places:

In the specification in the form of a user story
As part of the python module as docs string

The first is used to generate web docs, the second for the --help message. The content is very similar though. Would be nice to find a way how to maintain this at once place only. Quick brainstorm:

Extract the specification story content and feed it to click?
Or generate story based on the plugin class docstring?

The specification should always be a starting point so I'd say the first approach probably makes more sense. Any other way? Thoughts?

My PoV is that I don't like stories :)
So docstring for me is better, it is closer to the code.

Since we have "dreams" and "ideas" in specification - it could be messy in --help or require additional logic to remove not implemented but planned stuff happening in steps/tmt

Another thing to improve is structure of docs - some plugins are huge, specification is mixing plugins for how with step properties, etc.

Currently we store detailed plugin documentation at two places:

In the specification in the form of a user story
As part of the python module as docs string

The first is used to generate web docs, the second for the --help message. The content is very similar though. Would be nice to find a way how to maintain this at once place only. Quick brainstorm:

Extract the specification story content and feed it to click?
Or generate story based on the plugin class docstring?

The specification should always be a starting point so I'd say the first approach probably makes more sense. Any other way? Thoughts?

I somehow missed this issue, but I believe that I've been working towards solving it for a couple of months already. I agree with the points discussed above, namely the mixture of specification and plugin docs. My approach is this:

separate plugin docs from the specification. L2 docs focus on L2 attributes, steps, how they work together, etc. but does not cover plugins and their fields. In other words, the prepare page, built from specs/, would mention how and where keys and it'd speak about where the step sits in the pipeline, but it would not discuss the ansible plugin and its keys - instead, we'd have "Plugins" section in docs, with a subtree for each step where would docs for each plugin live.
plugin docs would live in plugin (class) docstrings and plugin data class help texts. Unfortunately, dataclass fields cannot have docstrings (it's possible to use #: foo... comment, but that's consumed by Sphinx, it does not work with pure Python). We can collect steps, and plugins, from plugins we can reach their data classes that define fields accepted by plugins.
with a Jinja template, we can render an HTML page for every plugin.
with a ReST parser and renderer, we can render CLI help for every plugin, honoring ReST directives.
taking advantage of ReST - it makes HTML better with Sphinx, and for CLI we would have a parser to make it look as good as the HTML version. Raw docstrings would contain ReST directives, and the parser/renderer duo would convert them to nice CLI content.

What I have so far:

https://github.com/teemtee/tmt/pull/2545 - to make plugins name available for "Plugins" section in docs
https://github.com/teemtee/tmt/pull/2549 - bootstraps the HTML docs for plugins
https://github.com/teemtee/tmt/pull/2574 - ReST rendering for CLI
and follow-up PRs improving docs for individual plugins, e.g. adding code-block, proper lists, literals, metavars, references, etc. would start flowing in.